View Issue Details

IDProjectCategoryView StatusLast Update
0002084WishesHistorypublic2019-05-30 07:26
ReporterCyberShadow Assigned To 
PrioritynormalSeverityfeatureReproducibilityN/A
Status newResolutionopen 
Product Version3.0 
Summary0002084: Локальная история команд, как в Far 2
DescriptionВ FAR 2, стрелки вверх/вниз искали по истории команд из текущей сессии FAR. В FAR 3, история - глобальная, и запущенная команда в одном окне сразу появляется в истории других окон.

Хотя это в теории классно, мне это крайне неудобно, т.к. в подавляющем большинстве случаев работа в разных окнах идет по своим независимым направлениям (напр. в одном окне правим код и запускаем компилятор, в другом работаем с входными/выходными данными, в третьем что-то совсем иное).

В FAR 2 у меня был настроен плагин AltHistory на Ctrl+X / Ctrl+E. Получалось что стрелки - прокрутка по локальной истории, а Ctrl+X/E - по глобальной. Так было намного удобнее.
Additional InformationОбсуждение #1:
http://forum.farmanager.com/viewtopic.php?f=4&t=7046&p=92488

Обсуждение #2 (чего не хватает в API для реализации в плагине):
http://forum.farmanager.com/viewtopic.php?f=5&t=1608&p=92489#p92489
TagsNo tags attached.
Build

Activities

JohnDoe

2012-04-23 14:24

updater   bugnote:0009025

Вы написали что вам неудобно, но взамен ничего конкретного не предложили.

Обратите внимание, что нужное вам поведение сейчас реализуемо при таких настройках
[ ] Save commands history
[ ] Save folders history
[ ] Save view and edit history

(Естественно так невозможно сохранить историю между сессиями).

CyberShadow

2012-04-23 14:31

reporter   bugnote:0009027

Конкретные предложения не стал предлагать, так как мне неведомо сложность (и "правильность") их исполнения. Но возможностей немало:

1) Просто добавить опцию: стрелки = прокрутка по локальной истории
2) Добавить пункты меню / макрокоманды / итд. для прокрутки по локальной истории, чтобы можно было самому настроить макросы
3) Добавить в FAR API чего не хватает для реализации в плагине, например:
  а) передача исполняемых команд / переходов по папкам / открытие файлов плагинам, чтобы они сами могли вести локальную либо глобальную историю
  б) передача плагинам, считывающих историю FAR, флаг если этот пункт истории был добавлен в течении текущей сессии

> (Естественно так невозможно сохранить историю между сессиями).

Вариантов которые "решают" проблему взамен на другие, более весомые проблемы, тоже немало, и они никому не интересны. В обсуждении #1 было также предложено использование разных профилей, но это настолько же непрактично.

JohnDoe

2012-04-23 16:01

updater   bugnote:0009028

Практика показывает что у тикетов сформулированных конкретно - на порядок больше шансов.

1) Очевидно что это не "просто". Например продумайте в деталях поведение фара(-ов) с этой опцией и без неё, и учтите разные состояния [ ] Save commands history.
При этом не забудьте, что эти опции можно включать/выключать неоднократно в течении сеанса.

zg

2012-04-23 18:08

developer   bugnote:0009034

в морг.

CyberShadow

2012-04-23 18:32

reporter   bugnote:0009035

Если хотите просто и конкретно - "Как в FAR 2".

> Например продумайте в деталях поведение фара(-ов) с этой опцией и без неё, и учтите разные состояния [ ] Save commands history.

Что тут непонятного? Ясно, что если глобальная история нигде не используется, любая фича которая различает между локальной и глобальной истории не имеет смысла. Если проще сказать: [ ] Save commands history делает недоступной гипотетическую опцию "стрелки = прокрутка по локальной истории", и когда последняя выключена или недоступна - стрелки работают как сейчас.

> в морг.

Мне придется форкать, что ли? Трудно поверить что я - единственный usecase.

JohnDoe

2012-04-23 19:00

updater   bugnote:0009037

>Если хотите просто и конкретно - "Как в FAR 2".
Это значит сохранять историю только того экземпляра фара, из которого мы вышли последним?
Нет, спасибо.

