aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2014-11-16 23:29:34 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2014-11-16 23:34:25 +0100
commit52db2f4e20d7c544d3040af1f359dd3365ca204b (patch)
tree5f1d9ae0e9673215a2cb99965943e4ed93e50850
parent38fcf6d15cdf09591e7d7a142ad724164875e433 (diff)
downloadsciteco-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)
-rw-r--r--src/parser.cpp5
-rw-r--r--src/qregisters.cpp68
-rw-r--r--src/qregisters.h23
-rw-r--r--src/ring.cpp24
-rw-r--r--src/ring.h13
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 */
diff --git a/src/ring.h b/src/ring.h
index 00284cb..35424dc 100644
--- a/src/ring.h
+++ b/src/ring.h
@@ -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)