xlib是否有活动窗口事件?

时间:2011-03-10 16:10:38

标签: c linux xlib xorg

我正在尝试编写一个程序,用于跟踪活动窗口何时使用Xlib进行更改。我无法找到最好的方法来做到这一点。到目前为止,这些是我的想法:

  • 每秒使用_NET_ACTIVE_WINDOW获取活动窗口,如果已更改,则运行事件的相关代码。
  • 获取所有窗口的列表,并听取他们对事件的关注。我不得不弄清楚如何保持打开窗口的最新列表。

他们是一个更容易/更好的方式吗?我是使用Xlib进行编程的新手。

3 个答案:

答案 0 :(得分:2)

您是否只能在根窗口中选择PropertyChange以获取更新任何属性时发送的PropertyNotify事件,然后检查每个事件以查看它是否适用于_NET_ACTIVE_WINDOW?< / p>

答案 1 :(得分:2)

这是@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

答案 2 :(得分:0)

我一直在寻找“活动的Windows更改事件抓取器”。我在平均时间内使用(可能对您有所帮助)是xdotoolxwininfo的组合。

xwininfo -id "$(xdotool getactivewindow)"