xlib 有活动窗口事件吗?

发布于 2024-10-21 06:37:24 字数 235 浏览 11 评论 0原文

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

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

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

I am trying to write a program that tracks when the active window changes using Xlib. I am have trouble figuring out the best way to do this. These are my ideas so far:

  • Every second use _NET_ACTIVE_WINDOW to get the active window and if it has changed then running the related code for the event.
  • Get a list of all windows and listen to their focus in event. I would have to figure out how to keep an up to date list of open windows though.

Is their an easier/better way? I am new to programming with Xlib.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

还给你自由 2024-10-28 06:37:24

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

我为某人编写的作为示例的更完整注释的版本位于此要点中。

Here's a Python implementation of what @alanc proposed.

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

The more fully-commented version I wrote as an example for someone is in this gist.

碍人泪离人颜 2024-10-28 06:37:24

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

Can't you just select PropertyChange on the root window to get sent PropertyNotify events when any property is updated and then check each event to see if it was for _NET_ACTIVE_WINDOW?

葬シ愛 2024-10-28 06:37:24

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

xwininfo -id "$(xdotool getactivewindow)"

I've been looking for "active windows change event grabber" as well. What I use in mean time (and might be helpful for you) is combination of xdotool and xwininfo.

xwininfo -id "$(xdotool getactivewindow)"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文