ProcessConsoleInput

Место, где разработчики плагинов могут поделиться своим опытом.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Post by John Doe »

Latest post of the previous page:

Что значит не надо? В этом весь смысл вообще-то.
Зачем мне все эти холды, если я на основную клавишу не смогу прицепить макрос?

А возражения против исправления текущего поведения есть?
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

ProcessConsoleInputW

Post by Max Rusov »

John Doe wrote: Зачем мне все эти холды, если я на основную клавишу не смогу прицепить макрос.
Сможете, только она тоже должна обрабатываться MacroLib'ом. Для этого я и предполагал префикс. Но можно и так, например: "Key:"
John Doe wrote: А возражения против исправления текущего поведения есть?
На первый взгляд - это не должно ничего сломать. Но я сомневаюсь, что это станут править. По моим ощущениям ProcessConsoleInputW пользуется единственный плагин, который, вообщем уже не очень актуален...
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

ProcessConsoleInputW

Post by John Doe »

Max Rusov wrote:Сможете, только она тоже должна обрабатываться MacroLib'ом.
Это уже не очень по-человечески...
Max Rusov wrote:Но я сомневаюсь, что это станут править.
Зависит от трудоемкости, полагаю.
Max Rusov wrote:По моим ощущениям ProcessConsoleInputW пользуется единственный плагин, который, вообщем уже не очень актуален...
Актуален, иначе бы с чего бы мы его сегодня обсуждали.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

ProcessConsoleInput

Post by John Doe »

Shmuel wrote: при наличии макроса, ProcessConsoleInputW не вызывается при нажатии, но вызывается при отпускании.
Подскажите, а для клавиш-модификаторов то же самое?
Если есть макрос на LCtrl, то какие события от этой клавиши получит ProcessConsoleInputW?
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

ProcessConsoleInput

Post by Shmuel »

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

ProcessConsoleInput

Post by John Doe »

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

P.S.
На практике, в большинстве случаев приходит 0, а в командной строке 1 (но только если на экране нет списка автодополнения).
Но как применить флаг мне непонятно.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 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: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

ProcessConsoleInput

Post by John Doe »

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

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

ProcessConsoleInput

Post by John Doe »

zg wrote: ProcessConsoleInput [...] может быть выпилено завтра хоть полностью. или сегодня.
Действительно ли у вас есть такое намерение?
User avatar
zg
zero-gravity
Posts: 6016
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: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 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: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 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 “Разработка плагинов”