Does xlib have an active window event?

前端 未结 3 645
醉酒成梦
醉酒成梦 2021-01-03 11:11

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:

相关标签:
3条回答
  • 2021-01-03 11:52

    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.

    0 讨论(0)
  • 2021-01-03 11:52

    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?

    0 讨论(0)
  • 2021-01-03 12:02

    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)"
    
    0 讨论(0)
提交回复
热议问题