View Issue Details

IDProjectCategoryView StatusLast Update
0001687WishesPlugins APIpublic2017-10-25 17:56
Reportermax rusov Assigned Tovskirdin  
PrioritynormalSeverityfeatureReproducibilityN/A
Status closedResolutionfixed 
Product Version2.0 
Fixed in Version3.0 
Summary0001687: ProcessConsoleInput
DescriptionПо мотивам топика http://forum.farmanager.com/viewtopic.php?f=8&t=6102

Некоторое количество плагинов используют технологию хака таблицы импорта, для перехвата функций ReadConsoleInput/WriteConsoleOutput. Это в целом работает, но есть неприятный эффект. Если такой перехват сделали 2 или более плагина то корректно выгрузить их можно только в порядке обратном загрузке, иначе выгружаемый плагин снесет все позже установленные обработчики. Или не снесет, но тогда еще хуже - все свалится.

Может "легализовать" эту технологию, раз уж она востребована? Предлагаю добавить в API: если плагин экспортирует специальную функцию (например: ProcessConsoleInput), то FAR вызывает их по очереди для каждого плагина, до того как обработает событие сам. Плагин должен иметь возможность сказать, что он обработал сообщение и его нужно "погасить".

Предлагаю такой прототип функции:
 
function ProcessConsoleInputW(hInput :THandle; var AEvent: TInputRecord; AFlags :DWORD): BOOL; stdcall;

Зачем нужны флаги? На всякий случай. Возможные значения для AFlags:

- Признак Read/Peek, если будет решено что Peek тоже нужен.
- Откуда вызывается функция(?). Тут я не до конца уверен, но есть проблемка в MacroLib'е, что он не может различить, когда ReadConsoleInput вызывается FAR'ом из основного цикла обработки сообщений(?), либо плагином для обработки прерывания. Может ее удастся разрулить флагами.
- Еще что-то...
TagsNo tags attached.
Build2937

Relationships

related to 0001759 assignedvskirdin Far Manager ProcessKeyW вызывается по два раза 
child of 0002070 closedvskirdin Far Manager Ошибка обротки ProcessConsoleInputInfo 

Activities

vskirdin

2011-01-25 12:40

administrator   bugnote:0006239

Есть небольшое уточнение - в очереди может быть больше 1 события :-)

max rusov

2011-01-25 14:25

reporter   bugnote:0006242

FAR, вроде, всегда выбирает события по одному, поэтому я решил упростить. Но если это не так - можно сделать с буфером, нет проблем.

vskirdin

2011-05-11 10:56

administrator   bugnote:0006875

struct ProcessConsoleInput
{
  size_t StructSize;
  const INPUT_RECORD *RecIn;
  INPUT_RECORD *RecOut;
};

int WINAPI ProcessConsoleInputW(struct ProcessConsoleInput *Info);

так?
или RecOut это чревато?

Yegor

2011-05-11 11:02

reporter   bugnote:0006876

Как по мне, RecOut не нужен. Всегда можно модифицировать RecIn

vskirdin

2011-05-11 11:44

administrator   bugnote:0006877

Можно, но фар в этом случае (если такой вид структуры примется) будет смотреть только код возврата и на RecOut (если код соответствующий) :-)

max rusov

2011-09-26 22:07

reporter   bugnote:0007751

Хотелось бы узнать в каком состоянии данная задача? Попробовал в MacroLib'е отказаться от хака, в общем почти все работает, но есть несколько замечаний. Высказывать, или пока просто не доделано что-то?

vskirdin

2011-09-27 07:06

administrator   bugnote:0007754

Если есть желание - доковыряй сам (времени пока нет). Там вроде по тексту в нужных местах дефы компиляции расставлены...

vskirdin

2011-10-01 06:23

administrator   bugnote:0007798

запускаем в свободное плавание или есть нарекания?

max rusov

2011-10-01 19:21

reporter   bugnote:0007802

Не очень работает с событиями мыши. События от колеса вообще не приходят. Клики приходят, но не "давятся", т.е. даже если плагин вернул 1 - то Far все равно реагирует на клик.

vskirdin

2011-10-03 06:43

administrator   bugnote:0007806

попробуй в keyboard.cpp строка 645 условие поменять с "if (Key)" на "if (Key != KEY_NONE)"...

max rusov

2011-10-03 07:07

