A wayland compositor and stacking window manager, built on top of LayersEngine;
The compositor is heavily inspired by MacOS, the goal is to learn and experiment with wayland, rust, skia and see how far can I go with it.
The project is not currently ready for a daily usage but any contributor curious to support is welcome. MANY things are hardcoded while trying to figure out the best way to implement them. Sudden crashes are expected, especially with the tty-udev backend which may result in a system freeze.
Standard desktop with windows overlapping and Dock task manager. Windows shadow is added by the compositor. Application switcher showcasing icons and application names, with background blur blending. Expose windows, showing all open windows.Yes-ish, you can try it out, though it is not ready for daily usage. The project is still in the early stages of development, and many features are missing. The project is not yet packaged for any distribution, so you'll need to build it yourself. Following a draft roadmap of features and improvements.
- move windows
- resize windows
- window fullscreen/maximize
- window scaling
- animated drag and drop
- minimize windows
- fix resize from edge-top
- [ ]
- background search for application metadata and icons (following xdg specs)
- close applications from application switcher
- cycle between same app windows
- all windows (algorithm from gnome-shell/kde)
- preview windows with name
- show running applications in their opening order
- show minimized windows
- show pinned applications
- show favorite locations
- refactor out of the compositor core
- XDG Desktop Portal backend (see docs/xdg-desktop-portal.md)
- ScreenCast portal for PipeWire screen sharing
- [~] fullscreenshare with dmabuf zero-copy
- Window capture support (layers_element)
- screenshot support
- Permission dialog UI
- Theming dark/light
- Volume control widget
- Brightness control widget
- Keyboard light control widget
- notifications
- enable natural scrolling
- 2 finger scrolling
- calculate scroll acceleration
- dynamic background
- multiple workspaces
- workspace switcher
- animate create/delete workspace
- enable multiple screens
- screen rotation / resolution
- centralized config manager
- persistent config from text files
- setup keybindings from config
- setup screen mode
Hotkeys are now fully configurable via the sc_config.toml file. See the [keyboard_shortcuts] section to customize keybindings for your setup. Example:
[keyboard_shortcuts]
"Ctrl+Alt+BackSpace" = "Quit"
"Ctrl+Shift+Q" = "Quit"
"Ctrl+Return" = { run = { cmd = "terminator", args = [] } }
"Logo+Space" = { open_default = "file_manager" }
"Logo+B" = { open_default = "browser" }
"Ctrl+1" = { builtin = "Workspace", index = 0 }ScreenComposer implements a comprehensive set of Wayland protocols, including:
- Core:
wl_compositor,wl_shm,wl_seat,wl_data_device_manager - Shells:
xdg_wm_base(XDG shell),wlr_layer_shell_v1(Layer shell 1.0) - Output management:
wl_output,xdg_output,wp_presentation - Rendering:
zwp_linux_dmabuf_v1,wp_viewporter - Input: pointer gestures, relative pointer, keyboard shortcuts inhibit, text input, input method
- Selection: primary selection, data control (wlr-data-control)
- XDG foreign: cross-client surface identification
For a complete and up-to-date list, see docs/wayland.md.
ScreenComposer consists of the main compositor and additional components:
| Component | Description |
|---|---|
screen-composer |
Main compositor binary |
xdg-desktop-portal-screencomposer |
XDG Desktop Portal backend for screen sharing |
See docs/xdg-desktop-portal.md for details on the portal integration.
You can contribute by testing the compositor, reporting bugs, by implementing new features or bring new ideas. Both this project and the LayersEngine are open to contributions. If you have any questions, open an issue on the repository.
You'll need to install the following dependencies (note, that those package names may vary depending on your OS and linux distribution):
libwaylandlibxkbcommon
libudevlibinputlibgbmlibseat
If you want to enable X11 support (to run X11 applications within anvil),
then you'll need to install the following packages as well:
- xwayland
ScreenComposer uses TOML configuration files. A complete example configuration is provided in sc_config.example.toml which you can copy and modify:
cp sc_config.example.toml sc_config.tomlYou can create backend-specific configuration files using the naming convention sc_config.{backend}.toml. For example:
sc_config.winit.toml- Configuration for the winit backendsc_config.udev.toml- Configuration for the tty-udev/DRM backend
When running with a specific backend, ScreenComposer will automatically load the corresponding configuration file if it exists, falling back to sc_config.toml otherwise.
This allows you to maintain different display settings, keyboard shortcuts, or other preferences for each backend. For instance, you might want different screen_scale values or display resolutions when running in a window (winit/X11) versus on bare metal (tty-udev).
For detailed configuration options, see the configuration documentation.
You can run it with cargo after having cloned this repository:
cd screen-composer;
cargo run -- --{backend}
The currently available backends are:
--x11: start anvil as an X11 client. This allows you to run the compositor inside an X11 session or any compositor supporting XWayland. Should be preferred over the winit backend where possible.--winit: start screen-composer as a Winit application. This allows you to run it inside of an other X11 or Wayland session.--tty-udev: start screen-composer in a tty with udev support. This is the "traditional" launch of a Wayland compositor. Note that this requires you to start screen-composer as root if your system does not have logind available.
- Icon used: WhiteSur Icon Theme
- Font used: Inter Font
- Background used: hdqwalls


