Видимый фрейм занимает прямоугольную область на дисплее своего терминала. Эта область может содержать несколько вложенных прямоугольников, каждый из которых служит для своей цели. Схема ниже показывает компоновку фрейма на графическом терминале:
<------------ 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+. На 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) на схеме выше указывают эту позицию для различных сборок:
Соответственно, родная высота фрейма может включать высоту панели инструментов, но не высоту строки меню (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. Возвращаемое значение — это ассоциативный список перечисленных ниже атрибутов. Все значения координат, высоты и ширины являются целыми числами, считающими пиксели. Обратите внимание, что если frame ещё не был отображён (см. Видимость фреймов), некоторые из возвращаемых значений могут представлять лишь приближения фактических значений — тех, которые можно увидеть после отображения фрейма.
outer-positionПара, представляющая абсолютную позицию внешнего frame, относительно начала координат в позиции (0, 0) дисплея frame.
outer-sizeПара из внешней ширины и высоты frame.
external-border-sizeПара горизонтальной и вертикальной ширины внешних границ frame, предоставляемых оконным менеджером. Если оконный менеджер не предоставляет эти значения, Emacs попытается угадать их по координатам внешнего и внутреннего фреймов.
outer-border-widthШирина наружной границы frame. Значение имеет смысл только для сборок X без GTK+.
title-bar-sizeПара ширины и высоты заголовка frame в том виде, в котором он предоставляется оконным менеджером или операционной системой. Если оба значения равны нулю, фрейм не имеет заголовка. Если только ширина равна нулю, Emacs не смог получить информацию о ширине.
menu-bar-externalЕсли не равно nil, это означает, что строка меню является внешней (не является частью
родного фрейма frame).
menu-bar-sizeПара ширины и высоты строки меню frame.
tool-bar-externalЕсли не равно nil, это означает, что панель инструментов является внешней (не является частью
родного фрейма frame).
tool-bar-positionУказывает, на какой стороне frame находится панель инструментов; может быть одним
из left, top, right или bottom.
Значения left и right поддерживаются только в сборках
с использованием GTK+; bottom поддерживается во всех сборках,
кроме NS, а top поддерживается везде.
tool-bar-sizeПара ширины и высоты панели инструментов frame.
internal-border-widthШирина внутренней границы frame.
Следующая функция может использоваться для получения краёв внешнего, родного и внутреннего фрейма.
Эта функция возвращает абсолютные края внешнего, родного или внутреннего
фрейма 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. Это означает, что если у вас есть, например, два расположенных рядом фрейма, позиционированных так, что правый внешний край левого фрейма совпадает с левым внешним краем правого фрейма, то пиксели на этом крае показывают часть правого фрейма.