Операции с дочерними фреймами
Чтобы создать новый дочерний фрейм или преобразовать обычный фрейм в дочерний, задайте для параметра parent-frame этого фрейма (см. Параметры взаимодействия с фреймами) значение, равное значению этого параметра уже существующего фрейма. Фрейм, указанный этим параметром, будет родительским фреймом для данного фрейма до тех пор, пока параметр не будет изменён или сброшен. Технически в графическом интерфейсе это делает окно оконной системы дочернего фрейма дочерним окном окна оконной системы родительского фрейма. В текстовом терминале дочерний фрейм обычно отображается на том же терминале, что и его родительский фрейм, перекрывая его часть.
Параметр parent-frame можно изменить в любой момент. Если задать ему другой фрейм, дочерний фрейм переподчиняется ему. Если задать ему другой дочерний фрейм, фрейм становится вложенным дочерним фреймом. Если задать ему значение nil, фрейм снова становится фреймом верхнего уровня — фреймом, окно оконной системы которого является дочерним окном корневого окна дисплея. В текстовых терминалах фреймы верхнего уровня называются корневыми фреймами (см. ниже).
Поскольку дочерние фреймы можно вкладывать произвольным образом, фрейм может быть одновременно дочерним и родительским. Кроме того, роли дочернего и родительского фреймов можно поменять в любой момент (хотя обычно рекомендуется, чтобы размер дочернего фрейма был значительно меньше размера родительского). При попытке сделать фрейм предком самого себя будет выдана ошибка.
Когда родительский фрейм собираются удалить (см. Удаление фреймов), его дочерние фреймы рекурсивно удаляются до него. Из этого правила есть одно исключение: если дочерний фрейм служит замещающим фреймом минибуфера (см. Минибуферы и фреймы) для другого фрейма, он сохраняется до удаления родительского фрейма. Если к этому моменту ни один из оставшихся фреймов не использует дочерний фрейм в качестве фрейма минибуфера, Emacs попытается удалить и дочерний фрейм. Если по какой-либо причине удалить его не удастся, дочерний фрейм станет фреймом верхнего уровня. Поскольку в текстовых терминалах такое преобразование невозможно, при удалении фрейма может возникнуть ошибка, если удаляемый замещающий фрейм минибуфера используется фреймом, который также не будет удалён.
Следующие три функции помогают понять, как связаны родительские и дочерние фреймы.
- Функция: frame-parent &optional frame
Эта функция возвращает родительский фрейм frame. Если у frame нет родительского фрейма, она возвращает
nil.
- Функция: frame-ancestor-p ancestor descendant
Эта функция возвращает значение, отличное от
nil, если ancestor является предком descendant. ancestor является предком descendant, если он является родительским фреймом descendant или предком родительского фрейма descendant. И ancestor, и descendant должны указывать на действующие фреймы.
- Функция: frame-root-frame &optional frame
Эта функция возвращает корневой фрейм указанного frame. frame должен быть действующим фреймом; по умолчанию используется выбранный фрейм. Корневой фрейм frame — это фрейм, полученный при переходе по цепочке родительских фреймов, начиная с frame, до фрейма без родителя. Если у frame нет родителя, его корневым фреймом является сам frame.
В текстовом терминале корневой фрейм всегда расположен у верхнего левого края терминала и всегда занимает всю его площадь.
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-Operations.html