場合によっては、マウスをトラッキングすることが有用です。これは、マウスの位置を示すものを表示し、マウスの動きに合わせてそのインジケーターを移動させることを意味します。効率的なマウストラッキングを実現するには、マウスが実際に動くまで待機する仕組みが必要です。
マウスを追跡する便利な方法は、マウスの動きを表わすイベントをリクエストすることです。そうすれば、イベントを待機することで動きを検知できます。さらに、発生しうるその他のあらゆる種類のイベントも簡単に処理できます。通常、マウスを永遠に追跡したいわけではなく、ボタンの離しといった別のイベントが発生するまでだけ追跡したいため、これは有用です。
このマクロは、マウスモーションイベントの生成を有効にした状態で body を実行します。通常、body は read-event
を使用してモーションイベントを読み取り、それに応じて表示を変更します。マウスモーションイベントの形式については、モーションイベント を参照してください。
track-mouse の値は、body
の最後のフォームの値となります。body
は、ボタンの離上を示すアップイベントや、トラッキングを停止すべきタイミングであることを示す何らかのイベントを検知した際にリターンするように設計してください。また、その値は、マウスボタンが押されている間のマウスイベントの報告方法も制御します。値が
dropping または drag-source
の場合、モーションイベントはポインタ直下のフレームを基準として報告されます。そのようなフレームが存在しない場合は、マウスボタンが最初に押されたフレームを基準としてイベントが報告されます。さらに、値が
drag-source の場合、マウス位置リストの posn-window は nil
となります。これは、マウスポインタの直下にフレームが直接表示されていないかを判定するのに有用です。
track-mouse マクロは、変数 track-mouse に nil
以外の値をバインドすることで、Emacs にマウスモーションイベントを生成させます。この変数に特殊な値 dragging
が設定されている場合、さらにディスプレイエンジンに対し、マウスポインタの形状を変更しないよう指示します。これは、Emacs
ディスプレイの広範囲にわたってマウスをドラッグする必要がある Lisp
プログラムにおいて望ましい動作です。そうしないと、マウスポインタがホバーしている表示領域に応じて形状が変わってしまう可能性があるためです(ポインタの形状
を参照)。したがって、ドラッグ中にマウスポインタが元の形状を維持することを必要とする Lisp プログラムでは、body の冒頭で track-mouse に値 dragging をバインドすべきです。
マウスの動きを追跡する一般的な目的は、現在の位置でボタンを押したり離したりした際の結果を画面上に表示することにあります。
多くの場合、mouse-face テキストプロパティ(特殊な意味を持つプロパティを参照)を使用することで、マウストラッキングを行う必要を回避できます。これはLispレベルのマウストラッキングよりもはるかに低レイヤーで動作し、よりスムーズに動作します。