Spec-Zone.ru › Elisp

Подрамки

Подрамки — это объекты, находящиеся на полпути между окнами (см. Окна) и «обычными» рамками. Как и окна, они привязаны к владеющей рамке. В отличие от окон, они могут перекрывать друг друга — изменение размера или положения одной подрамки не меняет размер или положение других подрамок-братьев.

По задумке, операции по созданию или модификации подрамок реализованы с помощью параметров рамок (см. Параметры рамок) без каких-либо специализированных функций или настраиваемых переменных. Обратите внимание, что подрамки имеют смысл только на графических терминалах.

Чтобы создать новую подрамку или преобразовать обычную рамку в подрамку, установите параметр parent-frame этой рамки (см. Параметры взаимодействия с рамкой) на значение уже существующей рамки. Рамка, указанная этим параметром, будет родительской рамкой, пока параметр не будет изменён или сброшен. Технически это делает окно подрамки дочерним окном окна родительской рамки в системе окон.

Параметр parent-frame может быть изменён в любое время. Установка его на другую рамку изменяет родительскую рамку подрамки. Установка его на другую подрамку делает рамку вложенной подрамкой. Установка его на nil восстанавливает статус рамки как главной рамки — рамки, чьё окно в системе окон является дочерним окном корневого окна дисплея.

Поскольку подрамки могут быть произвольно вложены, рамка может быть одновременно дочерней и родительской. Кроме того, относительные роли дочерней и родительской рамок могут быть изменены в любое время (хотя обычно следует поддерживать размер подрамки достаточно меньшим, чем размер родительской). Будет выдано сообщение об ошибке при попытке сделать рамку своим предком.

Большинство систем окон обрезают подрамки на границах родительской рамки (см. Геометрия рамок) — всё за пределами этих границ обычно невидимо. Параметры left и top подрамки задают положение относительно левого верхнего угла родительской рамки. При изменении размера родительской рамки это положение концептуально не изменяется.

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

Обычно перемещение родительской рамки также перемещает все её подрамки и их потомков, сохраняя их относительное положение неизменным. Обратите внимание, что обработчик move-frame-functions (см. Положение рамки) выполняется для подрамки только при изменении положения подрамки относительно родительской рамки.

При изменении размера родительской рамки её подрамки концептуально сохраняют свои предыдущие размеры и положение относительно левого верхнего угла родителя. Это означает, что подрамка может стать (частично) невидимой, когда родительская рамка уменьшается. Параметр keep-ratio (см. Параметры взаимодействия с рамкой) можно использовать для пропорционального изменения размера и положения подрамки при изменении размера родительской рамки. Это может предотвратить затемнение частей рамки при уменьшении её родительской рамки.

Видимая подрамка всегда отображается поверх родительской рамки, закрывая её части, за исключением сборок NS, где она может быть размещена под родительской рамкой. Это аналогично окну в системе окон главной рамки, которое также всегда отображается поверх родительского окна — корневого окна рабочего стола. При иконизации или скрытии родительской рамки (см. Видимость рамок) её подрамки скрываются. При разиконизации или показе родительской рамки её подрамки становятся видимыми.

При удалении родительской рамки (см. Удаление рамок) её подрамки рекурсивно удаляются перед ней. Есть одно исключение из этого правила: когда подрамка служит замещающей минибуферной рамкой (см. Минибуферы и рамки) для другой рамки, она сохраняется до удаления родительской рамки. Если в этот момент ни одна оставшаяся рамка не использует подрамку в качестве минибуферной рамки, Emacs попытается удалить подрамку. Если это удаление по какой-либо причине не удастся, подрамка становится главной рамкой.

Возможность наличия меню или панели инструментов у подрамки зависит от системы окон или менеджера окон. Большинство систем окон явно запрещают панели меню для подрамок. Полезно отключить и меню, и панели инструментов через начальные параметры рамки.

Обычно подрамки не отображают украшения менеджера окон, такие как строка заголовка или внешние границы (см. Геометрия рамок). Когда подрамка не отображает меню или панель инструментов, вместо внешних границ можно использовать другие границы рамки (см. Параметры макета).

В частности, под X (но не при сборке с GTK+), можно использовать внешнюю границу рамки. В MS-Windows, указание ненулевого внешнего размера границы отобразит внешнюю границу шириной в один пиксель. Во всех системах окон можно использовать внутреннюю границу. В любом случае рекомендуется отключить украшения менеджера окон у подрамки с помощью параметра рамки undecorated (см. Параметры управления).

Для изменения размера или перемещения подрамки без украшений с помощью мыши необходимо использовать специальные параметры рамки (см. Параметры перетаскивания мышью). Внутренняя граница подрамки, если присутствует, может использоваться для изменения размера рамки с помощью мыши, при условии, что рамка имеет ненулевой параметр nil drag-internal-border. Если установлен, параметр snap-width указывает количество пикселей, на которых рамка прилипает к соответствующему краю или углу родительской рамки.

