2010-11-06 4 views
6

Có cách nào để biết khi nào người dùng (linux x windows) thay đổi cửa sổ hiện hoạt thông qua tab alt hoặc nhấp. Tôi muốn viết một kịch bản mà lắng nghe sự kiện này (nếu một sự kiện như vậy xảy ra, kịch bản sau đó tiếp tục tìm cửa sổ hiện hành đang hoạt động - mà tôi biết cách giải quyết). Tôi cũng có thể tiếp tục bỏ phiếu để tìm cửa sổ hiện tại đang hoạt động nhưng đó là cách không tốt để viết điều này. Hy vọng sẽ có được một giải pháp có thể "lắng nghe" chứ không phải là "bình chọn".Chụp thay đổi trong cửa sổ đang hoạt động (đối với linux)

Cảm ơn!

+0

Bạn đã tìm thấy câu trả lời chưa? –

Trả lời

1

Chỉ cần xem qua tài liệu cho mô-đun Perl X11 :: Tops chỉ ra rằng có phương thức monitor_property_and_structure_change. Do đó, tôi đoán rằng các thư viện X11 bên dưới sẽ cung cấp chức năng mà bạn đang tìm kiếm.

0

Tôi biết về chương trình KTimeTracker KDE theo dõi lượng thời gian bạn đã sử dụng trong mỗi cửa sổ. Tôi không biết chi tiết - cho dù nó theo dõi các sự kiện thay đổi cửa sổ đang hoạt động hay chỉ kiểm tra định kỳ trạng thái của toàn bộ màn hình. Tuy nhiên, các nguồn có thể hữu ích: http://www.kde.org/applications/utilities/ktimetracker/.

0

Tôi cần làm điều đó và giải pháp của tôi là xem tài sản (được Trình quản lý cửa sổ bảo trì) trên cửa sổ gốc để thay đổi.

Dưới đây là một bản sao của việc thực hiện python-Xlib tôi đã viết để chứng minh nó với ai đó:

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_attributes(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 

Phiên bản hơn đầy đủ nhận xét là trong this gist.