2011-03-10 128 views
4

我正在嘗試編寫一個程序,用於跟蹤何時使用Xlib更改活動窗口。我很難找出最好的方法來做到這一點。這些是我的想法到目前爲止:xlib是否有活動窗口事件?

  • 每秒鐘使用_NET_ACTIVE_WINDOW來獲取活動窗口,如果它已經改變,然後運行事件的相關代碼。
  • 獲取所有窗口的列表,並聽取他們的重點事件。我將不得不弄清楚如何保持最新的打開窗口列表。

他們是更容易/更好的方法嗎?我是使用Xlib進行編程的新手。

+0

傾聽所有焦點事件併爲所有窗口註冊所有處理程序似乎非常昂貴。我想知道,事實上,是否通常監聽PointerMove,然後從事件處理函數中調用'XGetInputFocus()'來找出被移動的人在移動時的開銷會小一些。這是怎麼實時的?如果答案是「秒很好」,那麼輪詢方法似乎是最好的。 – 2011-03-10 17:12:43

+0

它不一定是實時的,在幾秒鐘內就沒問題。我會嘗試第一種方法。謝謝FrankH。 – Jim 2011-03-11 03:26:58

回答

0

我一直在尋找「活動窗口更改事件捕獲器」以及。我使用的平均時間(可能對您有所幫助)是xdotoolxwininfo的組合。

xwininfo -id "$(xdotool getactivewindow)" 
2

你就不能選擇根窗口PropertyChange以獲取發送PropertyNotify事件時,任何財產進行更新,然後檢查每個事件,看它是否是爲?

1

以下是@alanc提議的Python實現。

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 

我寫的一個比較完整的評論版本作爲人的例子是this gist