Next: , Previous: , Up: Frames   [Contents][Index]


28.9 Input Focus

どんなときでも、Emacs内のただ1つのフレームが選択されたフレーム(selected frame)です。選択されたウィンドウは、常に選択されたフレーム上にあります。

Emacsがフレームを複数端末(Multiple Terminalsを参照)上に表示する際、各端末は自身の選択されたフレームをもちます。しかし、それらのうち1つだけが、“いわゆる選択されたフレーム”であり、それはもっとも最近に入力があった端末に属すフレームです。つまり、特定の端末からのコマンドをEmacsが実行する際は、その端末上の1つが選択されたフレームです。Emacsが実行するコマンドは常に1つだけなので、選択されたフレームは常に1つだけだと考える必要があります。このフレームこそ、このマニュアルで選択されたフレームと呼ぶフレームです。選択されたフレームを表示するディスプレイは、選択されたフレームのディスプレイ(selected frame’s display)です。

Function: selected-frame

この関数は選択されたフレームをリターンする。

いくつかのウィンドウシステムおよびウィンドウマネージャーは、マウスがあるウィンドウオブジェクトにキーボード入力をダイレクトします。それ以外は、さまざまなウィンドウオブジェクトにフォーカスをシフト(shift the focus)するために、明示的なクリックやコマンドを要求します。どちらの方法でも、Emacsはフォーカスをもつフレームを自動的に追跡します。Lisp関数から別フレームに明示的に切り替えるためには、select-frame-set-input-focusを呼び出します。

関数select-frameを呼び出すことにより、Lispプログラムが“一時的”にフレームを切り替えることもできます。これは、そのウィンドウシステムのフォーカス概念を変更はしません。変更ではなく、何らかの方法により制御が再確認(reasserted)されるまで、ウィンドウマネージャーの制御から抜け出す(escape)のです。

テキスト端末使用時は、その端末上で一度に表示できるフレームは1つだけなので、select-frame呼び出し後、次回の再表示で新たに選択されたフレームが実際に表示されます。このフレームは、次のselect-frame呼び出しまで、選択されたままです。テキスト端末上の各フレームは、バッファー名の前に表示される番号をもちます(Mode Line Variablesを参照)。

Function: select-frame-set-input-focus frame &optional norecord

この関数は、frameを選択、(他のフレームのせいで不明瞭な場合には)それを前面に移動(raise)して、Xサーバーのフォーカス授与を試みる。テキスト端末上では、次回再表示時に端末スクリーン全体に新たにフレームが表示される。オプション引数norecordは、select-frame(下記参照)のときと同じ意味をもつ。この関数のリターン値に意味はない。

Command: select-frame frame &optional norecord

この関数は、フレームframeを選択し、Xサーバーのフォーカスがあればそれを一時的に無視する。frameにたいする選択は、次回ユーザーが別フレームに何かを行うか、この関数の次回呼び出しまで継続する(ウィンドウシステムを使用する場合は、以前に選択されていたフレームに依然としてウィンドウシステムの入力フォーカスがあるかもしれないので、コマンドループからリターン後に、そのフレームが選択されたフレームとしてリストアされるかもしれない)。

指定されたframeは選択されたフレームとなり、その端末が選択された端末になる。その後、この関数はframe内で選択されていたウィンドウを第1引数、norecordを第2引数でサブルーチンとしてselect-windowを呼び出す(したがって、norecordが非nilなら、もっとも最近に選択されたウィンドウおよびバッファーリストの変更を避ける)。Selecting Windowsを参照のこと。

この関数はframe、またはframeが削除されていればnilをリターンする。

一般的には、実行後に端末を戻すよう切り替えることなく、別の端末に切り替えるのが可能な手段としてselect-frameを決して使用すべきではない。

Emacsは、サーバーおよびウィンドウマネージャーのリクエストとしてフレーム選択をアレンジすることにより、ウィンドウシステムと協調します。これは、適切なときにフォーカス(focus)と呼ばれる特殊な入力イベントを生成することにより行われます。コマンドループは、handle-switch-frameを呼び出してフォーカスイベントを処理します。Focus Eventsを参照してください。

Command: handle-switch-frame frame

この関数は、フレームframe選択によりフォーカスイベントを処理する。

フォーカスイベントは通常、このコマンドを呼び出すことにより、その処理を行う。他の理由でこれを呼び出しではならない。

Function: redirect-frame-focus frame &optional focus-frame

この関数は、frameからfocus-frameにフォーカスをリダイレクトする。これは、frameにかわってfocus-frameが以降のキーストロークとイベントを受け取るであろうことを意味する。そのようなイベント後は、last-event-frameの値はfocus-frameになるだろう。また、frameを指定したswitch-frameイベントも、かわりに focus-frameを選択するだろう。

focus-frameが省略またはnilの場合は、frameにたいするすべての既存のリダイレクションがキャンセルされ、したがってframeが自身のイベントを再度受け取ることになる。

フォーカスリダイレクトの用途の1つは、ミニバッファーをもたないフレームにたいしてである。これらのフレームは、別フレーム上のミニバッファーを使用する。別フレーム上のミニバッファーをアクティブにすることは、そのフレームにフォーカスをリダイレクトすることである。これは、たとえマウスがミニバッファーをアクティブにしたフレーム内に留まっていても、ミニバッファーが属すフレームにフォーカスを置く。

フレーム選択は、フォーカスリダイレクションの変更も可能にする。fooが選択されているときにフレームbarを選択することにより、fooを指すすべてのリダイレクションは、かわりにbarを指す。これは、ユーザーがselect-windowを使用してあるフレームから別のフレームに切り替えた際に、フォーカスのリダイレクトが正しく機能することを可能にする。

これは、フォーカスが自身にリダイレクトされたフレームが、フォーカスがリダイレクトされていないフレームとは異なう扱いを受けることを意味する。前者にたいしてselect-frameは影響するが、後者には影響がない。

このリダイレクションは、それを変更するためにredirect-frame-focusが呼び出されるまで継続する。

Variable: focus-in-hook

これは、Emacsフレームが入力フォーカスを得た際に実行されるノーマルフックである。

Variable: focus-out-hook

これは、Emacsフレームが入力フォーカスを失った際に実行されるノーマルフックである。

User Option: focus-follows-mouse

これは、ユーザーがマウスを移動した際に、ウィンドウマネージャーがフォーカスを転送するかどうかをEmacsに告げるためのオプションである。非nilなら、フォーカスは転送される。その場合、コマンドother-frameは新たに選択されたフレームと一貫性のある位置にマウスを移動する。