Особенности дочерних фреймов
Поведение дочерних фреймов отличается от поведения обычных фреймов в ряде необычных аспектов. Здесь мы кратко рассмотрим некоторые из них:
- Семантика разворачивания и сворачивания дочерних фреймов в значительной степени зависит от оконной системы. Как правило, приложениям не следует вызывать эти операции для дочерних фреймов. По умолчанию вызов
iconify-frameдля дочернего фрейма приводит к попытке свернуть соответствующий ему фрейм верхнего уровня. Чтобы изменить это поведение, пользователи могут настроить описанный ниже параметрiconify-child-frame. - Поднятие, опускание и изменение порядка наложения дочерних фреймов (см. Поднятие, опускание и изменение порядка наложения фреймов), а также изменение
z-groupдочернего фрейма (см. Параметры положения) меняют только порядок наложения дочерних фреймов с одним и тем же родителем. Изменение порядка наложения не реализовано в текстовых терминалах. - Многие оконные системы не могут изменять непрозрачность дочерних фреймов (см. Параметры шрифта и цвета).
- В некоторых оконных системах передача фокуса от дочернего фрейма предку, который не является его родителем, щелчком мыши по видимой части окна этого предка может не сработать. Возможно, сначала потребуется щелкнуть по окну оконной системы непосредственного родителя.
- Менеджеры окон могут не распространять на дочерние фреймы политику передачи фокуса вслед за указателем мыши. Настройка
mouse-autoselect-windowможет помочь в этом случае (см. Автоматический выбор окна с помощью мыши). - Перетаскивание объектов на дочерние фреймы (см. Перетаскивание) может работать не во всех оконных системах. В некоторых системах объект будет перемещен в родительский фрейм или в один из предков.
Настройка следующего параметра может быть полезна для изменения поведения iconify-frame дочерних фреймов.
- Пользовательский параметр: iconify-child-frame
-
Этот параметр указывает Emacs, что делать при запросе на сворачивание дочернего фрейма. Если его значение —
nil, тоiconify-frameпри вызове для дочернего фрейма ничего не сделает. Если его значение —iconify-top-level, Emacs попытается свернуть корневой фрейм этого дочернего фрейма. Если его значение —make-invisible, Emacs попытается сделать этот дочерний фрейм невидимым, а не свернуть его.Любое другое значение означает, что будет предпринята попытка свернуть дочерний фрейм. Поскольку такая попытка может быть проигнорирована некоторыми менеджерами окон и даже привести к тому, что дочерний фрейм перестанет реагировать на действия пользователя, по умолчанию вместо него сворачивается корневой фрейм.
В текстовом терминале допустимы только значения
nilиmake-invisible.
В текстовых терминалах есть несколько ограничений, связанных со сменой родительского фрейма. Одно из них состоит в том, что фрейм верхнего уровня (см. Фреймы) нельзя напрямую сделать дочерним фреймом: сначала нужно сделать другой корневой фрейм новым фреймом верхнего уровня этого терминала. Если же вы хотите сделать дочерний фрейм новым фреймом верхнего уровня терминала, сначала нужно сделать его корневым фреймом.
Кроме того, окно-заместитель минибуфера любого фрейма в текстовом терминале должно находиться во фрейме с тем же корневым фреймом. Смена родительского фрейма приведет к ошибке, если нарушит это ограничение. Это также означает, что создать фрейм без минибуфера, окно минибуфера которого находится в дочернем фрейме, содержащем только минибуфер, сложнее. В графическом интерфейсе Emacs выполняет следующие действия, если пользователь указал значение child-frame для параметра minibuffer в initial-frame-alist (см. Начальные параметры фрейма):
- Создает фрейм, содержащий только минибуфер.
- Создает фрейм без минибуфера, задавая для его параметра
minibufferокно фрейма, содержащего только минибуфер. - Делает фрейм без минибуфера родительским фреймом для фрейма, содержащего только минибуфер.
- Удаляет первоначально выбранный фрейм.
В текстовом терминале эти действия нужно выполнить вручную, как показано в следующем фрагменте:
(let* ((selected (selected-frame))
(mini-only
(make-frame
`((parent-frame . ,selected)
(minibuffer . only)
(left . 1) (top . -1) (width . 20) (height . 1))))
(mini-less
(make-frame
(append `((parent-frame . ,selected)
(minibuffer . ,(minibuffer-window mini-only)))))))
(set-frame-parameter mini-only 'parent-frame mini-less)
(set-frame-parameter mini-less 'parent-frame nil)
(select-frame mini-less)
(delete-frame selected))
Это означает, что сначала нужно установить фреймы без минибуфера и только с минибуфером как дочерние фреймы выбранного фрейма, задав для параметра minibuffer фрейма без минибуфера окно минибуфера фрейма, содержащего только минибуфер. Затем сделайте фрейм, содержащий только минибуфер, дочерним фреймом фрейма без минибуфера, а фрейм без минибуфера — новым корневым фреймом. Наконец, выберите фрейм без минибуфера и удалите первоначально выбранный фрейм.
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/Child-Frame-Peculiarities.html