xlib是否有活动的窗口事件? [英] Does xlib have an active window event?

查看:326
本文介绍了xlib是否有活动的窗口事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个程序,该程序使用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:

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

他们是更轻松/更好的方式吗?我是Xlib编程的新手.

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

推荐答案

这是@alanc建议的Python实现.

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.

这篇关于xlib是否有活动的窗口事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