CyberShadow

2012-04-23 19:04

reporter   bugnote:0009038

Ну так давайте спокойно обсудим как это лучше сделать. Я не хочу прислать патч который сразу же получит очередной "в морг. -- zg".

Вот конкретное предложение: в таблице истории добавляем колонку "сессия", где указывается время запуска FAR с точностью до микросекунды. Оттуда, можно либо эту информацию сделать доступным плагинам (тогда это повесить на стрелки - элементарно), либо просто добавить выше-обсужденный checkbox.

zg

2012-04-23 23:43

developer   bugnote:0009039

> Я не хочу прислать патч который сразу же получит очередной "в морг. -- zg".
а можно ссылки на предыдущие _хорошие_ патчи, которые "в морг. -- zg"?
> Вот конкретное предложение: в таблице истории добавляем колонку "сессия", где указывается время запуска FAR с точностью до микросекунды. Оттуда, можно либо эту информацию сделать доступным плагинам
жду патч.

JohnDoe

2012-04-24 05:58

updater   bugnote:0009041

>Вот конкретное предложение
Мне нравится

CyberShadow

2012-04-25 13:50

reporter   bugnote:0009056

Проблема в том, что я не могу знать какие патчи вы посчитаете хорошими (и не только в субъективном смысле), т.к. не знаком с кодом и не слежу за разработкой (например, на этой стадии развития FAR 3 изменения схемы БД может быть табу, и мне это было бы неведомо).

Обратно на тему:

Я глянул в код, по всей видимости придется везде где идет поиск по истории добавить также и поиск по определенной сессии? Много копи-пасты выйдет (функции, индексы, prepared statements)... может лучше вариант с FCTL? Цитирую...

> Вот если бы разработчики FAR добавили аналог ProcessPanelEventInfo/FE_COMMAND так, чтобы плагин мог получить информацию о запускаемых командах на любых панелях - тогда не вопрос. Ну, и дополнительные фишки стали бы доступны - вроде как "при запуске команды из истории перейти в каталог, откуда она выполнялась" и пр. и пр.

CyberShadow

2012-04-29 18:50

reporter  

pf_allpanelevents.diff (8,623 bytes)   
Index: enc/enc_rus3.work/meta/exported_functions/openw.html
===================================================================
--- enc/enc_rus3.work/meta/exported_functions/openw.html	(revision 7948)
+++ enc/enc_rus3.work/meta/exported_functions/openw.html	(working copy)
@@ -37,13 +37,13 @@
 ���� ����� ��������� ������, �� ����������� ������� - �������� �������. ���� �������� ����� ����� ���������� ������ ������ ������� �� ����, 
 ���� �������� �� ������� ������� ����� ������������ �������. ������ � ���������� �������� �� ���� �� Far Manager'� - ��� ����� ��, � �������,
 ������� ����������� ������ �������, ��� ������� �������� � ������ ������� ��� ��� ������ �������� ���������������, ������ �� ���.
-<p>� ����� ��������� �������� ������, ����������� ������� ������ ������ <code>INVALID_HANDLE_VALUE</code>.</p>
+<p>� ����� ��������� �������� ������, ����������� ������� ������ ������ <code>NULL</code>.</p>
 </div>
 
 <h3>�������</h3>
 <div class=descr>
 <ol>
-<li>� ������ ���������� ��� ����� �� ��������� ��������, ������� ��� ������� ������ �������. ������ �������� ��� ��������� ������� � ������� INVALID_HANDLE_VALUE.
+<li>� ������ ���������� ��� ����� �� ��������� ��������, ������� ��� ������� ������ �������. ������ �������� ��� ��������� ������� � ������� NULL.
 </ol>
 </div>
 
Index: enc/enc_rus3.work/meta/structures/processpaneleventinfo.html
===================================================================
--- enc/enc_rus3.work/meta/structures/processpaneleventinfo.html	(revision 7948)
+++ enc/enc_rus3.work/meta/structures/processpaneleventinfo.html	(working copy)
@@ -34,7 +34,9 @@
   <div class=dfn>StructSize</div>
     <div class=dfndescr>��� ���� �������� ������ �������� <dfn>ProcessPanelEventInfo</dfn>.</div>
   <div class=dfn>hPanel</div>
