IT用語集 › プログラミング › クロッシングイベント (X11)

クロッシングイベント (X11)

プログラミング Svenska → 更新: 2026-10-22

EnterNotifyとLeaveNotify。ポインタがウィンドウの境界をまたいだときにXサーバーが送るイベントで、ホバー効果やフォーカスフォローズマウスの基礎であり、多くの混乱の元でもある。

ポインタがあるウィンドウを出て別のウィンドウに入ると、サーバーは前者に LeaveNotify、後者に EnterNotify を送る。ただしクライアントがイベントマスクで EnterWindowMask と LeaveWindowMask を要求している場合に限る。ウィンドウは木構造なので、あるアプリケーションの孫ウィンドウから別のアプリケーションのウィンドウへ移ると途中のウィンドウをいくつも通過し、それらにも仮想(virtual)イベントとして通知される。detail フィールドは相手のウィンドウが階層のどこにあるかを示し、NotifyAncestor、NotifyInferior、NotifyNonlinear とその仮想版がある。mode フィールドは、ポインタが実際に動いたのか、誰かがグラブを取得・解放した副作用なのかを示す。

フォーカスフォローズマウスのウィンドウマネージャがやっていることは、クライアントのフレームでEnterNotifyを待ち、XSetInputFocus を呼ぶだけだ。ツールチップ、光るボタン、ホバーで開くメニューも同じ仕組みの一段下の応用である。混乱の原因は、ポインタが動いていなくてもサーバーがクロッシングイベントを生成することにある。下でウィンドウがマップ/アンマップされたとき、グラブでメニューが開いたとき、ウィンドウマネージャがフレームを並べ替えたときなどだ。LeaveNotifyが来たら必ずユーザーが去ったと思い込むプログラムは、クリックの最中にツールチップを失う。NotifyInferior、つまり自分の子ウィンドウにポインタが入っただけで去ったわけではない、という場合の取り違えは、誰もが一度は通る道だ。

← 用語集に戻る