Макет фрейма
Видимый фрейм занимает прямоугольную область на дисплее своего терминала. Эта область может содержать несколько вложенных прямоугольников, каждый из которых выполняет свою функцию. На рисунке ниже схематично показан макет фрейма на графическом терминале:
<------------ Outer Frame Width ----------->
____________________________________________
^(0) ________ External/Outer Border _______ |
| | |_____________ Title Bar ______________| |
| | (1)_____________ Menu Bar ______________| | ^
| | (2)_____________ Tool Bar ______________| | ^
| | (3)_____________ Tab Bar _______________| | ^
| | | _________ Internal Border ________ | | ^
| | | | ^ | | | |
| | | | | | | | |
Outer | | | Inner | | | Native
Frame | | | Frame | | | Frame
Height | | | Height | | | Height
| | | | | | | | |
| | | |<--+--- Inner Frame Width ------->| | | |
| | | | | | | | |
| | | |___v______________________________| | | |
| | |___________ Internal Border __________| | |
| | (4)__________ Bottom Tool Bar __________| | v
v |___________ External/Outer Border __________|
<-------- Native Frame Width -------->
На практике некоторые из показанных на рисунке областей могут отсутствовать. Ниже описано значение этих областей.
- Внешний фрейм
-
Внешний фрейм — это прямоугольник, включающий все области, показанные на рисунке. Стороны этого прямоугольника называются внешними краями фрейма. Внешняя ширина и внешняя высота фрейма вместе определяют внешний размер этого прямоугольника.
Знание внешнего размера фрейма полезно, чтобы вписать фрейм в рабочую область дисплея (см. Несколько терминалов) или разместить два фрейма рядом друг с другом на экране. Обычно внешний размер фрейма доступен только после того, как фрейм хотя бы один раз был отображён (сделан видимым, см. Видимость фреймов). Для начального фрейма или фрейма, который ещё не создан, внешний размер можно лишь оценить либо вычислить на основе значений по умолчанию оконной системы или оконного менеджера. Один из способов обойти это ограничение — получить разницу между внешним и нативным (см. ниже) размерами отображённого фрейма и использовать её для вычисления внешнего размера нового фрейма.
Положение верхнего левого угла внешнего фрейма (обозначенного ‘(0)’ на рисунке выше) называется внешним положением фрейма. Внешнее положение графического фрейма также называют его «положением», поскольку при изменении размера фрейма или его макета оно обычно остаётся неизменным на дисплее.
Внешнее положение задаётся параметрами фрейма
leftиtopи может быть изменено через них (см. Параметры положения). Для обычного фрейма верхнего уровня эти параметры обычно задают его абсолютное положение (см. ниже) относительно начала координат дисплея. Для дочернего фрейма (см. Дочерние фреймы) эти параметры задают его положение относительно нативного положения (см. ниже) родительского фрейма. Для корневых фреймов (см. Дочерние фреймы) на текстовых терминалах значения этих параметров не имеют смысла и всегда равны нулю. - Внешняя рамка
-
Внешняя рамка — часть оформления, предоставляемого оконным менеджером. Обычно она используется для изменения размера фрейма с помощью мыши, поэтому не отображается у фреймов в полноэкранном режиме «fullboth» и максимизированных фреймов (см. Параметры размера). Её ширина определяется оконным менеджером и не может быть изменена функциями Emacs.
У фреймов на текстовых терминалах внешних рамок нет. Для графических фреймов их отображение можно отключить, задав параметр фрейма
override-redirectилиundecorated(см. Параметры управления окнами). - Наружная рамка
-
Наружная рамка — отдельная рамка, ширину которой можно задать параметром фрейма
border-width(см. Параметры макета). На практике у фрейма отображается либо внешняя, либо наружная рамка, но никогда обе одновременно. Обычно наружная рамка показывается только у специальных фреймов, которыми оконный менеджер управляет не полностью или вовсе не управляет, например у фреймов подсказок (см. Подсказки), дочерних фреймов (см. Дочерние фреймы) и фреймовundecoratedилиoverride-redirect(см. Параметры управления окнами).Как правило, наружные рамки никогда не отображаются у фреймов на текстовых терминалах и у фреймов, созданных процедурами GTK+. Для дочернего фрейма на текстовом терминале наружную рамку можно имитировать, задав параметру
undecoratedэтого фрейма значениеnil(см. Параметры макета). В MS-Windows наружная рамка имитируется с помощью внешней рамки шириной в один пиксель. В сборках для X без инструментария можно изменить цвет наружной рамки, задав параметр фреймаborder-color(см. Параметры макета). - Строка заголовка
-
Строка заголовка, также называемая полосой заголовка, тоже является частью оформления оконного менеджера и обычно отображает заголовок фрейма (см. Заголовки фреймов), а также кнопки для сворачивания, разворачивания и удаления фрейма. Её также можно использовать для перетаскивания фрейма мышью. Строка заголовка обычно не отображается у фреймов в полноэкранном режиме «fullboth» (см. Параметры размера), фреймов подсказок (см. Подсказки) и дочерних фреймов (см. Дочерние фреймы); у фреймов терминалов её нет. Отображение строки заголовка можно отключить, задав параметр фрейма
override-redirectилиundecorated(см. Параметры управления окнами). - Строка меню
-
Строка меню (см. Строка меню) может быть внутренней (отрисовываться самим Emacs) или внешней (отрисовываться инструментарием). В большинстве сборок (GTK+, Lucid, Motif и MS-Windows) используется внешняя строка меню. В NS также используется внешняя строка меню, которая, однако, не является частью внешнего фрейма. Сборки без инструментария могут предоставлять внутреннюю строку меню. В фреймах на текстовых терминалах строка меню является частью корневого окна фрейма (см. Окна и фреймы). Как правило, строки меню никогда не отображаются в дочерних фреймах (см. Дочерние фреймы). Отображение строки меню можно отключить, задав параметру
menu-bar-lines(см. Параметры макета) значение ноль.Обёртывается ли строка меню или обрезается, когда её ширина становится слишком большой для фрейма, зависит от инструментария. Обычно оборачивать строку меню могут только сборки Motif и MS-Windows. При оборачивании и разворачивании строки меню они стараются сохранить неизменной внешнюю высоту фрейма, поэтому вместо неё меняется нативная высота фрейма (см. ниже).
- Панель инструментов
-
Как и строка меню, панель инструментов (см. Панели инструментов) может быть внутренней (отрисовываться самим Emacs) или внешней (отрисовываться инструментарием). В сборках GTK+ и NS панель инструментов отрисовывается инструментарием. В остальных сборках используются внутренние панели инструментов. В GTK+ панель инструментов может располагаться с любой стороны фрейма, сразу за внутренней рамкой; см. ниже. Панели инструментов обычно не отображаются в дочерних фреймах (см. Дочерние фреймы). Отображение панели инструментов можно отключить, задав параметру
tool-bar-lines(см. Параметры макета) значение ноль.Если переменная
auto-resize-tool-barsне равнаnil, Emacs оборачивает внутреннюю панель инструментов, когда её ширина становится слишком большой для фрейма. При оборачивании и разворачивании внутренней панели инструментов Emacs по умолчанию сохраняет неизменной внешнюю высоту фрейма, поэтому вместо неё меняется нативная высота фрейма (см. ниже). В свою очередь, Emacs, собранный с GTK+, никогда не оборачивает панель инструментов, но может автоматически увеличить внешнюю ширину фрейма, чтобы вместить слишком длинную панель инструментов. - Панель вкладок
-
Панель вкладок (см. Панели вкладок в Руководстве GNU Emacs) всегда отрисовывается самим Emacs. В сборках Emacs с внутренней панелью инструментов панель вкладок располагается над ней, а в сборках с внешней панелью инструментов — под ней. Отображение панели вкладок можно отключить, задав параметру
tab-bar-lines(см. Параметры макета) значение ноль. - Нативный фрейм
-
Нативный фрейм — прямоугольник, полностью расположенный внутри внешнего фрейма. Он не включает области, занятые внешней или наружной рамкой, строкой заголовка и внешней строкой меню или панелью инструментов. Стороны нативного фрейма называются нативными краями фрейма. Нативная ширина и нативная высота фрейма вместе определяют нативный размер фрейма.
Нативный размер фрейма — это размер, который Emacs передаёт оконной системе или оконному менеджеру при создании фрейма или изменении его размера из Emacs. Это также размер, который Emacs получает от оконной системы или оконного менеджера, когда они изменяют размер окна фрейма в оконной системе, например после разворачивания фрейма нажатием соответствующей кнопки в строке заголовка или перетаскивания его внешней рамки мышью.
Положение верхнего левого угла нативного фрейма задаёт нативное положение фрейма. На рисунке выше положения для разных сборок обозначены как (1)–(3):
- (1) сборки без инструментария, Android, Haiku и фреймы терминалов
- (2) фреймы Lucid, Motif и MS-Windows
- (3) фреймы GTK+ и NS
Таким образом, нативная высота фрейма может включать высоту панели инструментов, но не строки меню (Lucid, Motif, MS-Windows) либо не строки меню и панели инструментов (сборки без инструментария и фреймы на текстовых терминалах).
Если нативное положение в противном случае соответствовало бы (2), но панель инструментов расположена внизу фрейма, как показано на рисунке (4), нативным положением фрейма становится положение панели вкладок.
Нативное положение фрейма служит опорным для функций, устанавливающих или возвращающих текущее положение мыши (см. Положение мыши), а также для функций, работающих с положением окон, например
window-edges,window-atилиcoordinates-in-window-p(см. Координаты и окна). Оно также задаёт начало координат (0, 0) для расположения и позиционирования дочерних фреймов внутри этого фрейма (см. Дочерние фреймы).Также обратите внимание, что нативное положение фрейма на дисплее обычно не меняется при удалении или добавлении оформления оконного менеджера посредством изменения параметра фрейма
override-redirectилиundecorated(см. Параметры управления окнами). - Внутренняя рамка
-
Внутренняя рамка — это рамка, которую Emacs рисует вокруг внутреннего фрейма (см. ниже). Способ задания её внешнего вида зависит от того, является ли данный фрейм дочерним (см. Дочерние фреймы).
Для обычных фреймов её ширина задаётся параметром фрейма
internal-border-width(см. Параметры макета), а цвет — фоном граниinternal-border.Для дочерних фреймов её ширина задаётся параметром фрейма
child-frame-border-width(при отсутствии значения используется параметрinternal-border-width), а цвет — фоном граниchild-frame-border. - Внутренний фрейм
-
Внутренний фрейм — прямоугольник, выделенный для окон фрейма. Он ограничен внутренней рамкой, которая, однако, не является частью внутреннего фрейма. Его стороны называются внутренними краями фрейма. Внутренняя ширина и внутренняя высота задают внутренний размер прямоугольника. Внутренний фрейм иногда также называют областью отображения фрейма.
Как правило, внутренний фрейм разделён на корневое окно фрейма (см. Окна и фреймы) и окно минибуфера фрейма (см. Окна минибуфера). Из этого правила есть два важных исключения. Фрейм без минибуфера содержит только корневое окно и не содержит окна минибуфера. Фрейм только с минибуфером содержит только окно минибуфера, которое также служит корневым окном этого фрейма. О том, как создавать такие конфигурации фреймов, см. Начальные параметры фрейма.
- Область текста
Область текста фрейма — условная область, которая может находиться внутри нативного фрейма. Её положение не определено. Её ширину можно получить, вычтя из нативной ширины ширину внутренней рамки, одной вертикальной полосы прокрутки, а также левого и правого полей, если они заданы для этого фрейма; см. Параметры макета. Её высоту можно получить, вычтя из нативной высоты ширину внутренней рамки и высоту внутренней строки меню и панели инструментов фрейма, панели вкладок и одной горизонтальной полосы прокрутки, если они заданы для этого фрейма.
Абсолютное положение фрейма задаётся парой (X, Y) горизонтального и вертикального смещений в пикселях относительно начала координат (0, 0) дисплея фрейма. Соответственно, абсолютные края фрейма задаются смещениями в пикселях относительно этого начала координат.
Обратите внимание, что при использовании нескольких мониторов начало координат дисплея не обязательно совпадает с верхним левым углом всей доступной области отображения терминала. Поэтому в такой конфигурации абсолютное положение фрейма может быть отрицательным, даже если фрейм полностью виден.
Согласно принятому соглашению, вертикальные смещения увеличиваются «вниз». Это означает, что высота фрейма вычисляется вычитанием смещения его верхнего края из смещения нижнего края. Горизонтальные смещения, как и ожидается, увеличиваются «вправо», поэтому ширина фрейма вычисляется вычитанием смещения левого края из смещения правого края.
Для фрейма на графическом терминале следующая функция возвращает размеры описанных выше областей:
- Функция: frame-geometry &optional frame
-
Эта функция возвращает геометрические атрибуты frame. Возвращаемое значение — ассоциативный список атрибутов, перечисленных ниже. Все значения координат, высоты и ширины — целые числа, задающие количество пикселей. Обратите внимание: если frame ещё не отображался (см. Видимость фреймов), некоторые возвращаемые значения могут быть лишь приближениями фактических значений — тех, которые можно увидеть после отображения фрейма.
outer-position-
Cons-ячейка, представляющая абсолютное положение внешнего фрейма frame относительно начала координат в точке (0, 0) дисплея фрейма frame.
outer-size-
Cons-ячейка с внешними шириной и высотой frame.
external-border-size-
Cons-ячейка с горизонтальной и вертикальной шириной внешних рамок frame, предоставленных оконным менеджером. Если оконный менеджер не предоставляет эти значения, Emacs попытается определить их по координатам внешнего и внутреннего фреймов.
outer-border-width-
Ширина наружной рамки frame. Это значение имеет смысл только для сборок X без GTK+.
title-bar-size-
Cons-ячейка с шириной и высотой строки заголовка frame, предоставленными оконным менеджером или операционной системой. Если оба значения равны нулю, у фрейма нет строки заголовка. Если ширина равна нулю, Emacs не удалось получить сведения о ширине.
menu-bar-external-
Если значение не равно
nil, это означает, что строка меню является внешней (не входит в нативный фрейм frame). menu-bar-size-
Cons-ячейка с шириной и высотой строки меню frame.
tool-bar-external-
Если значение не равно
nil, это означает, что панель инструментов является внешней (не входит в нативный фрейм frame). tool-bar-position-
Указывает, с какой стороны frame находится панель инструментов; значение может быть одним из следующих:
left,top,rightилиbottom.Значения
leftиrightподдерживаются только в сборках, использующих инструментарий GTK+; значениеbottomподдерживается во всех сборках, кроме NS, а значениеtopподдерживается во всех сборках. tool-bar-size-
Cons-ячейка с шириной и высотой панели инструментов frame.
internal-border-widthШирина внутренней рамки frame.
Для получения краёв внешнего, нативного и внутреннего фреймов можно использовать следующую функцию.
- Функция: frame-edges &optional frame type
-
Эта функция возвращает абсолютные края внешнего, нативного или внутреннего фрейма frame. frame должен быть активным фреймом; по умолчанию используется выбранный фрейм. Возвращаемый список имеет вид
(left top right bottom), где все значения задаются в пикселях относительно начала координат дисплея фрейма frame. Для фреймов терминалов возвращаемые значения left и top всегда равны нулю.Необязательный аргумент type задаёт тип возвращаемых краёв:
outer-edgesозначает вернуть внешние края frame,native-edges(илиnil) — вернуть его нативные края, аinner-edges— вернуть его внутренние края.Согласно принятому соглашению, пиксели дисплея с координатами, возвращаемыми для left и top, считаются находящимися внутри (то есть принадлежащими) frame. Поэтому, если left и top оба равны нулю, пиксель в начале координат дисплея принадлежит frame. Пиксели с координатами bottom и right, напротив, считаются находящимися непосредственно снаружи 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/Frame-Layout.html