GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Touchscreen-Events.html ・ emacs-doc.conao3.com

22.7.9 タッチスクリーンイベント

一部のウィンドウシステムでは、ユーザーが画面に触れたり、触れたまま指を動かしたりすることに反応する入力デバイスをサポートしています。こうした入力デバイスはタッチスクリーンと呼ばれ、Emacsはそれらが発生させるイベントをタッチスクリーンイベントとして報告します。

タッチスクリーンによって生成される個々のイベントの多くは、他のイベントが連なるより大きなシーケンスの一部として初めて意味を持つ。例えば、タッチスクリーンをタップするという単純な操作では、ユーザーがタッチスクリーン上に指を置いて持ち上げ、ディスプレイをスワイプしてスクロールさせる際には、指を置き、それを上下に何度も動かし、その後指を離すという動作を伴う。

タップやスクロールであれば指1本のシンプルなモデルで十分ですが、より複雑なジェスチャーでは、各指の位置をタッチポイントで表現し、複数の指を追跡する機能が必要になります。例えば、「ピンチズーム」ジェスチャーでは、ユーザーが2本の指を置き、それらを個別に反対方向へ動かすことがあります。このとき、個々のポイントの位置間の距離によってディスプレイのズーム倍率が決まり、それらの位置を結ぶ仮想線の中心によって、ズーム後のディスプレイのパン位置が決まります。

以下に説明する低レベルのタッチスクリーンイベントを使用することで、上述のすべてのタッチシーケンスを実装できます。これらのイベントでは、各点は、タッチポイントを識別する任意の数値と、イベント発生時の指の位置を指定するマウス位置リスト(クリックイベントを参照)からなるコンスで表現されます。

(touchscreen-begin point)

このイベントは、ユーザーがタッチスクリーンに指を押し当てて point が生成された際に送信されます。

フレームやウィンドウの特殊な領域上で発生する場合、これらのイベント read-key-sequence にも仮想プレフィックスキーが付加されます。キーシーケンス入力 を参照してください。

(touchscreen-update points)

このイベントは、タッチスクリーン上の点の位置が変化した際に送信されます。points は、現在タッチスクリーン上にある各タッチポイントの最新位置を含むタッチポイントのリストです。

(touchscreen-end point canceled)

このイベントは、別のプログラムがグラブを取得したか、あるいはユーザーがタッチスクリーンから指を離したことにより、ディスプレイ上にpointが存在しなくなった際に送信されます。

canceled は、タッチシーケンスが別のプログラム(ウィンドウマネージャなど)によってインターセプトされた場合に non-nil となり、Emacs は、そのままではタッチシーケンスによって発生するあらゆる編集コマンドを取り消すか、あるいは回避する必要があります。

これらのイベントがフレームやウィンドウの特殊な領域上で発生する場合、仮想的なプレフィックスキー read-key-sequence も付加されます。

タッチポイントがメニューバーに押し当てられた場合、Emacsは対応するtouchscreen-beginやtouchscreen-endイベントを生成しません。その代わりに、通常であればtouchscreen-endが送信されるはずの状況でも、メニューバーが表示されることがあります。

touchscreen-begin、touchscreen-end、またはtouchscreen-updateにコマンドが割り当てられていない場合、Emacsは「キー変換関数」(イベントシーケンス変換用のキーマップを参照)を呼び出し、タッチスクリーンイベントを含むキーシーケンスを通常のマウスイベントに変換します(マウスイベントを参照)。Emacsは個別のマウスデバイスから発生するイベントを区別することをサポートしていないため、変換処理中は最大2つのタッチポイントがアクティブであると想定しており、この制限を超えた場合のイベント変換結果については一切保証しません。

Emacsは、touchscreen-beginイベントの発生箇所で有効なキーマップにバインドされているコマンドなどの要因に応じて、タッチイベントをマウスイベントに変換する際に2つの異なる戦略を採用します。その箇所でdown-mouse-1にコマンドがバインドされている場合、初期の変換は単一のdown-mouse-1イベントとなり、後続のtouchscreen-updateイベントはマウスモーションイベント(モーションイベントを参照)に、最後のtouchscreen-endイベントはmouse-1またはdrag-mouse-1イベントに変換されます(ただし、touchscreen-endイベントがタッチシーケンスを別のプログラムがインターセプトしたことを示している場合はこの限りではありません)。これは「単純変換」と呼ばれ、タッチポイントの移動とマウスの移動との間に単純な対応関係をもたらします。

