From e371b5fc710c597e175e6b7d7645b3a224a731a1 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Fri, 25 Sep 2026 01:43:56 +0200 Subject: instead of relying on Scintilla undo actions, use SciTECO undo tokens exclusively Previously we were using both Scintilla undo actions and our own undo tokens and both had to be coordinated via `undo__teco_interface_ssm(SCI_UNDO, 0, 0)`. This was error prone since we have to predict when an undo action is actually generated. Furthermore, you had to update SCI_SETUNDOCOLLECTION on all buffers and the Q-Reg view whenever switching to and from interactive mode. Also, this probably wasted memory for the doubled undo bookkeeping. Now, we always set SCI_SETUNDOCOLLECTION(FALSE), even in interactive mode. teco_undo_view_insert() was introduced to undo text deletions. While this saves almost no lines of code, it's just a clearer and simpler architecture. --- src/qreg.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'src/qreg.c') diff --git a/src/qreg.c b/src/qreg.c index 559373c..9e19202 100644 --- a/src/qreg.c +++ b/src/qreg.c @@ -188,7 +188,9 @@ teco_qreg_plain_append_string(teco_qreg_t *qreg, const gchar *str, gsize len, GE teco_doc_undo_edit(&teco_qreg_current->string); teco_doc_undo_reset(&qreg->string); - undo__teco_view_ssm(teco_qreg_view, SCI_UNDO, 0, 0); + + sptr_t pos = teco_view_ssm(teco_qreg_view, SCI_GETCURRENTPOS, 0, 0); + undo__teco_view_ssm(teco_qreg_view, SCI_DELETERANGE, pos, len); } if (teco_qreg_current) @@ -196,9 +198,7 @@ teco_qreg_plain_append_string(teco_qreg_t *qreg, const gchar *str, gsize len, GE teco_doc_edit(&qreg->string, teco_default_codepage()); - teco_view_ssm(teco_qreg_view, SCI_BEGINUNDOACTION, 0, 0); teco_view_ssm(teco_qreg_view, SCI_APPENDTEXT, len, (sptr_t)str); - teco_view_ssm(teco_qreg_view, SCI_ENDUNDOACTION, 0, 0); if (teco_qreg_current) teco_doc_edit(&teco_qreg_current->string, 0); @@ -469,12 +469,12 @@ teco_qreg_external_edit(teco_qreg_t *qreg, GError **error) !qreg->vtable->get_string(qreg, &str.data, &str.len, NULL, error)) return FALSE; - teco_view_ssm(teco_qreg_view, SCI_BEGINUNDOACTION, 0, 0); + teco_undo_view_insert(teco_qreg_view, 0, + teco_view_ssm(teco_qreg_view, SCI_GETLENGTH, 0, 0)); teco_view_ssm(teco_qreg_view, SCI_CLEARALL, 0, 0); + undo__teco_view_ssm(teco_qreg_view, SCI_CLEARALL, 0, 0); teco_view_ssm(teco_qreg_view, SCI_ADDTEXT, str.len, (sptr_t)str.data); - teco_view_ssm(teco_qreg_view, SCI_ENDUNDOACTION, 0, 0); - undo__teco_view_ssm(teco_qreg_view, SCI_UNDO, 0, 0); return TRUE; } @@ -586,12 +586,11 @@ teco_qreg_external_save(teco_qreg_t *qreg, const gchar *filename, GError **error if (!qreg->vtable->get_string(qreg, &str.data, &str.len, NULL, error)) return FALSE; - teco_view_ssm(teco_qreg_view, SCI_BEGINUNDOACTION, 0, 0); + teco_undo_view_insert(teco_qreg_view, 0, + teco_view_ssm(teco_qreg_view, SCI_GETLENGTH, 0, 0)); teco_view_ssm(teco_qreg_view, SCI_CLEARALL, 0, 0); + undo__teco_view_ssm(teco_qreg_view, SCI_CLEARALL, 0, 0); teco_view_ssm(teco_qreg_view, SCI_ADDTEXT, str.len, (sptr_t)str.data); - teco_view_ssm(teco_qreg_view, SCI_ENDUNDOACTION, 0, 0); - - undo__teco_view_ssm(teco_qreg_view, SCI_UNDO, 0, 0); gboolean ret = teco_view_save(teco_qreg_view, filename, error); -- cgit v1.2.3