В этом разделе описываются функции, сообщающие положения окон и позиции внутри них. Большинство этих функций сообщают положения относительно начала координат, расположенного в собственной позиции фрейма окна (см. Геометрия фрейма). Некоторые функции сообщают положения относительно начала координат дисплея фрейма окна. В любом случае начало координат имеет координаты (0, 0), а координаты X и Y увеличиваются соответственно вправо и вниз.
Для следующих функций координаты X и Y сообщаются в целых единицах символов, то есть в количестве строк и столбцов соответственно. На графическом дисплее каждая «строка» и «столбец» соответствуют высоте и ширине символа по умолчанию, заданного шрифтом фрейма (см. Шрифт фрейма).
Эта функция возвращает список координат краёв окна window. Если window опущен или равен nil, по умолчанию используется выбранное окно.
Возвращаемое значение имеет вид (left top right bottom). Эти элементы списка являются соответственно координатой X крайнего левого столбца, занимаемого окном, координатой Y самой верхней строки, координатой X на один столбец правее крайнего правого столбца и координатой Y на одну строку ниже самой нижней строки.
Обратите внимание, что это фактические внешние края окна, включая любые его украшения. На текстовом терминале, если окно имеет соседа справа, его правый край включает разделительную линию между окном и его соседом.
Если необязательный аргумент body равен nil, это означает возврат краёв, соответствующих общему размеру окна window. Не-nil значение body означает возврат краёв тела окна window. Если body не равен nil, window должно указывать на живое окно.
Если необязательный аргумент absolute равен nil, это означает возврат краёв относительно собственной позиции фрейма окна window. Не-nil значение absolute означает возврат координат относительно начала координат (0, 0) дисплея окна window. На неграфических системах этот аргумент не имеет эффекта.
Если необязательный аргумент pixelwise равен nil, это означает возврат координат в единицах ширины и высоты символа по умолчанию фрейма окна window (см. Шрифт фрейма) с округлением при необходимости. Не-nil значение pixelwise означает возврат координат в пикселях. Обратите внимание, что пиксель, задаваемый значениями right и bottom, находится непосредственно за пределами этих краёв. Если absolute не равен nil, pixelwise также неявно становится не-nil.
Эта функция возвращает края тела окна window (см. Размеры окон). Вызов (window-body-edges window) эквивалентен вызову (window-edges window t), см. выше.
Следующие функции можно использовать для сопоставления набора координат относительно фрейма с окном:
Эта функция возвращает живое окно по координатам x и y, заданным в размерах символа по умолчанию (см. Шрифт фрейма) относительно собственной позиции frame (см. Геометрия фрейма).
Если окна в этой позиции нет, возвращается nil. Если frame опущен или равен nil, по умолчанию используется выбранный фрейм.
Эта функция проверяет, занимает ли окно window координаты coordinates относительно фрейма, и если да, то какую часть окна это составляет. window должно быть живым окном.
coordinates должен быть точечной парой вида (x . y), где x и y заданы в размерах символа по умолчанию (см. Шрифт фрейма) относительно собственной позиции фрейма окна window (см. Геометрия фрейма).
Если в указанной позиции нет окна, возвращается nil. В противном случае возвращается одно из следующих значений:
(relx . rely)Координаты находятся внутри окна window. Числа relx и rely — это эквивалентные координаты относительно окна для указанной позиции, считая от 0 в верхнем левом углу окна.
mode-lineКоординаты находятся в строке режима окна window.
header-lineКоординаты находятся в верхней строке окна window.
tab-lineКоординаты находятся в строке вкладок окна window.
right-dividerКоординаты находятся в разделителе, отделяющем окно window от окна справа.
bottom-dividerКоординаты находятся в разделителе, отделяющем окно window от окна снизу.
vertical-lineКоординаты находятся в вертикальной линии между окном window и его соседом справа. Это значение возникает только в том случае, если у окна нет полосы прокрутки; позиции в полосе прокрутки для этих целей считаются находящимися вне окна.
left-fringeright-fringeКоординаты находятся в левой или правой кайме окна.
left-marginright-marginКоординаты находятся в левом или правом поле окна.
nilКоординаты не находятся ни в одной части окна window.
Функция coordinates-in-window-p не требует фрейма в качестве аргумента, поскольку всегда использует фрейм, на котором находится окно window.
Следующие функции возвращают позиции окон в пикселях, а не в единицах символов. Хотя они полезны в основном на графических дисплеях, их можно вызывать и на текстовых терминалах, где площадь экрана каждого текстового символа принимается за один пиксель.
Эта функция возвращает список пиксельных координат краёв окна window. Вызов (window-pixel-edges window) эквивалентен вызову (window-edges window nil nil t), см. выше.
Эта функция возвращает пиксельные края тела окна window. Вызов (window-body-pixel-edges window) эквивалентен вызову (window-edges window t nil t), см. выше.
Следующие функции возвращают позиции окон в пикселях относительно начала координат экрана дисплея, а не фрейма:
Эта функция возвращает пиксельные координаты окна window относительно начала координат (0, 0) дисплея фрейма окна window. Вызов (window-absolute-pixel-edges) эквивалентен вызову (window-edges window nil t t), см. выше.
Эта функция возвращает пиксельные координаты тела окна window относительно начала координат (0, 0) дисплея фрейма окна window. Вызов (window-absolute-body-pixel-edges window) эквивалентен вызову (window-edges window t t t), см. выше.
В сочетании с set-mouse-absolute-pixel-position эту функцию можно использовать для перемещения указателя мыши в произвольную позицию буфера, видимую в некотором окне:
(let ((edges (window-absolute-body-pixel-edges))
(position (pos-visible-in-window-p nil nil t)))
(set-mouse-absolute-pixel-position
(+ (nth 0 edges) (nth 0 position))
(+ (nth 1 edges) (nth 1 position))))
На графическом терминале эта форма «телепортирует» курсор мыши в верхний левый угол глифа в точке выбранного окна. Позиция, вычисленная таким образом, может также использоваться для отображения там всплывающей подсказки.
Следующая функция возвращает экранные координаты позиции буфера, видимой в окне:
Если позиция буфера position видима в окне window, эта функция возвращает координаты дисплея верхнего/левого угла глифа в позиции position. Возвращаемое значение — это точечная пара из координат X и Y этого угла относительно начала координат (0, 0) дисплея window. Возвращает nil, если position не видима в окне window.
window должно быть живым окном и по умолчанию равно выбранному окну. position по умолчанию равна значению window-point окна window.
Это означает, что для перемещения указателя мыши в позицию точки в выбранном окне достаточно написать:
(let ((position (window-absolute-pixel-position))) (set-mouse-absolute-pixel-position (car position) (cdr position)))
Следующая функция возвращает наибольший прямоугольник, который можно вписать в окно, не перекрывая текст, отображаемый в этом окне.
Эта функция вычисляет размеры наибольшего пустого прямоугольника, который можно вписать в текстовую область указанного окна window. window должно быть живым окном и по умолчанию равно выбранному.
Возвращаемое значение — это тройка, состоящая из ширины и начальной и конечной координат Y наибольшего прямоугольника, который можно вписать в пустое пространство (пространство, не отображающее текст) текстовой области окна window. Координаты X этой функцией не возвращаются — предполагается, что любой такой прямоугольник заканчивается у правого края текстовой области окна window. Если пустое пространство не найдено, возвращается nil.
Необязательный аргумент count, если не равен nil, задаёт максимальное количество прямоугольников для возврата. Это означает, что возвращаемым значением является список троек, задающих прямоугольники, причём самый большой прямоугольник идёт первым. count также может быть точечной парой, чья голова (car) задаёт количество возвращаемых прямоугольников, а хвост (CDR), если не равен nil, указывает, что все возвращаемые прямоугольники должны быть непересекающимися.
Необязательные аргументы min-width и min-height, если не равны nil, задают минимальную ширину и высоту любого возвращаемого прямоугольника.
Необязательный аргумент positions, если не равен nil, является точечной парой, чья голова (CAR) задаёт самую верхнюю, а хвост (CDR) — самую нижнюю пиксельную позицию, которая должна быть покрыта любым возвращаемым прямоугольником. Эти позиции измеряются от начала текстовой области окна window.
Необязательный аргумент left, если не равен nil, означает возврат значений, подходящих для буферов, отображающих текст справа налево. В этом случае предполагается, что любой возвращаемый прямоугольник начинается с левого края текстовой области окна window.
Обратите внимание, что эта функция должна получать размеры каждой строки глифовой матрицы окна window через window-lines-pixel-dimensions (см. Размер отображаемого текста). Следовательно, эта функция может также вернуть nil, когда текущая глифовая матрица окна window не обновлена.