Существует два способа перетаскивания всей подрамки с помощью мыши: параметр drag-with-mode-line, если он не nil, позволяет перетаскивать рамку без окна минибуфера (см. Окна минибуфера) через область строки режима самого нижнего окна. Параметр drag-with-header-line, если он не nil, позволяет перетаскивать рамку через область строки заголовка самого верхнего окна.

Для того, чтобы подрамке была доступна перетаскиваемая строка заголовка или строки режима, полезны параметры окна mode-line-format и header-line-format (см. Параметры окон). Они позволяют удалить нежелательную строку режима (при выборе drag-with-header-line) и удалить чувствительные к мыши области, которые могут помешать перетаскиванию рамки.

Когда пользователь перетаскивает рамку мышью и переходит за пределы области, легко перетащить рамку за пределы области экрана родителя. Восстановление такой рамки может быть сложным после отпускания кнопки мыши. Для предотвращения такой ситуации рекомендуется установить параметр рамки top-visible или bottom-visible (см. Параметры перетаскивания мышью).

Установите параметр top-visible подрамки на число, если вы хотите разрешить пользователю перетаскивание этой рамки за её строкой заголовка. Установка top-visible на число запрещает перетаскивание верхнего края подрамки выше верхнего края родителя. Установите параметр bottom-visible на число, когда вы хотите перетаскивать эту рамку через её строку режима; это запрещает перетаскивание нижнего края подрамки ниже нижнего края родителя. В любом случае это число также определяет ширину и высоту (в пикселях) области подрамки, которая остаётся видимой во время перетаскивания.

Когда подрамка используется для отображения буфера с помощью display-buffer-in-child-frame (см. Функции действий по отображению буфера), параметр auto-hide-function подрамки (см. Параметры взаимодействия с рамкой) можно установить в функцию, чтобы надлежащим образом обработать рамку при выходе из окна, отображающего буфер.

При использовании подрамки во время взаимодействия с минибуфером, например, для отображения дополнений в отдельном окне, полезен параметр minibuffer-exit (см. Параметры взаимодействия с рамкой) для обработки рамки при выходе из минибуфера.

Поведение подрамок отличается от поведения главных рамок и другими способами. Здесь мы набросаем некоторые из них:

  • Семантика максимизации и иконизации подрамок сильно зависит от системы окон. Как правило, приложения никогда не должны вызывать эти операции над подрамками. По умолчанию вызов iconify-frame над подрамкой попытается иконизировать главную рамку, соответствующую этой подрамке. Чтобы получить другое поведение, пользователи могут настроить параметр iconify-child-frame, описанный ниже.
  • Поднятие, опускание и переупорядочивание подрамок (см. Поднятие и опускание) или изменение z-group (см. Параметры позиции) подрамки изменяет только порядок стекирования подрамок с одним и тем же родителем.
  • Многие системы окон не могут изменить непрозрачность (см. Параметры шрифта и цвета) подрамок.
  • Передача фокуса от подрамки к предку, который не является её родителем, нажатием мыши в видимой части окна предка может не получиться в некоторых системах окон. Возможно, сначала нужно нажать в окне непосредственного родителя.
  • Менеджеры окон могут не беспокоиться о расширении своей политики следования фокусу на подрамки. Настройка mouse-autoselect-window может помочь в этом (см. Автовыбор окна мышью).
  • Опускание (см. Перетаскивание) на подрамки не гарантируется на всех системах окон. Некоторые будут опускать объект на родительскую рамку или на какого-либо предка вместо этого.

Следующие две функции могут быть полезны при работе с подрамками и родительскими рамками:

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

Эта функция возвращает родительскую рамку frame. Родительская рамка frame — это рамка Emacs, чьё окно в системе окон является родительским окном окна frame в системе окон. Если такая рамка существует, frame считается дочерней рамкой этой рамки.

Функция возвращает nil если у frame нет родительской рамки.

Функция: frame-ancestor-p ancestor descendant

Эта функция возвращает не-nil если ancestor является предком descendant. ancestor является предком descendant, когда он либо родительская рамка descendant, либо является предком родительской рамки descendant. И ancestor, и descendant должны указывать на живые рамки.

END_OF_DOCUMENT_MARKER

Обратите внимание также на функцию window-largest-empty-rectangle (см. Координаты и окна), которая может использоваться для вписывания дочернего фрейма в самую большую пустую область существующего окна. Это может быть полезно, чтобы избежать того, что дочерний фрейм закроет любой текст, отображаемый в этом окне.

Настройка следующего параметра может быть полезной для настройки поведения iconify-frame для дочерних фреймов.

Параметр пользователя: iconify-child-frame

Этот параметр указывает Emacs, как поступить, когда ему предлагается свернуть дочерний фрейм. Если он nil, iconify-frame ничего не сделает, когда будет вызван на дочернем фрейме. Если он iconify-top-level, Emacs попытается свернуть верхнеуровневый фрейм, который является предком этого дочернего фрейма. Если он make-invisible, Emacs попытается сделать этот дочерний фрейм невидимым вместо его свертывания.

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

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Child-Frames.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API