Skip to main content

An implementation of the Wayland protocol with no external dependencies. A Python replacement for libwayland, not a wrapper for it.

Project description

python-wayland

PyPI - Version Tests PyPI - Python Version

A Python implementation of the Wayland protocol, from scratch, with no external dependencies, including no dependencies on any Wayland libraries.

This seeks to be a Python implementation of libwayland-client.

Features

  • No external dependencies, needs no Wayland libraries, and only Python standard libraries at runtime. This is a replacement for libwayland-client, not a wrapper for it.
  • All common Wayland protocols built in.
  • Maintains the original Wayland naming conventions to ensure references such as https://wayland.app are easy to use.
  • Has the latest protocol files built in by default.
  • Supports updating protocol definitions from either the local system or latest official Wayland repositories.
  • Intellisense code completion support for methods and events.

Notes

Wayland identifiers that collide with Python builtin keywords are renamed to end with an underscore. There are very few of these. The list of known protocols that have changes are:

  • wayland.wl_registry.global renamed to global_
  • xdg_foreign_unstable_v1.zxdg_importer_v1.import renamed to import_

Enums with integer names, which are not permitted in Python, have the value prefixed with the name of the enum. This is also very rare, at the time of writing the below example is the only case in the stable and staging protocols.

For example:

class wl_output.transform(Enum):
    normal: int
    90: int
    180: int
    270: int
    flipped: int
    flipped_90: int
    flipped_180: int
    flipped_270: int

becomes:

class wl_output.transform(Enum):
    normal: int
    transform_90: int
    transform_180: int
    transform_270: int
    flipped: int
    flipped_90: int
    flipped_180: int
    flipped_270: int

Making Wayland Requests

Requests are made in the standard manner, with the exception that new_id arguments should be omitted. There is no need to pass an integer ID for the object you want to create, that is handled automatically for you. An instance of the object created is simply returned by the request.

So the request signature is not this:

wayland.wl_display.get_registry( some_integer: new_id ) -> None

It has become simply this:

wayland.wl_display.get_registry() -> wl_registry

Where wl_registry is an instance of the interface created.

Event Handlers

Events are collected together under the events attribute of an interface. Define event handlers:

    def on_error(self, object_id, code, message):
        print(f"Fatal error: {object_id} {code} {message}")
        sys.exit(1)

Register an event handler by adding it to the relevant event:

    wayland.wl_display.events.error += self.on_error

The order of parameters in the event handler doesn't matter.

Processing Events

To process all pending wayland events and call any registered event handlers:

wayland.process_messages()

Refreshing Protocols

The package is installed with the latest Wayland stable and staging protocols already built-in. Refreshing the protocol definitions is optional. It requires some additional Python dependencies:

  • pip install lxml
  • pip install requests

To rebuild the Wayland protocols from the locally installed protocol definitions:

python -m wayland

To rebuild the protocols directly from the online sources:

python -m wayland --download

Add the --verbose command line switch if you want to see progress of the protocol parsing.

Checking Wayland Protocols

To produce a report which compares the locally installed Wayland protocol files with the latest online versions:

python -m wayland --compare

Example output:

Protocol definitions which have been updated:

None

Available remote protocol definitions, but not installed locally:

ext_image_capture_source_v1: version 1
ext_output_image_capture_source_manager_v1: version 1
ext_foreign_toplevel_image_capture_source_manager_v1: version 1

Protocol definitions installed locally but not in official stable or staging repositories:

zwp_fullscreen_shell_v1: version 1
zwp_fullscreen_shell_mode_feedback_v1: version 1
zwp_idle_inhibit_manager_v1: version 1

Protocol Level Debugging

Set the environment variable WAYLAND_DEBUG=1

Thanks

Thanks to Philippe Gaultier, whose article Wayland From Scratch inspired this project.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python_wayland-0.6.0.tar.gz (109.1 kB view details)

Uploaded Source

Built Distribution

python_wayland-0.6.0-py3-none-any.whl (113.8 kB view details)

Uploaded Python 3

File details

Details for the file python_wayland-0.6.0.tar.gz.

File metadata

  • Download URL: python_wayland-0.6.0.tar.gz
  • Upload date:
  • Size: 109.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.5

File hashes

Hashes for python_wayland-0.6.0.tar.gz
Algorithm Hash digest
SHA256 2a09467680582b036e25b9c725dc40085c961d07bcdf06db525e1e7ec8e38246
MD5 508db7198c3ba39e2ad88796bc901776
BLAKE2b-256 67472f00a488602773addddc50162694f46acb6363d3f524d6ae257f73bbb7a0

See more details on using hashes here.

File details

Details for the file python_wayland-0.6.0-py3-none-any.whl.

File metadata

File hashes

Hashes for python_wayland-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0a67bbdefc7e24871a7a7dff6ea72c86bf08ec84b6cd821307387e69d1496093
MD5 172e45b4d9e86c6a7401f07540711cee
BLAKE2b-256 7beda8ba0f6f633d4b03debb2ba1b711b03fe70f3f11a2c84d24b6122d8ec619

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page