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)