しかし、down-mouse-1–mouse-drag-regionにバインドされた一部のコマンド(例えば–「長押ししてドラッグ」など)は、定義済みのタッチスクリーンジェスチャーやタッチ入力に対するユーザーの期待と競合する場合があり、タッチシーケンスを単純な変換に委ねるべきではありません。名称にプロパティ(シンボルプロパティを参照)ignored-mouse-commandを含むコマンドが見つかった場合、あるいはdown-mouse-1にバインドされたコマンドが存在しない場合は、より不規則な形式の変換が行われます。この場合、Emacsはまずタッチスクリーンジェスチャー(The GNU Emacs ManualのTouchscreensを参照)を処理し、最後に、終了touchscreen-endイベント(単純な変換と同様にcanceledパラメータnilを伴う)の前にジェスチャーが検出されず、かつそのイベントの位置でmouse-1にコマンドがバインドされている場合に、タッチスクリーンイベントをマウスイベントに変換しようと試みます。mouse-1イベントを生成する前に、ポイントもtouchscreen-endイベントの位置に設定され、そのイベントの位置を含むウィンドウが選択されます。これは、mouse-drag-regionがすでにマウスクリックの位置にポイントを設定し、クリックが発生したウィンドウを選択済みであると想定するパッケージへの妥協策です。

マウスメニューを閉じた後に不要な mouse-1 イベントが発生するのを防ぐため(メニューとマウス を参照)、Emacs では down-mouse-1 がキーマップにバインドされている場合、単純変換を無効にしてそれをプレフィックスキーとして扱います。単純変換の代わりに、終了を示す touchscreen-end をタッチシーケンスの開始位置を持つ down-mouse-1 イベントに変換し、結果としてマウスメニューを表示します。

変数 touch-screen-simple-mouse-conversion がバインドされているか、あるいは nil 以外の値に設定されている場合、コマンドやメニューのバインディングの有無にかかわらず、単純な変換が有効になります。例えば、read-key の呼び出し側が mouse-movement および drag-mouse-1 イベントの受信を想定している場合などがこれに該当します。

一部のコマンドはポップアップメニューを表示する目的で down-mouse-1 にもバインドされているため、down-mouse-1 が名前に mouse-1-menu-command というプロパティを持つコマンドにバインドされている場合、Emacs はさらに最終段落に示すように動作します。

すでにタッチポイントの変換が行われている状態で2つ目のタッチポイントが登録されると、ジェスチャー変換は終了し、2つ目のタッチポイント(補助ツール)から1つ目のタッチポイントまでの距離が計測されます。その後、いずれかのタッチポイントから行われた操作では、以下の表に示すように、新しい位置間の距離と開始時に計測された距離との比を組み込んだtouchscreen-pinchイベントが生成されます。

翻訳中にタッチジェスチャーが検出された場合、以下の入力イベントのいずれかが生成されることがあります。

(touchscreen-scroll window dx dy)

翻訳処理中に「スクロール」ジェスチャーが検出された場合、それ以降の各touchscreen-updateイベントはtouchscreen-scrollイベントに変換されます。ここで、dxおよびdyは、シーケンスを開始したtouchscreen-beginイベントの位置、または直前のtouchscreen-scrollイベントのいずれか遅い方からのタッチポイントの相対的な移動量をピクセル単位で指定します。

(touchscreen-hold posn)

touchscreen-begin が生成された後、単一のアクティブなタッチポイントが touch-screen-delay 秒を超えて静止したままの場合、変換処理中に「長押し」ジェスチャが検出され、posn に touchscreen-begin イベントの位置を含むマウス位置リストが設定された状態で touchscreen-hold イベントが送信されます。

(touchscreen-drag posn)

現在のタッチシーケンスの翻訳中に「長押し」ジェスチャーが検出された場合、またはtouch-screen-extend-selectionユーザーオプションにより「ドラッグして選択」が再開された場合、後続のtouchscreen-updateイベントが発生するたびにtouchscreen-dragイベントが送信され、posnにはタッチポイントの新しい位置が設定されます。

