Xlib

Un article de Haypo.

Retour à la page précédente Retour à la programmation

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

Récupérée de « http://www.haypocalc.com/wiki/Xlib »