diff --git a/modules/services/hardware/wii-u-gc-adapter.nix b/modules/services/hardware/wii-u-gc-adapter.nix new file mode 100644 index 00000000..39b4d64a --- /dev/null +++ b/modules/services/hardware/wii-u-gc-adapter.nix @@ -0,0 +1,40 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let cfg = config.services.wii-u-gc-adapter; +in { + options = { + services.wii-u-gc-adapter = { + enable = mkOption { + type = types.bool; + default = false; + description = '' + Whether to enable wii-u-gc-adapter service to automatically start + when the controller adapter is plugged in. + ''; + }; + }; + }; + config = mkIf cfg.enable { + services.udev.extraRules = '' + # start wii-u-gc-adapter when plugged in + ACTION=="add", SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="057e", \ + ENV{ID_MODEL_ID}=="0337", TAG+="systemd", \ + ENV{SYSTEMD_ALIAS}="/sys/subsystem/usb/wii-u-gc-adapter", \ + ENV{SYSTEMD_WANTS}+="wii-u-gc-adapter.service" + + # workaround for https://github.com/systemd/systemd/issues/7587 + ACTION=="remove", SUBSYSTEM=="usb", ENV{PRODUCT}=="57e/337/100", \ + TAG+="systemd" + ''; + + systemd.services.wii-u-gc-adapter = { + enable = true; + script = '' + ${pkgs.wii-u-gc-adapter}/bin/wii-u-gc-adapter + ''; + unitConfig = { StopWhenUnneeded = true; }; + }; + }; +} diff --git a/pkgs/default.nix b/pkgs/default.nix index 99b464cc..759901c0 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -5,4 +5,5 @@ final: prev: { purs = prev.callPackage ./shells/zsh/purs { }; pure = prev.callPackage ./shells/zsh/pure { }; dzvol = prev.callPackage ./applications/misc/dzvol.nix { }; + wii-u-gc-adapter = prev.callPackage ./misc/drivers/wii-u-gc-adapter { }; } diff --git a/pkgs/misc/drivers/wii-u-gc-adapter/default.nix b/pkgs/misc/drivers/wii-u-gc-adapter/default.nix new file mode 100644 index 00000000..8c20d5d0 --- /dev/null +++ b/pkgs/misc/drivers/wii-u-gc-adapter/default.nix @@ -0,0 +1,21 @@ +{ stdenv, fetchFromGitHub, pkgconfig, libudev, libusb, ... }: + +stdenv.mkDerivation { + name = "wii-u-gc-adapter"; + + buildInputs = [ pkgconfig libudev libusb ]; + + src = fetchFromGitHub { + owner = "ToadKing"; + repo = "wii-u-gc-adapter"; + rev = "ae6b46d7a2b32068e746f1d2d816f4b3d6a7ac80"; + hash = "sha256-Dk4jMaL5P85yxH3pDVBDNKjtGL4gRkhN5CJqZnOAshE="; + }; + + installPhase = '' + mkdir -p $out/bin + install wii-u-gc-adapter $out/bin + ''; + + hardeningDisable = [ "format" ]; +} diff --git a/profiles/games/default.nix b/profiles/games/default.nix index c0457eb3..da7818e5 100644 --- a/profiles/games/default.nix +++ b/profiles/games/default.nix @@ -1,5 +1,9 @@ { unstablePkgs, ... }: { - imports = [ ../graphical ./udev.nix ]; + imports = [ + ../graphical + ./udev.nix + ../../modules/services/hardware/wii-u-gc-adapter.nix + ]; environment.systemPackages = with unstablePkgs; [ retroarchBare steam @@ -8,6 +12,8 @@ qjoypad ]; + services.wii-u-gc-adapter.enable = true; + # fps games on laptop need this services.xserver.libinput.disableWhileTyping = false;