一部のウィンドウシステムではユーザーがスクリーンにタッチしたり、タッチしながら指を動かすことで反応する入力デバイスがサポートされています。Emacsはこれらのタッチスクリーンと呼ばれる入力デバイスが生成したイベントをタッチスクリーンイベント(touchscreen event)として報告します。
タッチスクリーンが生成した個々のイベントのほとんどは、他のイベントのより大きなシーケンスの一部としての意味しかもっていません。たとえばタッチスクリーンをタップするという単純な操作はユーザーがタッチスクリーンに指を置いて離すという操作、ディスプレイをスクロールためのスワイプはタッチスクリーンに指を置いて何度も上(下)に動かしてから指を離すという操作を引き起こすのです。
タップやスクロールにたいしては一本の指で構成される単純なモデルで十分ですが、より複雑なジェスチャーには複数の指を追跡するためのサポートが要求されまづ。指が複数の場合には、それぞれの指の位置はタッチポイント(touch point)によって表されることになります。たとえば“ズームするためのピンチアウト”というジェスチャーは、ユーザーが指を2本置いて、それらの指を別個に反対方向へ動かすことから構成されます。ここでこれら2本の指による個別のポイント位置の間の距離によってディスプレイのズーム量、これらの位置を結ぶ想像上の線の中央位置によってズーム後にどこにディスプレイをパンする(振る)かが決まります。
下記の低レベルなタッチスクリーンイベントを使って、上述したタッチシーケンスすべてを実装できます。これらのイベントでは、ポイントはそれぞれポイントを識別する任意の番号、およびイベント発生時の指の位置を指定するマウス位置リスト(クリックイベントを参照)のコンスセルによって表現されます。
(touchscreen-begin point)
これはユーザーがタッチスクリーンにたいして指を押すことでpointが作成されたときに送信されるイベント。
これらのイベントがフレームやウィンドウの特別な場所で発生した場合には、read-key-sequence
は想像上のプレフィクスキーもこれらのイベントに付加する。キーシーケンス入力を参照のこと。
(touchscreen-update points)
これはタッチスクリーン上のポイントの位置が変更されたときに送信されるイベント。pointsはカレントでタッチスクリーン上にあるタッチポイントの最新位置を含んだタッチポイントのリスト。
(touchscreen-end point canceled)
これは他のプログラムにより奪われたりユーザーがタッチスクリーンから指を離したことによってpointがディスプレイ上に存在しなくなった際に送信されるイベント。
タッチシーケンスが(ウィンドウマネージャーのような)他のプログラムからインターセプト(intercept:
横取り)されるとcanceledが非nil
となり、Emacsはインターセプトされなければ得られたであろすべての編集コマンドの結果をアンドゥまたは破棄する必要がある。
これらのイベントがフレームやウィンドウの特別な場所で発生した場合には、read-key-sequence
は想像上のプレフィクスキーもこれらのイベントに付加する。
Emacsはメニューバーにたいしてタッチポイントが押下されるとそれに対応するtouchscreen-begin
やtouchscreen-end
のイベントを生成しません。そのかわりに他の状況においてはtouchscreen-end
の配信後に表示されるメニューバーが表示されるかもしれません。
touchscreen-begin
、touchscreen-end
、touchscreen-update
にコマンドがバインドされていなければ、Emacsはタッチスクリーンイベントを含んだキーシーケンスを通常のマウスイベント(マウスイベントを参照)に変換するために“キー変換関数(key translation
function)”を呼び出します(イベントシーケンス変換のためのキーマップを参照)。Emacsは別個のマウスデバイスを発生源とするイベントの区別をサポートしていないので、変換が行われる際にアクティブなタッチポイントは最大で2つと仮定して、この制限を超えた際のイベント変換の結果については保証されていません。
Emacsはタッチイベントからマウスイベントへの変換にたいして、touchscreen-begin
イベントの位置でアクティブなキーマップにバインドされているコマンドといったような偶発的な要因に応じた2つの異なるストラテジー(strategiesl:
戦略)を適用します。その位置においてあるコマンドがdown-mouse-1
にバインドされていれば、最初のイベントは単独のdown-mouse-1
として構成されて後続のtouchscreen-update
イベントがマウスモーションイベント(モーションイベントを参照)へと変換、最後にtouchscreen-end
イベントがmouse-1
かdrag-mouse-1
のイベントに変換されます(他のプログラムによってタッチシーケンスがインターセプトされたことをtouchscreen-end
イベントが示す場合を除く)。これは“単純変換(simple
translation)”と呼ばれるもので、タッチポイントとマウスモーションの間に単純な対応を生成する変換です。
ただしdown-mouse-1
にバインドされているコマンドの一部(たとえばmouse-drag-region
)は、(たとえば“long-press
to
drag”、長押ししてドラッグのような)定義済みのタッチスクリーンジェスチャーと競合するか、あるいはタッチ入力にたいするユーザーの期待に応えるためにもタッチシーケンスを単純な変換の対象にするべきではありません。名前にプロパティignored-mouse-command
(シンボルのプロパティを参照)を含むコマンドに遭遇した場合やdown-mouse-1
にバインドされているコマンドがない場合には、より変則的な変換形式が採用されます。この場合はまずEmacsはタッチスクリーンジェスチャー(Touchscreens in The GNU Emacs
Manualを参照)を処理してから、最後に(単純変換のときのようにcanceledパラメーターをnil
にして)touchscreen-end
イベントをクローズする前に何もジェスチャーが検知されなければタッチスクリーンイベントをマウスイベントへと変換、そのイベント位置でmouse-1
にコマンドをバインドします。mouse-1
イベントの生成に先立ちポイントをtouchscreen-end
イベントの位置にセット、mouse-drag-region
がすでにすべてのマウスクリック位置を指すとともに、クリックされたウィンドウが選択されていると仮定するパッケージへの妥協策として、そのイベント位置を含むウィンドウを選択します。
マウスメニューを閉じた後(メニューとマウスを参照)に予期せぬmouse-1
イベントが到達するのを避けるために、down-mouse-1
がキーマップにバインドされている場合には、Emacsがそれをプレフィクスキーにすることで単純な変換も回避します。Emacsは単純な変換を行うかわりにtouchscreen-end
のクローズを、イベント位置がタッチシーケンスの開始位置であるようなdown-mouse-1
イベントに変換、それによりマウスメニューが表示されます。
ポップアップメニューを表示する目的のための特定のコマンドもdown-mouse-1
にバインドされているので、down-mouse-1
が名前にプロパティmouse-1-menu-command
をもつようなコマンドにバインドされている場合には、Emacsはさらに最後のパラグラフで示したような動作を行います。
あるタッチポイントがすでに変換中なので2つ目のタッチポイントを登録するとジェスチャーの変換は終了して、2つ目のタッチポイント(ancillary
tool、いわゆる補助工具)から1つ目のタッチポイントまでの距離が測定されます。これらタッチポイントいずれかからの後続モーションによる新たな位置間の距離と、最初に測定された距離によって形成される比率を組み込んだtouchscreen-pinch
イベントが生成されます(以下テーブルを参照)。
変換中にタッチジェスチャーが検知されると、以下の入力イベントのいずれかが生成されるかもしれません:
(touchscreen-scroll window dx dy)
変換プロセス中に“スクロール(scrolling)”のジェスチャーが検知されると、それに続くtouchscreen-update
イベントはそれぞれtouchscreen-scroll
イベントへと変換される。ここでdxとdyはそのシーケンスを開始したtouchscreen-begin
イベント、あるいは最後のtouchscreen-scroll
イベントのいずれか遅く発生したイベント位置からの相対的モーションをピクセル単位で指定する。
(touchscreen-hold posn)
単一のアクティブなタッチポイントがtouchscreen-begin
が生成されて以降touch-screen-delay
秒を超える間静止した状態のままだと、変換プロセス中に“長押し(long-press)”のジェスチャーが検知されて、posnにtouchscreen-begin
のイベント位置を含んだマウス位置リストをセットしたtouchscreen-hold
イベントが送出される。
(touchscreen-drag posn)
カレントのタッチシーケンスの変換中、あるいはユーザーオプションtouch-screen-extend-selection
により“ドラッグ選択(drag-to-select)”が再開されると、posnにタッチポイントの新たな位置をセットしたtouch-screen-extend-selection
イベントが後続のイベントとしてそれぞれ送出される。
(touchscreen-restart-drag posn)
このイベントは継続中の“ドラッグ選択(drag-to-select)”の結果としてタッチシーケンス開始時に、posnにそのタッチシーケンス中の最初のtouchscreen-begin
イベントの位置リストをセットして送出される。
(touchscreen-pinch posn ratio pan-x pan-y ratio-diff)
このイベントは補助工具(ancillary tool)がアクティブな際にアクティブなタッチポイント位置が有意に変更されると配信される。
posnは補助工具から観測中の別のタッチポイントに描画される線分の中間点にたいするマウス位置リスト。
ratioは観測中の両方のタッチポイント間の距離を、補助工具が最初に登録された際の位置で除した値、すなわち“ピンチ(pinch)”のジェスチャーのスケールのこと。
pan-xとpan-yはposnのピクセル位置とこの一連のタッチイベントに関して配信された最後のイベントにおけるこの位置の差、そのようなイベントが存在しない場合には補助工具が最初に登録された際の両方のタッチポイントの中心点。
ratio-diffはこのイベントのratioと配信された最後のイベントのratio。そのようなイベントが存在しない場合にはratio。
イベントが表す変更の重大さと前のイベントで得られたratioの差が0.2
より大きい、あるいはpan-xとpan-yの和がそのフレームの文字(フレームのフォントを参照)のピクセル幅の半分を超える場合にこのようなイベントが送出される。
タッチスクリーンイベントを処理するLispプログラム向けにいくつかの関数が提供されています。以下で説明する関数のうち最初期2つは、touchscreen-begin
イベントに直接バインドされるコマンドからの使用を意図しています。これらの関数はマウスイベントの変換とは別に、一般的に使用されるタッチスクリーンジェスチャーへの応答も可能です。
この関数はtouchscreen-begin
イベントであるeventを発生源とする単独の“タップ(tap)”ジェスチャーの追跡、およびポイントのセットやボタンのアクティブ化によく用いられる。同一のタッチ識別子をもつtouchscreen-end
イベントの到着を待機して、到着するとその時点でジェスチャーの終了を意味するt
をリターンする。
待機中にtouchscreen-update
イベントが到着して、そのうち少なくとも1つのタッチポイントがeventと同じ識別子をもつ場合には、そのtouchscreen-update
イベント内のタッチポイントのリスト、dataという2つの引数で関数updateを呼び出す。
thresholdが非nil
、かつeventで表されるタッチポイントがthreshold、event位置からの数値でなければ10ピクセルといういずれかの閾値を超えて移動した場合にはnil
がリターンされて、そのシーケンスから生じる後続のタッチスクリーンジェスチャーの認識を阻害しないようにそのタッチポイントにたいするマウスイベント変換が再開される。
待機中に他のイベントが到達するとnil
をリターンする。この場合には呼び出し側は何のアクションも処理するべきではない。
この関数はtouchscreen-begin
イベントであるevent
を発生源とする単独の“ドラッグ(drag)”ジェスチャーを追跡するために使用される。
これはtouch-screen-track-tap
と同じように振る舞うがno-drag
をリターンすること、および実際のドラッグとして認識されるほど十分にタッチポイントが移動しなかった場合(デフォルトではevent
内の位置から5ピクセル)にupdateの呼び出しを控える点が異なる。
上記2つの関数に加えて、マウスイベント変換を介して生成される一部のイベントタイプにバインドされるコマンド向けに、コマンド呼び出し後に予期せぬイベント生成を防ぐための関数が提供されています。
この関数は呼び出された後のタッチシーケンス変換の間、マウスイベント変換中のtouchscreen-drag
イベントの生成を抑止する。この関数がtouchscreen-hold
かtouchscreen-drag
のイベントにバインドされたコマンドから呼び出さなければならず、それ以外に場合にはエラーをシグナルする。
この関数はマウスイベント変換中にジェスチャーがすでに認識された後でのみ呼び出せるので、呼び出し後に前述したタッチシーケンスを構成するタッチイベントから生成されるマウスイベントは存在しない。