30.3.4 Размер фрейма

Каноническим способом задания размера фрейма из Emacs является задание его текстового размера — кортежа из ширины и высоты текстовой области фрейма (см. Расположение фрейма). Он может измеряться как в пикселях, так и в единицах канонического размера символа фрейма (см. Шрифт фрейма).

Для фреймов с внутренним меню или панелью инструментов собственная высота фрейма не может быть точно определена до тех пор, пока фрейм не будет фактически отображён. Это означает, что в общем случае вы не можете использовать собственный размер для указания начального размера фрейма. Как только вы узнаете собственный размер видимого фрейма, вы можете вычислить его внешний размер (см. Расположение фрейма), прибавив оставшиеся компоненты из возвращаемого значения frame-geometry. Однако для невидимых фреймов или для фреймов, которые ещё предстоит создать, внешний размер можно лишь оценить. Это также означает, что вычисление точного начального положения фрейма, заданного через смещения от правого или нижнего края экрана (см. Положение фрейма), невозможно.

Текстовый размер любого фрейма можно установить и получить с помощью параметров фрейма height и width (см. Параметры размера). Текстовый размер начального фрейма также можно задать с помощью спецификации геометрии в стиле X. См. Аргументы командной строки для вызова Emacs в Руководство по GNU Emacs. Ниже мы перечисляем некоторые функции для доступа и установки размера существующего видимого фрейма (по умолчанию выбранного).

Функция: frame-height &optional frame
Функция: frame-width &optional frame

Эти функции возвращают высоту и ширину текстовой области frame, измеренные в единицах высоты и ширины шрифта по умолчанию для frame (см. Шрифт фрейма). Эти функции являются просто сокращениями для записи (frame-parameter frame 'height) и (frame-parameter frame 'width).

Если текстовая область frame, измеренная в пикселях, не кратна размеру шрифта по умолчанию, значения, возвращаемые этими функциями, округляются вниз до количества символов шрифта по умолчанию, которые полностью помещаются в текстовую область.

Следующие функции возвращают ширину и высоту в пикселях для собственного, внешнего и внутреннего фрейма, а также текстовой области (см. Расположение фрейма) заданного фрейма. Для текстового терминала результаты выдаются в символах, а не в пикселях.

Функция: frame-outer-width &optional frame
Функция: frame-outer-height &optional frame

Эти функции возвращают внешнюю ширину и высоту frame в пикселях.

Функция: frame-native-height &optional frame
Функция: frame-native-width &optional frame

Эти функции возвращают собственную ширину и высоту frame в пикселях.

Функция: frame-inner-width &optional frame
Функция: frame-inner-height &optional frame

Эти функции возвращают внутреннюю ширину и высоту frame в пикселях.

Функция: frame-text-width &optional frame
Функция: frame-text-height &optional frame

Эти функции возвращают ширину и высоту текстовой области frame в пикселях.

В оконных системах, которые это поддерживают, Emacs по умолчанию старается, чтобы текстовый размер фрейма, измеренный в пикселях, был кратен размеру символа фрейма. Однако это обычно означает, что фрейм можно изменять только с шагом в размер символа при перетаскивании его внешних границ. Это также может нарушать попытки действительно развернуть фрейм или сделать его «полной высоты» или «полной ширины» (см. Параметры размера), оставляя некоторое пустое пространство снизу и/или справа от фрейма. В этом случае может помочь следующая опция.

Пользовательская опция: frame-resize-pixelwise

Если эта опция равна nil (значение по умолчанию), пиксельный размер текста фрейма обычно округляется до кратного текущим значениям frame-char-height и frame-char-width этого фрейма при каждом изменении размера фрейма. Если она не равна nil, округление не выполняется, следовательно, размеры фрейма могут увеличиваться/уменьшаться на один пиксель.

Установка этой переменной обычно приводит к тому, что следующая операция изменения размера передаёт соответствующие подсказки о размере оконному менеджеру. Это означает, что эту переменную следует устанавливать только в начальном файле пользователя; приложения никогда не должны временно её привязывать.

