22.7.15 Доступ к событиям мыши

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

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

Функция: event-start событие

Возвращает начальную позицию события.

Если событие является щелчком или событием нажатия кнопки, возвращает местоположение события. Если событие является событием перетаскивания, возвращает начальную позицию перетаскивания.

Функция: event-end событие

Возвращает конечную позицию события.

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

Функция: posnp объект

Эта функция возвращает не nil, если объект является списком позиции мыши в формате, описанном в События щелчка); в противном случае возвращает nil.

Эти функции принимают в качестве аргумента список позиции мыши и возвращают различные его части:

Функция: posn-window позиция

Возвращает окно, в котором находится позиция. Если позиция представляет местоположение за пределами фрейма, в котором было инициировано событие, возвращает этот фрейм.

Функция: posn-area позиция

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

Функция: posn-point позиция

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

Функция: posn-x-y позиция

Возвращает координаты x и y в пикселях из позиции в виде ячейки cons (x . y). Эти координаты относительны окну, возвращаемому posn-window.

Этот пример показывает, как преобразовать координаты, относительные к окну в текстовой области окна, в координаты, относительные к фрейму:

(defun frame-relative-coordinates (position)
  "Возвращает координаты, относительные к фрейму, из POSITION.
POSITION предположительно находится в текстовой области окна."
  (let* ((x-y (posn-x-y position))
         (window (posn-window position))
         (edges (window-inside-pixel-edges window)))
    (cons (+ (car x-y) (car edges))
          (+ (cdr x-y) (cadr edges)))))
Функция: posn-col-row позиция &optional use-window

Эта функция возвращает ячейку cons (col .  row), содержащую вычисленные столбец и строку, соответствующие позиции в буфере, описываемой позицией. Возвращаемое значение даётся в единицах ширины символа по умолчанию и высоты строки по умолчанию (включая интервалы) фрейма, вычисленных из значений x и y, соответствующих позиции. (Таким образом, если фактические символы имеют нестандартные размеры, фактические строка и столбец могут отличаться от этих вычисленных значений.) Если необязательный аргумент window не равен nil, используется ширина символа по умолчанию в окне, указанном позицией, вместо ширины фрейма. (Это имеет значение, если это окно показывает буфер с нестандартным уровнем масштабирования, например.)

Обратите внимание, что row отсчитывается от верхней части текстовой области. Если окно, заданное позицией, имеет строку заголовка (см. Строки заголовка окон) или строку вкладок, они не включаются в счёт row.

Функция: posn-actual-col-row позиция

Возвращает фактические строку и столбец в позиции в виде ячейки cons (col . row). Значениями являются фактические номера строки и столбца в окне, заданном позицией. См. События щелчка для подробностей. Функция возвращает nil, если позиция не содержит фактических значений позиции; в этом случае для получения приблизительных значений можно использовать posn-col-row.

Обратите внимание, что эта функция не учитывает визуальную ширину отображаемых символов, например количество визуальных столбцов, занимаемых символом табуляции или изображением. Если вам нужны координаты в канонических единицах символов, используйте posn-col-row.

Функция: posn-string позиция

Возвращает строковый объект, описываемый позицией, либо nil (что означает, что позиция описывает текст буфера), либо ячейку cons (строка . позиция-в-строке).

Функция: posn-image позиция

Возвращает объект изображения в позиции, либо nil (если в позиции нет изображения), либо спецификацию изображения (image …).

Функция: posn-object позиция

Возвращает объект изображения или строки, описываемый позицией, либо nil (что означает, что позиция описывает текст буфера), изображение (image …) или ячейку cons (строка . позиция-в-строке).

Функция: posn-object-x-y позиция

Возвращает координаты x и y в пикселях относительно левого верхнего угла объекта, описываемого позицией, в виде ячейки cons (dx . dy). Если позиция описывает текст буфера, возвращает относительные координаты символа текста буфера, ближайшего к этой позиции.

Функция: posn-object-width-height позиция

Возвращает ширину и высоту в пикселях объекта, описываемого позицией, в виде ячейки cons (ширина . высота). Если позиция описывает позицию в буфере, возвращает размер символа в этой позиции.

Функция: posn-timestamp позиция

Возвращает временную метку в позиции. Это время, в которое произошло событие, в миллисекундах. Такая временная метка сообщается относительно произвольного начального времени, которое варьируется в зависимости от используемой оконной системы. Например, в оконной системе X это количество миллисекунд с момента запуска X-сервера.

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

Функция: posn-at-point &optional pos window

Эта функция возвращает список позиции для позиции pos в window. pos по умолчанию равен точке в window; window по умолчанию равен выбранному окну.

posn-at-point возвращает nil, если pos не видна в window.

Функция: posn-at-x-y x y &optional frame-or-window whole

Эта функция возвращает информацию о позиции, соответствующую пиксельным координатам x и y в указанном фрейме или окне frame-or-window, которое по умолчанию равно выбранному окну. Координаты x и y относительны текстовой области выбранного окна. Если whole не равен nil, координата x относительна всей области окна, включая полосы прокрутки, поля и кайму.

Пользовательская опция: mouse-prefer-closest-glyph

Если эта переменная не равна nil, posn-point из списка позиции мыши будет установлен в позицию глифа, левый край которого ближе всего к щелчку мыши, а не в позицию глифа, находящегося непосредственно под указателем мыши. Например, если posn-at-x-y вызван с x, установленным в 9, что находится внутри символа шириной 10, отображаемого в столбце 0, точка, сохранённая в списке позиции мыши, будет после этого символа, а не перед ним.