DN_CONTROLINPUT

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

DN_CONTROLINPUT

Post by John Doe » Thu 23 Apr, 2015 14:24

Latest post of the previous page:

4355 не щупал, но если я правильно понимаю, то этот пример будет возвращать nil.

Если какой-то плагин ожидает нажатия Ctrl (и использует при этом FarInputRecordToName), то он не дождётся.
Это гипотетический плагин, и реальных претензий к 4355 у меня нет (свои макросы и плагины как-то приспособлю в любом случае ).

P.S.
Хотя ситуация сейчас не очень правильная, ведь в ProcessEditorInputW постоянно приходят сообщения об отпускании модификаторов, даже если модификатор не одиночный, а в сочетаниях.
Например нажатие/отпускание CtrlA тоже приведёт к приходу сообщения, которое будет преобразовано в "Ctrl". Не очень логично.

Имхо, FarInputRecordToName стоит обрабатывать и нажатия и отпускания, но отпускания можно именовать иначе, типа AltRelease.
(А как это передавать в DN_CONTROLINPUT не нарушая совместимости - воспрос открытый)

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

DN_CONTROLINPUT

Post by zg » Thu 23 Apr, 2015 14:35

John Doe wrote:Это гипотетический плагин, и реальных претензий к 4355 у меня нет (свои макросы и плагины как-то приспособлю в любом случае ).
зачем обсуждать гипотетические плагины? что касается ваших макросов и плагинов. вот вы упоминаете выше некоторый немодальный инкрементальный поиск. это вот это имеется ввиду?
John Doe wrote:Хотя ситуация сейчас не очень правильная, ведь в ProcessEditorInputW постоянно приходят сообщения об отпускании модификаторов, даже если модификатор не одиночный, а в сочетаниях.
Например нажатие/отпускание CtrlA тоже приведёт к приходу сообщения, которое будет преобразовано в "Ctrl". Не очень логично.

Имхо, FarInputRecordToName стоит обрабатывать и нажатия и отпускания, но отпускания можно именовать иначе, типа AltRelease.
FarInputRecordToName можно вызвать с любым input_record, а не только с последним, пришедшим в консоль.

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

DN_CONTROLINPUT

Post by John Doe » Thu 23 Apr, 2015 15:00

zg wrote: вот вы упоминаете выше некоторый немодальный инкрементальный поиск. это вот это имеется ввиду?
Переделать это на ProcessEditorInputW я собираюсь, но пока обсуждать рано.
Из реальных знаю LEAP, но не пробовал, поэтому тоже не обсуждаю.
zg wrote: FarInputRecordToName можно вызвать с любым input_record, а не только с последним, пришедшим в консоль.
Естественно.
Сомнения у меня в другом.
Одиночное нажатие Ctrl будет выглядеть так: nil Ctrl (нормально, хотя CtrlRelease может быть лучше)
Нажатие/отпускание сочетания CtrlA: nil CtrlA nil Ctrl (это уже не кажется логичным)

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

DN_CONTROLINPUT

Post by zg » Thu 23 Apr, 2015 15:05

John Doe wrote:Нажатие/отпускание сочетания CtrlA: nil CtrlA nil Ctrl (это уже не кажется логичным)
ещё раз: FarInputRecordToName можно вызвать с любым input_record, а не только с последним, пришедшим в консоль.

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

DN_CONTROLINPUT

Post by John Doe » Thu 23 Apr, 2015 15:14

zg wrote: FarInputRecordToName можно вызвать с любым input_record, а не только с последним, пришедшим в консоль.
И какие выводы я должен из этого сделать?

Лично мне было бы удобнее, если бы функция FarInputRecordToName различала нажатия модификаторов (и вреда я от этого пока не вижу), в противном случае для своих целей я вынужден колхозить самостоятельно (тоже не проблема, приспособлюсь).

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

DN_CONTROLINPUT

Post by zg » Thu 23 Apr, 2015 15:22

John Doe wrote:И какие выводы я должен из этого сделать?
есть две последовательности:
1. Ctrl:press A:press A:release Ctrl:release.
2. Ctrl:press Ctrl:release.
правильно ли я понимаю, что вы хотите, чтобы в первом случае FarInputRecordToName(Ctrl:release) возвращал nil, а во втором "Ctrl"?

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

DN_CONTROLINPUT

Post by John Doe » Thu 23 Apr, 2015 15:36

zg wrote: правильно ли я понимаю, что вы хотите, чтобы в первом случае FarInputRecordToName(Ctrl:release) возвращал nil, а во втором "Ctrl"?
О таком я не думал, это вообще проблематично, если только фар не будет добавлять в InputRecord какой-то дополнительный флаг.

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

DN_CONTROLINPUT

Post by zg » Thu 23 Apr, 2015 15:38

тогда я не понимаю вообще, чего вы хотите.

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

DN_CONTROLINPUT

Post by John Doe » Fri 24 Apr, 2015 17:51

