次: Visibility of Frames, 前: Minibuffers and Frames, 上: Frames
ある時点では、Emacsの1つのフレームが選択されているフレーム (selected frame)です。 選択されているウィンドウは選択されているフレームの中につねにあります。
マウスが入っているウィンドウにキーボード入力を振り向ける ウィンドウシステムやウィンドウマネージャがあります。 ウィンドウにフォーカスを置くために、 明示的にクリックしたりコマンドを必要とするものもあります。 いずれであっても、Emacsはどのフレームにフォーカスがあるかを 自動的に追跡します。
Lispプログラムからは、関数select-frame
を呼ぶことで、
『一時的に』フレームを切り替えることもできます。
これは、ウィンドウシステムのフォーカスは変えません。
というよりは、プログラムで指定するまで
ウィンドウシステムの制御を回避します。
文字端末を使っているときには、
選択されているフレームのみが端末に実際に表示されます。
フレームを切り替える唯一の方法はswitch-frame
であり、
それ以降にswitch-frame
を呼び出すまで切り替えた効果は持続します。
初期フレーム以外の各端末フレームには番号が付いていて、
選択されているフレームの番号がモード行内のバッファ名のまえに現れます
(see Mode Line Variables)。
この関数はフレームframeを選択し、 Xサーバーのフォーカスを一時的に無視する。 frameを選択している状態は、 ユーザーが別のフレームを選択する動作を行うか 再度この関数が呼ばれるまで持続する。
サーバーやウィンドウマネジャーの要請にしたがって
フレームを選択するようにして、
Emacsはウィンドウシステムと協調します。
必要なときにはfocusイベントと呼ばれる特別な入力イベントを
生成することでこのようにします。
コマンドループはhandle-switch-frame
を呼び出すことで
イベントfocusを処理します。
See Focus Events。
この関数は、フレームframeを選択することでフォーカスイベントを 処理する。
フォーカスイベントは、通常、このコマンドを起動することで処理される。 それ以外の理由ではこれを呼び出さないこと。
この関数は、フォーカスをframeからfocus-frameへ振り向ける。 つまり、以降の打鍵やイベントは、focusではなく、 focus-frameが受け取ることになる。 そのようなイベントのあとでは、
last-event-frame
の値はfocus-frameになる。 また、focusを指定したイベントswitch-frame
は、 focus-frameを選ぶことになる。focus-frameが
nil
であると、frameでの振り向けを取り消す。 つまり、frameはイベントをふたたび受けるようになる。フォーカスの振り向けの用途の1つは、 ミニバッファを持たないフレームのためである。 これらのフレームでは、別のフレームのミニバッファを使う。 別のフレームのミニバッファを活性にすると、 フォーカスを当該フレームへ振り向ける。 これにより、ミニバッファを活性にしたフレームにマウスが入っていても、 ミニバッファのフレームにフォーカスを置ける。
フレームを選択してもフォーカスの振り向けを変更する。 フレーム
foo
を選択しているときにフレームbar
を選択すると、foo
への振り向けをbar
へ振り向けるように変更する。 これにより、select-window
を使ってユーザーが 別のフレームへ切り替えても、フォーカスの振り向けが正しく動作する。これは、フォーカスを自分自身へ振り向けているフレームは、 フォーカスを振り向けていないフレームとは異なる扱いを受けることを意味する。
select-frame
は前者に影響するが後者には影響しない。
redirect-frame-focus
で変更するまで、振り向けは持続する。