(touchscreen-restart-drag posn)

このイベントは、「ドラッグして選択」ジェスチャー(前述のユーザーオプションによる)の継続となるタッチシーケンスの開始時に送信され、posn にはそのタッチシーケンス内における最初の touchscreen-begin イベントの位置リストが設定されます。

(touchscreen-pinch posn ratio pan-x pan-y ratio-diff)

本イベントは、補助ツールが有効な状態で、いずれかのアクティブなタッチポイントの位置に大幅な変化が生じた際に発生します。

posnは、補助ツールから観測対象のもう一方のタッチポイントまで引いた線の中点のマウス位置リストです。

ratioは、観測対象となっている両タッチポイント間の距離を、補助点が最初に登録された際のその距離で除した値、すなわち「ピンチ」ジェスチャーのスケールである。

pan-x および pan-y は、一連のタッチイベントに関連して配信された直近のイベントにおける posn のピクセル位置と本位置との差、あるいはそのようなイベントが存在しない場合には、補助ツールが最初に登録された際の両タッチポイントの中心点である。

ratio-diff は、このイベントの比率と、直前に配信されたイベントの ratio との差であり、そのようなイベントが存在しない場合は ratio となります。

このようなイベントは、それが表す変化の大きさによって、ratio が直前のイベントの値と 0.2 を超える差を持つ場合、あるいは pan-x と pan-y の和がフレームの文字幅の半分(ピクセル単位)を超える場合に送信されます(フレームフォントを参照)。

タッチスクリーンイベントを処理するLispプログラム向けに、いくつかの関数が提供されています。以下に説明する最初の2つの関数は、touchscreen-beginイベントに直接バインドされたコマンドでの使用を想定しており、マウスイベントの変換とは別に、よく使われるタッチスクリーンジェスチャーに対応させることができます。

関数: touch-screen-track-tap event &optional update data threshold

この関数は、touchscreen-begin イベント event を起点とする単一の「タップ」ジェスチャーを追跡するために使用され、多くの場合、ポイントの設定やボタンの押下に利用されます。同じタッチ識別子を持つ touchscreen-end イベントの到来を待機し、その時点でジェスチャーの終了を示す t を返します。

その間に touchscreen-update イベントが発生し、その中に event と同じ識別子を持つタッチポイントが少なくとも1つ含まれている場合、関数 update は、その touchscreen-update イベント内のタッチポイントのリストと data の2つの引数で呼び出されます。

threshold が nil ではなく、かつ当該イベントが、event で表されるタッチポイントが、event の位置からの数値でない場合には threshold または 10 ピクセルのいずれかの閾値を超えて移動したことを示す場合、nil が返され、そのタッチポイントに対するマウスイベントの変換が再開される。これは、そのシーケンスから生じる後続のタッチスクリーンジェスチャの認識を妨げないようにするためである。

その間に他のイベントが発生した場合は、nil が返されます。その場合、呼び出し元はいかなる処理も行わないようにしてください。

関数: touch-screen-track-drag event update &optional data

この関数は、touchscreen-begin イベント event を起点とする単一の「ドラッグ」ジェスチャーを追跡するために使用されます。

touch-screen-track-tapと同様に動作しますが、event内のタッチポイントが実際のドラッグとして判定されるほど十分に移動しなかった場合(デフォルトではevent内の位置から5ピクセル)、no-dragを返し、updateの呼び出しは行いません。

これら2つの機能に加え、マウスイベントの変換によって発生する一部の種類のイベントに紐付けられたコマンドに対して、呼び出し後に意図しないイベントが発生しないようにするための機能が用意されています。

関数: touch-screen-inhibit-drag

この関数は、呼び出し後、変換対象となっているタッチシーケンスの期間中、マウスイベント変換時の touchscreen-drag イベントの発生を抑制します。touchscreen-hold または touchscreen-drag イベントにバインドされたコマンドから呼び出す必要があり、それ以外の場合はエラーを通知します。

この関数は、マウスイベントの変換時にすでにジェスチャーが認識された後でなければ呼び出せないため、呼び出し後は、前述のタッチシーケンスを構成するタッチイベントからマウスイベントが発生することはありません。