From 05982e65c7985177c6a1b3daa08944debc740ed0 Mon Sep 17 00:00:00 2001 From: alper-han <89567766+alper-han@users.noreply.github.com> Date: Mon, 9 Feb 2026 05:30:03 +0300 Subject: [PATCH 1/4] maintainers: add alper-han --- maintainers/maintainer-list.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index ef50ebc387ae..d16b2087035c 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -1416,6 +1416,12 @@ { fingerprint = "DF68 C500 4024 23CC F9C5 E6CA 3D17 C832 4696 FE70"; } ]; }; + alper-han = { + email = "contact@zynix.net"; + github = "alper-han"; + githubId = 89567766; + name = "Zynix"; + }; alternateved = { email = "alternateved@pm.me"; github = "alternateved"; From 15a34a2fa335b2472a30957f6722bcaacfffc7b1 Mon Sep 17 00:00:00 2001 From: alper-han <89567766+alper-han@users.noreply.github.com> Date: Mon, 9 Feb 2026 05:30:09 +0300 Subject: [PATCH 2/4] crossmacro: init at 0.9.6 --- pkgs/by-name/cr/crossmacro/deps.json | 218 +++++++++++++++++++++++++ pkgs/by-name/cr/crossmacro/package.nix | 105 ++++++++++++ 2 files changed, 323 insertions(+) create mode 100644 pkgs/by-name/cr/crossmacro/deps.json create mode 100644 pkgs/by-name/cr/crossmacro/package.nix diff --git a/pkgs/by-name/cr/crossmacro/deps.json b/pkgs/by-name/cr/crossmacro/deps.json new file mode 100644 index 000000000000..6d172f70917d --- /dev/null +++ b/pkgs/by-name/cr/crossmacro/deps.json @@ -0,0 +1,218 @@ +[ + { + "pname": "Avalonia", + "version": "11.3.11", + "hash": "sha256-FSMuXVA5q5L5evwos5bIsuT81suO8FbCjEF3OvAL9p0=" + } +, + { + "pname": "Avalonia.Angle.Windows.Natives", + "version": "2.1.25547.20250602", + "hash": "sha256-LE/lENAHptmz6t3T/AoJwnhpda+xs7PqriNGzdcfg8M=" + } +, + { + "pname": "Avalonia.BuildServices", + "version": "11.3.2", + "hash": "sha256-6wx06tjSKWQOlX2czdp6Wh0nuwVapx5qf/s8Qj5we40=" + } +, + { + "pname": "Avalonia.Controls.ColorPicker", + "version": "11.3.11", + "hash": "sha256-Ki6O9HYbseQPV3DsvwmJ+ERimi/WmvzelNJDKP6loo0=" + } +, + { + "pname": "Avalonia.Desktop", + "version": "11.3.11", + "hash": "sha256-oFivO8/0rir4BwQsTeWs3bSnb7RmldwxYmI77j5pt8k=" + } +, + { + "pname": "Avalonia.Diagnostics", + "version": "11.3.11", + "hash": "sha256-p38+O0VDqZ8u5VOzImP21/U5wyP1BUp2UrLLc9HSfwE=" + } +, + { + "pname": "Avalonia.Fonts.Inter", + "version": "11.3.11", + "hash": "sha256-S0DWwcZHulVUIckiv2HM1Vbqno64c/Xt+mPhZp1tfsA=" + } +, + { + "pname": "Avalonia.FreeDesktop", + "version": "11.3.11", + "hash": "sha256-UE2/w9cw3YDzsw3HuhI2sTPy8reH9C71ufmHOpzvlSQ=" + } +, + { + "pname": "Avalonia.Native", + "version": "11.3.11", + "hash": "sha256-vw67lp/oOt+2lqdJ5PK2FY93jqPTcgZqOAXLtSXlJ8s=" + } +, + { + "pname": "Avalonia.Remote.Protocol", + "version": "11.3.11", + "hash": "sha256-l1f3rVygtI268llwbN0NvTDSfXwZE3CyRw8w5tbHBC4=" + } +, + { + "pname": "Avalonia.Skia", + "version": "11.3.11", + "hash": "sha256-89TGu50JfEVFo+QZgyOR0uOagC/xoJvqfnrHep3W/cc=" + } +, + { + "pname": "Avalonia.Themes.Fluent", + "version": "11.3.11", + "hash": "sha256-tiJ0xAFf0UVSH7LASPtg/7ils7+vZjw2UKBMydyUR3Q=" + } +, + { + "pname": "Avalonia.Themes.Simple", + "version": "11.3.11", + "hash": "sha256-AJS5Ls0tJ6PCr2mnr1PpxGWX4sII8mpe2R+VCFYRg44=" + } +, + { + "pname": "Avalonia.Win32", + "version": "11.3.11", + "hash": "sha256-6/NG4OrB/4YisXzJ51GPuq3uDn8oEUWyJRAqejyMCQw=" + } +, + { + "pname": "Avalonia.X11", + "version": "11.3.11", + "hash": "sha256-2fiQvKxU/r71UOAQgy0zwSHVCM2uG2sdEUhObd5TrQQ=" + } +, + { + "pname": "CommunityToolkit.Mvvm", + "version": "8.4.0", + "hash": "sha256-a0D550q+ffreU9Z+kQPdzJYPNaj1UjgyPofLzUg02ZI=" + } +, + { + "pname": "HarfBuzzSharp", + "version": "8.3.1.1", + "hash": "sha256-614yv6bK9ynhdUnvW4wIkgpBe2sqTh28U9cDZzdhPc0=" + } +, + { + "pname": "HarfBuzzSharp.NativeAssets.Linux", + "version": "8.3.1.1", + "hash": "sha256-sBbez6fc9axVcsBbIHbpQh/MM5NHlMJgSu6FyuZzVyU=" + } +, + { + "pname": "HarfBuzzSharp.NativeAssets.macOS", + "version": "8.3.1.1", + "hash": "sha256-hK20KbX2OpewIO5qG5gWw5Ih6GoLcIDgFOqCJIjXR/Q=" + } +, + { + "pname": "HarfBuzzSharp.NativeAssets.WebAssembly", + "version": "8.3.1.1", + "hash": "sha256-mLKoLqI47ZHXqTMLwP1UCm7faDptUfQukNvdq6w/xxw=" + } +, + { + "pname": "HarfBuzzSharp.NativeAssets.Win32", + "version": "8.3.1.1", + "hash": "sha256-Um4iwLdz9XtaDSAsthNZdev6dMiy7OBoHOrorMrMYyo=" + } +, + { + "pname": "MicroCom.Runtime", + "version": "0.11.0", + "hash": "sha256-VdwpP5fsclvNqJuppaOvwEwv2ofnAI5ZSz2V+UEdLF0=" + } +, + { + "pname": "Microsoft.Extensions.DependencyInjection", + "version": "10.0.2", + "hash": "sha256-/9UWQRAI2eoocnJWWf1ktnAx/1Gt65c16fc0Xqr9+CQ=" + } +, + { + "pname": "Microsoft.Extensions.DependencyInjection.Abstractions", + "version": "10.0.2", + "hash": "sha256-UF9T13V5SQxJy2msfLmyovLmitZrjJayf8gHH+uK2eg=" + } +, + { + "pname": "Serilog", + "version": "4.3.0", + "hash": "sha256-jyIy4BjsyFXge3aO4GRFAdnX4/rz1MHfBkBDIpCDsTw=" + } +, + { + "pname": "Serilog.Sinks.Async", + "version": "2.1.0", + "hash": "sha256-LDoLpXkleD2MVPK2KBsLGRf5yqrwckBiAnYDbuIbaUM=" + } +, + { + "pname": "Serilog.Sinks.Console", + "version": "6.1.1", + "hash": "sha256-CfIg4Us4kSMQAn6rU2rsAeE22g6MpFiZdhoZWySpZeY=" + } +, + { + "pname": "Serilog.Sinks.File", + "version": "7.0.0", + "hash": "sha256-LxZYUoUPkCjIIVarJilnXnqQiMrFNJtoRilmzTNtUjo=" + } +, + { + "pname": "SkiaSharp", + "version": "2.88.9", + "hash": "sha256-jZ/4nVXYJtrz9SBf6sYc/s0FxS7ReIYM4kMkrhZS+24=" + } +, + { + "pname": "SkiaSharp.NativeAssets.Linux", + "version": "2.88.9", + "hash": "sha256-mQ/oBaqRR71WfS66mJCvcc3uKW7CNEHoPN2JilDbw/A=" + } +, + { + "pname": "SkiaSharp.NativeAssets.Linux.NoDependencies", + "version": "2.88.9", + "hash": "sha256-WjpcM78Q6kaW0eU5iqDR5+fGcF+06/tawWHsJRK57Es=" + } +, + { + "pname": "SkiaSharp.NativeAssets.macOS", + "version": "2.88.9", + "hash": "sha256-qvGuAmjXGjGKMzOPBvP9VWRVOICSGb7aNVejU0lLe/g=" + } +, + { + "pname": "SkiaSharp.NativeAssets.WebAssembly", + "version": "2.88.9", + "hash": "sha256-vgFL4Pdy3O1RKBp+T9N3W4nkH9yurZ0suo8u3gPmmhY=" + } +, + { + "pname": "SkiaSharp.NativeAssets.Win32", + "version": "2.88.9", + "hash": "sha256-kP5XM5GgwHGfNJfe4T2yO5NIZtiF71Ddp0pd1vG5V/4=" + } +, + { + "pname": "Tmds.DBus", + "version": "0.23.0", + "hash": "sha256-BwWQSqOOMS+Cf2fM8MIuiHey8QnGH4WvYjOn9haq5e0=" + } +, + { + "pname": "Tmds.DBus.Protocol", + "version": "0.21.2", + "hash": "sha256-gaK/5aAummyin6ptnhaJbnA0ih4+2xADrtrLfFbHwYI=" + } + +] diff --git a/pkgs/by-name/cr/crossmacro/package.nix b/pkgs/by-name/cr/crossmacro/package.nix new file mode 100644 index 000000000000..b076dd651952 --- /dev/null +++ b/pkgs/by-name/cr/crossmacro/package.nix @@ -0,0 +1,105 @@ +{ + lib, + buildDotnetModule, + dotnetCorePackages, + fetchFromGitHub, + nix-update-script, + fontconfig, + freetype, + expat, + libx11, + libice, + libsm, + libxi, + libxcursor, + libxext, + libxrandr, + libxrender, + libxfixes, + libxtst, + libglvnd, + mesa, + wayland, + libxkbcommon, + glib, + icu, + openssl, + zlib, +}: + +buildDotnetModule rec { + pname = "crossmacro"; + version = "0.9.6"; + + src = fetchFromGitHub { + owner = "alper-han"; + repo = "CrossMacro"; + tag = "v${version}"; + hash = "sha256-6Cc1mC34l+4dUPD1LAYxlXxzNF76l4HoOmbqTdTJVk0="; + }; + + projectFile = "src/CrossMacro.UI/CrossMacro.UI.csproj"; + nugetDeps = ./deps.json; + + dotnet-sdk = dotnetCorePackages.sdk_10_0; + dotnet-runtime = dotnetCorePackages.runtime_10_0; + + executables = [ "CrossMacro.UI" ]; + buildType = "Release"; + + dotnetFlags = [ + "-p:SelfContained=false" + "-p:Version=${version}" + ]; + + runtimeDeps = [ + zlib + icu + openssl + fontconfig + freetype + expat + libx11 + libice + libsm + libxi + libxcursor + libxext + libxrandr + libxrender + libxfixes + libxtst + glib + libglvnd + mesa + wayland + libxkbcommon + ]; + + postInstall = '' + install -Dm644 scripts/assets/CrossMacro.desktop $out/share/applications/crossmacro.desktop + + for size in 16 32 48 64 128 256 512; do + install -Dm644 src/CrossMacro.UI/Assets/icons/''${size}x''${size}/apps/crossmacro.png \ + $out/share/icons/hicolor/''${size}x''${size}/apps/crossmacro.png + done + + install -Dm644 scripts/assets/io.github.alper-han.CrossMacro.metainfo.xml \ + $out/share/metainfo/io.github.alper-han.CrossMacro.metainfo.xml + + mkdir -p $out/bin + ln -sf $out/bin/CrossMacro.UI $out/bin/crossmacro + ''; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "Cross-platform mouse and keyboard macro recorder and player"; + homepage = "https://github.com/alper-han/CrossMacro"; + changelog = "https://github.com/alper-han/CrossMacro/releases/tag/v${version}"; + license = lib.licenses.gpl3Plus; + platforms = lib.platforms.linux; + mainProgram = "crossmacro"; + maintainers = with lib.maintainers; [ alper-han ]; + }; +} From 78c93bb2867e1b9582611a1288a5e552b9fccff8 Mon Sep 17 00:00:00 2001 From: alper-han <89567766+alper-han@users.noreply.github.com> Date: Mon, 9 Feb 2026 05:30:12 +0300 Subject: [PATCH 3/4] crossmacro-daemon: init at 0.9.6 --- pkgs/by-name/cr/crossmacro-daemon/deps.json | 218 ++++++++++++++++++ pkgs/by-name/cr/crossmacro-daemon/package.nix | 71 ++++++ 2 files changed, 289 insertions(+) create mode 100644 pkgs/by-name/cr/crossmacro-daemon/deps.json create mode 100644 pkgs/by-name/cr/crossmacro-daemon/package.nix diff --git a/pkgs/by-name/cr/crossmacro-daemon/deps.json b/pkgs/by-name/cr/crossmacro-daemon/deps.json new file mode 100644 index 000000000000..6d172f70917d --- /dev/null +++ b/pkgs/by-name/cr/crossmacro-daemon/deps.json @@ -0,0 +1,218 @@ +[ + { + "pname": "Avalonia", + "version": "11.3.11", + "hash": "sha256-FSMuXVA5q5L5evwos5bIsuT81suO8FbCjEF3OvAL9p0=" + } +, + { + "pname": "Avalonia.Angle.Windows.Natives", + "version": "2.1.25547.20250602", + "hash": "sha256-LE/lENAHptmz6t3T/AoJwnhpda+xs7PqriNGzdcfg8M=" + } +, + { + "pname": "Avalonia.BuildServices", + "version": "11.3.2", + "hash": "sha256-6wx06tjSKWQOlX2czdp6Wh0nuwVapx5qf/s8Qj5we40=" + } +, + { + "pname": "Avalonia.Controls.ColorPicker", + "version": "11.3.11", + "hash": "sha256-Ki6O9HYbseQPV3DsvwmJ+ERimi/WmvzelNJDKP6loo0=" + } +, + { + "pname": "Avalonia.Desktop", + "version": "11.3.11", + "hash": "sha256-oFivO8/0rir4BwQsTeWs3bSnb7RmldwxYmI77j5pt8k=" + } +, + { + "pname": "Avalonia.Diagnostics", + "version": "11.3.11", + "hash": "sha256-p38+O0VDqZ8u5VOzImP21/U5wyP1BUp2UrLLc9HSfwE=" + } +, + { + "pname": "Avalonia.Fonts.Inter", + "version": "11.3.11", + "hash": "sha256-S0DWwcZHulVUIckiv2HM1Vbqno64c/Xt+mPhZp1tfsA=" + } +, + { + "pname": "Avalonia.FreeDesktop", + "version": "11.3.11", + "hash": "sha256-UE2/w9cw3YDzsw3HuhI2sTPy8reH9C71ufmHOpzvlSQ=" + } +, + { + "pname": "Avalonia.Native", + "version": "11.3.11", + "hash": "sha256-vw67lp/oOt+2lqdJ5PK2FY93jqPTcgZqOAXLtSXlJ8s=" + } +, + { + "pname": "Avalonia.Remote.Protocol", + "version": "11.3.11", + "hash": "sha256-l1f3rVygtI268llwbN0NvTDSfXwZE3CyRw8w5tbHBC4=" + } +, + { + "pname": "Avalonia.Skia", + "version": "11.3.11", + "hash": "sha256-89TGu50JfEVFo+QZgyOR0uOagC/xoJvqfnrHep3W/cc=" + } +, + { + "pname": "Avalonia.Themes.Fluent", + "version": "11.3.11", + "hash": "sha256-tiJ0xAFf0UVSH7LASPtg/7ils7+vZjw2UKBMydyUR3Q=" + } +, + { + "pname": "Avalonia.Themes.Simple", + "version": "11.3.11", + "hash": "sha256-AJS5Ls0tJ6PCr2mnr1PpxGWX4sII8mpe2R+VCFYRg44=" + } +, + { + "pname": "Avalonia.Win32", + "version": "11.3.11", + "hash": "sha256-6/NG4OrB/4YisXzJ51GPuq3uDn8oEUWyJRAqejyMCQw=" + } +, + { + "pname": "Avalonia.X11", + "version": "11.3.11", + "hash": "sha256-2fiQvKxU/r71UOAQgy0zwSHVCM2uG2sdEUhObd5TrQQ=" + } +, + { + "pname": "CommunityToolkit.Mvvm", + "version": "8.4.0", + "hash": "sha256-a0D550q+ffreU9Z+kQPdzJYPNaj1UjgyPofLzUg02ZI=" + } +, + { + "pname": "HarfBuzzSharp", + "version": "8.3.1.1", + "hash": "sha256-614yv6bK9ynhdUnvW4wIkgpBe2sqTh28U9cDZzdhPc0=" + } +, + { + "pname": "HarfBuzzSharp.NativeAssets.Linux", + "version": "8.3.1.1", + "hash": "sha256-sBbez6fc9axVcsBbIHbpQh/MM5NHlMJgSu6FyuZzVyU=" + } +, + { + "pname": "HarfBuzzSharp.NativeAssets.macOS", + "version": "8.3.1.1", + "hash": "sha256-hK20KbX2OpewIO5qG5gWw5Ih6GoLcIDgFOqCJIjXR/Q=" + } +, + { + "pname": "HarfBuzzSharp.NativeAssets.WebAssembly", + "version": "8.3.1.1", + "hash": "sha256-mLKoLqI47ZHXqTMLwP1UCm7faDptUfQukNvdq6w/xxw=" + } +, + { + "pname": "HarfBuzzSharp.NativeAssets.Win32", + "version": "8.3.1.1", + "hash": "sha256-Um4iwLdz9XtaDSAsthNZdev6dMiy7OBoHOrorMrMYyo=" + } +, + { + "pname": "MicroCom.Runtime", + "version": "0.11.0", + "hash": "sha256-VdwpP5fsclvNqJuppaOvwEwv2ofnAI5ZSz2V+UEdLF0=" + } +, + { + "pname": "Microsoft.Extensions.DependencyInjection", + "version": "10.0.2", + "hash": "sha256-/9UWQRAI2eoocnJWWf1ktnAx/1Gt65c16fc0Xqr9+CQ=" + } +, + { + "pname": "Microsoft.Extensions.DependencyInjection.Abstractions", + "version": "10.0.2", + "hash": "sha256-UF9T13V5SQxJy2msfLmyovLmitZrjJayf8gHH+uK2eg=" + } +, + { + "pname": "Serilog", + "version": "4.3.0", + "hash": "sha256-jyIy4BjsyFXge3aO4GRFAdnX4/rz1MHfBkBDIpCDsTw=" + } +, + { + "pname": "Serilog.Sinks.Async", + "version": "2.1.0", + "hash": "sha256-LDoLpXkleD2MVPK2KBsLGRf5yqrwckBiAnYDbuIbaUM=" + } +, + { + "pname": "Serilog.Sinks.Console", + "version": "6.1.1", + "hash": "sha256-CfIg4Us4kSMQAn6rU2rsAeE22g6MpFiZdhoZWySpZeY=" + } +, + { + "pname": "Serilog.Sinks.File", + "version": "7.0.0", + "hash": "sha256-LxZYUoUPkCjIIVarJilnXnqQiMrFNJtoRilmzTNtUjo=" + } +, + { + "pname": "SkiaSharp", + "version": "2.88.9", + "hash": "sha256-jZ/4nVXYJtrz9SBf6sYc/s0FxS7ReIYM4kMkrhZS+24=" + } +, + { + "pname": "SkiaSharp.NativeAssets.Linux", + "version": "2.88.9", + "hash": "sha256-mQ/oBaqRR71WfS66mJCvcc3uKW7CNEHoPN2JilDbw/A=" + } +, + { + "pname": "SkiaSharp.NativeAssets.Linux.NoDependencies", + "version": "2.88.9", + "hash": "sha256-WjpcM78Q6kaW0eU5iqDR5+fGcF+06/tawWHsJRK57Es=" + } +, + { + "pname": "SkiaSharp.NativeAssets.macOS", + "version": "2.88.9", + "hash": "sha256-qvGuAmjXGjGKMzOPBvP9VWRVOICSGb7aNVejU0lLe/g=" + } +, + { + "pname": "SkiaSharp.NativeAssets.WebAssembly", + "version": "2.88.9", + "hash": "sha256-vgFL4Pdy3O1RKBp+T9N3W4nkH9yurZ0suo8u3gPmmhY=" + } +, + { + "pname": "SkiaSharp.NativeAssets.Win32", + "version": "2.88.9", + "hash": "sha256-kP5XM5GgwHGfNJfe4T2yO5NIZtiF71Ddp0pd1vG5V/4=" + } +, + { + "pname": "Tmds.DBus", + "version": "0.23.0", + "hash": "sha256-BwWQSqOOMS+Cf2fM8MIuiHey8QnGH4WvYjOn9haq5e0=" + } +, + { + "pname": "Tmds.DBus.Protocol", + "version": "0.21.2", + "hash": "sha256-gaK/5aAummyin6ptnhaJbnA0ih4+2xADrtrLfFbHwYI=" + } + +] diff --git a/pkgs/by-name/cr/crossmacro-daemon/package.nix b/pkgs/by-name/cr/crossmacro-daemon/package.nix new file mode 100644 index 000000000000..9e93a307206a --- /dev/null +++ b/pkgs/by-name/cr/crossmacro-daemon/package.nix @@ -0,0 +1,71 @@ +{ + lib, + stdenv, + buildDotnetModule, + dotnetCorePackages, + fetchFromGitHub, + nix-update-script, + autoPatchelfHook, + clang, + patchelf, + systemd, + zlib, +}: + +buildDotnetModule rec { + pname = "crossmacro-daemon"; + version = "0.9.6"; + + src = fetchFromGitHub { + owner = "alper-han"; + repo = "CrossMacro"; + tag = "v${version}"; + hash = "sha256-6Cc1mC34l+4dUPD1LAYxlXxzNF76l4HoOmbqTdTJVk0="; + }; + + projectFile = "src/CrossMacro.Daemon/CrossMacro.Daemon.csproj"; + nugetDeps = ./deps.json; + + dotnet-sdk = dotnetCorePackages.sdk_10_0; + dotnet-runtime = null; + + selfContainedBuild = true; + executables = [ "CrossMacro.Daemon" ]; + buildType = "Release"; + + nativeBuildInputs = [ + autoPatchelfHook + clang + patchelf + ]; + + buildInputs = [ + systemd + zlib + ]; + + dotnetFlags = [ "-p:Version=${version}" ]; + + postInstall = '' + install -Dm644 scripts/assets/org.crossmacro.policy \ + $out/share/polkit-1/actions/org.crossmacro.policy + + install -Dm644 scripts/assets/50-crossmacro.rules \ + $out/share/polkit-1/rules.d/50-crossmacro.rules + '' + + lib.optionalString stdenv.hostPlatform.isLinux '' + patchelf --add-needed libsystemd.so.0 $out/lib/crossmacro-daemon/CrossMacro.Daemon + ''; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "Privileged input daemon for CrossMacro"; + homepage = "https://github.com/alper-han/CrossMacro"; + changelog = "https://github.com/alper-han/CrossMacro/releases/tag/v${version}"; + license = lib.licenses.gpl3Plus; + platforms = lib.platforms.linux; + mainProgram = "CrossMacro.Daemon"; + maintainers = with lib.maintainers; [ alper-han ]; + }; +} From d5b6a136a624df674fd3f8af33a2319c86970ab6 Mon Sep 17 00:00:00 2001 From: alper-han <89567766+alper-han@users.noreply.github.com> Date: Mon, 9 Feb 2026 05:30:18 +0300 Subject: [PATCH 4/4] nixos/crossmacro: add module --- nixos/modules/module-list.nix | 1 + .../modules/services/desktops/crossmacro.nix | 119 ++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 nixos/modules/services/desktops/crossmacro.nix diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index dc8c2560c94a..028bac16985e 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -556,6 +556,7 @@ ./services/desktops/blueman.nix ./services/desktops/bonsaid.nix ./services/desktops/cpupower-gui.nix + ./services/desktops/crossmacro.nix ./services/desktops/dleyna.nix ./services/desktops/espanso.nix ./services/desktops/flatpak.nix diff --git a/nixos/modules/services/desktops/crossmacro.nix b/nixos/modules/services/desktops/crossmacro.nix new file mode 100644 index 000000000000..e00a06b5bc6b --- /dev/null +++ b/nixos/modules/services/desktops/crossmacro.nix @@ -0,0 +1,119 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + cfg = config.services.crossmacro; +in +{ + options.services.crossmacro = { + enable = lib.mkEnableOption "CrossMacro, a cross-platform mouse and keyboard macro application"; + + package = lib.mkPackageOption pkgs "crossmacro" { }; + + daemonPackage = lib.mkPackageOption pkgs "crossmacro-daemon" { }; + + users = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + example = [ + "alice" + "bob" + ]; + description = "List of users granted permission to use CrossMacro."; + }; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + { + assertion = cfg.users != [ ]; + message = "CrossMacro: You must specify at least one user. Set `services.crossmacro.users`."; + } + ]; + + environment.systemPackages = [ cfg.package ]; + + hardware.uinput.enable = true; + + services.udev.extraRules = '' + KERNEL=="uinput", GROUP="input", MODE="0660", OPTIONS+="static_node=uinput" + ACTION=="add|change", KERNEL=="event*", ATTRS{name}=="CrossMacro Virtual Input Device", ENV{LIBINPUT_ATTR_POINTER_ACCEL}="0" + ''; + + environment.etc."polkit-1/actions/org.crossmacro.policy".source = + "${cfg.daemonPackage}/share/polkit-1/actions/org.crossmacro.policy"; + + environment.etc."polkit-1/rules.d/50-crossmacro.rules".source = + "${cfg.daemonPackage}/share/polkit-1/rules.d/50-crossmacro.rules"; + + users.groups.crossmacro = { }; + + users.users = + lib.listToAttrs ( + map (user: { + name = user; + value = { + extraGroups = [ "crossmacro" ]; + }; + }) cfg.users + ) + // { + crossmacro = { + isSystemUser = true; + group = "input"; + extraGroups = [ + "crossmacro" + "uinput" + ]; + description = "CrossMacro Input Daemon User"; + }; + }; + + systemd.services.crossmacro = { + description = "CrossMacro Input Daemon Service"; + documentation = [ "https://github.com/alper-han/CrossMacro" ]; + + wantedBy = [ "multi-user.target" ]; + after = [ + "network.target" + "dbus.service" + "polkit.service" + ]; + wants = [ + "dbus.service" + "polkit.service" + ]; + + path = [ pkgs.polkit ]; + + serviceConfig = { + Type = "notify"; + User = "crossmacro"; + Group = "input"; + ExecStart = lib.getExe cfg.daemonPackage; + Restart = "always"; + RestartSec = 5; + RuntimeDirectory = "crossmacro"; + RuntimeDirectoryMode = "0755"; + CapabilityBoundingSet = [ + "CAP_SYS_ADMIN" + "CAP_SETUID" + "CAP_SETGID" + "CAP_CHOWN" + "CAP_DAC_READ_SEARCH" + ]; + AmbientCapabilities = [ + "CAP_SYS_ADMIN" + "CAP_CHOWN" + "CAP_DAC_READ_SEARCH" + ]; + }; + }; + }; + + meta.maintainers = with lib.maintainers; [ alper-han ]; +}