How to get the list of open windows from xserver

Building off of Marten's answer, (assuming your window manager supports Extended Window Manager Hints) you can feed that list of window ids back into xprop to get the _NET_WM_NAME property:

$ xprop -root _NET_CLIENT_LIST |
    pcregrep -o1 '# (.*)' |
    sed 's/, /\n/g' |
    xargs -I{} -n1 xprop -id {} _NET_WM_NAME

But at the command line, it would just be easier to use wmctrl:

$ wmctrl -l

Programmatically, with python-xlib, you can do the same with:

#!/usr/bin/env python
from Xlib.display import Display
from Xlib.X import AnyPropertyType

display = Display()
root = display.screen().root

_NET_CLIENT_LIST = display.get_atom('_NET_CLIENT_LIST')
_NET_WM_NAME = display.get_atom('_NET_WM_NAME')

client_list = root.get_full_property(
    _NET_CLIENT_LIST,
    property_type=AnyPropertyType,
).value

for window_id in client_list:
    window = display.create_resource_object('window', window_id)
    window_name = window.get_full_property(
        _NET_WM_NAME,
        property_type=AnyPropertyType,
    ).value
    print(window_name)

Or, better yet, using the EWMH library:

#!/usr/bin/env python
from ewmh import EWMH

window_manager_manager = EWMH()
client_list = window_manager_manager.getClientList()

for window in client_list:
    print(window_manager_manager.getWmName(window))

If your window manager implements EWMH specification, you can also take a look at the _NET_CLIENT_LIST value of the root window. This is set by most modern window managers:

xprop -root|grep ^_NET_CLIENT_LIST

That value can easily be obtained programmatically, see your Xlib documentation!


From the CLI you can use

xwininfo -tree -root

If you need to do this within your own code then you need to use the XQueryTree function from the Xlib library.

Tags:

X11

Xserver