View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001687 | Wishes | Plugins API | public | 2011-01-24 14:45 | 2017-10-25 18:56 |
Reporter | max rusov | Assigned To | vskirdin | ||
Priority | normal | Severity | feature | Reproducibility | N/A |
Status | closed | Resolution | fixed | ||
Product Version | 2.0 | ||||
Fixed in Version | 3.0 | ||||
Summary | 0001687: 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'ом из основного цикла обработки сообщений(?), либо плагином для обработки прерывания. Может ее удастся разрулить флагами. - Еще что-то... | ||||
Tags | No tags attached. | ||||
Build | 2937 | ||||
|
Есть небольшое уточнение - в очереди может быть больше 1 события :-) |
|
FAR, вроде, всегда выбирает события по одному, поэтому я решил упростить. Но если это не так - можно сделать с буфером, нет проблем. |
|
struct ProcessConsoleInput { size_t StructSize; const INPUT_RECORD *RecIn; INPUT_RECORD *RecOut; }; int WINAPI ProcessConsoleInputW(struct ProcessConsoleInput *Info); так? или RecOut это чревато? |
|
Как по мне, RecOut не нужен. Всегда можно модифицировать RecIn |
|
Можно, но фар в этом случае (если такой вид структуры примется) будет смотреть только код возврата и на RecOut (если код соответствующий) :-) |
|
Хотелось бы узнать в каком состоянии данная задача? Попробовал в MacroLib'е отказаться от хака, в общем почти все работает, но есть несколько замечаний. Высказывать, или пока просто не доделано что-то? |
|
Если есть желание - доковыряй сам (времени пока нет). Там вроде по тексту в нужных местах дефы компиляции расставлены... |
|
запускаем в свободное плавание или есть нарекания? |
|
Не очень работает с событиями мыши. События от колеса вообще не приходят. Клики приходят, но не "давятся", т.е. даже если плагин вернул 1 - то Far все равно реагирует на клик. |
|
попробуй в keyboard.cpp строка 645 условие поменять с "if (Key)" на "if (Key != KEY_NONE)"... |
|
Не, так совсем плохо - не приходит отпускание кнопки, у меня половина макросов вообще отваливается. |
|
походу надо GetInputRecord полностью переписывать... :-( |
|
max rusov, после 2621 проблемы еще остались? |
|
И я бы таки предложил не только _запрещать_ событие, но и давать как-то его менять. Может все-таки "const INPUT_RECORD *Rec;" заменить на "INPUT_RECORD *Rec;"? А плагин должен будет вернуть, например, 0 - продолжить 1 - если событие "запрещено" 2 - если он изменил событие Почему новый код возврата - фар должен пересчитать keycode. Еще вариант, без спец.кодов возврата. Добавить в ProcessConsoleInputInfo поле "INPUT_RECORD NewRec", по умолчанию пустое (EventType=0). Если плагин вернул TRUE, и (EventType!=0) - то фар меняет свой считанный Rec и keycode. |
|
> max rusov, после 2621 проблемы еще остались? На первый взгляд - все работает. > И я бы таки предложил не только _запрещать_ событие, но и давать как-то его менять. Есть пример как это можно было бы использовать? |
|
Как бы не просто const убрать, а сделать не ссылку, а объект Rec. INPUT_RECORD Rec; |
|
Пример - QsearchSwitch. Сейчас оно через жопу (сначала запрещает обработку, а потом допихивает в буфер ввода то что требуется). Хочется как-то покрасивше... Ок, можно сделать INPUT_RECORD Rec; А как тогда фар будет "понимать", что плагинзменил событие? Таки 0-1-2 коды возврата? Или после FALSE фару нужно memcpy дергать? |
|
коды возврата и memcpy по крайней мере плагин не изгадит память ФАРа |
|
Может стоит уже в официальной сборке включить эту опцию? |
|
А всё устраивает? Включить то никогда не поздно. Другое дело "ломать" АПИ - болезненно. |
|
Не, я считаю рано. Вот структурку поменяю - тогда. |
|
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 |
|
Вроде как-то так. Поиграться - Far/MacroLib/QSearchSwitch - у меня в загрузках http://code.google.com/p/conemu-maximus5/downloads/list Плагин должен вернуть 0 - продолжить в фаре 1 - запретить обработку 2 - поменял Rec, пересчитать KeyCode |
|
build 2630 |
|
Едем дальше? |
|
сильных глюков не видно, пора релиз? |
|
Открываем. build 2937 Баги в рамках новых Инцов |
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 11:56 | vskirdin | Note Added: 0006875 | |
2011-05-11 12:02 | Yegor | Note Added: 0006876 | |
2011-05-11 12:44 | vskirdin | Note Added: 0006877 | |
2011-09-26 23:07 | max rusov | Note Added: 0007751 | |
2011-09-27 08:06 | vskirdin | Note Added: 0007754 | |
2011-10-01 07:23 | vskirdin | Note Added: 0007798 | |
2011-10-01 20:21 | max rusov | Note Added: 0007802 | |
2011-10-03 07:43 | vskirdin | Note Added: 0007806 | |
2011-10-03 08:07 | max rusov | Note Added: 0007807 | |
2011-10-03 08:59 | vskirdin | Note Added: 0007810 | |
2012-04-16 07:44 | vskirdin | Relationship added | child of 0002070 |
2012-04-18 08:30 | Maximus | Note Added: 0008946 | |
2012-04-18 08:37 | Maximus | Note Added: 0008947 | |
2012-04-18 09:28 | max rusov | Note Added: 0008948 | |
2012-04-18 10:04 | vskirdin | Note Added: 0008949 | |
2012-04-18 10:31 | Maximus | Note Added: 0008950 | |
2012-04-18 10:40 | vskirdin | Note Added: 0008951 | |
2012-04-19 10:34 | max rusov | Note Added: 0008958 | |
2012-04-19 11:00 | vskirdin | Note Added: 0008959 | |
2012-04-19 11:13 | Maximus | Note Added: 0008960 | |
2012-04-20 08:48 | Maximus | File Added: 1687.120420.diff | |
2012-04-20 08:49 | Maximus | Note Added: 0008979 | |
2012-04-20 10:40 | vskirdin | Note Added: 0008981 | |
2012-04-20 10:40 | vskirdin | Assigned To | => vskirdin |
2012-04-20 10:40 | vskirdin | Status | new => feedback |
2012-04-25 14:26 | vskirdin | Note Added: 0009054 | |
2012-04-25 14:46 | Maximus | Note Added: 0009055 | |
2012-09-24 08:42 | vskirdin | Build | => 2937 |
2012-09-24 08:42 | vskirdin | Note Added: 0009531 | |
2012-09-24 08:42 | vskirdin | Status | feedback => closed |
2012-09-24 08:42 | vskirdin | Resolution | open => fixed |
2012-09-24 08:42 | vskirdin | Fixed in Version | => 3.0 |
2013-02-03 00:33 | alexy | Severity | minor => feature |
2017-10-25 18:56 | JohnDoe | Relationship added | related to 0001759 |