From 0bec0fa60c84a94c2956a975b65017b42d018c31 Mon Sep 17 00:00:00 2001 From: RaiKoHoff Date: Thu, 2 Jul 2020 18:30:04 +0200 Subject: [PATCH] + fix: multiple line-/stream-selection undo/redo --- src/Notepad3.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/Notepad3.c b/src/Notepad3.c index 1323ba300..3f7b839fc 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -6919,19 +6919,28 @@ static bool _IsIMEOpenInNoNativeMode() // inline static LRESULT _MsgNotifyLean(const LPNMHDR pnmh, const SCNotification* const scn) { + static int _mod_insdel_token = -1; // --- check only mandatory events (must be fast !!!) --- if (pnmh->idFrom == IDC_EDIT) { if (pnmh->code == SCN_MODIFIED) { bool bModified = true; int const iModType = scn->modificationType; - if ((iModType & SC_MOD_BEFOREINSERT) || ((iModType & SC_MOD_BEFOREDELETE))) { - if (!((iModType & SC_PERFORMED_UNDO) || (iModType & SC_PERFORMED_REDO))) { - if ((!_InUndoRedoTransaction() && !SciCall_IsSelectionEmpty()) || Sci_IsMultiOrRectangleSelection()) { - _SaveRedoSelection(_SaveUndoSelection()); + if (iModType & (SC_MOD_BEFOREINSERT | SC_MOD_BEFOREDELETE)) { + if (!(iModType & (SC_PERFORMED_UNDO | SC_PERFORMED_REDO))) { + if (!_InUndoRedoTransaction()) { + _mod_insdel_token = _SaveUndoSelection(); } } bModified = false; // not yet } + if (iModType & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT)) { + if (!(iModType & (SC_PERFORMED_UNDO | SC_PERFORMED_REDO))) { + if (!_InUndoRedoTransaction() && (_mod_insdel_token >= 0)) { + _SaveRedoSelection(_mod_insdel_token); + _mod_insdel_token = -1; + } + } + } // check for ADDUNDOACTION step if (iModType & SC_MOD_CONTAINER) { @@ -6978,6 +6987,7 @@ inline static LRESULT _MsgNotifyLean(const LPNMHDR pnmh, const SCNotification* c static LRESULT _MsgNotifyFromEdit(HWND hwnd, const LPNMHDR pnmh, const SCNotification* const scn) { static int _s_indic_click_modifiers = SCMOD_NORM; + static int _mod_insdel_token = -1; switch (pnmh->code) { @@ -7019,14 +7029,22 @@ static LRESULT _MsgNotifyFromEdit(HWND hwnd, const LPNMHDR pnmh, const SCNotific { int const iModType = scn->modificationType; bool bModified = true; - if ((iModType & SC_MOD_BEFOREINSERT) || ((iModType & SC_MOD_BEFOREDELETE))) { - if (!((iModType & SC_PERFORMED_UNDO) || (iModType & SC_PERFORMED_REDO))) { - if ((!_InUndoRedoTransaction() && !SciCall_IsSelectionEmpty()) || Sci_IsMultiOrRectangleSelection()) { - _SaveRedoSelection(_SaveUndoSelection()); + if (iModType & (SC_MOD_BEFOREINSERT | SC_MOD_BEFOREDELETE)) { + if (!(iModType & (SC_PERFORMED_UNDO | SC_PERFORMED_REDO))) { + if (!_InUndoRedoTransaction()) { + _mod_insdel_token = _SaveUndoSelection(); } } bModified = false; // not yet } + else if (iModType & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT)) { + if (!(iModType & (SC_PERFORMED_UNDO | SC_PERFORMED_REDO))) { + if (!_InUndoRedoTransaction() && (_mod_insdel_token >= 0)) { + _SaveRedoSelection(_mod_insdel_token); + _mod_insdel_token = -1; + } + } + } if (iModType & SC_MOD_CONTAINER) { if (iModType & SC_PERFORMED_UNDO) { bModified = RestoreAction(scn->token, UNDO); @@ -9073,6 +9091,9 @@ static void _SaveRedoSelection(int token) utarray_push_back(pSel->anchorPos_redo, &anchorPos); DocPos const curPos = SciCall_GetCurrentPos(); utarray_push_back(pSel->curPos_redo, &curPos); + //~DocPos const dummy = (DocPos)-1; + //~utarray_push_back(pSel->anchorVS_redo, &dummy); + //~utarray_push_back(pSel->curVS_redo, &dummy); } break; }