/ReGreet

Clean and customizable greeter for greetd

Primary LanguageRustGNU General Public License v3.0GPL-3.0

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

Welcome Dropdown session menu Manual session entry Password entry with selected user Password entry with manual user Login fail

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
  • Respects XDG_DATA_DIRS environment variable
  • Respects fields Hidden and NoDisplay in session files
  • Picks up the first found session with the same name and in the same type (X11/Wayland). This allows for overriding system-provided session files.
  • Demo mode to run ReGreet without greetd for easier development.

Requirements

  • Rust 1.64.0+ (for compilation only)
  • greetd
  • GTK 4.0+
  • A Wayland compositor (such as Cage or Sway)

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 NixOS Search.

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
  • Changing how the background image fits the screen

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
  • Greeting message
  • 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.

Tip: You might want to use demo mode to test out your CSS before making it permanent.

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.

By default, the logs are stored in /var/log/regreet/log (configurable during installation). You can use a log file in a different location with the --logs argument as follows:

regreet --logs /path/to/custom/regreet/logs

Once the log file reaches a limit, it is compressed and rotated to log.X.gz in the same directory, 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. You can also print the logs to stdout in addition to the log file, with the --verbose argument as follows:

regreet --verbose

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.

Demo mode

To aid development, a "demo" mode is included within ReGreet that runs ReGreet independent of greetd. Simply run ReGreet as follows:

regreet --demo

Since the demo mode doesn't use greetd, authentication is done using hardcoded credentials within the codebase. These credentials are logged with the warning log-level, so that you don't have to read the source code.

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.