{ lib, config, pkgs, ... }: let cfg = config.snowhawk.pipewire-controller; pipewire-controller = let mpv = lib.getExe pkgs.mpv; pamixer = lib.getExe pkgs.pamixer; in pkgs.writers.writeRustBin "pipewire-controller" { } '' use std::{process::Command, str}; const MUTE_AUDIO: &str = "${../audio/discord-mute.mp3}"; const UNMUTE_AUDIO: &str = "${../audio/discord-unmute.mp3}"; fn main() { let mute_status = Command::new("${pamixer}") .args(["--default-source", "--get-mute"]) .output() .expect("Unable to get mute status from pamixer") .stdout; let mute_status = str::from_utf8(&mute_status[..]).expect("pamixer output wasn't a string").trim(); if mute_status == "false" { Command::new("${pamixer}") .args(["--default-source", "--mute"]) .output() .expect("Unable to mute via pamixer"); Command::new("${mpv}") .args(["--no-video", "--volume=80", MUTE_AUDIO]) .output() .expect("Unable to play audio via mpv"); } else { Command::new("${pamixer}") .args(["--default-source", "--unmute"]) .output() .expect("Unable to unmute via pamixer"); Command::new("${mpv}") .args(["--no-video", "--volume=80", UNMUTE_AUDIO]) .output() .expect("Unable to play audio via mpv"); } } ''; in { options.snowhawk.pipewire-controller = { enable = lib.mkEnableOption "pipewire-controller home-manager module"; }; config = lib.mkIf cfg.enable { snowhawk.sxhkd.enable = true; services.sxhkd.keybindings = { "XF86TouchpadOn" = "${lib.getExe pipewire-controller}"; }; }; }