about summary refs log tree commit diff
path: root/modules/nixos/solaar.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/nixos/solaar.nix')
-rw-r--r--modules/nixos/solaar.nix54
1 files changed, 54 insertions, 0 deletions
diff --git a/modules/nixos/solaar.nix b/modules/nixos/solaar.nix
new file mode 100644
index 0000000..ceff23d
--- /dev/null
+++ b/modules/nixos/solaar.nix
@@ -0,0 +1,54 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+with lib; let
+  cfg = config.nixfiles.modules.solaar;
+in {
+  options.nixfiles.modules.solaar = {
+    enable = mkEnableOption "Solaar";
+  };
+
+  config = mkIf cfg.enable {
+    hm = {
+      home.packages = with pkgs; [solaar];
+
+      systemd.user.services.solaar = {
+        Unit = {
+          Description = "Device manager for Logitech devices";
+          After = ["graphical-session-pre.target"];
+          PartOf = ["graphical-session.target"];
+        };
+        Service = {
+          # The dirtiest hack I've ever implemented... I should be ashamed of
+          # it. Regardless, that shit still doesn't work because each reconnect,
+          # /dev/hidraw* is recreated and has default permissions which breaks
+          # Solaar. Fuck this shit.
+          ExecStartPre = let
+            pkg = pkgs.writeShellApplication {
+              name = "solaar-pre";
+              text = ''
+                for i in /dev/hidraw*; do
+                  if [ -c "$i" ]; then
+                    sudo chown root:input "$i"
+                    sudo chmod 0660 "$i"
+                  fi
+                done
+              '';
+            };
+          in "${pkg}/bin/solaar-pre";
+          ExecStart = "${pkgs.solaar}/bin/solaar --window=hide";
+        };
+        Install.WantedBy = ["graphical-session.target"];
+      };
+    };
+
+    boot.kernelModules = ["hid_logitech_dj" "hid_logitech_hidpp"];
+
+    hardware.uinput.enable = true;
+
+    my.extraGroups = ["uinput" "input"];
+  };
+}

Consider giving Nix/NixOS a try! <3