reporter   bugnote:0007807

Не, так совсем плохо - не приходит отпускание кнопки, у меня половина макросов вообще отваливается.

vskirdin

2011-10-03 07:59

administrator   bugnote:0007810

походу надо GetInputRecord полностью переписывать... :-(

Maximus

2012-04-18 07:30

reporter   bugnote:0008946

max rusov, после 2621 проблемы еще остались?

Maximus

2012-04-18 07:37

reporter   bugnote:0008947

И я бы таки предложил не только _запрещать_ событие, но и давать как-то его менять.
Может все-таки "const INPUT_RECORD *Rec;" заменить на "INPUT_RECORD *Rec;"?
А плагин должен будет вернуть, например,
0 - продолжить
1 - если событие "запрещено"
2 - если он изменил событие

Почему новый код возврата - фар должен пересчитать keycode.

Еще вариант, без спец.кодов возврата.
Добавить в ProcessConsoleInputInfo поле "INPUT_RECORD NewRec", по умолчанию пустое (EventType=0). Если плагин вернул TRUE, и (EventType!=0) - то фар меняет свой считанный Rec и keycode.

max rusov

2012-04-18 08:28

reporter   bugnote:0008948

> max rusov, после 2621 проблемы еще остались?
На первый взгляд - все работает.

> И я бы таки предложил не только _запрещать_ событие, но и давать как-то его менять.
Есть пример как это можно было бы использовать?

vskirdin

2012-04-18 09:04

administrator   bugnote:0008949

Как бы не просто const убрать, а сделать не ссылку, а объект Rec.
INPUT_RECORD Rec;

Maximus

2012-04-18 09:31

reporter   bugnote:0008950

Пример - QsearchSwitch. Сейчас оно через жопу (сначала запрещает обработку, а потом допихивает в буфер ввода то что требуется). Хочется как-то покрасивше...

Ок, можно сделать INPUT_RECORD Rec;
А как тогда фар будет "понимать", что плагинзменил событие? Таки 0-1-2 коды возврата? Или после FALSE фару нужно memcpy дергать?

vskirdin

2012-04-18 09:40

administrator   bugnote:0008951

коды возврата и memcpy
по крайней мере плагин не изгадит память ФАРа

max rusov

2012-04-19 09:34

reporter   bugnote:0008958

Может стоит уже в официальной сборке включить эту опцию?

vskirdin

2012-04-19 10:00

administrator   bugnote:0008959

А всё устраивает?
Включить то никогда не поздно. Другое дело "ломать" АПИ - болезненно.

Maximus

2012-04-19 10:13

reporter   bugnote:0008960

Не, я считаю рано. Вот структурку поменяю - тогда.

Maximus

2012-04-20 07:48

reporter  

1687.120420.diff (1,886 bytes)   
Index: keyboard.cpp
===================================================================
--- keyboard.cpp	(revision 7925)
+++ keyboard.cpp	(working copy)
@@ -636,25 +636,28 @@
 DWORD GetInputRecord(INPUT_RECORD *rec,bool ExcludeMacro,bool ProcessMouse,bool AllowSynchro)
 {
 	DWORD Key = __GetInputRecord(rec,ExcludeMacro,ProcessMouse,AllowSynchro);
-	bool Halt=false;
 
 	if (Key)
 	{
 		if (CtrlObject)
 		{
-			ProcessConsoleInputInfo Info={sizeof(Info),PCIF_NONE,rec};
+			ProcessConsoleInputInfo Info={sizeof(Info),PCIF_NONE,*rec};
 			//Info.hPanel
 			if (WaitInMainLoop)
 				Info.Flags|=PCIF_FROMMAIN;
-			if (CtrlObject->Plugins->ProcessConsoleInput(&Info))
-				Halt=true;
+			switch (CtrlObject->Plugins->ProcessConsoleInput(&Info))
+			{
+			case 1:
+				Key=KEY_NONE;
+				KeyToInputRecord(Key, rec);
+				break;
+			case 2:
+				*rec=Info.Rec;
+				Key=CalcKeyCode(rec,FALSE);
+				break;
+			}
 		}
 	}
-	if (Halt)
-	{
-		Key=KEY_NONE;
-		KeyToInputRecord(Key, rec);
-	}
 	return Key;
 }
 
Index: plugins.cpp
===================================================================
--- plugins.cpp	(revision 7925)
+++ plugins.cpp	(working copy)
@@ -1114,8 +1114,18 @@
 		Plugin *pPlugin = PluginsData[i];
 
 		if (pPlugin->HasProcessConsoleInput())
-			if ((nResult = pPlugin->ProcessConsoleInput(Info)) != 0)
+		{
+			int n = pPlugin->ProcessConsoleInput(Info);
+			if (n == 1)
+			{
+				nResult = 1;
 				break;
+			}
+			else if (n == 2)
+			{
+				nResult = 2;
+			}
+		}
 	}
 
 	return nResult;
