【问题标题】:Does xlib have an active window event?xlib 是否有活动的窗口事件?
【发布时间】:2011-03-10 16:10:38
【问题描述】:

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

  • 每隔一秒使用 _NET_ACTIVE_WINDOW 获取活动窗口,如果它已更改,则运行事件的相关代码。
  • 获取所有窗口的列表并在事件中监听它们的焦点。不过,我必须弄清楚如何保持打开窗口的最新列表。

他们是更简单/更好的方法吗?我是 Xlib 编程新手。

【问题讨论】:

  • 监听所有焦点事件以及注册所有窗口的所有处理程序似乎非常昂贵。我想知道,事实上,一般听 PointerMove 然后从事件处理程序调用XGetInputFocus() 以找出移动时谁拥有它会不会减少开销。这必须有多实时?如果答案是“一秒钟就好”,那么轮询方法似乎是最好的。
  • 不一定是实时的,几秒钟内就可以了。我将尝试我的第一种方法。谢谢 FrankH。

标签: c linux xlib xorg


【解决方案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

【讨论】:

    【解决方案2】:

    您不能只在根窗口上选择PropertyChange 以在更新任何属性时发送PropertyNotify 事件,然后检查每个事件以查看它是否针对_NET_ACTIVE_WINDOW

    【讨论】:

      【解决方案3】:

      我也一直在寻找“活动窗口更改事件采集器”。我同时使用的(可能对您有帮助)是 xdotoolxwininfo 的组合。

      xwininfo -id "$(xdotool getactivewindow)"
      

      【讨论】:

      • 这会获取活动窗口信息,但它如何帮助注册事件处理程序?
      猜你喜欢
      • 2014-05-17
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多