From ebf26388355a2db8ea713424075e5a56b1f0c744 Mon Sep 17 00:00:00 2001 From: Alex Alabuzhev Date: Fri, 4 Aug 2017 19:08:51 +0000 Subject: [PATCH] ClosePanel fix --- far/changelog | 4 ++++ far/filelist.cpp | 12 +++++++++--- far/filelist.hpp | 1 + far/vbuild.m4 | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/far/changelog b/far/changelog index 6e8d1e5be6..17beee3805 100644 --- a/far/changelog +++ b/far/changelog @@ -1,3 +1,7 @@ +drkns 04.08.2017 20:07:24 +0000 - build 4999 + +1. С форума: "Падение при выходе “наверх” из панели результатов RESearch" + drkns 04.08.2017 00:27:23 +0000 - build 4998 1. Уточнение 4997 - погнулась замена. diff --git a/far/filelist.cpp b/far/filelist.cpp index 85f45af347..31472c22fc 100644 --- a/far/filelist.cpp +++ b/far/filelist.cpp @@ -5370,11 +5370,17 @@ bool FileList::PopPlugin(int EnableRestoreViewMode) } auto CurPlugin = std::move(PluginsList.back()); - PluginsList.pop_back(); --Global->PluginPanelsCount; - Global->CtrlObject->Plugins->ClosePanel(std::move(CurPlugin.m_Plugin)); + // We have removed current plugin panel from PluginsList already. + // However, ClosePanel provides a notification and plugins might call API functions from it. + // So GetPluginHandle() will look into m_ExpiringPluginPanel first. + { + m_ExpiringPluginPanel = CurPlugin.m_Plugin.get(); + SCOPE_EXIT{ m_ExpiringPluginPanel = nullptr; }; + Global->CtrlObject->Plugins->ClosePanel(std::move(CurPlugin.m_Plugin)); + } if (!PluginsList.empty()) { @@ -6449,7 +6455,7 @@ void FileList::SetPluginModified() plugin_panel* FileList::GetPluginHandle() const { - return PluginsList.empty()? nullptr : PluginsList.back().m_Plugin.get(); + return m_ExpiringPluginPanel? m_ExpiringPluginPanel : !PluginsList.empty()? PluginsList.back().m_Plugin.get() : nullptr; } diff --git a/far/filelist.hpp b/far/filelist.hpp index 358e09c23c..fc77a6d343 100644 --- a/far/filelist.hpp +++ b/far/filelist.hpp @@ -412,6 +412,7 @@ class FileList:public Panel m_ListData; std::list PrevDataList; std::list PluginsList; + plugin_panel* m_ExpiringPluginPanel{}; FileSystemWatcher FSWatcher; long UpperFolderTopFile{}, LastCurFile{ -1 }; bool ReturnCurrentFile{}; diff --git a/far/vbuild.m4 b/far/vbuild.m4 index 1ebb92f5c0..89445e1a33 100644 --- a/far/vbuild.m4 +++ b/far/vbuild.m4 @@ -1 +1 @@ -m4_define(BUILD,4998)m4_dnl +m4_define(BUILD,4999)m4_dnl