diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2014-11-16 23:29:34 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2014-11-16 23:34:25 +0100 |
commit | 52db2f4e20d7c544d3040af1f359dd3365ca204b (patch) | |
tree | 5f1d9ae0e9673215a2cb99965943e4ed93e50850 /src | |
parent | 38fcf6d15cdf09591e7d7a142ad724164875e433 (diff) | |
download | sciteco-52db2f4e20d7c544d3040af1f359dd3365ca204b.tar.gz |
cleaned up Scintilla document "updating"
* allowed me to remove some obscure global functions and methods like
QRegister::update_string().
* Document updating is concentrated in qregisters.cpp now
* also fixes some bugs introduced earlier, like undo tokens being
generated for non-undo registers (resulting in segfaults on rubout)
Diffstat (limited to 'src')
-rw-r--r-- | src/parser.cpp | 5 | ||||
-rw-r--r-- | src/qregisters.cpp | 68 | ||||
-rw-r--r-- | src/qregisters.h | 23 | ||||
-rw-r--r-- | src/ring.cpp | 24 | ||||
-rw-r--r-- | src/ring.h | 13 |
5 files changed, 58 insertions, 75 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index a510ab5..575fc78 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -995,10 +995,7 @@ StateStart::custom(gchar chr) throw Error("Command-line editing only possible in " "interactive mode"); - if (ring.current) - ring.undo_edit(); - else /* QRegisters::current != NULL */ - QRegisters::undo_edit(); + current_doc_undo_edit(); QRegisters::globals.edit("\x1B"); interface.ssm(SCI_BEGINUNDOACTION); diff --git a/src/qregisters.cpp b/src/qregisters.cpp index 981db88..002d4b7 100644 --- a/src/qregisters.cpp +++ b/src/qregisters.cpp @@ -61,14 +61,6 @@ namespace QRegisters { QRegister *current = NULL; ViewCurrent *view = NULL; - void - undo_edit(void) - { - current->update_string(); - undo.push_var(ring.current); - undo.push_var(current)->undo_edit(); - } - static QRegisterStack stack; } @@ -77,8 +69,11 @@ static QRegister *register_argument = NULL; void QRegisterData::set_string(const gchar *str) { - string.edit(QRegisters::view); + if (QRegisters::current) + QRegisters::current->string.update(QRegisters::view); + string.reset(); + string.edit(QRegisters::view); QRegisters::view->ssm(SCI_BEGINUNDOACTION); QRegisters::view->ssm(SCI_SETTEXT, 0, @@ -92,13 +87,16 @@ QRegisterData::set_string(const gchar *str) void QRegisterData::undo_set_string(void) { - /* set_string() assumes that parameters have been saved */ - current_doc_update(); - if (!must_undo) return; - if (QRegisters::current) + /* + * Necessary, so that upon rubout the + * string's parameters are restored. + */ + string.update(QRegisters::view); + + if (QRegisters::current && QRegisters::current->must_undo) QRegisters::current->string.undo_edit(QRegisters::view); string.undo_reset(); @@ -112,16 +110,21 @@ QRegisterData::append_string(const gchar *str) { /* * NOTE: Will not create undo action - * if string is empty + * if string is empty. + * Also, appending preserves the string's + * parameters. */ if (!str || !*str) return; + if (QRegisters::current) + QRegisters::current->string.update(QRegisters::view); + string.edit(QRegisters::view); QRegisters::view->ssm(SCI_BEGINUNDOACTION); QRegisters::view->ssm(SCI_APPENDTEXT, - strlen(str), (sptr_t)str); + strlen(str), (sptr_t)str); QRegisters::view->ssm(SCI_ENDUNDOACTION); if (QRegisters::current) @@ -137,7 +140,9 @@ QRegisterData::get_string(void) if (!string.is_initialized()) return g_strdup(""); - current_doc_update(); + if (QRegisters::current) + QRegisters::current->string.update(QRegisters::view); + string.edit(QRegisters::view); size = QRegisters::view->ssm(SCI_GETLENGTH) + 1; @@ -151,26 +156,11 @@ QRegisterData::get_string(void) } void -QRegisterData::edit(void) -{ - string.edit(QRegisters::view); - interface.show_view(QRegisters::view); -} - -void -QRegisterData::undo_edit(void) -{ - if (!must_undo) - return; - - string.undo_edit(QRegisters::view); - interface.undo_show_view(QRegisters::view); -} - -void QRegister::edit(void) { - /* NOTE: could call QRegisterData::edit() */ + if (QRegisters::current) + QRegisters::current->string.update(QRegisters::view); + string.edit(QRegisters::view); interface.show_view(QRegisters::view); interface.info_update(this); @@ -183,7 +173,7 @@ QRegister::undo_edit(void) return; interface.undo_info_update(this); - /* NOTE: could call QRegisterData::undo_edit() */ + string.update(QRegisters::view); string.undo_edit(QRegisters::view); interface.undo_show_view(QRegisters::view); } @@ -281,7 +271,6 @@ QRegisterTable::QRegisterTable(bool _undo) : RBTree(), must_undo(_undo) void QRegisterTable::edit(QRegister *reg) { - current_doc_update(); reg->edit(); ring.current = NULL; @@ -538,13 +527,12 @@ StateLoadQReg::done(const gchar *str) BEGIN_EXEC(&States::start); if (*str) { + /* Load file into Q-Register */ register_argument->undo_load(); register_argument->load(str); } else { - if (ring.current) - ring.undo_edit(); - else /* QRegisters::current != NULL */ - QRegisters::undo_edit(); + /* Edit Q-Register */ + current_doc_undo_edit(); QRegisters::globals.edit(register_argument); } diff --git a/src/qregisters.h b/src/qregisters.h index e0e8520..3d89c4a 100644 --- a/src/qregisters.h +++ b/src/qregisters.h @@ -64,7 +64,12 @@ protected: public: /* - * whether to generate UndoTokens (unnecessary in macro invocations) + * Whether to generate UndoTokens (unnecessary in macro invocations). + * + * FIXME: Every QRegister has this field, but it only differs + * between local and global QRegisters. This wastes space. + * There must be a more clever way to inherit this property, e.g. + * by setting QRegisters::current_must_undo. */ bool must_undo; @@ -88,12 +93,6 @@ public: return integer; } - inline void - update_string() - { - string.update(QRegisters::view); - } - virtual void set_string(const gchar *str); virtual void undo_set_string(void); virtual void append_string(const gchar *str); @@ -104,9 +103,11 @@ public: } virtual gchar *get_string(void); - virtual void edit(void); - virtual void undo_edit(void); - + /* + * The QRegisterStack must currently access the + * integer and string fields directly to exchange + * data efficiently. + */ friend class QRegisterStack; }; @@ -441,8 +442,6 @@ namespace QRegisters { extern QRegisterTable *locals; extern QRegister *current; - void undo_edit(void); - enum Hook { HOOK_ADD = 1, HOOK_EDIT, diff --git a/src/ring.cpp b/src/ring.cpp index 443b22d..492845f 100644 --- a/src/ring.cpp +++ b/src/ring.cpp @@ -37,6 +37,7 @@ #include "undo.h" #include "parser.h" #include "expressions.h" +#include "qregisters.h" #include "ring.h" #include "error.h" @@ -229,8 +230,6 @@ Ring::edit(tecoInt id) if (!buffer) return false; - current_doc_update(); - QRegisters::current = NULL; current = buffer; buffer->edit(); @@ -245,8 +244,6 @@ Ring::edit(const gchar *filename) { Buffer *buffer = find(filename); - current_doc_update(); - QRegisters::current = NULL; if (buffer) { current = buffer; @@ -572,20 +569,14 @@ get_absolute_path(const gchar *path) void StateEditFile::do_edit(const gchar *filename) { - if (ring.current) - ring.undo_edit(); - else /* QRegisters::current != NULL */ - QRegisters::undo_edit(); + current_doc_undo_edit(); ring.edit(filename); } void StateEditFile::do_edit(tecoInt id) { - if (ring.current) - ring.undo_edit(); - else /* QRegisters::current != NULL */ - QRegisters::undo_edit(); + current_doc_undo_edit(); if (!ring.edit(id)) throw Error("Invalid buffer id %" TECO_INTEGER_FORMAT, id); } @@ -752,4 +743,13 @@ StateSaveFile::done(const gchar *str) return &States::start; } +void +current_doc_undo_edit(void) +{ + if (ring.current) + ring.undo_edit(); + else if (QRegisters::current) + undo.push_var(QRegisters::current)->undo_edit(); +} + } /* namespace SciTECO */ @@ -241,13 +241,12 @@ namespace States { extern StateSaveFile savefile; } -/* FIXME: clean up current_doc_update() usage */ -static inline void -current_doc_update(void) -{ - if (QRegisters::current) - QRegisters::current->update_string(); -} +/* + * Helper functions applying to any current + * document (whether a buffer or QRegister). + * There's currently no better place to put them. + */ +void current_doc_undo_edit(void); static inline bool current_doc_must_undo(void) |