22.7.10 События фокуса

Этот раздел рассматривает как оконные системы, так и фреймы Emacs. Когда говорится просто о “фреймах” или “окнах”, это относится к фреймам Emacs и окнам Emacs. Когда речь идет об окнах оконной системы, которые также являются фреймами Emacs, в этом разделе всегда говорится “окно оконной системы”.

Оконные системы предоставляют общие способы для пользователя управлять тем, какое окно оконной системы или фрейм Emacs получает ввод с клавиатуры. Этот выбор окна оконной системы называется фокусом. Когда пользователь делает что-то для переключения между фреймами Emacs, генерируется событие фокуса. Emacs также генерирует события фокуса при использовании mouse-autoselect-window для переключения между окнами Emacs внутри фреймов Emacs.

Событие фокуса в середине последовательности клавиш исказило бы последовательность. Поэтому Emacs никогда не генерирует событие фокуса в середине последовательности клавиш. Если пользователь изменяет фокус в середине последовательности клавиш—то есть после префиксной клавиши—то Emacs переупорядочивает события так, чтобы событие фокуса происходило либо до, либо после многособытийной последовательности клавиш, а не внутри нее.

События фокуса для фреймов

Обычное определение события фокуса, которое переключает фреймы, в глобальной карте клавиш заключается в выборе этого нового фрейма в Emacs, как ожидает пользователь. См. Фокус ввода, где также описаны хуки, связанные с событиями фокуса для фреймов. События фокуса для фреймов представлены в Lisp в виде списков, которые выглядят так:

(switch-frame новый-фрейм)

где новый-фрейм — это фрейм, на который выполнен переключение.

Некоторые оконные менеджеры X настроены так, что простого перемещения мыши во фрейм достаточно для установки туда фокуса. Обычно нет необходимости программе на Lisp знать об изменении фокуса до тех пор, пока не поступит какой-либо другой ввод. Emacs генерирует событие фокуса только тогда, когда пользователь фактически нажимает клавишу на клавиатуре или кнопку мыши в новом фрейме; простое перемещение мыши между фреймами не генерирует событие фокуса.

События фокуса для окон

Когда установлено mouse-autoselect-window, перемещение мыши над новым окном внутри фрейма также может переключить выбранное окно. См. Автоматический выбор окна мышью, где описано поведение для разных значений. Когда мышь перемещается над новым окном, генерируется событие фокуса для переключения окон. События фокуса для окон представлены в Lisp в виде списков, которые выглядят так:

(select-window новое-окно)

где новое-окно — это окно, на которое выполнено переключение.