Я хотел бы смочь отследить, какое приложение в настоящее время фокусируется на моем дисплее X11 из Python. Намерение состоит в том, чтобы связать его в timetracking инструмент так, чтобы я мог отслеживать то, сколько времени я провожу быть непроизводительным.
Я уже нашел этот код по 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(), )
Однако это, кажется, не работает на меня. По-видимому, неважно, какое приложение фокусируется, оба, get_wm_class () и get_wm_name () просто не возвращают Ни один.
Конечно, решение должно работать со всеми этими новыми fangled менеджерами окон как Compiz и такой.
Ого! Я сам это понял:
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, )
Несколько более приятным решением, особенно для долго работающего приложения, а не скрипта, будет использование libwnck для отслеживания подсказки _NET_ACTIVE_WINDOW. (Определение подсказки см. в спецификации EWMH)
.