-    <div class=dfndescr>�������� ������, ���������� ������� <a href="../exported_functions/openw.html">OpenW</a>.</div>
+    <div class=dfndescr>�������� ������, ���������� ������� <a href="../exported_functions/openw.html">OpenW</a>.
+    ����� �� NULL, ���� � PluginInfo.Flags �� ������ <a href="plugininfo.html#PF_ALLPANELEVENTS">PF_ALLPANELEVENTS</a>.
+    </div>
   <div class=dfn>Event</div>
     <div class=dfndescr>��� �����. ���� �� ������ ������� (����������� <a name="FAR_EVENTS">FAR_EVENTS</a>):
     <table class="cont">
Index: enc/enc_rus3.work/meta/structures/plugininfo.html
===================================================================
--- enc/enc_rus3.work/meta/structures/plugininfo.html	(revision 7948)
+++ enc/enc_rus3.work/meta/structures/plugininfo.html	(working copy)
@@ -52,6 +52,10 @@
     <tr class="cont"><td class="cont" width="40%"><a name="PF_FULLCMDLINE">PF_FULLCMDLINE</a></td>
     <td class="cont" width="60%">��������� Far Manager ��������� ������� �� �������� ������ ������ � ��������� <i>CommandPrefix</i>.
     ��������� ���������� ���� ����, ���� ������ ����� ���������� �������� ��������� <i>CommandPrefix</i>.</td></tr>
+    <tr class="cont"><td class="cont" width="40%"><a name="PF_ALLPANELEVENTS">PF_ALLPANELEVENTS</a></td>
+    <td class="cont" width="60%">��������� Far Manager ��������� ������� ��� ������� �����, ���������� ���� ����� ����������� ������-���� �������.
+    ����� �������� ����� �������� ����� <a href="../exported_functions/processpaneleventw.html">ProcessPanelEventW</a> � ����� hPanel ������ NULL.
+    �������� ����� �������� ����� �����, ������ �������� ���������� ������� ����� ������ TRUE.</td></tr>
     </table>
     </div>
   <div class=dfn>DiskMenu</div>
Index: unicode_far/plugins.cpp
===================================================================
--- unicode_far/plugins.cpp	(revision 7981)
+++ unicode_far/plugins.cpp	(working copy)
@@ -1378,8 +1378,45 @@
     void *Param
 )
 {
-	PluginHandle *ph = (PluginHandle*)hPlugin;
-	return ph->pPlugin->ProcessPanelEvent(ph->hPlugin, Event, Param);
+	if (!hPlugin)
+	{
+		// hPlugin==NULL �� ��������� ������ �� ��� �����
+		// (�������� ���� �������� � PF_ALLPANELEVENTS)
+
+		for (size_t i=0; i<PluginsCount; i++)
+		{
+			UINT64 PluginFlags=0;
+	
+			if (PluginsData[i]->CheckWorkFlags(PIWF_CACHED))
+			{
+				unsigned __int64 id = PlCacheCfg->GetCacheID(PluginsData[i]->GetCacheName());
+				PluginFlags = PlCacheCfg->GetFlags(id);
+			}
+			else
+			{
+				PluginInfo Info = {sizeof(Info)};
+	
+				if (PluginsData[i]->GetPluginInfo(&Info))
+					PluginFlags = Info.Flags;
+				else
+					continue;
+			}
+
+			if (PluginFlags & PF_ALLPANELEVENTS)
+			{
+				Plugin *pPlugin = PluginsData[i];
+				if (pPlugin->Load() && pPlugin->ProcessPanelEvent(NULL, Event, Param))
+					return TRUE;
+			}
+		}
+	
+		return FALSE;
+	}
+	else
+	{
+		PluginHandle *ph = (PluginHandle*)hPlugin;
+		return ph->pPlugin->ProcessPanelEvent(ph->hPlugin, Event, Param);
+	}
 }
 
 
