From cf284b1700b2c8b6e564e51135b00feb011b875a Mon Sep 17 00:00:00 2001 From: "COGnITO (mode: carbon)" <108423881+zitongcharliedeng@users.noreply.github.com> Date: Mon, 16 Mar 2026 12:47:32 +0000 Subject: [PATCH] =?UTF-8?q?feat(nix):=20NixOS=20integration=20=E2=80=94=20?= =?UTF-8?q?ALSA=5FPLUGIN=5FDIR,=20nixosModule,=20home-manager=20module=20(?= =?UTF-8?q?#1025)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Set ALSA_PLUGIN_DIR to PipeWire's alsa-lib path in package wrapper (NixOS store paths aren't in ALSA's default plugin search) - Add nixosModules.default: udev rule for /dev/uinput, systemPackages - Add homeManagerModules.default: systemd user service for autostart Co-authored-by: zitongcharliedeng --- flake.nix | 17 +++++++++++++++++ nix/hm-module.nix | 41 +++++++++++++++++++++++++++++++++++++++++ nix/module.nix | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 nix/hm-module.nix create mode 100644 nix/module.nix diff --git a/flake.nix b/flake.nix index 14a4cfd..0767215 100644 --- a/flake.nix +++ b/flake.nix @@ -174,6 +174,7 @@ preFixup = '' gappsWrapperArgs+=( --set WEBKIT_DISABLE_DMABUF_RENDERER 1 + --set ALSA_PLUGIN_DIR "${pkgs.pipewire}/lib/alsa-lib:${pkgs.alsa-plugins}/lib/alsa-lib" --prefix LD_LIBRARY_PATH : "${ lib.makeLibraryPath [ pkgs.vulkan-loader @@ -196,6 +197,22 @@ } ); + # NixOS module for system-level integration (udev, input group) + nixosModules.default = + { lib, pkgs, ... }: + { + imports = [ ./nix/module.nix ]; + programs.handy.package = lib.mkDefault self.packages.${pkgs.stdenv.hostPlatform.system}.handy; + }; + + # Home-manager module for per-user service + homeManagerModules.default = + { lib, pkgs, ... }: + { + imports = [ ./nix/hm-module.nix ]; + services.handy.package = lib.mkDefault self.packages.${pkgs.stdenv.hostPlatform.system}.handy; + }; + # Development shell for building from source devShells = forAllSystems ( system: diff --git a/nix/hm-module.nix b/nix/hm-module.nix new file mode 100644 index 0000000..b84f987 --- /dev/null +++ b/nix/hm-module.nix @@ -0,0 +1,41 @@ +# Home-manager module for Handy speech-to-text +# +# Provides a systemd user service for autostart. +# Usage: imports = [ handy.homeManagerModules.default ]; +# services.handy.enable = true; +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.services.handy; +in +{ + options.services.handy = { + enable = lib.mkEnableOption "Handy speech-to-text user service"; + + package = lib.mkOption { + type = lib.types.package; + defaultText = lib.literalExpression "handy.packages.\${system}.handy"; + description = "The Handy package to use."; + }; + }; + + config = lib.mkIf cfg.enable { + systemd.user.services.handy = { + Unit = { + Description = "Handy speech-to-text"; + After = [ "graphical-session.target" ]; + PartOf = [ "graphical-session.target" ]; + }; + Service = { + ExecStart = "${cfg.package}/bin/handy"; + Restart = "on-failure"; + RestartSec = 5; + }; + Install.WantedBy = [ "graphical-session.target" ]; + }; + }; +} diff --git a/nix/module.nix b/nix/module.nix new file mode 100644 index 0000000..1709947 --- /dev/null +++ b/nix/module.nix @@ -0,0 +1,47 @@ +# NixOS module for Handy speech-to-text +# +# Handles system-level configuration that the package wrapper cannot: +# - udev rule for /dev/uinput (rdev grab() needs it for virtual input) +# +# Note: users must add themselves to the "input" group for evdev hotkey access. +# +# Usage in your flake: +# +# inputs.handy.url = "github:cjpais/Handy"; +# +# nixosConfigurations.myhost = nixpkgs.lib.nixosSystem { +# modules = [ +# handy.nixosModules.default +# { programs.handy.enable = true; } +# ]; +# }; +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.programs.handy; +in +{ + options.programs.handy = { + enable = lib.mkEnableOption "Handy offline speech-to-text"; + + package = lib.mkOption { + type = lib.types.package; + defaultText = lib.literalExpression "handy.packages.\${system}.handy"; + description = "The Handy package to use."; + }; + }; + + config = lib.mkIf cfg.enable { + environment.systemPackages = [ cfg.package ]; + + # rdev grab() creates virtual input devices via /dev/uinput. + # Default permissions are crw------- root root — open it to the input group. + services.udev.extraRules = '' + KERNEL=="uinput", GROUP="input", MODE="0660" + ''; + }; +}