Точное значение значения nil для этой опции зависит от используемого набора инструментов. Перетаскивание внешней границы с помощью мыши выполняется посимвольно, если оконный менеджер готов обрабатывать соответствующие подсказки о размере. Вызов set-frame-size (см. ниже) с аргументами, которые не задают размер фрейма как целое число, кратное размеру его символа, однако, может: быть проигнорирован, вызвать округление (GTK+) или быть принят (Lucid, Motif, MS-Windows).

В некоторых оконных менеджерах вам, возможно, придётся установить это значение не равным nil, чтобы фрейм действительно выглядел развёрнутым или полноэкранным.

Функция: set-frame-size frame width height &optional pixelwise

Эта функция устанавливает размер текстовой области frame, измеренный в единицах канонической высоты и ширины символа на frame (см. Шрифт фрейма).

Необязательный аргумент pixelwise не равный nil означает измерять новую ширину и высоту в пикселях. Обратите внимание, что если frame-resize-pixelwise равен nil, некоторые наборы инструментов могут отказаться действительно выполнить запрос, если он не увеличивает/уменьшает размер фрейма до величины, кратной размеру его символа.

Функция: set-frame-height frame height &optional pretend pixelwise

Эта функция изменяет размер текстовой области frame до высоты в height строк. Размеры существующих окон в frame изменяются пропорционально, чтобы соответствовать.

Если pretend не равен nil, то Emacs отображает height строк вывода в frame, но не изменяет значение для фактической высоты фрейма. Это полезно только на текстовых терминалах. Использование высоты меньше, чем фактически реализует терминал, может быть полезно для воспроизведения поведения, наблюдаемого на меньшем экране, или если терминал работает некорректно при использовании всего экрана. Установка высоты фрейма напрямую не всегда работает, поскольку знание правильного фактического размера может быть необходимо для правильного позиционирования курсора на текстовых терминалах.

Необязательный четвёртый аргумент pixelwise не равный nil означает, что frame должен иметь высоту height пикселей. Обратите внимание, что если frame-resize-pixelwise равен nil, некоторые оконные менеджеры могут отказаться действительно выполнить запрос, если он не увеличивает/уменьшает высоту фрейма до величины, кратной высоте его символа.

При интерактивном использовании эта команда запросит у пользователя количество строк для установки высоты текущего выбранного фрейма. Вы также можете указать это значение с помощью числового префикса.

Функция: set-frame-width frame width &optional pretend pixelwise

Эта функция устанавливает ширину текстовой области frame, измеренную в символах. Аргумент pretend имеет тот же смысл, что и в set-frame-height.

Необязательный четвёртый аргумент pixelwise не равный nil означает, что frame должен иметь ширину width пикселей. Обратите внимание, что если frame-resize-pixelwise равен nil, некоторые оконные менеджеры могут отказаться полностью выполнить запрос, если он не увеличивает/уменьшает ширину фрейма до величины, кратной ширине его символа.

При интерактивном использовании эта команда запросит у пользователя количество столбцов для установки ширины текущего выбранного фрейма. Вы также можете указать это значение с помощью числового префикса.

Ни одна из этих трёх функций не сделает фрейм меньше, чем необходимо для отображения всех его окон вместе с их полосами прокрутки, полями, отступами, разделителями, строкой режима и строкой заголовка. Это контрастирует с запросами от оконного менеджера, инициированными, например, перетаскиванием внешней границы фрейма с помощью мыши. Такие запросы всегда выполняются путём обрезания, если необходимо, частей, которые не могут быть отображены в правом нижнем углу фрейма. Параметры min-width и min-height (см. Параметры размера) можно использовать для получения аналогичного поведения при изменении размера фрейма из Emacs.

Аномальный хук window-size-change-functions (см. Хуки для прокрутки окон и изменений) отслеживает все изменения внутреннего размера фрейма, включая те, которые вызваны запросом оконной системы или оконного менеджера. Чтобы исключить ложные срабатывания, которые могут возникнуть при изменении только размеров окон фрейма без фактического изменения размера внутреннего фрейма, используйте следующую функцию.

Функция: frame-size-changed-p &optional frame

Эта функция возвращает не nil, если внутренняя ширина или высота frame изменились с момента последнего выполнения window-size-change-functions для frame. Она всегда возвращает nil сразу после выполнения window-size-change-functions для frame.