Leksykon IT › Programowanie › WM_TAKE_FOCUS

WM_TAKE_FOCUS

Programowanie Svenska → Zaktualizowano: 2026-10-09

Protokół ICCCM, który wraz z jedną flagą w WM_HINTS daje cztery różne odpowiedzi na pytanie, kto decyduje o fokusie klawiatury: aplikacja, menedżer okien czy nikt.

Fokus klawiatury w X to jedno okno, a XSetInputFocus może wywołać każdy. ICCCM musiało uregulować, kto to robi, gdy użytkownik klika okno, i wyszła z tego macierz. Pole input w WM_HINTS mówi, czy aplikacja chce, by menedżer okien nadał jej fokus; wpisanie WM_TAKE_FOCUS do WM_PROTOCOLS mówi, czy chce o tym zostać powiadomiona. Cztery kombinacje: No Input — xclock i xload, które nigdy nie chcą klawiatury; Passive — menedżer po prostu ustawia fokus na oknie najwyższego poziomu, a aplikacja jest zadowolona, jak xterm; Locally Active — menedżer ustawia fokus i dodatkowo wysyła komunikat, by aplikacja przekazała fokus właściwemu polu tekstowemu wśród własnych podokien; oraz Globally Active — menedżer nigdy nie rusza fokusu, tylko wysyła komunikat i pozwala aplikacji zdecydować samej.

Komunikat niesie znacznik czasu i aplikacja musi go użyć zamiast CurrentTime we własnym wywołaniu, inaczej starsze kliknięcie może pokonać nowsze. Modele tłumaczą cały gatunek zgłoszeń błędów. Programy Motif i Xt są Locally Active, podobnie GTK i Qt. AWT Javy wybrało Globally Active i bierze fokus przez własne okno pośredniczące, co jest jednym z powodów, dla których aplikacje Javy latami miały kłopot z uzyskaniem klawiatury w kafelkowych menedżerach okien, jak dwm i xmonad. Menedżery, które ignorują macierz i po prostu ustawiają fokus, zwykle działają — dopóki nie trafią na program, który potraktował ICCCM poważnie.

← Wróć do leksykonu