Skip to content

nongio/screencomposer

Repository files navigation

ScreenComposer

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.

ℹ️ Disclamer

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.

🖼️ How does it look like?

Basic desktop with Dock

Standard desktop with windows overlapping and Dock task manager. Windows shadow is added by the compositor.

Application switcher

Application switcher showcasing icons and application names, with background blur blending.

Expose windows

Expose windows, showing all open windows.

Is it usable?

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.

Features / Roadmap

Basic window management

  • move windows
  • resize windows
  • window fullscreen/maximize
  • window scaling
  • animated drag and drop
  • minimize windows
  • fix resize from edge-top
  • [ ]

Applications switcher (hotkey: alt + Tab)

  • background search for application metadata and icons (following xdg specs)
  • close applications from application switcher
  • cycle between same app windows

Expose windows (hotkey: alt + f gesture on udev: three fingers swipe up)

  • all windows (algorithm from gnome-shell/kde)
  • preview windows with name

Dock task manager

  • show running applications in their opening order
  • show minimized windows
  • show pinned applications
  • show favorite locations
  • refactor out of the compositor core

Screenshare

  • 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

Miscellaneus

  • Theming dark/light
  • Volume control widget
  • Brightness control widget
  • Keyboard light control widget
  • notifications

Natural scrolling

  • enable natural scrolling
  • 2 finger scrolling
  • calculate scroll acceleration

Workspace

  • dynamic background
  • multiple workspaces
  • workspace switcher
  • animate create/delete workspace
  • enable multiple screens
  • screen rotation / resolution

Config

  • centralized config manager
  • persistent config from text files
  • setup keybindings from config
  • setup screen mode

Keyboard Shortcuts

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 }

Supported Wayland Protocols

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.

Components

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.

Is it open for contributions?

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.

Build Dependencies

You'll need to install the following dependencies (note, that those package names may vary depending on your OS and linux distribution):

  • libwayland
  • libxkbcommon

These are needed for the "Udev/DRM backend"

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

Configuration

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.toml

Backend-specific configuration

You can create backend-specific configuration files using the naming convention sc_config.{backend}.toml. For example:

  • sc_config.winit.toml - Configuration for the winit backend
  • sc_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.

Build and run

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.

Credits

About

A Wayland compositor and stacking window manager, built on top of Layers Engine

Topics

Resources

License

Stars

Watchers

Forks

Contributors 2

  •  
  •