2010-04-20 12 views

Odpowiedz

5

Aby aktywować kolejne okno, właściwą rzeczą do zrobienia na warstwie protokołu Xlib jest, aby wysłać wiadomość _NET_ACTIVE_WINDOW jak opisano w specyfikacji EWMH http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html

można to zrobić z python-Xlib (przypuszczalnie) lub gdk_window_focus() na zagranicznym GdkWindow przy użyciu GDK poprzez pygtk

_NET_ACTIVE_WINDOW jest lepszy od XRaiseWindow() i był we wszystkich ważnych WM od wielu lat.

Powinieneś unikać XSetInputFocus(), co może powodować problemy (szczególnie, jeśli znacznik czasu jest nieprawidłowy). Problem polega na tym, że WM nie może przechwycić SetInputFocus(), co powoduje dziwne warunki wyścigu i niespójności interfejsu użytkownika.

Naprawdę tylko _NET_ACTIVE_WINDOW działa poprawnie, dlatego został wynaleziony, ponieważ poprzednie hacki były złe.

Istnieje biblioteka o nazwie libwnck, która pozwoli Ci aktywować okna (między innymi), ale niestety dodaje sporo narzutów, ponieważ zawsze śledzi wszystkie otwarte okna z dowolnej aplikacji, nawet jeśli nie musisz robić że. Jednak jeśli chcesz śledzić okna z innych aplikacji i tak, to libwnck ma funkcję aktywowania tych okien, które robią to, co trzeba i będą dobrym wyborem.

Podejście ściśle poprawne polega na sprawdzeniu obsługi EWMH _NET_ACTIVE_WINDOW (dokumenty EWMH jak to zrobić) i powrót do XRaiseWindow, jeśli WM nie ma _NET_ACTIVE_WINDOW. Jednakże, ponieważ każdy WM, nad którym aktywnie pracowano w ciągu ostatnich lat, ma EWMH, wiele osób jest leniwych w kwestii wycofywania starszych WM.

4

Musisz użyć i zadzwonić pod numer .circulate(Xlib.X.RaiseLowest) na obiekcie okna (który można zidentyfikować na wiele, wiele różnych sposobów - nie można zgadnąć, który z nich jest odpowiedni dla ciebie od zerowej ilości informacji o nim w twoim Q ;-). Aby zobaczyć wspaniały przykład użycia python-xlib, sprawdź menedżera okien tinywm - po wersji C autor daje wersję Pythona, która zajmuje około 30 niepustych linii bez komentarza (dla użytecznego, jeśli małego, menedżera okien ...! -).

4

Możesz rzucić okiem na the python ewmh package. Documentation zawiera przykłady, ale oto jak można osiągnąć to, czego potrzebujesz:

from ewmh import EWMH 
import random 
ewmh = EWMH() 

# get every displayed windows 
wins = ewmh.getClientList() 

# let's active one window randomly 
ewmh.setActiveWindow(random.choice(wins)) 

# flush requests - that's actually do the real job 
ewmh.display.flush() 
Powiązane problemy