2010-06-28 32 views
6

Tôi muốn có thể theo dõi ứng dụng nào hiện đang tập trung vào màn hình X11 của tôi từ Python. Mục đích là để buộc nó vào một công cụ thời gian để tôi có thể theo dõi bao nhiêu thời gian tôi dành được không hiệu quả.Tôi làm cách nào để phát hiện ứng dụng hiện đang tập trung?

Tôi đã tìm thấy mã này ở 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(),) 

Tuy nhiên, nó dường như không làm việc cho tôi. Rõ ràng, bất kể ứng dụng nào được tập trung, cả get_wm_class() và get_wm_name() chỉ trả về None.

Tất nhiên, giải pháp cần làm việc với tất cả các trình quản lý cửa sổ mới lạ như Compiz và như vậy.

Trả lời

8

Whoo! I figured it out bản thân mình:

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

Vì vậy, 'window.query_tree()' thực sự làm gì? Tôi đã tìm thấy rằng tôi cũng đã sử dụng nó để có được kết quả mong muốn nó nhưng ý nghĩa/chức năng đằng sau nó vẫn còn phần nào của một bí ẩn đối với tôi. Các tài liệu Python Xlib cũng không giúp được gì nhiều. – erb

0

Giải pháp nào đẹp hơn, đặc biệt đối với một ứng dụng lâu dài chứ không phải là một kịch bản, sẽ sử dụng libwnck để theo dõi các gợi ý _NET_ACTIVE_WINDOW. (Xem đặc tả EWMH để định nghĩa gợi ý.)

Các vấn đề liên quan