This crate is a general framework for build wayland compositors. It currently focuses on low-level, helpers and abstractions, handling most of the system-level and wayland protocol interactions. The window management and drawing logic is however at the time not provided (but helpers for this are planned for future version).
The provided helpers are split into two main modules.
backend contains helpers for interacting with
the operating system, such as session management, interactions with the graphic stack and input
processing. On the other hand,
wayland contains helpers for interacting with wayland clients
according to the wayland protocol. In addition, the
xwayland module contains helpers for managing
an XWayland instance if you want to support it. See the documentation of these respective modules for
information about their usage.
Smithay is built around
calloop, a callback-oriented event loop, which fits naturally with the
general behavior of a wayland compositor: waiting for events to occur and react to them (be it
client requests, user input, or hardware events such as
Using a callback-heavy structure however poses the question of state management: a lot of state needs
to be accessed from many different callbacks. To avoid an heavy requirement on shared pointers such
Arc and the synchronization they require,
calloop allows you to provide a mutable
reference to a value, that will be passed down to most callbacks (possibly under the form of a
DispatchData for wayland-related callbacks). This structure provides
easy access to a centralized mutable state without synchronization (as the callback invocation is
always sequential), and is the recommended way to of structuring your compositor.
Several objects, in particular on the wayland clients side, can exist as multiple instances where each instance has its own associated state. For these situations, these objects provide an interface allowing you to associate an arbitrary value to them, that you can access at any time from the object itself (rather than having your own container in which you search for the appropriate value when you need it).
Most entry points in the modules can take an optional
slog::Logger as argument
that will be used as a drain for logging. If
None is provided, the behavior depends on
slog-stdlog is enabled. If yes, the module will log to the global logger of the
log crate. If not, the logs will discarded. This cargo feature is part of the default set of
features of Smithay.
Backend (rendering/input) helpers
Reexports of crates, that are part of the public api, for convenience
Various utilities functions and types
EGLPlatform<'a> for the provided platform.