diff options
author | Neil <nyamatongwe@gmail.com> | 2025-02-04 20:57:26 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2025-02-04 20:57:26 +1100 |
commit | 3c7b3d58881b98806a0eb5bbd94a07c38b9fe7c5 (patch) | |
tree | 84bfcce4cd245c333cab38586f43be89e8c7259f | |
parent | c88990bc3bd3e043a426773d24d55a7527e84dcf (diff) | |
download | scintilla-mirror-3c7b3d58881b98806a0eb5bbd94a07c38b9fe7c5.tar.gz |
Ensure undo selection history for view is deleted when view destroyed or
history disabled.
-rw-r--r-- | src/Document.cxx | 6 | ||||
-rw-r--r-- | src/EditModel.cxx | 10 | ||||
-rw-r--r-- | src/EditModel.h | 1 | ||||
-rw-r--r-- | src/Editor.cxx | 2 |
4 files changed, 17 insertions, 2 deletions
diff --git a/src/Document.cxx b/src/Document.cxx index dc82b1902..7543b4940 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -2615,7 +2615,11 @@ void Document::SetLexInterface(std::unique_ptr<LexInterface> pLexInterface) noex } void Document::SetViewState(void *view, ViewStateShared pVSS) { - viewData[view] = pVSS; + if (pVSS) { + viewData[view] = pVSS; + } else { + viewData.erase(view); + } } ViewStateShared Document::GetViewState(void *view) const noexcept { diff --git a/src/EditModel.cxx b/src/EditModel.cxx index 033d79bd2..a0339de35 100644 --- a/src/EditModel.cxx +++ b/src/EditModel.cxx @@ -121,6 +121,9 @@ EditModel::EditModel() : braces{} { EditModel::~EditModel() { try { + // Erasing the view state won't throw even though SetViewState + // and the resulting map::erase aren't marked noexcept. + pdoc->SetViewState(this, {}); // This never throws but isn't marked noexcept for compatibility pdoc->Release(); } catch (...) { @@ -178,3 +181,10 @@ void EditModel::EnsureModelState() { } } } + +void EditModel::ChangeUndoSelectionHistory(Scintilla::UndoSelectionHistoryOption undoSelectionHistoryOptionNew) { + undoSelectionHistoryOption = undoSelectionHistoryOptionNew; + if (undoSelectionHistoryOption == UndoSelectionHistoryOption::Disabled) { + pdoc->SetViewState(this, {}); + } +} diff --git a/src/EditModel.h b/src/EditModel.h index b9c331573..1c4823b2e 100644 --- a/src/EditModel.h +++ b/src/EditModel.h @@ -105,6 +105,7 @@ public: [[nodiscard]] int GetMark(Sci::Line line) const; void EnsureModelState(); + void ChangeUndoSelectionHistory(Scintilla::UndoSelectionHistoryOption undoSelectionHistoryOptionNew); }; } diff --git a/src/Editor.cxx b/src/Editor.cxx index d85a4c294..a29aa08fc 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -8698,7 +8698,7 @@ sptr_t Editor::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) { return static_cast<sptr_t>(changeHistoryOption); case Message::SetUndoSelectionHistory: - undoSelectionHistoryOption = static_cast<UndoSelectionHistoryOption>(wParam); + ChangeUndoSelectionHistory(static_cast<UndoSelectionHistoryOption>(wParam)); break; case Message::GetUndoSelectionHistory: |