Skip to main content

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

Project description

python-wayland-extra

PyPI - Version Tests PyPI - Python Version

A Python implementation of the Wayland & Hyprland protocols, 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.

Thanks to Graham King, author of the original python-wayland library.

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_extra-0.7.0.tar.gz (182.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

python_wayland_extra-0.7.0-py3-none-any.whl (193.4 kB view details)

Uploaded Python 3

File details

Details for the file python_wayland_extra-0.7.0.tar.gz.

File metadata

  • Download URL: python_wayland_extra-0.7.0.tar.gz
  • Upload date:
  • Size: 182.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for python_wayland_extra-0.7.0.tar.gz
Algorithm Hash digest
SHA256 1d204e0963f7a3f0479a0dcb3be2d4f86a58904612a9d9638d87043dd3a7c599
MD5 ba20f0422325b8e75f6495329ada8be6
BLAKE2b-256 7e3f8f484d88cdc8638803013fcbdf7c85800b3ccc5b6d75752bdf72b8dea5fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_wayland_extra-0.7.0.tar.gz:

Publisher: publish.yml on dennisrijsdijk/python-wayland-extra

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_wayland_extra-0.7.0-py3-none-any.whl.

File metadata

File hashes

Hashes for python_wayland_extra-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e0ef708b7dc30ea6db72aa82b215a4de5329188ec3d7840a342537b06f289fa2
MD5 ed78c3c48cad716c10052b95bd367704
BLAKE2b-256 ee6b6a07f16a75e2ec74384771a3be49fd7056c09b5136a065860b32a36366aa

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_wayland_extra-0.7.0-py3-none-any.whl:

Publisher: publish.yml on dennisrijsdijk/python-wayland-extra

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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