Отслеживание мыши
Иногда бывает полезно отслеживать мышь, то есть отображать что-либо, указывающее, где находится мышь, и перемещать этот индикатор вместе с движением мыши. Для эффективного отслеживания мыши нужно дождаться фактического перемещения мыши.
Удобный способ отслеживать мышь — запросить события, представляющие движение мыши. Тогда можно дождаться перемещения, ожидая события. Кроме того, можно легко обрабатывать любые другие возникающие события. Это полезно, поскольку обычно не нужно отслеживать мышь бесконечно — только до другого события, например отпускания кнопки.
- Макрос: 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