ReGreet
A clean and customizable GTK-based greetd greeter written in Rust using Relm4. This is meant to be run under a Wayland compositor (like Sway).
It is based on Max Moser's LightDM Elephant greeter, which is based on Matt Shultz's Fischer's example LightDM greeter.
Screenshots
These screenshots use the Canta GTK theme in dark mode with the Roboto font. All screenshots are provided under the CC-BY-SA-4.0 license.
Features
- Shows a dropdown list of existing users and X11/Wayland sessions
- Allows manual entry of username and session command
- Remembers the last authenticated user
- Automatically selects the last used session per user
- Allows setting environment variables for created sessions
- Supports customizing:
- Background image
- GTK theme
- Dark mode
- Icon theme
- Cursor theme
- Font
- Allows changing reboot & poweroff commands for different init systems
- Supports custom CSS files for further customizations
Requirements
Note: Please make sure you have all requirements installed, as having a greetd greeter constantly failing isn't as much fun as it sounds.
Installation
Arch Linux
ReGreet is available as greetd-regreet in the official Arch Linux repositories, and as greetd-regreet-git in the AUR. Note that I only maintain the AUR package, and the package in the Arch repos is maintained by someone else.
Install the AUR package either by cloning the AUR repository and running makepkg
, or by using your favourite AUR helper:
paru -S greetd-regreet-git
Install the package in the Arch repos as follows:
pacman -S greetd-regreet
Unofficial Packages
NixOS
For a minimal config, add programs.regreet.enable = true;
in your NixOS configuration file.
For users who want to configure more, they can see all the options of the module by searching for regreet
on https://search.nixos.org/options.
Manual
First, the greeter must be compiled using Cargo:
cargo build --release
The compilation process also configures the greeter to look for or use certain directories. These can be changed by setting the values of certain environment variables. These are:
Environment Variable | Default | Use |
---|---|---|
GREETD_CONFIG_DIR | /etc/greetd |
The configuration directory used by greetd |
CACHE_DIR | /var/cache/regreet |
The directory used to store cache |
LOG_DIR | /var/log/regreet |
The directory used to store logs |
SESSION_DIRS | /usr/share/xsessions:/usr/share/wayland-sessions |
A colon (:) separated list of directories where the greeter looks for session files |
REBOOT_CMD | reboot |
The default command used to reboot the system |
POWEROFF_CMD | poweroff |
The default command used to shut down the system |
The greeter can be installed by copying the file target/release/regreet
to /usr/bin
(or similar directories like /bin
).
Optionally, to set up the log and cache directories using systemd-tmpfiles, do either of the following:
- Copy the configuration given in systemd-tmpfiles.conf to
/etc/tmpfiles.d/regreet.conf
or/usr/lib/tmpfiles.d/regreet.conf
. - Run the
systemd-tmpfiles
CLI:systemd-tmpfiles --create "$PWD/systemd-tmpfiles.conf"
GTK4 Versions
ReGreet targets GTK version 4.0 or above. If you have higher versions of GTK, then you can enable additional features in ReGreet. Currently, the extra features enabled are:
GTK Version | Feature Flag | Features |
---|---|---|
4.8 | gtk4_8 |
|
To compile with support for a GTK version, pass the corresponding feature flag during building. For example, to compile with GTK 4.8+ support, run:
cargo build -F gtk4_8 --release
To compile with full support, run:
cargo build --all-features --release
Usage
Set as Default Session
Edit the greetd config file (/etc/greetd/config.toml
) to set regreet with a Wayland compositor as the default session.
For example, if using Cage:
[default_session]
command = "cage -s -- regreet"
user = "greeter"
The -s argument enables VT switching in cage (0.1.2 and newer only), which is highly recommended to prevent locking yourself out.
If using Sway, create a sway config file (in a path such as /etc/greetd/sway-config
) as follows:
exec "regreet; swaymsg exit"
include /etc/sway/config.d/*
Then, set Sway to use this config (whose path is shown here as /path/to/custom/sway/config
) as the default greetd session:
[default_session]
command = "sway --config /path/to/custom/sway/config"
user = "greeter"
NOTE: If you find that ReGreet takes too much time to start up with Sway, you may be affected by this: swaywm/sway/wiki#gtk-applications-take-20-seconds-to-start. See this link for the fix. Alternatively, the solution proposed in issue #34 may resolve it.
Restart greetd to use the new config.
Configuration
The configuration file must be in the TOML format.
By default, it is named regreet.toml
, and located in the greetd configuration directory specified during compilation (/etc/greetd/
by default).
You can use a config file in a different location with the --config
argument as follows:
regreet --config /path/to/custom/regreet/config.toml
A sample configuration is provided along with sample values for all available options in regreet.sample.toml
.
Currently, the following can be configured:
- Background image
- How the background image fits the screen (needs GTK 4.8+ support compiled)
- Environment variables for created sessions
- GTK theme
- Dark mode
- Icon theme
- Cursor theme
- Font
- Reboot command
- Shut down command
Custom CSS
ReGreet supports loading CSS files to act as a custom global stylesheet. This enables one to do further customizations above what ReGreet supports through the config file.
By default, the custom CSS file is named regreet.css
, and located in the greetd configuration directory specified during compilation (/etc/greetd/
by default).
To load a custom CSS stylesheet from a different location, pass the -s
or --style
CLI argument as follows:
regreet --style /path/to/custom.css
Please refer to the GTK4 docs on CSS in GTK and GTK CSS Properties to learn how to style a GTK4 app using CSS. For a general reference on CSS, please refer to the MDN web docs.
Changing Reboot/Shut Down Commands
The default reboot and shut down commands use the reboot
and poweroff
binaries, which are present on most Linux systems.
However, since the recommended way of using ReGreet is to avoid running it as root, the reboot
/poweroff
commands might not work on systems where superuser access is needed to run these commands.
In this case, if there is another command to reboot or shut down the system without superuser access, these commands can be set in the config file under the [commands]
section.
For example, to use loginctl reboot
as the reboot command, use the following config:
[commands]
reboot = [ "loginctl", "reboot" ]
Here, each command needs to be separated into a list containing the main command, followed by individual arguments.
These commands can also be specified during compilation using the REBOOT_CMD
and POWEROFF_CMD
environment variables.
Logging and Caching
The cache is are stored in /var/cache/regreet/cache.toml
(configurable during installation).
It contains the last authenticated user and the last used session per user, which are automatically selected on next login.
If the greeter is unable to write to this file, then it reverts to the default behaviour.
The log file is stored in /var/log/regreet/log
(configurable during installation).
Once the log file reaches a limit, it is compressed and rotated to /var/log/regreet/log.X.gz
, where X
is the index of the log file.
The higher the index, the older the log file.
After reaching a limit, the oldest log file is removed.
If the greeter is unable to write to this file or create files in the log directory, then it logs to stdout.
The recommended configuration is to run greetd greeters as a separate user (greeter
in the above examples).
This can lead to insufficient permissions for either creating the cache/log directories, or writing to them.
To make use of the caching and logging features, please create the directories manually with the correct permissions, if not done during installation with systemd-tmpfiles.
Contributing
pre-commit is used for managing hooks that run before each commit (such as clippy), to ensure code quality. Thus, this needs to be set up only when one intends to commit changes to git.
Firstly, install pre-commit itself. Next, install pre-commit hooks:
pre-commit install
Now, pre-commit should ensure that the code passes all linters locally before committing. This will save time when creating PRs, since these linters also run in CI, and thus fail code that hasn't been linted well.
Licenses
This repository uses REUSE to document licenses. Each file either has a header containing copyright and license information, or has an entry in the DEP5 file at .reuse/dep5. The license files that are used in this project can be found in the LICENSES directory.
A copy of the GPL-3.0-or-later license is placed in LICENSE, to signify that it constitutes the majority of the codebase, and for compatibility with GitHub.