Desktop shells, also called graphical shells, are a set of widgets and graphical interfaces that allow an user to interact with an Operating System, similar to a command-line shell but graphically, hence the name. A few examples of graphical shell components include: taskbars, app launchers, wallpaper selectors, systray, notification menu, etc.
On Linux, the most popular graphical shells are oftentimes tied to a desktop environment, like KDE's plasmashell and GNOME Shell. However, it's also possible to use window managers (X11) or wayland compositors directly without a full-fledged graphical shell, like i3, AwesomeWM, Sway, Hyprland, etc. In the latter case, the user has more freedom to choose or create their own widgets, or "graphical shell components", which is part of a hobby informally referred to as "ricing".
In that context of developing graphical shell components, it's common the usage of libraries to create specific widgets, like waybar and polybar to create a basic status bar, and libraries that offer a bit more freedom, like eww and astal to create generic and complex widgets.
Recently, many of these graphical shells libraries are made for Wayland instead of X11 because of the recent layer shell protocol, which allows the creation of graphical shell components that work on any Wayland compositor that implements it. And despite being a wlroots extension, it's already supported on many compositors. This allows the creation of desktop shells that are not tied to a specific wayland compositor or desktop environment.
The main objective is to develop a compositor agnostic desktop shell for wayland while exploring the limits of the layer shell protocol. It's expected to find a few widgets that are difficult to develop without breaking the compositor agnostic rule, so a part of the project is also to find ways to work around it.
The name of the desktop shell is Azalea and I intend to use Rust as main programming language. The core library developed will be based on gtk4 and will be open source to allow other developers to create their own desktop shells as well. And since the main target audience of Azalea are developers, not general users, all the settings and configurations will be done through dotfiles, which are better for versioning and easier to share.
As a personal goal, I'll also use this project to learn and explore Nix as a tool for development, building, and packaging. As well as creating a reproducible NixOS virtual machine to run the project under multiple wayland compositors, since it's supposed to be compositor agnostic.
As extra objectives I also hope to develop a basic greeter using greetd and a lock screen using the wayland session lock protocol.
Task | May | June | July | August | September | October |
---|---|---|---|---|---|---|
Core library | x | x | x | x | x | x |
Clock, Date, Calendar (taskbar) |
x | |||||
MPRIS (DBus, taskbar) |
x | |||||
Network (taskbar + menu) |
x | x | ||||
Bluetooth (taskbar + menu) |
x | x | ||||
NixOS VM | x | x | x | |||
System tray (DBus, taskbar) |
x | x | ||||
Wallpaper selector | x | x | ||||
Dynamic theme based on wallpaper | x | x | x | |||
Dotfile parser | x | |||||
App launcher | x | |||||
Notifications (DBus, taskbar + menu) |
x | x | ||||
Workspace selector | x | x | ||||
Audio visualizer | x | x | ||||
Greeter (extra) | x | x | ||||
Session lock (extra) | x | x | ||||
Monograph | x | x | x | x |