次: 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で変更するまで、振り向けは持続する。