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

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

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

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

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

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

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

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

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