DN_CONTROLINPUT
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
DN_CONTROLINPUT
При DN_CONTROLINPUT в Param2 приходит INPUT_RECORD.
Однако очень неполноценный, видимо фар передаёт не сырые, а очень отфильтрованные события.
В частности в случае KEY_EVENT_RECORD никогда не приходят события об отпускании клавиш, и непонятно для чего тогда поле bKeyDown.
Это ограничивает возможности обработчика.
И если уж так, то необходимо документировать такие особенности.
Однако очень неполноценный, видимо фар передаёт не сырые, а очень отфильтрованные события.
В частности в случае KEY_EVENT_RECORD никогда не приходят события об отпускании клавиш, и непонятно для чего тогда поле bKeyDown.
Это ограничивает возможности обработчика.
И если уж так, то необходимо документировать такие особенности.
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
DN_CONTROLINPUT
Способы обработки событий мыши и клавиатуры на практике совершенно различны (имхо зря они вообще объединены в одном событии).
И в документации есть странная запись:
Это верно для нажатий клавиатуры, но не верно для щелчков мышью (приходит ID элемента, по которому осуществлён клик).
Кроме того, обработчик не получает не все события от мыши, и это тоже необходимо документировать: не приходят события о перемещениях мыши, и о кликах по пустому месту в диалогах.
И в документации есть странная запись:
Как понимать это "обычно"?Param1: ID элемента (обычно элемент, имеющий фокус ввода) диалога.
Это верно для нажатий клавиатуры, но не верно для щелчков мышью (приходит ID элемента, по которому осуществлён клик).
Кроме того, обработчик не получает не все события от мыши, и это тоже необходимо документировать: не приходят события о перемещениях мыши, и о кликах по пустому месту в диалогах.
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
DN_CONTROLINPUT
При проигрывании макроса в DN_CONTROLINPUT приходят записи, в которых EventType==KEY_EVENT.
В ProcessEditorInput и ProcessConsoleInput в этом случае EventType==FARMACRO_KEY_EVENT.
Это отличие стоит задокументировать (как минимум).
В ProcessEditorInput и ProcessConsoleInput в этом случае EventType==FARMACRO_KEY_EVENT.
Это отличие стоит задокументировать (как минимум).
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
DN_CONTROLINPUT
В текущем состоянии DN_CONTROLINPUT это какой-то странный суррогат, существенно расходящийся с исходной записью (которую можно например получить в ProcessConsoleInput).
Помимо уже описанного вижу и такие расхождения:
- ControlKeyState может отличаться.
- UnicodeChar не соответствует текущей раскладке (в комбинациях с модификаторами).
Складывается впечатление, что DN_CONTROLINPUT это результат двойного преобразования FarInputRecordToName/FarNameToInputRecord.
Если так, то это бессмысленно и вредно, и проще (и понятнее) было бы просто передавать FarName строкой.
Помимо уже описанного вижу и такие расхождения:
- ControlKeyState может отличаться.
- UnicodeChar не соответствует текущей раскладке (в комбинациях с модификаторами).
Складывается впечатление, что DN_CONTROLINPUT это результат двойного преобразования FarInputRecordToName/FarNameToInputRecord.
Если так, то это бессмысленно и вредно, и проще (и понятнее) было бы просто передавать FarName строкой.
- zg
- zero-gravity
- Posts: 6038
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
DN_CONTROLINPUT
по мере сил и наличию свободного времени это меняется. если вас не устраивает скорость изменений, присылайте патч.John Doe wrote:то это бессмысленно и вредно
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
DN_CONTROLINPUT
После 4318 для макроклавиш EventType==FARMACRO_KEY_EVENT, и UnicodeChar тоже приходит правильный.
Отпускания клавиш (пока?) не приходят.
Отпускания клавиш (пока?) не приходят.
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
DN_CONTROLINPUT
Ещё один скользкий момент это нажатия мышью по кнопкам, радиокнопкам и чекбоксам: необходимо учитывать, что вслед за мышиным событием фар генерирует клавиатурное, и только после этого приходит DN_BTNCLICK.
Вопрос: не является ли тут клавиатурное псевдонажатие лишним звеном?
(Или может стоить изменить EventType)
Вопрос: не является ли тут клавиатурное псевдонажатие лишним звеном?
(Или может стоить изменить EventType)
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Глюки и баги, появившиеся в «ночных сборках»
В 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
- zg
- zero-gravity
- Posts: 6038
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Глюки и баги, появившиеся в «ночных сборках»
тут такая интересная ситуация. большинство отпусканий клавиш преобразуется в 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 wrote:В 4319 (по сравнению с 4316) при нажатии одиночных модификаторов (например, Shift) в диалоге, FarInputRecordToName при обработке DN_CONTROLINPUT возвращает FALSE (то-есть, невозможность преобразования).
исправлять эту магию можно по разному, давайте обсудим.
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Глюки и баги, появившиеся в «ночных сборках»
Обсудить, конечно, можно. А пока что, если у кого стоит LF History, попробуйте (в билде 4319) в окне любой его истории нажать Shift (или Alt, или Ctrl).
- zg
- zero-gravity
- Posts: 6038
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Глюки и баги, появившиеся в «ночных сборках»
код можно увидеть, где падает?Shmuel wrote:Обсудить, конечно, можно. А пока что, если у кого стоит LF History, попробуйте (в билде 4319) в окне любой его истории нажать Shift (или Alt, или Ctrl).
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Глюки и баги, появившиеся в «ночных сборках»
Код на гитхабе, но там ничего нового по отношению к тому, что я написал раньше. Код вызывает far.InputRecordToName при поступлении DN_CONTROLINPUT и не учитывает возможность возвращения nil, поэтому и ошибка. Дело в том, что раньше nil не возвращался. Если вызывается DN_CONTROLINPUT, то, по идее, far.InputRecordToName() не должен возвращать nil.
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Глюки и баги, появившиеся в «ночных сборках»
Альтернативно:
1. При отпускании посылать запись, соответствующую нажатию (тоже магия)
2. Посылать и нажатия, и отпускания.
- zg
- zero-gravity
- Posts: 6038
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Глюки и баги, появившиеся в «ночных сборках»
почему?Shmuel wrote:Если вызывается DN_CONTROLINPUT, то, по идее, far.InputRecordToName() не должен возвращать nil.