Index: unicode_far/flplugin.cpp
===================================================================
--- unicode_far/flplugin.cpp	(revision 7981)
+++ unicode_far/flplugin.cpp	(working copy)
@@ -1251,6 +1251,10 @@
 
 int FileList::ProcessPluginEvent(int Event,void *Param)
 {
+	// ���� ������ ���� ��������� �� �������� ������
+	if (Panel::ProcessPluginEvent(Event, Param))
+		return TRUE;
+
 	if (PanelMode==PLUGIN_PANEL)
 		return(CtrlObject->Plugins->ProcessEvent(hPlugin,Event,Param));
 
Index: unicode_far/panel.cpp
===================================================================
--- unicode_far/panel.cpp	(revision 7981)
+++ unicode_far/panel.cpp	(working copy)
@@ -2786,3 +2786,8 @@
 	SrcPanel->Redraw();
 	return true;
 }
+
+int Panel::ProcessPluginEvent(int Event,void *Param)
+{
+	return(CtrlObject->Plugins->ProcessEvent(NULL,Event,Param));
+}
Index: unicode_far/plugin.hpp
===================================================================
--- unicode_far/plugin.hpp	(revision 7981)
+++ unicode_far/plugin.hpp	(working copy)
@@ -2275,6 +2275,7 @@
 	PF_VIEWER         = 0x0000000000000008ULL,
 	PF_FULLCMDLINE    = 0x0000000000000010ULL,
 	PF_DIALOG         = 0x0000000000000020ULL,
+	PF_ALLPANELEVENTS = 0x0000000000000040ULL,
 	PF_NONE           = 0;
 
 struct PluginMenuItem
Index: unicode_far/panel.hpp
===================================================================
--- unicode_far/panel.hpp	(revision 7981)
+++ unicode_far/panel.hpp	(working copy)
@@ -282,7 +282,7 @@
 		virtual void GetOpenPanelInfo(struct OpenPanelInfo *Info) {}
 		virtual void SetPluginMode(HANDLE hPlugin,const wchar_t *PluginFile,bool SendOnFocus=false) {}
 		virtual void SetPluginModified() {}
-		virtual int ProcessPluginEvent(int Event,void *Param) {return FALSE;}
+		virtual int ProcessPluginEvent(int Event,void *Param);
 		virtual HANDLE GetPluginHandle() {return nullptr;}
 		virtual void SetTitle();
 		virtual string &GetTitle(string &Title,int SubLen=-1,int TruncSize=0);
Index: unicode_far/PluginW.pas
===================================================================
--- unicode_far/PluginW.pas	(revision 7981)
+++ unicode_far/PluginW.pas	(working copy)
@@ -2734,12 +2734,13 @@
 { PLUGIN_FLAGS }
 
 const
