Xlib a-t-il un événement de fenêtre actif?

J’essaie d’écrire un programme qui surveille le moment où la fenêtre active change avec Xlib. J’ai du mal à trouver le meilleur moyen de le faire. Ce sont mes idées jusqu’à présent:

  • Chaque seconde, utilisez _NET_ACTIVE_WINDOW pour obtenir la fenêtre active et, si elle a changé, exécutez le code associé à l’événement.
  • Obtenez une liste de toutes les fenêtres et écoutez leur focus en événement. Je devrais trouver comment garder une liste à jour des fenêtres ouvertes.

Est-ce leur un moyen plus facile / meilleur? Je suis nouveau dans la programmation avec Xlib.

Ne pouvez-vous pas simplement sélectionner PropertyChange dans la fenêtre racine pour obtenir les événements PropertyNotify envoyés lorsqu’une propriété est mise à jour, puis vérifier chaque événement pour voir s’il s’agissait de _NET_ACTIVE_WINDOW ?

Voici une implémentation Python de ce que @alanc a proposé.

 import Xlib import Xlib.display disp = Xlib.display.Display() root = disp.screen().root NET_ACTIVE_WINDOW = disp.intern_atom('_NET_ACTIVE_WINDOW') NET_WM_NAME = disp.intern_atom('_NET_WM_NAME') last_seen = {'xid': None} def get_active_window(): window_id = root.get_full_property(NET_ACTIVE_WINDOW, Xlib.X.AnyPropertyType).value[0] focus_changed = (window_id != last_seen['xid']) last_seen['xid'] = window_id return window_id, focus_changed def get_window_name(window_id): try: window_obj = disp.create_resource_object('window', window_id) window_name = window_obj.get_full_property(NET_WM_NAME, 0).value except Xlib.error.XError: window_name = None return window_name if __name__ == '__main__': root.change_atsortingbutes(event_mask=Xlib.X.PropertyChangeMask) while True: win, changed = get_active_window() if changed: print(get_window_name(win)) while True: event = disp.next_event() if (event.type == Xlib.X.PropertyNotify and event.atom == NET_ACTIVE_WINDOW): break 

La version plus commentée que j’ai écrite à titre d’exemple pour quelqu’un se trouve dans cet esprit .

Je cherchais également un “dispositif de capture d’événement de changement de fenêtre actif”. Ce que j’utilise en moyenne (et qui pourrait vous être utile) est une combinaison de xdotool et xwininfo .

 xwininfo -id "$(xdotool getactivewindow)"