{ config, pkgs, lib, ... }: let # These micro-scripts change the volume while also triggering the volume # notification widget increaseVolume = pkgs.writeShellScriptBin "increaseVolume" '' ${pkgs.pamixer}/bin/pamixer -i 2 volume=$(${pkgs.pamixer}/bin/pamixer --get-volume) ${pkgs.volnoti}/bin/volnoti-show $volume ''; decreaseVolume = pkgs.writeShellScriptBin "decreaseVolume" '' ${pkgs.pamixer}/bin/pamixer -d 2 volume=$(${pkgs.pamixer}/bin/pamixer --get-volume) ${pkgs.volnoti}/bin/volnoti-show $volume ''; toggleMute = pkgs.writeShellScriptBin "toggleMute" '' ${pkgs.pamixer}/bin/pamixer --toggle-mute mute=$(${pkgs.pamixer}/bin/pamixer --get-mute) if [ "$mute" == "true" ]; then ${pkgs.volnoti}/bin/volnoti-show --mute else volume=$(${pkgs.pamixer}/bin/pamixer --get-volume) ${pkgs.volnoti}/bin/volnoti-show $volume fi ''; in { config = lib.mkIf config.gui.enable { sound.enable = true; # Enable PulseAudio hardware.pulseaudio.enable = true; # These aren't necessary, but helpful for the user environment.systemPackages = with pkgs; [ pamixer # Audio control volnoti # Volume notifications ]; home-manager.users.${config.user} = { # Graphical volume notifications services.volnoti.enable = true; xsession.windowManager.i3.config = { # Make sure that Volnoti actually starts (home-manager doesn't start # user daemon's automatically) startup = [{ command = "systemctl --user restart volnoti"; always = true; notification = false; }]; # i3 keybinds for changing the volume keybindings = { "XF86AudioRaiseVolume" = "exec --no-startup-id ${increaseVolume}/bin/increaseVolume"; "XF86AudioLowerVolume" = "exec --no-startup-id ${decreaseVolume}/bin/decreaseVolume"; "XF86AudioMute" = "exec --no-startup-id ${toggleMute}/bin/toggleMute"; # We can mute the mic by adding "--default-source" "XF86AudioMicMute" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer --default-source --toggle-mute"; }; }; }; }; }