diff --git a/src/Notepad3.c b/src/Notepad3.c index 6bda674ee..da6a38a41 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -7182,7 +7182,7 @@ void InvalidateSelections() int BeginSelUndoAction() { int token = -1; - UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0 }; + UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 }; sel.selMode = (int)SendMessage(hwndEdit,SCI_GETSELECTIONMODE,0,0); sel.rectSelVS = (int)SendMessage(hwndEdit,SCI_GETVIRTUALSPACEOPTIONS,0,0); if (sel.selMode == SC_SEL_LINES) { @@ -7190,8 +7190,12 @@ int BeginSelUndoAction() sel.currPos_undo = (int)SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0); } else if (sel.selMode == SC_SEL_RECTANGLE) { - sel.anchorPos_undo = (int)SendMessage(hwndEdit,SCI_GETRECTANGULARSELECTIONANCHOR,0,0); - sel.currPos_undo = (int)SendMessage(hwndEdit,SCI_GETRECTANGULARSELECTIONCARET,0,0); + sel.anchorPos_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0); + sel.currPos_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0); + if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) { + sel.anchorVS_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0); + sel.currVS_undo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0); + } } else { @@ -7216,7 +7220,7 @@ int BeginSelUndoAction() void EndSelUndoAction(int token) { if (token >= 0) { - UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0 }; + UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 }; if (UndoRedoSelectionMap(token,&sel) >= 0) { // mode and type should not have changed if (sel.selMode == SC_SEL_LINES) { @@ -7224,8 +7228,12 @@ void EndSelUndoAction(int token) sel.currPos_redo = (int)SendMessage(hwndEdit,SCI_GETSELECTIONEND,0,0); } else if (sel.selMode == SC_SEL_RECTANGLE) { - sel.anchorPos_redo = (int)SendMessage(hwndEdit,SCI_GETRECTANGULARSELECTIONANCHOR,0,0); - sel.currPos_redo = (int)SendMessage(hwndEdit,SCI_GETRECTANGULARSELECTIONCARET,0,0); + sel.anchorPos_redo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONANCHOR, 0, 0); + sel.currPos_redo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONCARET, 0, 0); + if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) { + sel.anchorVS_redo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE, 0, 0); + sel.currVS_redo = (int)SendMessage(hwndEdit, SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE, 0, 0); + } } else { sel.anchorPos_redo = (int)SendMessage(hwndEdit,SCI_GETANCHOR,0,0); @@ -7245,7 +7253,7 @@ void EndSelUndoAction(int token) // void RestoreSelectionAction(int token, DoAction doAct) { - UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0 }; + UndoRedoSelection_t sel = { -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 }; if (UndoRedoSelectionMap(token,&sel) >= 0) { // we are inside undo/redo transaction, so do delayed PostMessage() instead of SendMessage() int anchorPos = (doAct == UNDO ? sel.anchorPos_undo : sel.anchorPos_redo); @@ -7258,8 +7266,14 @@ void RestoreSelectionAction(int token, DoAction doAct) PostMessage(hwndEdit,SCI_SETSELECTIONEND,(WPARAM)currPos,0); } else if (sel.selMode == SC_SEL_RECTANGLE) { - PostMessage(hwndEdit,SCI_SETRECTANGULARSELECTIONANCHOR,(WPARAM)anchorPos,0); - PostMessage(hwndEdit,SCI_SETRECTANGULARSELECTIONCARET,(WPARAM)currPos,0); + PostMessage(hwndEdit, SCI_SETRECTANGULARSELECTIONANCHOR, (WPARAM)anchorPos, 0); + PostMessage(hwndEdit, SCI_SETRECTANGULARSELECTIONCARET, (WPARAM)currPos, 0); + if ((sel.rectSelVS & SCVS_RECTANGULARSELECTION) != 0) { + int anchorVS = (doAct == UNDO ? sel.anchorVS_undo : sel.anchorVS_redo); + int currVS = (doAct == UNDO ? sel.currVS_undo : sel.currVS_redo); + PostMessage(hwndEdit, SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE, (WPARAM)anchorVS, 0); + PostMessage(hwndEdit, SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE, (WPARAM)currVS, 0); + } } else { PostMessage(hwndEdit,SCI_SETSELECTION,(WPARAM)currPos,(LPARAM)anchorPos); diff --git a/src/Notepad3.h b/src/Notepad3.h index 64e7932d1..16bb5776b 100644 --- a/src/Notepad3.h +++ b/src/Notepad3.h @@ -49,6 +49,10 @@ typedef struct _undoSel int anchorPos_redo; int currPos_redo; int rectSelVS; + int anchorVS_undo; + int currVS_undo; + int anchorVS_redo; + int currVS_redo; } UndoRedoSelection_t;