-  PF_PRELOAD       = $0001;
-  PF_DISABLEPANELS = $0002;
-  PF_EDITOR        = $0004;
-  PF_VIEWER        = $0008;
-  PF_FULLCMDLINE   = $0010;
-  PF_DIALOG        = $0020;
+  PF_PRELOAD        = $0001;
+  PF_DISABLEPANELS  = $0002;
+  PF_EDITOR         = $0004;
+  PF_VIEWER         = $0008;
+  PF_FULLCMDLINE    = $0010;
+  PF_DIALOG         = $0020;
+  PF_ALLPANELEVENTS = $0040;
 
 (*
 struct PluginInfo
Index: plugins/common/unicode/plugin.hpp
===================================================================
--- plugins/common/unicode/plugin.hpp	(revision 7948)
+++ plugins/common/unicode/plugin.hpp	(working copy)
@@ -5,7 +5,7 @@
 /*
   plugin.hpp
 
-  Plugin API for Far Manager 3.0 build 2611
+  Plugin API for Far Manager 3.0 build 2652
 */
 
 /*
@@ -43,7 +43,7 @@
 #define FARMANAGERVERSION_MAJOR 3
 #define FARMANAGERVERSION_MINOR 0
 #define FARMANAGERVERSION_REVISION 0
-#define FARMANAGERVERSION_BUILD 2611
+#define FARMANAGERVERSION_BUILD 2652
 #define FARMANAGERVERSION_STAGE VS_RELEASE
 
 #ifndef RC_INVOKED
@@ -2089,6 +2089,7 @@
 	PF_VIEWER         = 0x0000000000000008ULL,
 	PF_FULLCMDLINE    = 0x0000000000000010ULL,
 	PF_DIALOG         = 0x0000000000000020ULL,
+	PF_ALLPANELEVENTS = 0x0000000000000040ULL,
 	PF_NONE           = 0;
 
 struct PluginMenuItem
pf_allpanelevents.diff (8,623 bytes)   

CyberShadow

2012-04-29 18:55

reporter   bugnote:0009079

Вот патч. Обобщил до всех панельных событий.

Также поправил документацию OpenW. Неужели так трудно доки вместе с API подправить? Убило 10 минут поиска бага.

Плагин: https://github.com/CyberShadow/localcmdhistory/blob/master/src/localcmdhistory.cpp

Maximus

2012-04-30 04:10

reporter   bugnote:0009080

А зачем "время запуска"? Есть же PID - чего проще и удобнее?

CyberShadow

2012-04-30 04:12

reporter   bugnote:0009081

Last edited: 2012-04-30 04:12

PID не уникальный за всё время. Эффект будет, что если стелкой докрутить после конца истории этой сессии, дальше пойдет история предыдущей сессии в которой по случайности FAR имел тот же PID.

Но это уже неважно, патч по другому пути.

CyberShadow

2012-05-01 16:42

reporter   bugnote:0009082

Если от меня чего-либо ожидается для продвижения этой идеи, буду рад это исполнить.

Denis

2012-05-12 09:10

reporter   bugnote:0009164

А что скажут разработчики Far'a? Текущие плагины патч не ломает. Или патч не принимается из соображений "безопасности" - можно будет перехватить всё и вся?

zg

2012-05-12 09:31

developer   bugnote:0009165

разработчиков фара в первую очередь волнуют изменения, которые ломают текущие плагины. как с ними будет покончено, так сразу и за те, которые не ломают примемся.

Denis

2013-02-20 22:26

reporter   bugnote:0010357

Вроде как ломающие изменения позади. Не пришло ли время патча?

CyberShadow

2014-01-11 18:15

reporter  

0001-Add-PF_ALLPANELEVENTS.patch (7,815 bytes)   
From b5ede4cc1fdb65873f7ad2adfdb9df28662fb048 Mon Sep 17 00:00:00 2001
From: Vladimir Panteleev <vladimir@thecybershadow.net>
Date: Sat, 11 Jan 2014 18:08:07 +0000
Subject: [PATCH] Add PF_ALLPANELEVENTS

---
 enc/enc_rus3.work/meta/structures/plugininfo.html  |  4 +++
 .../meta/structures/processpaneleventinfo.html     |  2 +-
 plugins/common/unicode/plugin.hpp                  |  1 +
 unicode_far/PluginW.pas                            | 15 ++++----
 unicode_far/flplugin.cpp                           |  4 +++
 unicode_far/panel.cpp                              |  5 +++
 unicode_far/panel.hpp                              |  2 +-
 unicode_far/plugin.hpp                             |  1 +
 unicode_far/plugins.cpp                            | 40 ++++++++++++++++++++--
 9 files changed, 63 insertions(+), 11 deletions(-)

diff --git a/enc/enc_rus3.work/meta/structures/plugininfo.html b/enc/enc_rus3.work/meta/structures/plugininfo.html
index be51de7..457a9fa 100644
--- a/enc/enc_rus3.work/meta/structures/plugininfo.html
+++ b/enc/enc_rus3.work/meta/structures/plugininfo.html
@@ -53,6 +53,10 @@ struct PluginInfo
     <tr class="cont"><td class="cont" width="40%"><a name="PF_FULLCMDLINE">PF_FULLCMDLINE</a></td>
     <td class="cont" width="60%">��������� Far Manager ��������� ������� �� �������� ������ ������ � ��������� <code>CommandPrefix</code>.
     ��������� ���������� ���� ����, ���� ������ ����� ���������� �������� ��������� <code>CommandPrefix</code>.</td></tr>
+    <tr class="cont"><td class="cont" width="40%"><a name="PF_ALLPANELEVENTS">PF_ALLPANELEVENTS</a></td>
+    <td class="cont" width="60%">��������� Far Manager ��������� ������� ��� ������� �����, ���������� ���� ����� ����������� ������-���� �������.
+    ����� �������� ����� �������� ����� <a href="../exported_functions/processpaneleventw.html">ProcessPanelEventW</a> � ����� <code>hPanel</code> ������ <code>NULL</code>.
+    �������� ����� �������� ����� �����, ������ �������� ���������� ������� ����� ������ TRUE.</td></tr>
     <tr class="cont"><td class="cont" width="40%"><a name="PF_NONE">PF_NONE</a></td>
     <td class="cont" width="60%">������� ����.</td></tr>
     </table></div>
diff --git a/enc/enc_rus3.work/meta/structures/processpaneleventinfo.html b/enc/enc_rus3.work/meta/structures/processpaneleventinfo.html
index a97fd81..656ef73 100644
--- a/enc/enc_rus3.work/meta/structures/processpaneleventinfo.html
+++ b/enc/enc_rus3.work/meta/structures/processpaneleventinfo.html
@@ -79,7 +79,7 @@ struct ProcessPanelEventInfo
   <div class=dfn>Param</div>
     <div class=dfndescr>������� �������� ������� �� ���� �����. �������� �������� ������ �� ������� ���������.</div>
   <div class=dfn>hPanel</div>
-    <div class=dfndescr>�������� ������, ���������� ������� <a href="../exported_functions/openw.html">OpenW</a>.</div>
+    <div class=dfndescr>�������� ������, ���������� ������� <a href="../exported_functions/openw.html">OpenW</a>. ����� �� NULL, ���� � PluginInfo.Flags �� ������ <a href="plugininfo.html#PF_ALLPANELEVENTS">PF_ALLPANELEVENTS</a>.</div>
 </div>
 
 <h3>�������</h3>
diff --git a/plugins/common/unicode/plugin.hpp b/plugins/common/unicode/plugin.hpp
index 5e99cc3..7245540 100644
--- a/plugins/common/unicode/plugin.hpp
+++ b/plugins/common/unicode/plugin.hpp
@@ -2188,6 +2188,7 @@ static const PLUGIN_FLAGS
 	PF_VIEWER         = 0x0000000000000008ULL,
 	PF_FULLCMDLINE    = 0x0000000000000010ULL,
 	PF_DIALOG         = 0x0000000000000020ULL,
+	PF_ALLPANELEVENTS = 0x0000000000000040ULL,
 	PF_NONE           = 0;
 
 struct PluginMenuItem
diff --git a/unicode_far/PluginW.pas b/unicode_far/PluginW.pas
index 6fcd8e0..217d8f9 100644
--- a/unicode_far/PluginW.pas
+++ b/unicode_far/PluginW.pas
@@ -3491,13 +3491,14 @@ type
   TPluginFlags = Int64;
 
 const
-  PF_NONE          = 0;
-  PF_PRELOAD       = $0001;
-  PF_DISABLEPANELS = $0002;
-  PF_EDITOR        = $0004;
-  PF_VIEWER        = $0008;
-  PF_FULLCMDLINE   = $0010;
-  PF_DIALOG        = $0020;
+  PF_NONE           = 0;
+  PF_PRELOAD        = $0001;
+  PF_DISABLEPANELS  = $0002;
+  PF_EDITOR         = $0004;
+  PF_VIEWER         = $0008;
+  PF_FULLCMDLINE    = $0010;
+  PF_DIALOG         = $0020;
+  PF_ALLPANELEVENTS = $0040;
 
 (*
 struct PluginMenuItem
diff --git a/unicode_far/flplugin.cpp b/unicode_far/flplugin.cpp
index bfb4258..c6fee5a 100644
--- a/unicode_far/flplugin.cpp
+++ b/unicode_far/flplugin.cpp
@@ -1169,6 +1169,10 @@ PluginHandle* FileList::GetPluginHandle() const
 
 int FileList::ProcessPluginEvent(int Event,void *Param)
 {
+	// ���� ������ ���� ��������� �� �������� ������
+	if (Panel::ProcessPluginEvent(Event, Param))
+		return TRUE;
+
 	if (PanelMode==PLUGIN_PANEL)
 		return(Global->CtrlObject->Plugins->ProcessEvent(hPlugin,Event,Param));
 
diff --git a/unicode_far/panel.cpp b/unicode_far/panel.cpp
index e288480..af1af68 100644
--- a/unicode_far/panel.cpp
+++ b/unicode_far/panel.cpp
@@ -2723,3 +2723,8 @@ bool Panel::ExecShortcutFolder(string& strShortcutFolder, const GUID& PluginGuid
 	SrcPanel->Redraw();
 	return true;
 }
+
+int Panel::ProcessPluginEvent(int Event,void *Param)
+{
+	return Global->CtrlObject->Plugins->ProcessEvent(NULL,Event,Param);
+}
diff --git a/unicode_far/panel.hpp b/unicode_far/panel.hpp
index 51c248d..74f17be 100644
--- a/unicode_far/panel.hpp
+++ b/unicode_far/panel.hpp
@@ -247,7 +247,7 @@ public:
 	virtual void GetOpenPanelInfo(struct OpenPanelInfo *Info) {}
 	virtual void SetPluginMode(PluginHandle* hPlugin,const string& PluginFile,bool SendOnFocus=false) {}
 	virtual void SetPluginModified() {}
-	virtual int ProcessPluginEvent(int Event,void *Param) {return FALSE;}
+	virtual int ProcessPluginEvent(int Event,void *Param);
 	virtual PluginHandle* GetPluginHandle() const {return nullptr;}
 	virtual void SetTitle();
 	virtual const string& GetTitle(string &Title);
diff --git a/unicode_far/plugin.hpp b/unicode_far/plugin.hpp
index 2e3f78d..1699656 100644
--- a/unicode_far/plugin.hpp
+++ b/unicode_far/plugin.hpp
@@ -2356,6 +2356,7 @@ static const PLUGIN_FLAGS
 	PF_VIEWER         = 0x0000000000000008ULL,
 	PF_FULLCMDLINE    = 0x0000000000000010ULL,
 	PF_DIALOG         = 0x0000000000000020ULL,
+	PF_ALLPANELEVENTS = 0x0000000000000040ULL,
 	PF_NONE           = 0;
 
 struct PluginMenuItem
diff --git a/unicode_far/plugins.cpp b/unicode_far/plugins.cpp
index 7b07bff..2e63548 100644
--- a/unicode_far/plugins.cpp
+++ b/unicode_far/plugins.cpp
@@ -1086,11 +1086,47 @@ int PluginManager::ProcessKey(PluginHandle* hPlugin,const INPUT_RECORD *Rec, boo
 int PluginManager::ProcessEvent(PluginHandle* hPlugin, int Event, void *Param)
 {
 	ProcessPanelEventInfo Info = {sizeof(Info)};
-	Info.hPanel = hPlugin->hPlugin;
 	Info.Event = Event;
 	Info.Param = Param;
 
-	return hPlugin->pPlugin->ProcessPanelEvent(&Info);
+	if (!hPlugin)
+	{
+		// hPlugin==NULL �� ��������� ������ �� ��� �����
+		// (�������� ���� �������� � PF_ALLPANELEVENTS)
+		Info.hPanel = NULL;
+
+		FOR(const auto& i, SortedPlugins)
+		{
+			UINT64 IFlags;
+
+			if (i->CheckWorkFlags(PIWF_CACHED))
+			{
+				unsigned __int64 id = Global->Db->PlCacheCfg()->GetCacheID(i->GetCacheName());
+				IFlags = Global->Db->PlCacheCfg()->GetFlags(id);
+			}
+			else
+			{
+				PluginInfo Info = {sizeof(Info)};
+				if (!i->GetPluginInfo(&Info))
+					continue;
+
+				IFlags = Info.Flags;
+			}
+
+			if (IFlags & PF_ALLPANELEVENTS && i->HasProcessPanelEvent())
+			{
+				if (i->Load() && i->ProcessPanelEvent(&Info))
+					return TRUE;
+			}
+		}
+
+		return FALSE;
+	}
+	else
+	{
+		Info.hPanel = hPlugin->hPlugin;
+		return hPlugin->pPlugin->ProcessPanelEvent(&Info);
+	}
 }
 
 
-- 
1.8.3.msysgit.0.5.gfaaeac2

CyberShadow

2014-01-11 18:17

reporter   bugnote:0011624

Обновил патч.

CyberShadow

2014-01-30 14:20

reporter   bugnote:0011802

Оригинальная проблема отлично решается отключением истории Far и использованием плагина AltHistory. Таким образом на стрелках - локальная история, на Ctrl+X/E и AltF8 - глобальная.

Предложенный патч и демо-плагин проблему решают плохо, т.к. все равно не перехватываются команды, выполненные нажатием Enter над файлом.

JohnDoe

2014-02-04 12:04

updater   bugnote:0011818

CyberShadow
Может быть не стоит торопиться и закрывать тикет?

Если ваш первый комментарий (0002084:0009027) актуален, то предлагается решить 2 независимые проблемы:

3а. Передавать плагинам информацию о смене папок, открытии файлов и др.
3б. Сохранять в истории вместе с прочей информацией и идентификатор сессии

Вопрос а) интересен, подымался и ранее и вроде бы никто не возражал, но делать пока некому.
Вопрос б) в общем независим от а), и как я понимаю несложен в реализации

Для решения задачи заявленой в описании тикета достаточно и б)
Ведь если в апи будет возможность получить id сессии, то макросом несложно реализовать фильтр по истории.

(Обратите внимание на недавний тикет 0002208, реализующий сохранение текущей папки, и на макрос http://forum.farmanager.com/viewtopic.php?f=60&t=8289)

JohnDoe

2019-05-30 07:26

updater   bugnote:0016513

> 3б. Сохранять в истории вместе с прочей информацией и идентификатор сессии

А в идеале ещё и различать панели, тогда появится возможность восстановить сторию переходов для каждой

Issue History

Date Modified Username Field Change
2012-04-23 14:11 CyberShadow New Issue
2012-04-23 14:24 JohnDoe Note Added: 0009025
2012-04-23 14:31 CyberShadow Note Added: 0009027
2012-04-23 16:01 JohnDoe Note Added: 0009028
2012-04-23 18:08 zg Note Added: 0009034
2012-04-23 18:32 CyberShadow Note Added: 0009035
2012-04-23 19:00 JohnDoe Note Added: 0009037
2012-04-23 19:04 CyberShadow Note Added: 0009038
2012-04-23 23:43 zg Note Added: 0009039
2012-04-24 05:58 JohnDoe Note Added: 0009041
2012-04-25 13:50 CyberShadow Note Added: 0009056
2012-04-29 18:50 CyberShadow File Added: pf_allpanelevents.diff
2012-04-29 18:55 CyberShadow Note Added: 0009079
2012-04-30 04:10 Maximus Note Added: 0009080
2012-04-30 04:12 CyberShadow Note Added: 0009081
2012-04-30 04:12 CyberShadow Note Edited: 0009081
2012-05-01 16:42 CyberShadow Note Added: 0009082
2012-05-12 09:10 Denis Note Added: 0009164
2012-05-12 09:31 zg Note Added: 0009165
2013-02-03 00:31 alexy Severity minor => feature
2013-02-20 22:26 Denis Note Added: 0010357
2014-01-11 18:15 CyberShadow File Added: 0001-Add-PF_ALLPANELEVENTS.patch
2014-01-11 18:17 CyberShadow Note Added: 0011624
2014-01-30 14:20 CyberShadow Note Added: 0011802
2014-01-30 14:20 CyberShadow Status new => resolved
2014-02-04 12:04 JohnDoe Note Added: 0011818
2019-05-30 07:26 JohnDoe Note Added: 0016513
2019-05-30 07:26 JohnDoe Status resolved => new