Python python-xlib

From wikinotes

python-xlib is a set of python bindings for Xorg's xlib library.

Documentation

python-xlib Documentation http://python-xlib.sourceforge.net/doc/html/index.html
non official documentation? https://www.pydoc.io/pypi/python-xlib-0.20/index.html
xlib Documentation
randr Documentation https://www.x.org/wiki/Projects/XRandR/
XCB intro https://www.x.org/releases/X11R7.7/doc/libxcb/tutorial/index.html#focus

Also checkout my notes on xcb - it is the successor to Xlib, and shares some architecture.

Library Notes

Request Objects

request objects have a repr that looks like this:

<<class 'Xlib.ext.xinerama.QueryVersion'> serial = 35, data = {'sequence_number': 35, 'major_version': 1, 'minor_version': 1}, error = None>

Each field within the data is available as an attribute

reply.major_version
#> 1

Screen Info

RandR

This is apparently the most dependable/comprehensive source of information (over xinerama, and regular xlib).

from Xlib import display
from Xlib.ext import randr

d = display.Display()
s = d.screen()

randr.get_screen_resources(s.root)._data.keys()  # ['sequence_number', 'timestamp', 'config_timestamp', 'crtcs', 'outputs', 'modes', 'mode_names']

# get monitor names
outputs = randr.get_screen_resources(s.root).outputs   # [638, 639, 671, 672, ...]
for output in outputs:
    randr.get_output_info(s.root, output, timestamp=0)._data.keys()  # ['status', 'sequence_number', 'timestamp', 'crtc', 
                                                                     #  'mm_width', 'mm_height', 'connection', 'subpixel_order', 
                                                                     #  'num_preferred', 'crtcs', 'modes', 'clones', 'name']

Xinerama

From Display

d = display.Display()

d.xinerama_is_active()      # 0/1
d.xinerama_query_version()  # {'major_version': 1, 'minor_version': 1}
d.xinerama_query_screens()  # {'number': 3, 'screens': [<class 'Xlib.protocol.rq.DictWrapper...>, ...]}

From Window

d = display.Display()
reply = d.get_input_focus()
win = reply.focus

win.xinerama_get_screen_size(screen_no=0)
win.xinerama_get_screen_count()
win.xinerama_get_state()

Non-Xinerama

Mouse Info

d = display.Display()
root_screen = d.screen().root
mouse_ptr = root_screen.query_pointer()
mouse_pos = (mouse_ptr.root_x, mouse_ptr.root_y)