From 3c7b3d58881b98806a0eb5bbd94a07c38b9fe7c5 Mon Sep 17 00:00:00 2001 From: Neil Date: Tue, 4 Feb 2025 20:57:26 +1100 Subject: Ensure undo selection history for view is deleted when view destroyed or history disabled. --- src/Document.cxx | 6 +++++- src/EditModel.cxx | 10 ++++++++++ src/EditModel.h | 1 + src/Editor.cxx | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) (limited to 'src') 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 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(changeHistoryOption); case Message::SetUndoSelectionHistory: - undoSelectionHistoryOption = static_cast(wParam); + ChangeUndoSelectionHistory(static_cast(wParam)); break; case Message::GetUndoSelectionHistory: -- cgit v1.2.3