feat(desktop): add screen brightness controls

Bind XF86MonBrightnessUp/Down to brightnessctl in the repeat-while-held
block, mirroring the volume keys. A new brightness module installs
brightnessctl's udev rule and adds the user to the video group so the
backlight can be dimmed without root.
This commit is contained in:
2026-07-24 13:57:45 -04:00
parent 7f7fc327fd
commit ac095ba0e4
3 changed files with 29 additions and 1 deletions

View File

@@ -0,0 +1,23 @@
{
config,
lib,
pkgs,
...
}:
# Screen backlight control via brightnessctl.
let
cfg = config.modules.desktop.brightness;
user = config.user.name;
in
{
options.modules.desktop.brightness.enable = lib.mkEnableOption "brightnessctl backlight control";
config = lib.mkIf cfg.enable {
environment.systemPackages = [ pkgs.brightnessctl ];
# The udev rule chgrps each backlight's brightness node to `video` and adds
# group write, so a member can dim the panel without root.
services.udev.packages = [ pkgs.brightnessctl ];
users.users.${user}.extraGroups = [ "video" ];
};
}

View File

@@ -25,5 +25,6 @@ in
modules.desktop.theming.enable = lib.mkDefault true; modules.desktop.theming.enable = lib.mkDefault true;
modules.desktop.waybar.enable = lib.mkDefault true; modules.desktop.waybar.enable = lib.mkDefault true;
modules.desktop.audio.enable = lib.mkDefault true; modules.desktop.audio.enable = lib.mkDefault true;
modules.desktop.brightness.enable = lib.mkDefault true;
}; };
} }

View File

@@ -141,10 +141,14 @@ in
] ]
++ workspaceBinds; ++ workspaceBinds;
# Volume keys repeat while held, capped at 150 percent. # Volume and brightness keys repeat while held. Volume is capped at 150
# percent; brightnessctl floors the panel at its minimum so a full hold
# cannot black the screen out.
binde = [ binde = [
", XF86AudioRaiseVolume, exec, ${pkgs.wireplumber}/bin/wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+" ", XF86AudioRaiseVolume, exec, ${pkgs.wireplumber}/bin/wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"
", XF86AudioLowerVolume, exec, ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" ", XF86AudioLowerVolume, exec, ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
", XF86MonBrightnessUp, exec, ${pkgs.brightnessctl}/bin/brightnessctl set 5%+"
", XF86MonBrightnessDown, exec, ${pkgs.brightnessctl}/bin/brightnessctl set 5%-"
]; ];
# Mute and media transport still fire while the session is locked. # Mute and media transport still fire while the session is locked.