aioxlib
Human-friendly asyncio interface to the X11 protocol
aioxlib is a pure-Python, asyncio-native client for the X11 wire protocol.
Open displays, create windows, draw with GCs and the RENDER extension, and stream
events — without blocking the event loop and without linking to libX11 or xcb.
Examples shipped with the library: Game of Life · 3D wireframe
Why aioxlib?
| aioxlib | python-xlib | xcffib / xpyb | |
|---|---|---|---|
| Language | Pure Python | Pure Python | C (libxcb) + Python |
| Async | asyncio first | Blocking / threads | Blocking |
| Dependencies | None at runtime | None | libxcb |
| Protocol access | Pack/unpack helpers exposed | High-level only | Low-level |
| Extensions | RENDER, MIT-SHM, DBE, GLX, … | Many | Many |
Inspired by linuxpy (same author): a clean high-level API when you want it, full protocol detail when you need it.
Requirements
- Python ≥ 3.12
- An X server (local or remote) and network/socket access to it
(
$DISPLAYor an explicit URI)
No third-party Python packages are required at runtime.
Installation
pip install aioxlib
Quick start
Functional API (simplest)
import asyncio
import aioxlib
async def main():
wnd = await aioxlib.create_window(640, 480, title="Hello from aioxlib")
await wnd.show()
async for event in aioxlib.events():
if wnd.is_delete_window(event):
break
asyncio.run(main())
Explicit display (object API)
import asyncio
import aioxlib
async def main():
display = await aioxlib.get_display()
async with display:
screen = display.default_screen()
wnd = await screen.create_window(640, 480, title="Hello from aioxlib")
await wnd.show()
async for event in display.events():
if wnd.is_delete_window(event):
break
asyncio.run(main())
Features
- Windows & drawing — create/map/configure windows, GCs, polylines, rectangles, arcs, text, images
- Events — non-blocking
async for event in display.events()stream - Properties & atoms —
WM_NAME, protocols, custom properties - Extensions — BIG-REQUESTS, RENDER, MIT-SHM, DBE, GLX, RANDR, DRI3, Present
- Pipeline — batch requests with
async with display.pipeline(): … - Protocol transparent — opcodes, pack/unpack helpers stay accessible
Examples
# clone the repo, then:
python examples/basic.py
python examples/game_of_life.py # Conway's Life (numpy)
python examples/3d.py # rotating 3D mesh
python examples/video_shm_dbe.py # shared memory + double buffering
| Example | What it shows |
|---|---|
basic.py |
Window + delete protocol |
game_of_life.py |
Animated cellular automaton |
3d.py |
Perspective projection & wireframe |
render.py / tristrip.py |
RENDER extension |
shm.py / video_shm*.py |
MIT-SHM image transfer |
cube_dbe.py |
Double buffering (DBE) |
keyboard.py |
Key events |
Package layout
| Module | Contents |
|---|---|
aioxlib (root) |
Functional API + get_display + common constants |
aioxlib.constants |
X11 constants and enumerations |
aioxlib.protocol |
Pack/unpack helpers |
aioxlib.connection |
Socket connection, Xauthority |
aioxlib.display |
Display, Screen, Window, GC, Pipeline |
aioxlib.render / shm / dbe / … |
Extensions |
Classes such as Display, Window, and EventType are imported from their
modules (or from the root where re-exported).
Root functional API (selection)
| Function | Role |
|---|---|
get_display / get_default_display |
Open connection |
create_window, map_window, … |
Windows |
events(), pipeline() |
Event stream / batched writes |
flush, query_extension, get_atom, … |
Display operations |
close_default_display |
Tear down default connection |
Documentation
- Online: aioxlib.readthedocs.io
- Local:
pip install --group docs # or: pip install mkdocs mkdocs-material 'mkdocstrings[python]'
mkdocs serve
License
GPLv3 or later — see LICENSE.
Author
José Tiago Macara Coutinho https://codeberg.org/tiagocoutinho
Release files for aioxlib 0.9.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aioxlib-0.9.0.tar.gz | 139.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aioxlib-0.9.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 231.2 kB
Release files / aioxlib-0.9.0.tar.gz
| Download URL | aioxlib-0.9.0.tar.gz |
|---|---|
| Size | 139.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0a70826d5a581f0be89a40a58e9b7d5f428db9a1a0a1dfc96dd5b54e2063f28c
|
|
BLAKE2b-256 checksum How to use checksums |
3b05453c2f733bf7f795470e54f2c1a2d9ee09101c99c14339fa7222e0184980
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.9
|
Release files / aioxlib-0.9.0-py3-none-any.whl
| Download URL | aioxlib-0.9.0-py3-none-any.whl |
|---|---|
| Size | 91.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5098bce7e08e0b0ca663873b25d1cf9766ca7295e89c5483a3fe3b04d76d139c
|
|
BLAKE2b-256 checksum How to use checksums |
faf79d4ba55d4eedec4f536b2429089bfed996899310b651b9a2ff899f51c86e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.9
|