{ config, lib, pkgs, ... }: # rofi as the desktop launcher and dmenu-style menu frontend. let user = config.user.name; # A session menu built on the same themed rofi, so the power actions look # like every other menu the launcher drives. powerMenu = pkgs.writeShellScript "rofi-power-menu" '' chosen=$(printf '%s\n' Lock Suspend 'Log out' Reboot 'Shut down' \ | ${pkgs.rofi}/bin/rofi -dmenu -i -p Power) case "$chosen" in Lock) ${pkgs.systemd}/bin/loginctl lock-session ;; Suspend) ${pkgs.systemd}/bin/systemctl suspend ;; 'Log out') ${pkgs.systemd}/bin/loginctl terminate-session "$XDG_SESSION_ID" ;; Reboot) ${pkgs.systemd}/bin/systemctl reboot ;; 'Shut down') ${pkgs.systemd}/bin/systemctl poweroff ;; esac ''; in { options.modules.desktop.session.rofi.enable = lib.mkEnableOption "the rofi launcher"; config = lib.mkIf config.modules.desktop.session.rofi.enable { registry.keybind.${config.networking.hostName} = { rofi-launcher = { keys = "SUPER + R"; action = { kind = "exec"; command = "${pkgs.rofi}/bin/rofi -show drun"; }; }; rofi-power-menu = { keys = "SUPER + SHIFT + X"; action = { kind = "exec"; command = "${powerMenu}"; }; }; }; home-manager.users.${user} = { # No theme is set here: Stylix's rofi target supplies the Nord one. programs.rofi = { enable = true; # Application launch is the only mode, kept minimal so the prompt opens # as fast as rofi can read the desktop entries. # Icons are off: resolving one per entry is the bulk of drun's startup. extraConfig = { modi = "drun"; show-icons = false; }; }; }; }; }