次: , 前: Minibuffers and Frames, 上: Frames


28.9 入力フォーカス

ある時点では、Emacsの1つのフレームが選択されているフレーム (selected frame)です。 選択されているウィンドウは選択されているフレームの中につねにあります。

— 機能: selected-frame

この関数は選択されているフレームを返す。

マウスが入っているウィンドウにキーボード入力を振り向ける ウィンドウシステムやウィンドウマネージャがあります。 ウィンドウにフォーカスを置くために、 明示的にクリックしたりコマンドを必要とするものもあります。 いずれであっても、Emacsはどのフレームにフォーカスがあるかを 自動的に追跡します。

Lispプログラムからは、関数select-frameを呼ぶことで、 『一時的に』フレームを切り替えることもできます。 これは、ウィンドウシステムのフォーカスは変えません。 というよりは、プログラムで指定するまで ウィンドウシステムの制御を回避します。

文字端末を使っているときには、 選択されているフレームのみが端末に実際に表示されます。 フレームを切り替える唯一の方法はswitch-frameであり、 それ以降にswitch-frameを呼び出すまで切り替えた効果は持続します。 初期フレーム以外の各端末フレームには番号が付いていて、 選択されているフレームの番号がモード行内のバッファ名のまえに現れます (see Mode Line Variables)。

— 機能: select-frame frame

この関数はフレームframeを選択し、 Xサーバーのフォーカスを一時的に無視する。 frameを選択している状態は、 ユーザーが別のフレームを選択する動作を行うか 再度この関数が呼ばれるまで持続する。

サーバーやウィンドウマネジャーの要請にしたがって フレームを選択するようにして、 Emacsはウィンドウシステムと協調します。 必要なときにはfocusイベントと呼ばれる特別な入力イベントを 生成することでこのようにします。 コマンドループはhandle-switch-frameを呼び出すことで イベントfocusを処理します。 See Focus Events

— コマンド: handle-switch-frame frame

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

フォーカスイベントは、通常、このコマンドを起動することで処理される。 それ以外の理由ではこれを呼び出さないこと。

— 機能: redirect-frame-focus frame focus-frame

この関数は、フォーカスをframeからfocus-frameへ振り向ける。 つまり、以降の打鍵やイベントは、focusではなく、 focus-frameが受け取ることになる。 そのようなイベントのあとでは、 last-event-frameの値はfocus-frameになる。 また、focusを指定したイベントswitch-frameは、 focus-frameを選ぶことになる。

focus-framenilであると、frameでの振り向けを取り消す。 つまり、frameはイベントをふたたび受けるようになる。

フォーカスの振り向けの用途の1つは、 ミニバッファを持たないフレームのためである。 これらのフレームでは、別のフレームのミニバッファを使う。 別のフレームのミニバッファを活性にすると、 フォーカスを当該フレームへ振り向ける。 これにより、ミニバッファを活性にしたフレームにマウスが入っていても、 ミニバッファのフレームにフォーカスを置ける。

フレームを選択してもフォーカスの振り向けを変更する。 フレームfooを選択しているときにフレームbarを選択すると、 fooへの振り向けをbarへ振り向けるように変更する。 これにより、select-windowを使ってユーザーが 別のフレームへ切り替えても、フォーカスの振り向けが正しく動作する。

これは、フォーカスを自分自身へ振り向けているフレームは、 フォーカスを振り向けていないフレームとは異なる扱いを受けることを意味する。 select-frameは前者に影響するが後者には影響しない。

redirect-frame-focusで変更するまで、振り向けは持続する。

— ユーザオプション: focus-follows-mouse

このオプションは、ユーザーがマウスを動かしたときに ウィンドウマネージャがフォーカスを移動するかどうかをEmacsに伝える。 nil以外であるとフォーカスが移動することを意味する。 その場合、コマンドother-frameは、 新たに選択されたフレームに適合するような位置にマウスを移動する。