Spec-Zone.ru › Elisp

Всплывающие меню

Программа на Lisp может открыть всплывающее меню, чтобы пользователь мог выбрать один из вариантов с помощью мыши. На текстовом терминале, если мышь недоступна, пользователь может выбрать вариант с помощью клавиш перемещения — C-n, C-p или клавиш со стрелками вверх и вниз.

Функция: x-popup-menu position menu

Эта функция отображает всплывающее меню и возвращает сведения о выборе пользователя.

Аргумент position задаёт место на экране, где должен находиться левый верхний угол меню. Это может быть событие нажатия кнопки мыши или событие touchscreen-begin (указывающее, что меню следует разместить там, где пользователь нажал кнопку), либо список следующего вида:

((xoffset yoffset) window)

где xoffset и yoffset — координаты в пикселях, отсчитываемые от левого верхнего угла window. window может быть окном или фреймом.

Если position равен t, используется текущее положение мыши (или левый верхний угол фрейма, если мышь недоступна на текстовом терминале). Если position равен nil, предварительно вычисляются эквиваленты привязок клавиш для карт клавиш, указанных в menu, без фактического отображения или открытия меню.

Аргумент menu задаёт содержимое меню. Это может быть карта клавиш или список карт клавиш (см. Карты клавиш меню). В этом случае возвращаемым значением является список событий, соответствующих выбору пользователя. Если выбор был сделан во вложенном меню, этот список содержит более одного элемента. (Обратите внимание, что x-popup-menu фактически не выполняет команду, привязанную к этой последовательности событий.) На текстовых терминалах и в инструментариях, поддерживающих заголовки меню, заголовок берётся из строки подсказки menu, если menu — это карта клавиш, или из строки подсказки первой карты клавиш в menu, если это список карт клавиш (см. Определение меню).

Кроме того, menu может иметь следующий вид:

(title pane1 pane2...)

где каждая панель представляет собой список следующего вида:

(title item1 item2...)

Каждый item должен быть конс-ячейкой, (line . value), где line — строка, а value — значение, возвращаемое при выборе этой line. В отличие от карты клавиш меню, значение value, равное nil, не делает пункт меню недоступным для выбора. Вместо конс-ячейки каждый item может быть строкой; в этом случае пункт меню нельзя выбрать.

Если пользователь закрывает меню, не сделав допустимый выбор, например щёлкнув мышью вне области допустимого выбора или нажав C-g, обычно это приводит к прерыванию, и x-popup-menu не возвращает значение. Но если position — это событие нажатия кнопки мыши (указывающее, что пользователь вызвал меню мышью), прерывания не происходит, а x-popup-menu возвращает nil.

Примечание по использованию: Не используйте x-popup-menu для отображения меню, если ту же задачу можно решить с помощью префиксной клавиши, определённой с использованием карты клавиш меню. Если для реализации меню используется карта клавиш меню, команды C-h c и C-h a могут обнаружить отдельные пункты меню и предоставить справку по ним. Если же меню реализовано определением команды, вызывающей x-popup-menu, средства справки не могут узнать, что происходит внутри этой команды, и поэтому не могут предоставить справку по пунктам меню.

Механизм панели меню, позволяющий переключаться между вложенными меню перемещением мыши, не может заглянуть в определение команды и узнать, что она вызывает x-popup-menu. Поэтому, если попытаться реализовать вложенное меню с помощью x-popup-menu, оно не сможет работать с панелью меню как единое целое. Именно поэтому все вложенные меню панели меню реализованы с помощью карт клавиш меню внутри родительского меню, а не с помощью x-popup-menu. См. Панель меню.

Если содержимое вложенного меню панели меню должно изменяться, всё равно следует реализовать его с помощью карты клавиш меню. Чтобы изменять содержимое, добавьте функцию-хук в menu-bar-update-hook, которая при необходимости обновляет содержимое карты клавиш меню.

Переменная: x-pre-popup-menu-hook

Обычный хук, выполняемый непосредственно перед отображением всплывающего меню — либо прямым вызовом x-popup-menu, либо через карту клавиш меню. Он не вызывается, если x-popup-menu возвращает значение по другой причине, не отображая всплывающее меню.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Pop_002dUp-Menus.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API