How to get the list of open windows from xserver

X11Xserver

X11 Problem Overview


Anyone got an idea how to get from an Xserver the list of all open windows?

X11 Solutions


Solution 1 - X11

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.

Solution 2 - X11

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!

Solution 3 - X11

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))

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionkenderView Question on Stackoverflow
Solution 1 - X11AlnitakView Answer on Stackoverflow
Solution 2 - X11MartenView Answer on Stackoverflow
Solution 3 - X11Christian Reall-FluhartyView Answer on Stackoverflow