ProcessConsoleInput

Место, где разработчики плагинов могут поделиться своим опытом.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

ProcessConsoleInput

Post by Shmuel »

Latest post of the previous page:

Приложена LuaMacro.dll, содержащая ProcessConsoleInputW. Вставьте в какой-либо макрофайл функцию export.ProcessConsoleInput() согласно документации LuaFAR и экспериментируйте.
LuaMacro.dll.7z
(16.55 KiB) Downloaded 126 times
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

ProcessConsoleInput

Post by John Doe »

Shmuel wrote:Приложена LuaMacro.dll, содержащая ProcessConsoleInputW. Вставьте в какой-либо макрофайл функцию export.ProcessConsoleInput() согласно документации LuaFAR и экспериментируйте.
LuaMacro.dll.7z
Спасибо!
Выяснил что для модификаторов наоборот, нажатие передаётся, а отпускание съедается.

Что ещё интересно: клавиша передаётся в ProcessConsoleInput только в случае, если нажатие не привело к запуску макроса, т.е. после проверки всех условий.
А значит в плагине таки можно извратиться, и получить информацию о моменте нажатия.
Для этого плагину потребуется создать вспомогательный макрос с повышенным приоритетом, MCTL_ADDMACRO наверно подойдёт.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

ProcessConsoleInput

Post by John Doe »

В структуре ProcessConsoleInputInfo есть параметр Flags.
Значение PCIF_FROMMAIN означает, что "Функция ProcessConsoleInputW вызвана из основного цикла сбора консольных событий."
Вопрос: как вообще можно использовать эту информацию?

P.S.
На практике, в большинстве случаев приходит 0, а в командной строке 1 (но только если на экране нет списка автодополнения).
Но как применить флаг мне непонятно.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

ProcessConsoleInput

Post by John Doe »

И второй, связанный с этим момент: примерно раз в секунду приходит такое сообщение:

Code: Select all

Flags = 0
Rec = {
   ControlKeyState = 0,
   EventType = 1,
   KeyDown = false,
   RepeatCount = 0,
   UnicodeChar = "", -- \000
   VirtualKeyCode = 0,
   VirtualScanCode = 0
 }
Приходит отовсюду, кроме командной строки. В покое, безотносительно каких-либо нажатий, хотя EventType = 1.
Не баг ли это?

Update: выяснилось, что это KEY_IDLE.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

ProcessConsoleInput

Post by John Doe »

Shmuel wrote: при наличии макроса, ProcessConsoleInputW не вызывается при нажатии, но вызывается при отпускании.
Заметил что в этом случае при нажатии приходит "пустое"(?) событие с EventType = 0.
В документации такой тип не описан, что опять же наводит на мысли о баге.

Update: выяснилось, что это KEY_NONE.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

ProcessConsoleInput

Post by John Doe »

zg wrote: ProcessConsoleInput [...] может быть выпилено завтра хоть полностью. или сегодня.
Действительно ли у вас есть такое намерение?
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

ProcessConsoleInput

Post by zg »

John Doe wrote:
zg wrote: ProcessConsoleInput [...] может быть выпилено завтра хоть полностью. или сегодня.
Действительно ли у вас есть такое намерение?
моё отношение к ProcessConsoleInput — строго отрицательное. потому что плюсов я не вижу не одного, а минуса целых два.
1. ProcessConsoleInput вводится, как расширение возможностей по обработке ввода. по факту это значит следующее: в keyboard.cpp у нас ад, что-то там начнёшь развивать — всё развалится, проще сделать хук, в нём — новые фишки, а keyboard.cpp не трогаем, авось пронесёт. да такой подход даёт некоторые бонусы в близкосрочной перспективе, но очевидно, что ничего хорошего в итоге не выйдет, когда-нибудь разбираться всё равно придётся (уже сейчас есть зависшие тикеты на мантисе), а поддержка ProcessConsoleInput количество костылей однозначно увеличит, что осложнит работы по разгребанию keyboard.cpp.
2. можно возразить, что ProcessConsoleInput — это не только макролиб, это возможность любому плагину перехватывать ввод не только в редакторе и диалогах. прекрасно, но текущий дизайн не предусматривает никаких попыток управления ситуацией, когда плагинов, экспортирующих ProcessConsoleInput больше одного. опыт ProcessEditorInput говорит, что это важно. здесь же перехват вообще глобальный и очевидно, что управление ещё более важно.

поэтому пока это всё лежало где-то в сторонке, мне было всё равно. когда вы достали это и начали тыкать мне в лицо, мне это стало не нравится. когда моё терпение иссякнет, я удалю поддержку ProcessConsoleInput.

надеюсь мой ответ на ваш вопрос был развёрнутым и аргументированным.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by IgorZ »

Наверное, всё-таки сюда.
  1. Делаем такой простой скрипт:
    1. local F = far.Flags
    2.  
    3. Event{
    4.  
    5.   group="ConsoleInput";
    6.  
    7.   description="test mouse click";
    8.  
    9.   condition=function(tInputRecord)
    10.  
    11. return tInputRecord.EventType==F.MOUSE_EVENT
    12.  
    13.    and tInputRecord.ButtonState~=0
    14.  
    15. end;
    16.  
    17.   action=function(tInputRecord)
    18.  
    19. far.Show(tInputRecord.ButtonState)
    20.  
    21. return 1
    22.  
    23. end;
    24.  
    25. }
  2. Выполняем macro:load.
  3. Включаем обе панели (если были выключены).
    Щёлкаем левой кнопкой мыши - получаем 1.
    Щёлкаем правой кнопкой мыши - получаем 1.
  4. Выключаем одну панель.
    Щёлкаем левой кнопкой мыши в оставшейся панели - получаем 1.
    Щёлкаем правой кнопкой мыши в оставшейся панели - получаем 1.
    Проделываем то же самое на месте выключенной панели: результат идентичен.
  5. Выключаем вторую панель панель.
    Щёлкаем левой кнопкой мыши в оставшейся панели - получаем 1.
    Щёлкаем правой кнопкой мыши в оставшейся панели - получаем 2. Как и должно быть с самого начала.
Windows XP, Far 3.0.5106 x86.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Наличие других макросов?
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

LuaFAR — библиотека для создания плагинов на языке Lua

Post by IgorZ »

John Doe wrote: Tue 19 Dec, 2017 12:04 Наличие других макросов?
Да, пардон. Забыл сразу проверить, прежде чем волну гнать. На голом профиле (из плагинов только LuaMacro, из скриптов только этот) всё работает правильно. Буду искать причину.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

ProcessConsoleInput не получает сочетания, на которые назначены макросы
https://bugs.farmanager.com/view.php?id=2952
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

ProcessConsoleInput

Post by IgorZ »

Виноват
Даже не помню, когда и зачем я его ставил?.. Значит, точно не нужен. Проблема снята, спасибо за поддержку.
Post Reply

Return to “Разработка плагинов”