Skip to main content

aioxlib

Human-friendly asyncio interface to the X11 protocol

aioxlib is a pure-Python library that talks the X11 wire protocol over asyncio.
It aims to make working with X displays, windows, graphics contexts, events, and images feel natural in modern async Python code—without blocking the event loop.

Inspired by the style of linuxpy (also by the same author), it provides a clean, high-level API while still exposing the underlying protocol details when you need them.

Features

  • Fully asynchronous connection to the X server (Unix socket or TCP)
  • High-level objects: Display, Screen, Window, GC, resources
  • Event stream via async for event in display.events()
  • Window creation, mapping, attributes, WM properties (WM_NAME, WM_PROTOCOLS, …)
  • Graphics Context (GC) drawing: rectangles, text (put_text), images
  • MIT-SHM support for high-performance image transfer
  • Atom interning, extensions querying, fonts listing
  • Python ≥ 3.12, GPLv3
  • No external dependencies
  • Code in a single file

Installation

From within your favorite python environment:

pip install aioxlib

Quick start

import asyncio
import aioxlib


async def main():
    display = await aioxlib.get_display()
    async with display:
        screen = display.default_screen()
        wnd = await screen.create_window(width=640, height=480)
        await wnd.map()
        await wnd.set_name("Hello from aioxlib")

        # Handle window close
        protocols = await display.get_atom("WM_PROTOCOLS")
        delete = await display.get_atom("WM_DELETE_WINDOW")
        await wnd.set_wm_protocols([delete])

        async for event in display.events():
            if (
                event["code"] == aioxlib.Event.ClientMessage
                and event["type"] == protocols
                and event["data"][0] == delete
            ):
                break


asyncio.run(main())

Examples

The examples/ directory contains several demos:

File Description
basic.py Minimal window + close handling
text.py Draw text on expose
grid.py Fill a grid of rectangles
point.py Points API
segments.py Line segments
3d.py Simulate 3d rendering
shm.py MIT-SHM image transfer
video.py Live video from a V4L2 camera
video_shm.py Video + shared-memory path

Run any of them with:

python examples/basic.py

API overview

display = await aioxlib.get_display()          # or get_display(":0")
async with display:
    screen = display.default_screen()

    wnd = await screen.create_window(...)      # or display.create_window(...)
    await wnd.map()
    await wnd.set_name("…")
    await wnd.set_wm_protocols([...])

    gc = await wnd.create_gc(foreground=…, background=…)
    await gc.poly_fill_rectangles([...])
    await gc.put_text(x, y, "text")
    await wnd.draw_image(gc, x, y, w, h, depth, data)

    async for event in display.events():
        ...

Events are plain dicts with a "code" field matching aioxlib.Event.*.

Requirements

  • Python ≥ 3.12
  • An X11 server (Xorg, Xwayland, …)
  • $DISPLAY set (or pass the display string explicitly)

License

GPLv3 or later — see LICENSE.

Author

José Tiago Macara Coutinho
https://codeberg.org/tiagocoutinho


Early beta (v0.0.2). Feedback and contributions welcome!

Release files for aioxlib 0.0.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aioxlib 0.0.8
File Size Uploaded
aioxlib-0.0.8.tar.gz 60.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aioxlib 0.0.8
File Interpreter ABI Platform
aioxlib-0.0.8-py3-none-any.whl Python 3 none any Details

Total release size: 96.2 kB

Release files / aioxlib-0.0.8.tar.gz

Download URL aioxlib-0.0.8.tar.gz
Size 60.2 kB
Tags Source
SHA-256 checksum
How to use checksums
0c37141ba557ac3da1760a3ed18ba118beb72f5afa63f19feb000caef88e3782
BLAKE2b-256 checksum
How to use checksums
b61081465fbaa15e511d94e19aa70205414bf7c40288f170792a9b57a74e8969
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.13

Release files / aioxlib-0.0.8-py3-none-any.whl

Download URL aioxlib-0.0.8-py3-none-any.whl
Size 35.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a51ec027a0a60275218cc384dcd86b30a422ab15d9e1f3622aa556dffa6946cf
BLAKE2b-256 checksum
How to use checksums
f3fa8dc5672a5a0aa515c72c79683cf37de59674e6d75a6d8fec4b6020ba6797
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.13

Release history Release notifications | RSS feed

0.10.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

This release

0.0.8 This release

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page