diff options
| author | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2026-09-25 01:43:56 +0200 |
|---|---|---|
| committer | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2026-09-25 01:43:56 +0200 |
| commit | e371b5fc710c597e175e6b7d7645b3a224a731a1 (patch) | |
| tree | 3861fa4949adfd1c95a06ae0b7dd41c4167a3b7a /src/qreg.c | |
| parent | 207af96f4eb3220534ea06c2e107517372246544 (diff) | |
instead of relying on Scintilla undo actions, use SciTECO undo tokens exclusivelyHEADmaster-fmsbw-cimaster
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.
Diffstat (limited to 'src/qreg.c')
| -rw-r--r-- | src/qreg.c | 19 |
1 files changed, 9 insertions, 10 deletions
@@ -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); |