Index: plugin.hpp
===================================================================
--- plugin.hpp	(revision 7925)
+++ plugin.hpp	(working copy)
@@ -2650,7 +2650,7 @@
 {
 	size_t StructSize;
 	PROCESSCONSOLEINPUT_FLAGS Flags;
-	const INPUT_RECORD *Rec;
+	INPUT_RECORD Rec;
 	HANDLE hPanel;
 };
 #endif
1687.120420.diff (1,886 bytes)   

Maximus

2012-04-20 07:49

reporter   bugnote:0008979

Вроде как-то так. Поиграться - Far/MacroLib/QSearchSwitch - у меня в загрузках
http://code.google.com/p/conemu-maximus5/downloads/list

Плагин должен вернуть
0 - продолжить в фаре
1 - запретить обработку
2 - поменял Rec, пересчитать KeyCode

vskirdin

2012-04-20 09:40

administrator   bugnote:0008981

build 2630

vskirdin

2012-04-25 13:26

administrator   bugnote:0009054

Едем дальше?

Maximus

2012-04-25 13:46

reporter   bugnote:0009055

сильных глюков не видно, пора релиз?

vskirdin

2012-09-24 07:42

administrator   bugnote:0009531

Открываем.
build 2937
Баги в рамках новых Инцов

Issue History

Date Modified Username Field Change
2011-01-24 14:45 max rusov New Issue
2011-01-25 12:40 vskirdin Note Added: 0006239
2011-01-25 14:25 max rusov Note Added: 0006242
2011-05-11 10:56 vskirdin Note Added: 0006875
2011-05-11 11:02 Yegor Note Added: 0006876
2011-05-11 11:44 vskirdin Note Added: 0006877
2011-09-26 22:07 max rusov Note Added: 0007751
2011-09-27 07:06 vskirdin Note Added: 0007754
2011-10-01 06:23 vskirdin Note Added: 0007798
2011-10-01 19:21 max rusov Note Added: 0007802
2011-10-03 06:43 vskirdin Note Added: 0007806
2011-10-03 07:07 max rusov Note Added: 0007807
2011-10-03 07:59 vskirdin Note Added: 0007810
2012-04-16 06:44 vskirdin Relationship added child of 0002070
2012-04-18 07:30 Maximus Note Added: 0008946
2012-04-18 07:37 Maximus Note Added: 0008947
2012-04-18 08:28 max rusov Note Added: 0008948
2012-04-18 09:04 vskirdin Note Added: 0008949
2012-04-18 09:31 Maximus Note Added: 0008950
2012-04-18 09:40 vskirdin Note Added: 0008951
2012-04-19 09:34 max rusov Note Added: 0008958
2012-04-19 10:00 vskirdin Note Added: 0008959
2012-04-19 10:13 Maximus Note Added: 0008960
2012-04-20 07:48 Maximus File Added: 1687.120420.diff
2012-04-20 07:49 Maximus Note Added: 0008979
2012-04-20 09:40 vskirdin Note Added: 0008981
2012-04-20 09:40 vskirdin Assigned To => vskirdin
2012-04-20 09:40 vskirdin Status new => feedback
2012-04-25 13:26 vskirdin Note Added: 0009054
2012-04-25 13:46 Maximus Note Added: 0009055
2012-09-24 07:42 vskirdin Build => 2937
2012-09-24 07:42 vskirdin Note Added: 0009531
2012-09-24 07:42 vskirdin Status feedback => closed
2012-09-24 07:42 vskirdin Resolution open => fixed
2012-09-24 07:42 vskirdin Fixed in Version => 3.0
2013-02-03 00:33 alexy Severity minor => feature
2017-10-25 17:56 JohnDoe Relationship added related to 0001759