AvengeMedia / AvengeMedia/DankMaterialShell
Add Wayfire compositor support
- Dominant language
- QML
- Stars
- 8.1k
- Forks
- 515
- Avg merge
- 1d 8h
- Merged PRs (30d)
- 102
Description
### Feature Description
Add first-class support for Wayfire (https://wayfire.org), a wlroots-based 3D Wayland compositor inspired by Compiz. DMS already supports niri, Hyprland, Sway, Scroll, MangoWC, labwc, dwl, and Miracle WM, so Wayfire is a natural addition.
Today DMS launches on Wayfire and Wayland-protocol-only features work (bar, tray, notifications, spotlight, clipboard, idle), but compositor-aware paths fall through because there's no `WayfireService.qml` and no `isWayfire` branch in `CompositorService.qml`. Most visibly: power-menu logout does nothing because `SessionService._logout()` falls through to `Hyprland.dispatch("exit")`. Workspace clicks in the bar also don't switch workspaces.
### Use Case
Wayfire is the closest thing on Wayland to a macOS-style floating-window experience: its `scale` plugin is true Mission Control / Exposé (arrange all windows side-by-side, click to focus), `expo` gives a workspace grid, and it ships native hot-corner support. None of the currently-supported compositors offer this combination, so users who want this UX have to either give up DMS or live with broken logout/workspace-switching.
Adoption-wise, Wayfire is a long-running, actively maintained wlroots compositor (currently 0.10) packaged in Arch `extra`, Debian, Fedora, and most other major distros. It's the canonical choice for users who want compiz-spiritual successor behaviour on Wayland.
### Compositor(s)
Other (specify below)
### If Other, please specify
Wayfire
### Proposed Solution
Mirror the existing pattern used for niri/labwc/dwl:
1. Detection in `CompositorService.qml`: add `isWayfire` boolean. Detect via `XDG_CURRENT_DESKTOP` containing `Wayfire` (Wayfire's session entry sets `XDG_CURRENT_DESKTOP=Wayfire:wlroots`).
2. New `Services/WayfireService.qml` mirroring `NiriService.qml`. Wayfire ships an official IPC plugin (`libipc.so` + `libipc-rules.so`) that exposes a JSON-over-Unix-socket protocol for workspace, view, and output queries plus dispatch, equivalent in scope to niri's IPC. Implement at minimum: workspace list, current workspace, switch workspace, output → workspace mapping, and quit.
3. Logout fix in `SessionService.qml:308-332`: add a Wayfire branch that sends `core/quit` over IPC (or `pkill -SIGTERM wayfire` as a fallback).
4. Greeter template under `Modules/Greetd/assets/` (`dms-wayfire.ini`) following the existing per-compositor pattern.
Layout-override settings (`*LayoutGapsOverride` etc.) can be deferred since Wayfire doesn't expose gaps in the same way.
Happy to test or contribute a PR if there's appetite for accepting one, wanted to check interest before sinking time into it.
### Alternatives/Existing Solutions
- waybar + nwg-shell / nwg-panel work on Wayfire but are visually and architecturally far from DMS's Material You design.
- wf-shell (Wayfire's reference shell) is functional but minimal, no theming/notifications/material design.
- ags-based shells can target Wayfire but require building a shell from scratch.
DMS is the only Quickshell-based Material design shell with broad multi-compositor support, which is why adding Wayfire here (rather than starting a separate Wayfire-specific project) seems like the right home for it.
Contributor guide
Assessment
This issue has not been assessed yet.