WM_TAKE_FOCUS
WM_HINTSのフラグ一つと組み合わせて、キーボードフォーカスの行き先を誰が決めるか(アプリか、ウィンドウマネージャか、誰でもないか)に四通りの答えを与えるICCCMのプロトコル。
Xのキーボードフォーカスはウィンドウ一つで、XSetInputFocus は誰でも呼べる。ユーザーがウィンドウをクリックしたとき誰が呼ぶのか、ICCCMはそれを規制する必要があり、答えは行列になった。WM_HINTS の input 欄は、アプリがウィンドウマネージャにフォーカスを与えてほしいかを示す。WM_PROTOCOLS に WM_TAKE_FOCUS を載せるかは、通知を受けたいかを示す。組み合わせは四つ。No Input は xclock や xload のように決してキーボードを要らない。Passive は、ウィンドウマネージャが単にトップレベルへフォーカスを設定し、アプリはそれで満足する(xterm など)。Locally Active は、フォーカスを設定したうえでメッセージも送り、アプリが自分のサブウィンドウの適切な入力欄へ渡せるようにする。Globally Active は、ウィンドウマネージャはフォーカスに触れずメッセージだけを送り、アプリが自分で決める。
メッセージにはタイムスタンプが載り、アプリは自分の呼び出しで CurrentTime ではなくそれを使わねばならない。さもないと古いクリックが新しいクリックに勝つことがある。このモデルは、ある種のバグ報告を一括して説明する。MotifとXtのプログラムは Locally Active で、GTKとQtもそうだ。JavaのAWTは Globally Active を選び、独自のプロキシウィンドウ経由でフォーカスを取るので、dwm や xmonad のようなタイル型ウィンドウマネージャでJavaアプリが長年キーボードを得られなかった理由の一つになった。行列を無視してフォーカスを設定するだけのウィンドウマネージャは、たいてい動く。ICCCMを真面目に受け取ったプログラムに出会うまでは。