Xlib
Un article de Haypo.
La bibliothèque Xlib est utilisée est pour accéder aux fonctions client/serveur de X11 (serveur graphique de Linux / BSD). Cet article présente l'utilisation du binding Python : le module Xlib.
Sommaire |
[modifier] Se connecter
from Xlib.display import Display display = Display()
Ceci va, si j'ai bien compris, ouvrir une socket vers le serveur. Le fichier ~/.Xauthority (cookie X11) est utilisé pour s'authentifier auprès du serveur graphique.
[modifier] Lister les fenêtres
La fonction Xlib « XQueryTree() » permet de lister les fenêtres filles d'une fenêtre. On peut s'en servir pour lister toutes les fenêtres du bureau.
def listWindows(root):
children = root.query_tree().children
for window in children:
yield window
for window in children:
for window in listWindows(window):
yield window
root_window = display.screen().root
listWindows(root_window)
[modifier] Propriétés d'une fenêtre
- Lire le nom de la fenêtre : window.get_wm_name()
- Dimension et position de la fenêtre : geometry = window.get_geometry(). L'objet geometry a divers attributs, et en particulier : width, height, depth, x, y.
- Numéro du processus (process ID) associé à la fenêtre : c'est l'attribute "_NET_WM_PID" :
from Xlib.protocol.request import InternAtom
from Xlib.X import AnyPropertyType
atom = InternAtom(display=window.display, name="_NET_WM_PID", only_if_exists=1)
pid = window.get_property(atom.atom, AnyPropertyType, 0, 10)
if pid:
pid = int(pid.value.tolist()[0])
else:
pass # attribut absent
[modifier] Envoyer une touche du clavier
Une fois qu'on a trouvé la bonne fenêtre, on va lui envoyer un événement.
from Xlib.X import NONE, KeyRelease, CurrentTime
from Xlib.protocol.event import KeyRelease as KeyReleaseEvent
def sendKey(window, keycode, modifiers=0, released=True):
event = KeyReleaseEvent(
type=KeyRelease,
detail=keycode,
time=CurrentTime,
root=NONE,
window=window,
child=NONE,
root_x=0,
root_y=0,
event_x=0,
event_y=0,
state=modifiers,
same_screen=1)
window.send_event(event)
window.display.flush()
Le flush() final est très important : sinon l'événement va être mis en attente dans le tampon du display.
Le code ci-dessus envoie l'événement "touche relachée", pour l'événement "touche enfoncée", utilisez :
from Xlib.X import KeyPress from Xlib.protocol.event import KeyPress as KeyPressEvent
La fonction sendKey() a besoin d'un keycode (code clavier), pour retrouver un keycode à partir d'un symbole (keysym), utilisez (ici exemple avec la touche F5) :
from Xlib.keysymdef.miscellany import XK_F5 keycode = self.display.keysym_to_keycode(XK_F5)
[modifier] Liens externes
- Sending Key Events : article qui m'a beaucoup servi

