Files
Nixos/hosts/darwin/packages/paneru.nix
T
2026-02-15 19:31:16 +01:00

126 lines
3.9 KiB
Nix

{
self,
fetchFromGitHub,
nixpkgs,
}:
let
pkgs = import nixpkgs { system = "aarch64-darwin"; };
package = pkgs.rustPlatform.buildRustPackage {
pname = "paneru";
src = fetchFromGitHub {
owner = "karinushka";
repo = "paneru";
sha256 = "sha256-ZPnuAjieJM+C/ebNEr04ZN3Iw+J/mquHekJXXMNHelI=";
};
postPatch = ''
substituteInPlace build.rs --replace-fail \
'let sdk_dir = "/Library/Developer/CommandLineTools/SDKs";' \
'let sdk_dir = "${pkgs.apple-sdk}/Platforms/MacOSX.platform/Developer/SDKs";'
'';
cargoLock.lockFile = ./Cargo.lock;
buildInputs = [
pkgs.apple-sdk.privateFrameworksHook
];
};
in
{
packages.aarch64-darwin.default = self.packages.aarch64-darwin.paneru;
packages.aarch64-darwin.paneru = package;
homeModules.paneru =
{ config, lib, ... }:
let
cfg = config.services.paneru;
tomlFormat = pkgs.formats.toml { };
in
{
options.services.paneru = {
enable = lib.mkEnableOption ''
Install paneru and configure the launchd agent.
The first time this is enabled, macOS will prompt you to allow this background
item in System Settings.
You can verify the service is running correctly from your terminal.
Run: `launchctl list | grep paneru`
In case of failure, check the logs with `cat /tmp/paneru.err.log`.
'';
package = lib.mkOption {
type = lib.types.package;
default = package;
description = "The paneru package to use.";
};
settings = lib.mkOption {
type = lib.types.nullOr lib.types.attrs;
default = null;
description = "Configuration to put in `~/.paneru.toml`.";
example = {
options = {
focus_follows_mouse = true;
preset_column_widths = [
0.25
0.33
0.5
0.66
0.75
];
swipe_gesture_fingers = 4;
animation_speed = 4000;
};
bindings = {
window_focus_west = "cmd - h";
window_focus_east = "cmd - l";
window_focus_north = "cmd - k";
window_focus_south = "cmd - j";
window_swap_west = "alt - h";
window_swap_east = "alt - l";
window_swap_first = "alt + shift - h";
window_swap_last = "alt + shift - l";
window_center = "alt - c";
window_resize = "alt - r";
window_manage = "ctrl + alt - t";
window_stack = "alt - ]";
window_unstack = "alt + shift - ]";
quit = "ctrl + alt - q";
};
};
};
};
config = lib.mkIf cfg.enable {
assertions = [ (lib.hm.assertions.assertPlatform "services.paneru" pkgs lib.platforms.darwin) ];
launchd.agents.paneru = {
enable = true;
config = {
KeepAlive = {
Crashed = true;
SuccessfulExit = false;
};
Label = "Paneru";
Nice = -20;
ProcessType = "Interactive";
EnvironmentVariables = {
NO_COLOR = "1";
XDG_CONFIG_HOME =
if config.xdg.enable then config.xdg.configHome else "${config.home.homeDirectory}/.config";
};
RunAtLoad = true;
StandardOutPath = "/tmp/paneru.log";
StandardErrorPath = "/tmp/paneru.err.log";
Program = cfg.package + /bin/paneru;
};
};
xdg.configFile."paneru/paneru.toml" = lib.mkIf (config.xdg.enable && cfg.settings != null) {
source = tomlFormat.generate "paneru.toml" cfg.settings;
};
home.file.".paneru.toml" = lib.mkIf (!config.xdg.enable && cfg.settings != null) {
source = tomlFormat.generate ".paneru.toml" cfg.settings;
};
};
};
}