aboutsummaryrefslogtreecommitdiffstats
path: root/modules/desktop/niri
diff options
context:
space:
mode:
Diffstat (limited to 'modules/desktop/niri')
-rw-r--r--modules/desktop/niri/default.nix110
-rw-r--r--modules/desktop/niri/keybindings.nix120
2 files changed, 230 insertions, 0 deletions
diff --git a/modules/desktop/niri/default.nix b/modules/desktop/niri/default.nix
new file mode 100644
index 0000000..f1e0fa7
--- /dev/null
+++ b/modules/desktop/niri/default.nix
@@ -0,0 +1,110 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+{
+ imports = [ ./keybindings.nix ];
+
+ options.desktop.hardware.gpu = {
+ nvidia.enable = lib.mkEnableOption "Nvidia GPU Wayland optimizations";
+ amd.enable = lib.mkEnableOption "AMD GPU Wayland optimizations";
+ };
+
+ config = lib.mkIf config.desktop.enable {
+ home.sessionVariables = lib.mkMerge [
+ {
+ NIXOS_OZONE_WL = "1";
+ QT_QPA_PLATFORM = "wayland;xcb";
+ SDL_VIDEODRIVER = "wayland";
+ CLUTTER_BACKEND = "wayland";
+ GDK_SCALE = "1";
+ QT_SCALE_FACTOR = "1";
+ GTK_THEME = "Adwaita:dark";
+ }
+
+ (lib.mkIf config.desktop.hardware.gpu.nvidia.enable {
+ LIBVA_DRIVER_NAME = "nvidia";
+ __GLX_VENDOR_LIBRARY_NAME = "nvidia";
+ GBM_BACKEND = "nvidia-drm";
+ __GL_YIELD = "USLEEP";
+ __GL_VRR_ALLOWED = "0";
+ })
+
+ (lib.mkIf config.desktop.hardware.gpu.amd.enable {
+ AMD_VULKAN_ICD = "RADV";
+ MESA_VK_DEVICE_SELECT = "1002:";
+ })
+ ];
+
+ wayland.windowManager.niri = {
+ enable = true;
+ systemd.enable = true;
+ };
+
+ # Niri does not paint wallpapers itself, so start swaybg with the existing wallpaper.
+ home.packages = [ pkgs.swaybg ];
+
+ home.pointerCursor = {
+ enable = true;
+ package = pkgs.adwaita-icon-theme;
+ name = "Adwaita";
+ size = 20;
+ gtk.enable = true;
+ x11.enable = true;
+ };
+
+ wayland.windowManager.niri.extraConfigEarly = ''
+ input {
+ keyboard {
+ xkb {
+ layout "us"
+ }
+ }
+ touchpad {
+ natural-scroll
+ tap
+ dwt
+ click-method "clickfinger"
+ accel-speed 0.5
+ }
+ }
+
+ layout {
+ gaps 5
+ center-focused-column "on-overflow"
+ default-column-width { proportion 1.0; }
+ preset-column-widths {
+ proportion 0.5
+ proportion 1.0
+ }
+ focus-ring {
+ width 1
+ active-color "${config.scheme.withHashtag.base07}"
+ inactive-color "${config.scheme.withHashtag.base03}"
+ }
+ border { off; }
+ shadow { off; }
+ }
+
+ prefer-no-csd
+ screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
+ animations { off; }
+
+ spawn-at-startup "${lib.getExe pkgs.swaybg}" "-i" "${../../../assets/sapling.png}" "-m" "fill"
+
+ // Keep the familiar numbered workspaces persistent; Niri otherwise uses dynamic workspaces.
+ workspace "1"
+ workspace "2"
+ workspace "3"
+ workspace "4"
+ workspace "5"
+ workspace "6"
+ workspace "7"
+ workspace "8"
+ workspace "9"
+ workspace "10"
+ '';
+ };
+}
diff --git a/modules/desktop/niri/keybindings.nix b/modules/desktop/niri/keybindings.nix
new file mode 100644
index 0000000..5fd07fe
--- /dev/null
+++ b/modules/desktop/niri/keybindings.nix
@@ -0,0 +1,120 @@
+{
+ config,
+ lib,
+ ...
+}:
+let
+ workspaceBinds =
+ lib.concatMapStringsSep "\n"
+ (
+ { key, workspace }:
+ ''
+ Mod+${key} { focus-workspace "${workspace}"; }
+ Mod+Shift+${key} { move-column-to-workspace "${workspace}"; }''
+ )
+ [
+ {
+ key = "1";
+ workspace = "1";
+ }
+ {
+ key = "2";
+ workspace = "2";
+ }
+ {
+ key = "3";
+ workspace = "3";
+ }
+ {
+ key = "4";
+ workspace = "4";
+ }
+ {
+ key = "5";
+ workspace = "5";
+ }
+ {
+ key = "6";
+ workspace = "6";
+ }
+ {
+ key = "7";
+ workspace = "7";
+ }
+ {
+ key = "8";
+ workspace = "8";
+ }
+ {
+ key = "9";
+ workspace = "9";
+ }
+ {
+ key = "0";
+ workspace = "10";
+ }
+ ];
+in
+{
+ config.wayland.windowManager.niri.extraConfig = ''
+ binds {
+ // Niri defaults retained alongside the established launch and close bindings.
+ Mod+Shift+Slash { show-hotkey-overlay; }
+ Mod+O repeat=false { toggle-overview; }
+ Mod+Q repeat=false { close-window; }
+ Mod+Shift+Q repeat=false { close-window; }
+
+ ${lib.optionalString config.desktop.enable ''Mod+R hotkey-overlay-title="Run an Application: rofi" { spawn "${lib.getExe config.desktop.rofi.package}" "-show" "drun"; }''}
+ ${lib.optionalString config.terminal.kitty.enable ''
+ Mod+Return hotkey-overlay-title="Open a Terminal: kitty" { spawn "${lib.getExe config.terminal.kitty.package}"; }
+ Mod+T { spawn "${lib.getExe config.terminal.kitty.package}"; }''}
+ ${lib.optionalString (config.terminal.kitty.enable && config.file-management.yazi.enable)
+ ''Mod+F { spawn "${lib.getExe config.terminal.kitty.package}" "--class" "yazi" "--title" "Yazi" "-e" "${lib.getExe config.file-management.yazi.package}"; }''
+ }
+
+ // Niri's column/window-aware directional navigation.
+ Mod+H { focus-column-left; }
+ Mod+J { focus-window-down; }
+ Mod+K { focus-window-up; }
+ Mod+L { focus-column-right; }
+ Mod+Ctrl+H { move-column-left; }
+ Mod+Ctrl+J { move-window-down; }
+ Mod+Ctrl+K { move-window-up; }
+ Mod+Ctrl+L { move-column-right; }
+
+ // Preserve the old Shift movement muscle memory as aliases.
+ Mod+Shift+H { move-column-left; }
+ Mod+Shift+J { move-window-down; }
+ Mod+Shift+K { move-window-up; }
+ Mod+Shift+L { move-column-right; }
+
+ Mod+D { toggle-window-floating; }
+ Mod+V { toggle-window-floating; }
+ Mod+M { fullscreen-window; }
+ Mod+Equal { set-column-width "+10%"; }
+ Mod+Minus { set-column-width "-10%"; }
+ Mod+U { focus-workspace-down; }
+ Mod+I { focus-workspace-up; }
+ Mod+Ctrl+U { move-column-to-workspace-down; }
+ Mod+Ctrl+I { move-column-to-workspace-up; }
+ Mod+W { toggle-column-tabbed-display; }
+
+ ${workspaceBinds}
+
+ ${lib.optionalString config.system.brightnessctl.enable ''
+ XF86MonBrightnessDown allow-when-locked=true { spawn "${lib.getExe config.system.brightnessctl.package}" "set" "5%-"; }
+ XF86MonBrightnessUp allow-when-locked=true { spawn "${lib.getExe config.system.brightnessctl.package}" "set" "+5%"; }''}
+ ${lib.optionalString config.media.pamixer.enable ''
+ XF86AudioLowerVolume allow-when-locked=true { spawn "${lib.getExe config.media.pamixer.package}" "--decrease" "5"; }
+ XF86AudioRaiseVolume allow-when-locked=true { spawn "${lib.getExe config.media.pamixer.package}" "--increase" "5"; }
+ XF86AudioMute allow-when-locked=true { spawn "${lib.getExe config.media.pamixer.package}" "--toggle-mute"; }''}
+ ${lib.optionalString config.media.playerctl.enable ''XF86AudioPlay allow-when-locked=true { spawn "${lib.getExe config.media.playerctl.package}" "play-pause"; }''}
+
+ ${lib.optionalString (config.media.grim.enable && config.media.slurp.enable)
+ ''
+ Mod+P { spawn-sh "${lib.getExe config.media.grim.package} -g \"$(${lib.getExe config.media.slurp.package})\" - | ${lib.getExe' config.desktop.wl-clipboard.package "wl-copy"}"; }
+ Mod+Shift+P { spawn-sh "mkdir -p \"$HOME/Pictures/Screenshots\" && ${lib.getExe config.media.grim.package} -g \"$(${lib.getExe config.media.slurp.package})\" \"$HOME/Pictures/Screenshots/screenshot-$(date +%Y%m%d-%H%M%S).png\""; }''
+ }
+ }
+ '';
+}