DN_CONTROLINPUT

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

DN_CONTROLINPUT

Post by John Doe » Sun 15 Feb, 2015 12:09

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

Это ограничивает возможности обработчика.
И если уж так, то необходимо документировать такие особенности.

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

DN_CONTROLINPUT

Post by John Doe » Sun 15 Feb, 2015 12:43

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

Кроме того, обработчик не получает не все события от мыши, и это тоже необходимо документировать: не приходят события о перемещениях мыши, и о кликах по пустому месту в диалогах.

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

DN_CONTROLINPUT

Post by John Doe » Wed 18 Mar, 2015 16:10

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

Это отличие стоит задокументировать (как минимум).

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

DN_CONTROLINPUT

Post by John Doe » Wed 18 Mar, 2015 17:20

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

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

Складывается впечатление, что DN_CONTROLINPUT это результат двойного преобразования FarInputRecordToName/FarNameToInputRecord.
Если так, то это бессмысленно и вредно, и проще (и понятнее) было бы просто передавать FarName строкой.

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

DN_CONTROLINPUT

Post by zg » Wed 18 Mar, 2015 18:49

John Doe wrote:то это бессмысленно и вредно
по мере сил и наличию свободного времени это меняется. если вас не устраивает скорость изменений, присылайте патч.

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

DN_CONTROLINPUT

Post by John Doe » Wed 18 Mar, 2015 19:48

zg wrote: по мере сил и наличию свободного времени это меняется
Отрадно слышать.

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

DN_CONTROLINPUT

Post by John Doe » Fri 20 Mar, 2015 08:35

После 4318 для макроклавиш EventType==FARMACRO_KEY_EVENT, и UnicodeChar тоже приходит правильный.
Отпускания клавиш (пока?) не приходят.

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

DN_CONTROLINPUT

Post by John Doe » Fri 20 Mar, 2015 08:59

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

Вопрос: не является ли тут клавиатурное псевдонажатие лишним звеном?
(Или может стоить изменить EventType)

Shmuel
Posts: 5041
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Fri 20 Mar, 2015 11:24

В 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: 5231
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

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

Post by zg » Fri 20 Mar, 2015 12:27

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: 5041
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Fri 20 Mar, 2015 13:11

Обсудить, конечно, можно. А пока что, если у кого стоит LF History, попробуйте (в билде 4319) в окне любой его истории нажать Shift (или Alt, или Ctrl).

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

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

Post by zg » Fri 20 Mar, 2015 14:02

Shmuel wrote:Обсудить, конечно, можно. А пока что, если у кого стоит LF History, попробуйте (в билде 4319) в окне любой его истории нажать Shift (или Alt, или Ctrl).
код можно увидеть, где падает?

Shmuel
Posts: 5041
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Fri 20 Mar, 2015 14:09

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

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

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

Post by John Doe » Fri 20 Mar, 2015 14:30

zg wrote: исправлять эту магию можно по разному, давайте обсудим.
Альтернативно:
1. При отпускании посылать запись, соответствующую нажатию (тоже магия)
2. Посылать и нажатия, и отпускания.

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

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

Post by zg » Fri 20 Mar, 2015 14:52

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

Shmuel
Posts: 5041
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

DN_CONTROLINPUT

Post by Shmuel » Fri 20 Mar, 2015 14:57

zg wrote:
Shmuel wrote:Если вызывается DN_CONTROLINPUT, то, по идее, far.InputRecordToName() не должен возвращать nil.
почему?
Фар сообщает плагину, что поступил ключ, и в то же время не может преобразовать этот ключ в строку? На мой взгляд, это неправильно. Это же не искуственно заполненный мусором INPUT_RECORD, а реальный ключ, он должен иметь текстовое представление.

Post Reply

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

Who is online

Users browsing this forum: No registered users and 2 guests