2010-06-28 18 views
6

Je voudrais être en mesure de suivre quelle application est actuellement concentrée sur mon affichage X11 à partir de Python. L'intention est de le lier dans un outil de calcul de délai afin que je puisse garder une trace du temps que je passe à être improductif.Comment détecter l'application actuellement ciblée?

Je l'ai déjà trouvé ce code à http://thpinfo.com/2007/09/x11-idle-time-and-focused-window-in.html:

import Xlib.display 
display = Xlib.display.Display() 
focus = display.get_input_focus() 
print "WM Class: %s" % (focus.focus.get_wm_class(),) 
print "WM Name: %s" % (focus.focus.get_wm_name(),) 

Cependant, il ne semble pas fonctionner pour moi. Apparemment, peu importe quelle application est ciblée, get_wm_class() et get_wm_name() retournent simplement None.

Bien sûr, la solution doit fonctionner avec tous ces nouveaux gestionnaires de fenêtres comme Compiz et autres.

Répondre

8

Whoo! Je pensais que ce moi-même:

import Xlib.display 
display = Xlib.display.Display() 
window = display.get_input_focus().focus 
wmname = window.get_wm_name() 
wmclass = window.get_wm_class() 
if wmclass is None and wmname is None: 
    window = window.query_tree().parent 
    wmname = window.get_wm_name() 
print "WM Name: %s" % (wmname,) 
+0

Alors, que fait réellement window.query_tree() '? J'ai trouvé que moi aussi je l'ai utilisé pour obtenir le résultat désiré, mais le sens/la fonction derrière cela est encore un peu un mystère pour moi. Les docs Python Xlib ne sont pas très utiles non plus. – erb

0

Une solution un peu plus agréable, surtout pour une application de longue durée plutôt qu'un script, utiliserait libwnck pour suivre l'indice de _NET_ACTIVE_WINDOW. (Voir la spécification EWMH pour la définition de l'indice.)