DN_LISTHOTKEY в меню

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

DN_LISTHOTKEY в меню

Post by John Doe » Fri 05 Dec, 2014 13:40

При нажатии в списке хоткея приходит событие DN_LISTHOTKEY, причём курсор предварительно позиционируется на соответствующий элемент.
Таким образом обработчик получает в Param2 избыточную информацию , и при этом нет возможности выяснить, какой из элементов был текущим в момент нажатия хоткея.

Фар же этой информацией определённо обладает, ведь если обработчик вернёт 1, то курсор возвращается в исходную позицию: (Update: изменено в 4640)

Вопрос: может стоит убрать предварительное позиционирование?

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

DN_LISTHOTKEY

Post by John Doe » Sat 06 Dec, 2014 00:49

Всё оказалось ещё хуже...

Update: http://bugs.farmanager.com/view.php?id=2877

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

Проблема с DN_LISTHOTKEY в ProcessDialogEvent

Post by John Doe » Mon 09 May, 2016 23:56

(Дублирую с багтрекера)
dn_listhotkey wrote: Событие DN_LISTHOTKEY оповещает обработчик о том, что пользователь для смены пункта в списке (DI_COMBOBOX, DI_LISTBOX) воспользовался горячими клавишами.
...
Return
FALSE - разрешить изменение.
TRUE - плагин сам отработал событие.
  1. Из данного текста складывается впечатление, что обработчик сработает до смены позиции, и вернув TRUE можно избежать позиционирования.
    В реальности это не так. То ли поведение стоит уточнить, то ли документацию.
  2. Возможно я неправильно понял, но в следующем примере я не вижу разницы в поведении, возвращая TRUE или FALSE.

    Code: Select all

    local F = far.Flags
    Event { group="DialogEvent";
      condition=function(Event,param)
        return param.Msg==F.DN_LISTHOTKEY and Event==F.DE_DLGPROCINIT
      end;
      action=function(Event,param)
        return 0
        --return 1
      end;
    }
    В обоих случая поведение получается одинаковым, например в меню плагинов по хоткеям не происходит выполнения пунктов, а только лишь позиционирование.

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

Проблема с DN_LISTHOTKEY в ProcessDialogEvent

Post by zg » Tue 10 May, 2016 01:26

а почему бы не проверить на комбобоксах и списках в ДИАЛОГАХ, для которых собственно документация и написана?

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

DN_LISTHOTKEY в меню

Post by John Doe » Wed 11 May, 2016 09:04

Действительно, в диалогах порядок.
А поскольку в меню никто ничего не обещал, а значит к документации вопросов нет.

Тему переименовал.

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

Проблема с DN_LISTHOTKEY в ProcessDialogEvent

Post by zg » Wed 11 May, 2016 17:50

если конструктивно. да, формально меню — это диалог с листбоксом. но во-первых у этого диалога есть своя, достаточно богатая на магию, диалоговая процедура. во-вторых — есть как минимум три различия между поведением просто диалога с листбоксом и меню. можно поискать в коде по DMODE_ISMENU.
John Doe wrote:Из данного текста складывается впечатление, что обработчик сработает до смены позиции, и вернув TRUE можно избежать позиционирования.
В реальности это не так. То ли поведение стоит уточнить, то ли документацию.
вот это одно из трёх различий. для меню позиционирование происходит до вызова DN_LISTHOTKEY. вот если тут и ещё в паре мест чуть ниже убрать !Parent->CheckDialogMode(DMODE_ISMENU), то будет так, как вы хотите. но возможно что-то сломается в фаре. или в плагинах. если же ничего не сломается, то стоит также присмотреться к другим двум местам и выпилить DMODE_ISMENU совсем.
John Doe wrote:Возможно я неправильно понял, но в следующем примере я не вижу разницы в поведении, возвращая TRUE или FALSE.

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

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

DN_LISTHOTKEY в меню

Post by John Doe » Wed 11 May, 2016 21:15

zg wrote: вешая свой обработчик, вы полностью переопределяете пользовательскую диалоговую процедуру.
Спасибо за разъяснение.

А как лучше принудительно отправить произвольное событие в стандартный обработчик?
Можно ли использовать для этого DefDlgProc?

Или только SendDlgMessage? (нежелательно, т.к. хотелось бы избежать нового полного цикла DE_DLGPROCINIT/DE_DEFDLGPROCINIT/DE_DLGPROCEND)

Спрашиваю потому что в коде фара не ориентируюсь, а проверить на практике проблематично, LuaFar сейчас не позволяет.

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

DN_LISTHOTKEY в меню

Post by zg » Wed 11 May, 2016 21:48

так можно ж false вернуть.

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

DN_LISTHOTKEY в меню

Post by John Doe » Wed 11 May, 2016 21:53

zg wrote: так можно ж false вернуть.
это понятно, но что если я хочу вызвать стандартный обработчик совсем в другой момент. Может даже не в ProcessDialogEvent

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

DN_LISTHOTKEY в меню

Post by zg » Wed 11 May, 2016 21:59

насколько я понимаю вопрос — SendDlgMessage.

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

DN_LISTHOTKEY в меню

Post by John Doe » Wed 11 May, 2016 22:04

Т.е. DefDlgProc совсем не о том

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

DN_LISTHOTKEY в меню

Post by zg » Wed 11 May, 2016 22:29

DefDlgProc — это заглушка, в которой прописаны стандартные реакции на стандартные события. это и есть стандартный обработчик.
то что вы называете стандартным обработчиком меню — это 9 параметр, передаваемый в far.Dialog.

ps: вы бы задачу описали, может есть другое решение.

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

DN_LISTHOTKEY в меню

Post by John Doe » Wed 11 May, 2016 22:53

zg wrote: вы бы задачу описали, может есть другое решение.
Проясняю для себя неясные моменты. (Когда-то возник вопрос при решении конкретной задачи, но сейчас не вспомню)

Post Reply

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