Хочу логичного поведения.
a) Раньше было просто: распознаются нажатия. Просто, потому и понятно.

б) Если распознавать не тупо нажатия, а "интеллектуально" значимые FarNames (как вы предположили в предыдущем сообщении), то это тоже будет понятно.

в) Если распознавать и нажатия, и отпускания (как я предлагал выше), то и это понятно.

г) А то как сейчас - уже не очень понятно.
zg wrote: тогда я не понимаю вообще, чего вы хотите.
Хочу б) или в)
Если же останется г), то необходимо описать особенности в Энциклопедии, например тут: http://api.farmanager.com/ru/fsf/farinp ... oname.html

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

DN_CONTROLINPUT

Post by John Doe » Tue 11 Aug, 2015 21:19

При нажатии CtrlBreak в DN_CONTROLINPUT приходит пустая запись с EventType~40000 (значения меняются).

Что бы это значило?

P.S.
Если вернуть 1, то диалог не закроется.

Shmuel
Posts: 5230
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

DN_CONTROLINPUT

Post by Shmuel » Wed 12 Aug, 2015 11:15

John Doe wrote: приходит пустая запись с EventType~40000 (значения меняются).
У меня наблюдался диапазон примерно от 15000 до 65000.
Похоже на неинициализированную переменную. Может выйти боком, если она примет значение из набора (1,2,4,8,16).

buniak_a_h
Posts: 362
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 40 times
Been thanked: 5 times
Contact:

DN_CONTROLINPUT

Post by buniak_a_h » Fri 28 Jul, 2017 04:11

John Doe wrote:
Sun 15 Feb, 2015 12:43
<...> обработчик получает не все события от мыши, <...>: не приходят события о перемещениях мыши, и о кликах по пустому месту в диалогах.
Ну, перемещение - наверно, не так критично (а главное - ресурсозатратно). А вот что не приходит клик (и даже не "по пустому месту", а по тексту, рамке и самому ListBox-у) - это уже очень обидно. Хотелось сделать "встроенные" в ListBox кнопки (нижний заголовок, чувствительный к мыши" - не даёт. А казалось бы...
Жаль!

Shmuel
Posts: 5230
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

DN_CONTROLINPUT

Post by Shmuel » Fri 28 Jul, 2017 07:10

buniak_a_h wrote:
Fri 28 Jul, 2017 04:11
А вот что не приходит клик
Все мышиные события приходят, если вызвать DM_SETINPUTNOTIFY, как указано в документации.

buniak_a_h
Posts: 362
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 40 times
Been thanked: 5 times
Contact:

DN_CONTROLINPUT

Post by buniak_a_h » Fri 28 Jul, 2017 13:28

Shmuel wrote:
Fri 28 Jul, 2017 07:10
buniak_a_h wrote:
Fri 28 Jul, 2017 04:11
А вот что не приходит клик
Все мышиные события приходят, если вызвать DM_SETINPUTNOTIFY, как указано в документации.
Я, видимо, опять что-то не так понял.
В хендлере событий для диалога я вставил код:

Code: Select all

if Msg == F.DN_INITDIALOG then
  hDlg:send(F.DM_SETINPUTNOTIFY, 1)
  -- Задание верхнего и нижнего заголовков ListBox-а
  hDlg:send(F.DM_LISTSETTITLES, 
            ID.MaskList, 
            {Title = hDlg:send(F.DM_LISTGETTITLES, ID.MaskList).Title;
             Bottom=' [ Редакт. (F4) ]  [ Удалить (Del) ]   [ Добавить (Ins) ]'} )
end                                          
В поведении диалога ничего не изменилось. Мышиные клики приходят при клике на DI_EDIT, DI_BUTTON, DI_TEXT и (внимание!) DI_DOUBLRBOX и НЕ приходят при клике на DI_LISTBOX (в том числе и на рамку!). Можно, конечно, рамку с заголовками нарисовать отдельными итемами, внешне отличаться ПОЧТИ не будет.
Может, я вызвал DM_SETINPUTNOTIFY не в тот момент (надо не в DN_INITIALDIALOG? А когда тогда?)
PS. На самом деле и без hDlg:send(F.DM_SETINPUTNOTIFY, 1) всё работало точно также. Ну очень похоже на ошибку именно в ListBox-е!

Shmuel
Posts: 5230
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

DN_CONTROLINPUT

Post by Shmuel » Fri 28 Jul, 2017 13:58

buniak_a_h wrote:
Fri 28 Jul, 2017 13:28
Мышиные клики [....] НЕ приходят при клике на DI_LISTBOX (в том числе и на рамку!)
У меня приходят:
buniak_a_h wrote:
Fri 28 Jul, 2017 13:28
На самом деле и без hDlg:send(F.DM_SETINPUTNOTIFY, 1) всё работало точно также
В моём примере (см. выше) это не так, без DM_SETINPUTNOTIFY не работает.

Post Reply

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