{ config, lib, pkgs, ... }: # SwayOSD: a transient on-screen popup for volume and brightness changes. let user = config.user.name; in { options.modules.desktop.utilities.osd.enable = lib.mkEnableOption "the SwayOSD volume and brightness popup"; config = lib.mkIf config.modules.desktop.utilities.osd.enable { registry.keybind.${config.networking.hostName} = { volume-up = { keys = "XF86AudioRaiseVolume"; repeating = true; action = { kind = "exec"; command = "${pkgs.swayosd}/bin/swayosd-client --output-volume raise --max-volume 100"; }; }; volume-down = { keys = "XF86AudioLowerVolume"; repeating = true; action = { kind = "exec"; command = "${pkgs.swayosd}/bin/swayosd-client --output-volume lower"; }; }; brightness-up = { keys = "XF86MonBrightnessUp"; repeating = true; action = { kind = "exec"; command = "${pkgs.swayosd}/bin/swayosd-client --brightness raise"; }; }; brightness-down = { keys = "XF86MonBrightnessDown"; repeating = true; action = { kind = "exec"; command = "${pkgs.swayosd}/bin/swayosd-client --brightness lower"; }; }; mute = { keys = "XF86AudioMute"; locked = true; action = { kind = "exec"; command = "${pkgs.swayosd}/bin/swayosd-client --output-volume mute-toggle"; }; }; }; environment.systemPackages = [ pkgs.swayosd ]; # The udev rule chgrps each backlight's brightness node to `video` and adds # group write, so the server dims the panel without root. # Membership below grants the running session that access. services.udev.packages = [ pkgs.swayosd ]; users.users.${user}.extraGroups = [ "video" ]; # The server draws the popups, so it runs for the whole graphical session. # It binds to the target uwsm activates. home-manager.users.${user}.systemd.user.services.swayosd = { Unit = { Description = "SwayOSD on-screen display server"; PartOf = [ "graphical-session.target" ]; After = [ "graphical-session.target" ]; }; Service = { ExecStart = "${pkgs.swayosd}/bin/swayosd-server"; Restart = "on-failure"; }; Install.WantedBy = [ "graphical-session.target" ]; }; }; }