DN_CONTROLINPUT

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

DN_CONTROLINPUT

Post by John Doe »

При DN_CONTROLINPUT в Param2 приходит INPUT_RECORD.
Однако очень неполноценный, видимо фар передаёт не сырые, а очень отфильтрованные события.
В частности в случае KEY_EVENT_RECORD никогда не приходят события об отпускании клавиш, и непонятно для чего тогда поле bKeyDown.

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

DN_CONTROLINPUT

Post by John Doe »

Способы обработки событий мыши и клавиатуры на практике совершенно различны (имхо зря они вообще объединены в одном событии).
И в документации есть странная запись:
Param1: ID элемента (обычно элемент, имеющий фокус ввода) диалога.
Как понимать это "обычно"?
Это верно для нажатий клавиатуры, но не верно для щелчков мышью (приходит ID элемента, по которому осуществлён клик).

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

DN_CONTROLINPUT

Post by John Doe »

При проигрывании макроса в DN_CONTROLINPUT приходят записи, в которых EventType==KEY_EVENT.
В ProcessEditorInput и ProcessConsoleInput в этом случае EventType==FARMACRO_KEY_EVENT.

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

DN_CONTROLINPUT

Post by John Doe »

В текущем состоянии DN_CONTROLINPUT это какой-то странный суррогат, существенно расходящийся с исходной записью (которую можно например получить в ProcessConsoleInput).

Помимо уже описанного вижу и такие расхождения:
- ControlKeyState может отличаться.
- UnicodeChar не соответствует текущей раскладке (в комбинациях с модификаторами).

Складывается впечатление, что DN_CONTROLINPUT это результат двойного преобразования FarInputRecordToName/FarNameToInputRecord.
Если так, то это бессмысленно и вредно, и проще (и понятнее) было бы просто передавать FarName строкой.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

DN_CONTROLINPUT

Post by zg »

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

DN_CONTROLINPUT

Post by John Doe »

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

DN_CONTROLINPUT

Post by John Doe »

После 4318 для макроклавиш EventType==FARMACRO_KEY_EVENT, и UnicodeChar тоже приходит правильный.
Отпускания клавиш (пока?) не приходят.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

DN_CONTROLINPUT

Post by John Doe »

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

Вопрос: не является ли тут клавиатурное псевдонажатие лишним звеном?
(Или может стоить изменить EventType)
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Shmuel »

В 4319 (по сравнению с 4316) при нажатии одиночных модификаторов (например, Shift) в диалоге, FarInputRecordToName при обработке DN_CONTROLINPUT возвращает FALSE (то-есть, невозможность преобразования).

Code: Select all

                             4316    4319
  ----------------------------------------
  InputRecordToName(param2)│ Shift │ nil  
  param2.EventType         │ 1     │ 1    
  param2.KeyDown           │ true  │ false
  param2.RepeatCount       │ 1     │ 1    
  param2.VirtualKeyCode    │ 16    │ 16   
  param2.VirtualScanCode   │ 42    │ 42   
  param2.UnicodeChar       │       │      
  param2.ControlKeyState   │ 16    │ 32   
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Глюки и баги, появившиеся в «ночных сборках»

Post by zg »

Shmuel wrote:В 4319 (по сравнению с 4316) при нажатии одиночных модификаторов (например, Shift) в диалоге, FarInputRecordToName при обработке DN_CONTROLINPUT возвращает FALSE (то-есть, невозможность преобразования).
тут такая интересная ситуация. большинство отпусканий клавиш преобразуется в KEY_NONE. поэтому, скажем в какой-нибудь DN_CONTROLINPUT отпускания и не приходят. но вот для ctrl/shift/alt существует специальная магия. при нажатии посылается KEY_NONE, а в случае если нажаты все три — KEY_CTRLALTSHIFTPRESS. при отпускании — посылаются соответствующие KEY_*. раньше в диалог приходил INPUT_RECORD прошедший двойное преобразование INPUT_RECORD->Key->INPUT_RECORD. и bKeyDown превращалась из false в true. сейчас приходит честный INPUT_RECORD, а FarInputRecordToName в этом случае возвращает ошибку.
исправлять эту магию можно по разному, давайте обсудим.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Shmuel »

Обсудить, конечно, можно. А пока что, если у кого стоит LF History, попробуйте (в билде 4319) в окне любой его истории нажать Shift (или Alt, или Ctrl).
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Глюки и баги, появившиеся в «ночных сборках»

Post by zg »

Shmuel wrote:Обсудить, конечно, можно. А пока что, если у кого стоит LF History, попробуйте (в билде 4319) в окне любой его истории нажать Shift (или Alt, или Ctrl).
код можно увидеть, где падает?
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Глюки и баги, появившиеся в «ночных сборках»

Post by Shmuel »

zg wrote: код можно увидеть, где падает?
Код на гитхабе, но там ничего нового по отношению к тому, что я написал раньше. Код вызывает far.InputRecordToName при поступлении DN_CONTROLINPUT и не учитывает возможность возвращения nil, поэтому и ошибка. Дело в том, что раньше nil не возвращался. Если вызывается DN_CONTROLINPUT, то, по идее, far.InputRecordToName() не должен возвращать nil.
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 »

zg wrote: исправлять эту магию можно по разному, давайте обсудим.
Альтернативно:
1. При отпускании посылать запись, соответствующую нажатию (тоже магия)
2. Посылать и нажатия, и отпускания.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Глюки и баги, появившиеся в «ночных сборках»

Post by zg »

Shmuel wrote:Если вызывается DN_CONTROLINPUT, то, по идее, far.InputRecordToName() не должен возвращать nil.
почему?
Post Reply

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