ProcessConsoleInput

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

ProcessConsoleInput

Post by Shmuel » Wed 18 Feb, 2015 10:35

Latest post of the previous page:

Приложена LuaMacro.dll, содержащая ProcessConsoleInputW. Вставьте в какой-либо макрофайл функцию export.ProcessConsoleInput() согласно документации LuaFAR и экспериментируйте.
LuaMacro.dll.7z
(16.55 KiB) Downloaded 63 times

User avatar
John Doe
Бюрократ
Posts: 12192
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 31 times
Been thanked: 159 times

ProcessConsoleInput

Post by John Doe » Wed 18 Feb, 2015 12:31

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

Что ещё интересно: клавиша передаётся в ProcessConsoleInput только в случае, если нажатие не привело к запуску макроса, т.е. после проверки всех условий.
А значит в плагине таки можно извратиться, и получить информацию о моменте нажатия.
Для этого плагину потребуется создать вспомогательный макрос с повышенным приоритетом, MCTL_ADDMACRO наверно подойдёт.

User avatar
John Doe
Бюрократ
Posts: 12192
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 31 times
Been thanked: 159 times

ProcessConsoleInput

Post by John Doe » Wed 18 Feb, 2015 15:41

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

P.S.
На практике, в большинстве случаев приходит 0, а в командной строке 1 (но только если на экране нет списка автодополнения).
Но как применить флаг мне непонятно.

User avatar
John Doe
Бюрократ
Posts: 12192
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 31 times
Been thanked: 159 times

ProcessConsoleInput

Post by John Doe » Wed 18 Feb, 2015 16:04

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

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: 12192
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 31 times
Been thanked: 159 times

ProcessConsoleInput

Post by John Doe » Wed 18 Feb, 2015 21:40

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

Update: выяснилось, что это KEY_NONE.

User avatar
John Doe
Бюрократ
Posts: 12192
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 31 times
Been thanked: 159 times

ProcessConsoleInput

Post by John Doe » Mon 23 Mar, 2015 11:01

zg wrote: ProcessConsoleInput [...] может быть выпилено завтра хоть полностью. или сегодня.
Действительно ли у вас есть такое намерение?

User avatar
zg
zero-gravity
Posts: 5540
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 85 times
Contact:

ProcessConsoleInput

Post by zg » Mon 23 Mar, 2015 12:56

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

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

надеюсь мой ответ на ваш вопрос был развёрнутым и аргументированным.

IgorZ
Posts: 584
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 35 times

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

Post by IgorZ » Tue 19 Dec, 2017 11:50

Наверное, всё-таки сюда.
  1. Делаем такой простой скрипт:
    1. local F = far.Flags
    2. Event{
    3.   group="ConsoleInput";
    4.   description="test mouse click";
    5.   condition=function(tInputRecord)
    6. return tInputRecord.EventType==F.MOUSE_EVENT
    7.    and tInputRecord.ButtonState~=0
    8. end;
    9.   action=function(tInputRecord)
    10. far.Show(tInputRecord.ButtonState)
    11. return 1
    12. end;
    13. }
  2. Выполняем macro:load.
  3. Включаем обе панели (если были выключены).
    Щёлкаем левой кнопкой мыши - получаем 1.
    Щёлкаем правой кнопкой мыши - получаем 1.
  4. Выключаем одну панель.
    Щёлкаем левой кнопкой мыши в оставшейся панели - получаем 1.
    Щёлкаем правой кнопкой мыши в оставшейся панели - получаем 1.
    Проделываем то же самое на месте выключенной панели: результат идентичен.
  5. Выключаем вторую панель панель.
    Щёлкаем левой кнопкой мыши в оставшейся панели - получаем 1.
    Щёлкаем правой кнопкой мыши в оставшейся панели - получаем 2. Как и должно быть с самого начала.
Windows XP, Far 3.0.5106 x86.

User avatar
John Doe
Бюрократ
Posts: 12192
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 31 times
Been thanked: 159 times

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

Post by John Doe » Tue 19 Dec, 2017 12:04

Наличие других макросов?

IgorZ
Posts: 584
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 35 times

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

Post by IgorZ » Tue 19 Dec, 2017 12:09

John Doe wrote:
Tue 19 Dec, 2017 12:04
Наличие других макросов?
Да, пардон. Забыл сразу проверить, прежде чем волну гнать. На голом профиле (из плагинов только LuaMacro, из скриптов только этот) всё работает правильно. Буду искать причину.

User avatar
John Doe
Бюрократ
Posts: 12192
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 31 times
Been thanked: 159 times

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

Post by John Doe » Tue 19 Dec, 2017 12:14

ProcessConsoleInput не получает сочетания, на которые назначены макросы
https://bugs.farmanager.com/view.php?id=2952

IgorZ
Posts: 584
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 35 times

ProcessConsoleInput

Post by IgorZ » Tue 19 Dec, 2017 12:33

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

Post Reply

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