Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/elfmz/far2l.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelfmz <fenix1905@tut.by>2022-01-17 02:18:04 +0300
committerelfmz <fenix1905@tut.by>2022-01-17 02:18:04 +0300
commit71097bcf9f337baa9f64684b7d1750cce8ca90da (patch)
treed10fd5fa0c485dea00b25a8b2400265af05aacb9 /far2l/src/plug
parent6f7ab910a1128a12e3492aeb3d3445aa0214ce06 (diff)
Editor: allow F12-switch for plugin-backed files
Diffstat (limited to 'far2l/src/plug')
-rw-r--r--far2l/src/plug/plugapi.cpp2
-rw-r--r--far2l/src/plug/plugins.cpp31
-rw-r--r--far2l/src/plug/plugins.hpp5
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);