Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions maintainers/maintainer-list.nix
Original file line number Diff line number Diff line change
Expand Up @@ -5397,6 +5397,12 @@
githubId = 852967;
name = "Russell O'Connor";
};
roelvandijk = {
email = "roel@lambdacube.nl";
github = "roelvandijk";
githubId = 710906;
name = "Roel van Dijk";
};
romildo = {
email = "malaquias@gmail.com";
github = "romildo";
Expand Down
133 changes: 133 additions & 0 deletions nixos/modules/hardware/openrazer.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
{ config, pkgs, lib, ... }:

with lib;

let
cfg = config.hardware.openrazer;
kernelPackages = config.boot.kernelPackages;

toPyBoolStr = b: if b then "True" else "False";

daemonExe = "${pkgs.openrazer-daemon}/bin/openrazer-daemon --config ${daemonConfFile}";

daemonConfFile = pkgs.writeTextFile {
name = "razer.conf";
text = ''
[General]
verbose_logging = ${toPyBoolStr cfg.verboseLogging}

[Startup]
sync_effects_enabled = ${toPyBoolStr cfg.syncEffectsEnabled}
devices_off_on_screensaver = ${toPyBoolStr cfg.devicesOffOnScreensaver}
mouse_battery_notifier = ${toPyBoolStr cfg.mouseBatteryNotifier}

[Statistics]
key_statistics = ${toPyBoolStr cfg.keyStatistics}
'';
};

dbusServiceFile = pkgs.writeTextFile rec {
name = "org.razer.service";
destination = "/share/dbus-1/services/${name}";
text = ''
[D-BUS Service]
Name=org.razer
Exec=${daemonExe}
SystemdService=openrazer-daemon.service
'';
};

drivers = [
"razerkbd"
"razermouse"
"razerfirefly"
"razerkraken"
"razermug"
"razercore"
];
in
{
options = {
hardware.openrazer = {
enable = mkEnableOption "OpenRazer drivers and userspace daemon.";

verboseLogging = mkOption {
type = types.bool;
default = false;
description = ''
Whether to enable verbose logging. Logs debug messages.
'';
};

syncEffectsEnabled = mkOption {
type = types.bool;
default = true;
description = ''
Set the sync effects flag to true so any assignment of
effects will work across devices.
'';
};

devicesOffOnScreensaver = mkOption {
type = types.bool;
default = true;
description = ''
Turn off the devices when the systems screensaver kicks in.
'';
};

mouseBatteryNotifier = mkOption {
type = types.bool;
default = true;
description = ''
Mouse battery notifier.
'';
};

keyStatistics = mkOption {
type = types.bool;
default = false;
description = ''
Collects number of keypresses per hour per key used to
generate a heatmap.
'';
};
};
};

config = mkIf cfg.enable {
boot.extraModulePackages = [ kernelPackages.openrazer ];
boot.kernelModules = drivers;

# Makes the man pages available so you can succesfully run
# > systemctl --user help openrazer-daemon
environment.systemPackages = [ pkgs.python3Packages.openrazer-daemon.man ];

services.udev.packages = [ kernelPackages.openrazer ];
services.dbus.packages = [ dbusServiceFile ];

# A user must be a member of the plugdev group in order to start
# the openrazer-daemon. Therefore we make sure that the plugdev
# group exists.
users.groups.plugdev = {};

systemd.user.services.openrazer-daemon = {
description = "Daemon to manage razer devices in userspace";
unitConfig.Documentation = "man:openrazer-daemon(8)";
# Requires a graphical session so the daemon knows when the screensaver
# starts. See the 'devicesOffOnScreensaver' option.
wantedBy = [ "graphical-session.target" ];
partOf = [ "graphical-session.target" ];
serviceConfig = {
Type = "dbus";
BusName = "org.razer";
ExecStart = "${daemonExe} --foreground";
Restart = "always";
};
};
};

meta = {
maintainers = with lib.maintainers; [ roelvandijk ];
};
}
1 change: 1 addition & 0 deletions nixos/modules/module-list.nix
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
./hardware/network/intel-2200bg.nix
./hardware/nitrokey.nix
./hardware/opengl.nix
./hardware/openrazer.nix
./hardware/pcmcia.nix
./hardware/raid/hpsa.nix
./hardware/steam-hardware.nix
Expand Down
17 changes: 17 additions & 0 deletions pkgs/development/python-modules/openrazer/common.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{ stdenv
, fetchFromGitHub
}: rec {
version = "2.6.0";
src = fetchFromGitHub {
owner = "openrazer";
repo = "openrazer";
rev = "v${version}";
sha256 = "1s5irs3avrlp891mxan3z8p55ias9rq26rqp2qrlcc6i4vl29di0";
};
meta = with stdenv.lib; {
homepage = https://openrazer.github.io/;
license = licenses.gpl2;
maintainers = with maintainers; [ roelvandijk ];
platforms = platforms.linux;
};
}
45 changes: 45 additions & 0 deletions pkgs/development/python-modules/openrazer/daemon.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{ buildPythonApplication
, daemonize
, dbus-python
, fetchFromGitHub
, fetchpatch
, gobject-introspection
, gtk3
, makeWrapper
, pygobject3
, pyudev
, setproctitle
, stdenv
, wrapGAppsHook
}:

let
common = import ./common.nix { inherit stdenv fetchFromGitHub; };
in
buildPythonApplication (common // rec {
pname = "openrazer_daemon";

sourceRoot = "source/daemon";

outputs = [ "out" "man" ];

nativeBuildInputs = [ makeWrapper wrapGAppsHook ];

propagatedBuildInputs = [
daemonize
dbus-python
gobject-introspection
gtk3
pygobject3
pyudev
setproctitle
];

postBuild = ''
DESTDIR="$out" PREFIX="" make install manpages
'';

meta = common.meta // {
description = "An entirely open source user-space daemon that allows you to manage your Razer peripherals on GNU/Linux";
};
})
26 changes: 26 additions & 0 deletions pkgs/development/python-modules/openrazer/pylib.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{ buildPythonPackage
, dbus-python
, fetchFromGitHub
, numpy
, stdenv
, openrazer-daemon
}:

