idiosyn/home/config/nil/desktop.nix

198 lines
5.3 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ ... }: { config, lib, pkgs, ... }@args:
let
osConfig = args.osConfig or { };
busctl = osConfig.systemd.package + /bin/busctl;
fish = lib.getExe osConfig.programs.fish.package;
fuzzel = lib.getExe config.programs.fuzzel.package;
kitty = lib.getExe config.programs.kitty.package;
loginctl = osConfig.systemd.package + /bin/loginctl;
playerctl = config.services.playerctld.package + /bin/playerctl;
swaylock = lib.getExe config.programs.swaylock.package;
wpctl = osConfig.services.pipewire.wireplumber.package + /bin/wpctl;
xdg-open = pkgs.xdg-utils + /bin/xdg-open;
busctl-gr = [ busctl "--user" "--" "call" "rs.wl-gammarelay" "/" "rs.wl.gammarelay" ];
niri-each-output = let
pkg = pkgs.writeShellApplication {
name = "niri-each-output";
runtimeInputs = [
config.programs.niri.package
pkgs.findutils
pkgs.jq
];
text = ''
niri msg --json outputs \
| jq --raw-output0 '. | keys | .[]' \
| xargs -0 I {} niri msg output -- {} "$1"
'';
};
in lib.getExe pkg;
in lib.mkIf (osConfig.hardware.graphics.enable or false) {
home.packages = with pkgs; [
calibre
fractal
inkscape
jellyfin-mpv-shim
keepassxc
libreoffice
obsidian
restic
signal-desktop
];
programs.fuzzel = {
enable = true;
settings = {
main = {
prompt = " ";
};
};
};
programs.niri.settings = {
prefer-no-csd = true;
input = {
keyboard = {
xkb = with config.home.keyboard; {
inherit layout;
options = options |> lib.concatStringsSep ",";
};
};
focus-follows-mouse.enable = true;
touchpad = {
dwt = true;
dwtp = true;
};
};
outputs = {
eDP-1 = {
scale = 1;
variable-refresh-rate = true;
};
DP-6 = {
mode = { width = 5120; height = 2160; };
scale = 1;
position = { x = 0; y = 0; };
variable-refresh-rate = true;
};
};
layout = {
border.enable = lib.mkForce false;
focus-ring = {
enable = true;
width = 1;
};
default-column-width.proportion = 1. / 3.;
gaps = 5;
preset-column-widths = [
{ proportion = 1. / 3.; }
{ proportion = 1. / 2.; }
{ proportion = 2. / 3.; }
];
};
binds = with config.lib.niri.actions; {
"Mod+Return".action = spawn [ kitty ];
"Mod+Shift+Return".action = spawn [ kitty fish "--private" ];
"Mod+e".action = spawn [ fuzzel ];
"Mod+Up".action = focus-window-or-workspace-up;
"Mod+Down".action = focus-window-or-workspace-down;
"Mod+Left".action = focus-column-left;
"Mod+Right".action = focus-column-right;
"Mod+Ctrl+Up".action = move-window-up-or-to-workspace-up;
"Mod+Ctrl+Down".action = move-window-up-or-to-workspace-up;
"Mod+Ctrl+Left".action = move-column-left;
"Mod+Ctrl+Right".action = move-column-right;
"Mod+WheelScrollUp".action = focus-window-up-or-column-left;
"Mod+WheelScrollDown".action = focus-window-down-or-column-right;
"Mod+g".action = consume-window-into-column;
"Mod+b".action = expel-window-from-column;
"Mod+Print".action = screenshot;
"Mod+Ctrl+Print".action = screenshot-window;
"Mod+Shift+Print".action = screenshot-screen;
XF86Explorer.action = spawn [ xdg-open "https:" ];
} // lib.mapAttrs (n: v: v // { allow-when-locked = true; }) {
XF86MonBrightnessUp.action = spawn (busctl-gr ++ [ "UpdateBrightness" "d" "0.05" ]);
XF86MonBrightnessDown.action = spawn (busctl-gr ++ [ "UpdateBrightness" "d" "-0.05" ]);
XF86AudioRaiseVolume.action = spawn [ wpctl "set-volume" "@DEFAULT_AUDIO_SINK@" "+2dB" ];
XF86AudioLowerVolume.action = spawn [ wpctl "set-volume" "@DEFAULT_AUDIO_SINK@" "-2dB" ];
XF86AudioMute.action = spawn [ wpctl "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle" ];
XF86AudioMicMute.action = spawn [ wpctl "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle" ];
XF86AudioNext.action = spawn [ playerctl "next" ];
XF86AudioPrev.action = spawn [ playerctl "previous" ];
XF86AudioPlay.action = spawn [ playerctl "play" ];
XF86AudioStop.action = spawn [ playerctl "pause" ];
};
environment = {
NIXOS_OZONE_WL = "1";
TERMINAL = kitty;
};
};
programs.swaylock = {
enable = true;
package = pkgs.swaylock-effects;
settings = {
screenshots = true;
effect-blur = "5x3";
grace = 2;
};
};
services.mako = {
enable = true;
defaultTimeout = 5000;
};
services.playerctld.enable = true;
services.swayidle = {
enable = true;
events = [
{ event = "lock"; command = "${swaylock} -f"; }
{ event = "before-sleep"; command = "${loginctl} lock-session"; }
];
timeouts = [
{
timeout = 240;
command = "${loginctl} lock-session";
}
{
timeout = 270;
command = "${niri-each-output} off";
resumeCommand = "${niri-each-output} on";
}
];
};
xdg.mimeApps.enable = true;
xdg.portal = {
enable = true;
configPackages = [ config.programs.niri.package ];
extraPortals = with pkgs; [
xdg-desktop-portal-gnome
xdg-desktop-portal-gtk
];
};
}