diff options
author | elfmz <fenix1905@tut.by> | 2022-01-17 02:18:04 +0300 |
---|---|---|
committer | elfmz <fenix1905@tut.by> | 2022-01-17 02:18:04 +0300 |
commit | 71097bcf9f337baa9f64684b7d1750cce8ca90da (patch) | |
tree | d10fd5fa0c485dea00b25a8b2400265af05aacb9 /far2l/src/plug | |
parent | 6f7ab910a1128a12e3492aeb3d3445aa0214ce06 (diff) |
Editor: allow F12-switch for plugin-backed files
Diffstat (limited to 'far2l/src/plug')
-rw-r--r-- | far2l/src/plug/plugapi.cpp | 2 | ||||
-rw-r--r-- | far2l/src/plug/plugins.cpp | 31 | ||||
-rw-r--r-- | far2l/src/plug/plugins.hpp | 5 |
3 files changed, 34 insertions, 4 deletions
diff --git a/far2l/src/plug/plugapi.cpp b/far2l/src/plug/plugapi.cpp index 6a616926..d88546e6 100644 --- a/far2l/src/plug/plugapi.cpp +++ b/far2l/src/plug/plugapi.cpp @@ -2127,7 +2127,7 @@ int FarEditorSynched( const wchar_t *FileName, const wchar_t *Title, if (Flags & EF_NONMODAL) { /* 09.09.2001 IS ! Добавим имя файла в историю, если потребуется */ - FileEditor *Editor=new(std::nothrow) FileEditor(FileName,CodePage,(CreateNew?FFILEEDIT_CANNEWFILE:0)|FFILEEDIT_ENABLEF6|(DisableHistory?FFILEEDIT_DISABLEHISTORY:0)|(Locked?FFILEEDIT_LOCKED:0), + FileEditor *Editor=new(std::nothrow) FileEditor(FileName,CodePage,(CreateNew?FFILEEDIT_CANNEWFILE:0)|FFILEEDIT_ENABLEF6|FFILEEDIT_ENABLESWITCH|(DisableHistory?FFILEEDIT_DISABLEHISTORY:0)|(Locked?FFILEEDIT_LOCKED:0), StartLine,StartChar,Title, X1,Y1,X2,Y2, DeleteOnClose,OpMode); diff --git a/far2l/src/plug/plugins.cpp b/far2l/src/plug/plugins.cpp index cfe7c9f3..d20d5f37 100644 --- a/far2l/src/plug/plugins.cpp +++ b/far2l/src/plug/plugins.cpp @@ -65,6 +65,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "InterThreadCall.hpp" #include <KeyFileHelper.h> #include <crc64.h> +#include <assert.h> const char *FmtDiskMenuStringD = "DiskMenuString%d"; const char *FmtPluginMenuStringD = "PluginMenuString%d"; @@ -766,8 +767,21 @@ void PluginManager::ClosePlugin(HANDLE hPlugin) { ChangePriority ChPriority(ChangePriority::NORMAL); PluginHandle *ph = (PluginHandle*)hPlugin; - ph->pPlugin->ClosePlugin(ph->hPlugin); - delete ph; + const auto RefCnt = ph->RefCnt; + assert(RefCnt > 0); + ph->RefCnt = RefCnt - 1; + if (RefCnt == 1) { + ph->pPlugin->ClosePlugin(ph->hPlugin); + delete ph; + } +} + +void PluginManager::RetainPlugin(HANDLE hPlugin) +{ + PluginHandle *ph = (PluginHandle*)hPlugin; + const auto RefCnt = ph->RefCnt; + assert(RefCnt > 0); + ph->RefCnt = RefCnt + 1; } HANDLE PluginManager::GetRealPluginHandle(HANDLE hPlugin) @@ -2082,3 +2096,16 @@ std::map<std::wstring, unsigned int> PluginManager::BackgroundTasks() } //////////////////////// + +static void HPluginDeleter(HANDLE h) +{ + if (CtrlObject) + { + CtrlObject->Plugins.ClosePlugin(h); + } + else + { + fprintf(stderr, "HPluginDeleter: no CtrlObject\n"); + } +} + diff --git a/far2l/src/plug/plugins.hpp b/far2l/src/plug/plugins.hpp index b42a7e83..5f097f86 100644 --- a/far2l/src/plug/plugins.hpp +++ b/far2l/src/plug/plugins.hpp @@ -42,6 +42,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <string> #include <map> #include <mutex> +#include <memory> extern const char *FmtDiskMenuStringD; extern const char *FmtPluginMenuStringD; @@ -157,6 +158,7 @@ struct PluginHandle { HANDLE hPlugin; class Plugin *pPlugin; + unsigned int RefCnt = 1; }; class PluginManager @@ -251,7 +253,8 @@ class PluginManager HANDLE OpenFindListPlugin(const PluginPanelItem *PanelItem,int ItemsNumber); HANDLE GetRealPluginHandle(HANDLE hPlugin); FARString GetPluginModuleName(HANDLE hPlugin); - void ClosePlugin(HANDLE hPlugin); + void ClosePlugin(HANDLE hPlugin); // decreases refcnt and actually closes plugin if refcnt reached zero + void RetainPlugin(HANDLE hPlugin); // increments refcnt void GetOpenPluginInfo(HANDLE hPlugin, OpenPluginInfo *Info); int GetFindData(HANDLE hPlugin,PluginPanelItem **pPanelItem,int *pItemsNumber,int Silent); void FreeFindData(HANDLE hPlugin,PluginPanelItem *PanelItem,int ItemsNumber); |