Spec-Zone.ru › Elisp

Отслеживание мыши

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

Удобный способ отслеживать мышь — запросить события, представляющие движение мыши. Тогда можно дождаться перемещения, ожидая события. Кроме того, можно легко обрабатывать любые другие возникающие события. Это полезно, поскольку обычно не нужно отслеживать мышь бесконечно — только до другого события, например отпускания кнопки.

Макрос: track-mouse body…

Этот макрос выполняет body, включая генерацию событий движения мыши. Обычно в body используется read-event для чтения событий движения и соответствующего изменения отображения. Формат событий движения мыши см. в разделе События движения.

Значение track-mouse совпадает со значением последней формы в body. Следует построить body так, чтобы он завершался при получении события отпускания, указывающего на отпускание кнопки, или другого события, означающего, что отслеживание пора прекратить. Его значение также определяет, как сообщаются события мыши при удерживании кнопки: если оно равно dropping или drag-source, события движения сообщаются относительно кадра под указателем. Если такого кадра нет, события будут сообщаться относительно кадра, на котором впервые нажали кнопку мыши. Кроме того, posn-window в списке позиции мыши будет иметь значение nil, если значение равно drag-source. Это позволяет определить, что кадр не виден непосредственно под указателем мыши.

Макрос track-mouse заставляет Emacs генерировать события движения мыши, связывая переменную track-mouse со значением, отличным от nil. Если этой переменной присвоено специальное значение dragging, он дополнительно указывает движку отображения не изменять форму указателя мыши. Это желательно в программах на Lisp, которым требуется перетаскивание мышью через большие области отображения Emacs, поскольку в противном случае форма указателя мыши может меняться в зависимости от области отображения, над которой он находится (см. раздел Форма указателя). Поэтому программы на Lisp, которым нужно сохранять исходную форму указателя мыши во время перетаскивания, должны связывать track-mouse со значением dragging в начале своего body.

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

Во многих случаях необходимости отслеживать мышь можно избежать, используя текстовое свойство mouse-face (см. раздел Свойства с особым значением). Этот способ работает на гораздо более низком уровне и выполняется плавнее, чем отслеживание мыши на уровне Lisp.

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

Spec-Zone.ru

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