Capturing changes in the active window (for Linux)

Is there any way to find out when the user (linux x windows) changes the active window via alt-tab or click. I want to write a script that listens for this event (if such an event occurs, the script then continues to find the current active window, which I know how to solve). I might as well continue the survey to find the current active window, but this is a bad way to write this. Hoping to get a solution that can β€œlisten,” not β€œpoll.”

Thanks!

+6
linux x11
source share
3 answers

Just by looking briefly at the documentation for the Perl X11 :: Tops module indicates that there is a monitor_property_and_structure_change method. I would suggest that the X11 core libraries provide the functions you need.

+1
source share

I know about the KTimeTracker KDE program, which tracks how much time you spent in each window. I don’t know the details of whether it tracks events of changes in active windows or just checks the status of the entire desktop. However, sources may be helpful: http://www.kde.org/applications/utilities/ktimetracker/ .

0
source share

I needed to do this, and my solution was to look at the _NET_ACTIVE_WINDOW property (supported by the window manager) in the root window for changes.

Here is a copy of the python-xlib implementation I wrote to demonstrate this to someone:

 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 

A more complete version of the comment is in that sense .

0
source share

All Articles