let
common = import ./common.nix { inherit stdenv fetchFromGitHub; };
in
buildPythonPackage (common // rec {
pname = "openrazer";

sourceRoot = "source/pylib";

propagatedBuildInputs = [
dbus-python
numpy
openrazer-daemon
];

meta = common.meta // {
description = "An entirely open source Python library that allows you to manage your Razer peripherals on GNU/Linux";
};
})
39 changes: 39 additions & 0 deletions pkgs/os-specific/linux/openrazer/driver.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{ coreutils
, fetchFromGitHub
, kernel
, stdenv
, utillinux
}:

let
common = import ../../../development/python-modules/openrazer/common.nix { inherit stdenv fetchFromGitHub; };
in
stdenv.mkDerivation (common // {
name = "openrazer-${common.version}-${kernel.version}";

nativeBuildInputs = kernel.moduleBuildDependencies;

buildFlags = [
"KERNELDIR=${kernel.dev}/lib/modules/${kernel.version}/build"
];

installPhase = ''
binDir="$out/lib/modules/${kernel.modDirVersion}/kernel/drivers/hid"
mkdir -p "$binDir"
cp -v driver/*.ko "$binDir"
RAZER_MOUNT_OUT="$out/bin/razer_mount"
RAZER_RULES_OUT="$out/etc/udev/rules.d/99-razer.rules"
install -m 644 -v -D install_files/udev/99-razer.rules $RAZER_RULES_OUT
install -m 755 -v -D install_files/udev/razer_mount $RAZER_MOUNT_OUT
substituteInPlace $RAZER_RULES_OUT \
--replace razer_mount $RAZER_MOUNT_OUT
substituteInPlace $RAZER_MOUNT_OUT \
--replace /usr/bin/logger ${utillinux}/bin/logger \
--replace chgrp ${coreutils}/bin/chgrp \
--replace "PATH='/sbin:/bin:/usr/sbin:/usr/bin'" ""
'';

meta = common.meta // {
description = "An entirely open source Linux driver that allows you to manage your Razer peripherals on GNU/Linux";
};
})
4 changes: 4 additions & 0 deletions pkgs/top-level/all-packages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -15856,6 +15856,8 @@ in
nvidia_x11_beta = nvidiaPackages.beta;
nvidia_x11 = nvidiaPackages.stable;

openrazer = callPackage ../os-specific/linux/openrazer/driver.nix { };

ply = callPackage ../os-specific/linux/ply { };

r8168 = callPackage ../os-specific/linux/r8168 { };
Expand Down Expand Up @@ -19996,6 +19998,8 @@ in

openmpt123 = callPackage ../applications/audio/openmpt123 { };

openrazer-daemon = with python3Packages; toPythonApplication openrazer-daemon;

opusfile = callPackage ../applications/audio/opusfile { };

opusTools = callPackage ../applications/audio/opus-tools { };
Expand Down
3 changes: 3 additions & 0 deletions pkgs/top-level/python-packages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -2569,6 +2569,9 @@ in {

odfpy = callPackage ../development/python-modules/odfpy { };

openrazer = callPackage ../development/python-modules/openrazer/pylib.nix { };
openrazer-daemon = callPackage ../development/python-modules/openrazer/daemon.nix { };

oset = callPackage ../development/python-modules/oset { };

pamela = callPackage ../development/python-modules/pamela { };
Expand Down