Files
nixos-config/modules/features/niri.nix

645 lines
23 KiB
Nix
Raw Normal View History

2026-04-04 16:46:30 -04:00
{
inputs,
...
}:
{
flake.modules.nixos.niri =
{ pkgs, ... }:
{
imports = [
inputs.niri.nixosModules.niri
];
nixpkgs.overlays = [ inputs.niri.overlays.niri ];
programs = {
niri = {
enable = true;
package = pkgs.niri-unstable;
};
uwsm = {
waylandCompositors.niri = {
prettyName = "Niri";
binPath = "/run/current-system/sw/bin/niri-session";
};
};
};
environment.systemPackages = [ pkgs.xwayland-satellite-unstable ];
};
flake.modules.homeManager.niri =
{
pkgs,
lib,
config,
...
}:
let
# Executables
foot = lib.getExe' config.programs.foot.package "foot";
vicinae = lib.getExe' config.programs.vicinae.package "vicinae";
yazi = lib.getExe' config.programs.yazi.package "yazi";
noctalia-shell = lib.getExe' config.programs.noctalia-shell.package "noctalia-shell";
playerctl = lib.getExe' pkgs.playerctl "playerctl";
wpctl = lib.getExe' pkgs.wireplumber "wpctl";
brightnessctl = lib.getExe' pkgs.brightnessctl "brightnessctl";
in
{
2026-04-04 17:56:31 -04:00
home.packages = [
pkgs.nautilus
];
xdg.portal = {
enable = true;
configPackages = [ pkgs.gnome-session ];
extraPortals = with pkgs; [
xdg-desktop-portal-gnome
xdg-desktop-portal-gtk
];
};
2026-04-11 14:20:23 -04:00
xdg.configFile."niri/config.kdl".text = ''
input {
keyboard {
xkb {
layout "us"
model ""
rules ""
variant ""
options "compose:ralt"
}
repeat-delay 400
repeat-rate 35
track-layout "global"
}
touchpad {
tap
dwt
drag true
drag-lock
scroll-method "two-finger"
click-method "clickfinger"
tap-button-map "left-right-middle"
}
warp-mouse-to-focus mode="center-xy-always"
focus-follows-mouse
mod-key "Super"
}
screenshot-path "${config.xdg.userDirs.extraConfig.SCREENSHOTS}/%Y%m%d-%H%M%S.png"
prefer-no-csd
layout {
gaps 16
struts {
left 0
right 0
top 0
bottom 0
}
focus-ring { width 4; }
border { off; }
default-column-width
center-focused-column "never"
}
cursor {
xcursor-theme "${config.home.pointerCursor.name}"
xcursor-size ${toString config.home.pointerCursor.size}
hide-when-typing
}
hotkey-overlay { skip-at-startup; }
environment { "NIXOS_OZONE_WL" "1"; }
binds {
Alt+XF86AudioLowerVolume allow-when-locked=true hotkey-overlay-title="Lower microphone volume" { spawn "${wpctl}" "set-volume" "@DEFAULT_AUDIO_SOURCE@" "0.05-"; }
Alt+XF86AudioMute allow-when-locked=true hotkey-overlay-title="Mute microphone" repeat=false { spawn "${wpctl}" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
Alt+XF86AudioRaiseVolume allow-when-locked=true hotkey-overlay-title="Raise microphone volume" { spawn "${wpctl}" "set-volume" "@DEFAULT_AUDIO_SOURCE@" "0.05+"; }
Mod+A hotkey-overlay-title="Launcher" repeat=false { spawn "${vicinae}" "toggle"; }
Mod+BracketLeft hotkey-overlay-title="Move window left" repeat=false { consume-or-expel-window-left; }
Mod+BracketRight hotkey-overlay-title="Move window right" repeat=false { consume-or-expel-window-right; }
Mod+Ctrl+0 hotkey-overlay-title="Reset display scale" { spawn "output-scale" "1.0"; }
Mod+Ctrl+Equal hotkey-overlay-title="Increase display scale" { spawn "output-scale" "+0.1"; }
Mod+Ctrl+F hotkey-overlay-title="Fill empty column space" repeat=false { expand-column-to-available-width; }
Mod+Ctrl+J hotkey-overlay-title="Focus workspace down" repeat=false { focus-workspace-down; }
Mod+Ctrl+K hotkey-overlay-title="Focus workspace up" repeat=false { focus-workspace-up; }
Mod+Ctrl+Minus hotkey-overlay-title="Decrease display scale" { spawn "output-scale" "-0.1"; }
Mod+Ctrl+N hotkey-overlay-title="Clear notifications" repeat=false { spawn "${noctalia-shell}" "ipc" "call" "notifications" "clear"; }
Mod+Ctrl+Shift+J hotkey-overlay-title="Move column to workspace down" repeat=false { move-column-to-workspace-down; }
Mod+Ctrl+Shift+K hotkey-overlay-title="Move column to workspace up" repeat=false { move-column-to-workspace-up; }
Mod+E hotkey-overlay-title="File Explorer" repeat=false { spawn "${foot}" "-e" "${yazi}"; }
Mod+Equal hotkey-overlay-title="Increase column width" { set-column-width "+10%"; }
Mod+Escape hotkey-overlay-title="Session menu" repeat=false { spawn "${noctalia-shell}" "ipc" "call" "sessionMenu" "toggle"; }
Mod+F hotkey-overlay-title="Maximize Column" repeat=false { maximize-column; }
Mod+H hotkey-overlay-title="Focus window left" repeat=false { focus-column-or-monitor-left; }
Mod+J hotkey-overlay-title="Focus window down" repeat=false { focus-window-or-monitor-down; }
Mod+K hotkey-overlay-title="Focus window up" repeat=false { focus-window-or-monitor-up; }
Mod+L hotkey-overlay-title="Focus window right" repeat=false { focus-column-or-monitor-right; }
Mod+Minus hotkey-overlay-title="Decrease column width" { set-column-width "-10%"; }
Mod+N hotkey-overlay-title="Show notifications" repeat=false { spawn "${noctalia-shell}" "ipc" "call" "notifications" "toggleHistory"; }
Mod+Print hotkey-overlay-title="Screenshot window" repeat=false { screenshot-window; }
Mod+Q hotkey-overlay-title="Close window" repeat=false { close-window; }
Mod+Shift+Equal hotkey-overlay-title="Increase window height" { set-window-height "+10%"; }
Mod+Shift+F hotkey-overlay-title="Fullscreen" repeat=false { fullscreen-window; }
Mod+Shift+H hotkey-overlay-title="Move column left" repeat=false { move-column-left-or-to-monitor-left; }
Mod+Shift+J hotkey-overlay-title="Move column down" repeat=false { move-column-to-monitor-down; }
Mod+Shift+K hotkey-overlay-title="Move column up" repeat=false { move-column-to-monitor-up; }
Mod+Shift+L hotkey-overlay-title="Move column right" repeat=false { move-column-right-or-to-monitor-right; }
Mod+Shift+Minus hotkey-overlay-title="Decrease window height" { set-window-height "-10%"; }
Mod+Slash hotkey-overlay-title="Show hotkeys" repeat=false { show-hotkey-overlay; }
Mod+T hotkey-overlay-title="Toggle tabbed column" repeat=false { toggle-column-tabbed-display; }
Mod+Tab hotkey-overlay-title="Toggle overview" repeat=false { toggle-overview; }
Mod+W hotkey-overlay-title="Terminal" repeat=false { spawn "${foot}"; }
Mod+Z hotkey-overlay-title="Toggle floating" repeat=false { toggle-window-floating; }
Print hotkey-overlay-title="Screenshot" repeat=false { screenshot show-pointer=false; }
Shift+Print hotkey-overlay-title="Screenshot screen" repeat=false { screenshot-screen show-pointer=false; }
XF86AudioLowerVolume allow-when-locked=true hotkey-overlay-title="Lower volume" { spawn "${wpctl}" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.05-"; }
XF86AudioMute allow-when-locked=true hotkey-overlay-title="Mute playback" repeat=false { spawn "${wpctl}" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
XF86AudioNext hotkey-overlay-title="Next track" repeat=false { spawn "${playerctl}" "next"; }
XF86AudioPlay hotkey-overlay-title="Play / pause track" repeat=false { spawn "${playerctl}" "play-pause"; }
XF86AudioPrev hotkey-overlay-title="Previous track" repeat=false { spawn "${playerctl}" "previous"; }
XF86AudioRaiseVolume allow-when-locked=true hotkey-overlay-title="Raise volume" { spawn "${wpctl}" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.05+"; }
XF86MonBrightnessDown allow-when-locked=true hotkey-overlay-title="Decrease brightness" { spawn "${brightnessctl}" "set" "5%-"; }
XF86MonBrightnessUp allow-when-locked=true hotkey-overlay-title="Increase brightness" { spawn "${brightnessctl}" "set" "5%+"; }
}
spawn-at-startup "noctalia-shell"
blur {
passes 2
offset 4.0
}
window-rule {
geometry-corner-radius 10.000000 10.000000 10.000000 10.000000
clip-to-geometry true
}
window-rule {
match app-id="foot"
match app-id="Alacritty"
default-column-width { proportion 0.400000; }
opacity 0.870000
background-effect {
blur true
}
}
layer-rule {
match namespace="^noctalia-overview*"
place-within-backdrop true
}
gestures { hot-corners { off; }; }
xwayland-satellite { path "${lib.getExe pkgs.xwayland-satellite-unstable}"; }
'';
# settings = {
# input = {
# keyboard = {
# xkb = {
# layout = "us";
# options = "compose:ralt";
# };
# };
# touchpad = {
# enable = true;
# click-method = "clickfinger";
# drag = true;
# drag-lock = true;
# dwt = true;
# natural-scroll = false;
# scroll-method = "two-finger";
# tap = true;
# tap-button-map = "left-right-middle"; # Mouse button click to register when tapping with 1, 2, or 3 fingers
# };
# warp-mouse-to-focus = {
# enable = true;
# mode = "center-xy-always";
# };
# focus-follows-mouse = {
# enable = true;
# };
# mod-key = "Super";
# };
# binds = {
# # General
# "Mod+Slash" = {
# action.show-hotkey-overlay = { };
# repeat = false;
# hotkey-overlay.title = "Show hotkeys";
# };
# "Mod+Q" = {
# action.close-window = { };
# repeat = false;
# hotkey-overlay.title = "Close window";
# };
# "Mod+W" = {
# action.spawn = foot;
# repeat = false;
# hotkey-overlay.title = "Terminal";
# };
# "Mod+A" = {
# action.spawn = [
# vicinae
# "toggle"
# ];
# repeat = false;
# hotkey-overlay.title = "Launcher";
# };
# "Mod+E" = {
# action.spawn = [
# foot
# "-e"
# yazi
# ];
# repeat = false;
# hotkey-overlay.title = "File Explorer";
# };
# "Mod+Escape" = {
# action.spawn = [
# noctalia-shell
# "ipc"
# "call"
# "sessionMenu"
# "toggle"
# ];
# repeat = false;
# hotkey-overlay.title = "Session menu";
# };
2026-04-04 16:46:30 -04:00
2026-04-11 14:20:23 -04:00
# # Notifications
# "Mod+N" = {
# action.spawn = [
# noctalia-shell
# "ipc"
# "call"
# "notifications"
# "toggleHistory"
# ];
# repeat = false;
# hotkey-overlay.title = "Show notifications";
# };
# "Mod+Ctrl+N" = {
# action.spawn = [
# noctalia-shell
# "ipc"
# "call"
# "notifications"
# "clear"
# ];
# repeat = false;
# hotkey-overlay.title = "Clear notifications";
# };
2026-04-04 16:46:30 -04:00
2026-04-11 14:20:23 -04:00
# # Media keys
# "XF86AudioPrev" = {
# action.spawn = [
# playerctl
# "previous"
# ];
# repeat = false;
# hotkey-overlay.title = "Previous track";
# };
# "XF86AudioPlay" = {
# action.spawn = [
# playerctl
# "play-pause"
# ];
# repeat = false;
# hotkey-overlay.title = "Play / pause track";
# };
# "XF86AudioNext" = {
# action.spawn = [
# playerctl
# "next"
# ];
# repeat = false;
# hotkey-overlay.title = "Next track";
# };
# "XF86AudioRaiseVolume" = {
# action.spawn = [
# wpctl
# "set-volume"
# "@DEFAULT_AUDIO_SINK@"
# "0.05+"
# ];
# repeat = true;
# allow-when-locked = true;
# hotkey-overlay.title = "Raise volume";
# };
# "XF86AudioLowerVolume" = {
# action.spawn = [
# wpctl
# "set-volume"
# "@DEFAULT_AUDIO_SINK@"
# "0.05-"
# ];
# repeat = true;
# allow-when-locked = true;
# hotkey-overlay.title = "Lower volume";
# };
# "XF86AudioMute" = {
# action.spawn = [
# wpctl
# "set-mute"
# "@DEFAULT_AUDIO_SINK@"
# "toggle"
# ];
# repeat = false;
# allow-when-locked = true;
# hotkey-overlay.title = "Mute playback";
# };
# "Alt+XF86AudioRaiseVolume" = {
# action.spawn = [
# wpctl
# "set-volume"
# "@DEFAULT_AUDIO_SOURCE@"
# "0.05+"
# ];
# repeat = true;
# allow-when-locked = true;
# hotkey-overlay.title = "Raise microphone volume";
# };
# "Alt+XF86AudioLowerVolume" = {
# action.spawn = [
# wpctl
# "set-volume"
# "@DEFAULT_AUDIO_SOURCE@"
# "0.05-"
# ];
# repeat = true;
# allow-when-locked = true;
# hotkey-overlay.title = "Lower microphone volume";
# };
# "Alt+XF86AudioMute" = {
# action.spawn = [
# wpctl
# "set-mute"
# "@DEFAULT_AUDIO_SOURCE@"
# "toggle"
# ];
# repeat = false;
# allow-when-locked = true;
# hotkey-overlay.title = "Mute microphone";
# };
2026-04-04 16:46:30 -04:00
2026-04-11 14:20:23 -04:00
# # Brightness
# "XF86MonBrightnessUp" = {
# action.spawn = [
# brightnessctl
# "set"
# "5%+"
# ];
# repeat = true;
# allow-when-locked = true;
# hotkey-overlay.title = "Increase brightness";
# };
# "XF86MonBrightnessDown" = {
# action.spawn = [
# brightnessctl
# "set"
# "5%-"
# ];
# repeat = true;
# allow-when-locked = true;
# hotkey-overlay.title = "Decrease brightness";
# };
2026-04-04 16:46:30 -04:00
2026-04-11 14:20:23 -04:00
# # Screen capture
# "Print" = {
# action.screenshot = {
# show-pointer = false;
# };
# repeat = false;
# hotkey-overlay.title = "Screenshot";
# };
# "Mod+Print" = {
# action.screenshot-window = {
# # show-pointer = false;
# };
# repeat = false;
# hotkey-overlay.title = "Screenshot window";
# };
# "Shift+Print" = {
# action.screenshot-screen = {
# show-pointer = false;
# };
# repeat = false;
# hotkey-overlay.title = "Screenshot screen";
# };
2026-04-04 16:46:30 -04:00
2026-04-11 14:20:23 -04:00
# # Display scaling
# "Mod+Ctrl+Equal" = {
# action.spawn = [
# "output-scale"
# "+0.1"
# ];
# repeat = true;
# hotkey-overlay.title = "Increase display scale";
# };
# "Mod+Ctrl+Minus" = {
# action.spawn = [
# "output-scale"
# "-0.1"
# ];
# repeat = true;
# hotkey-overlay.title = "Decrease display scale";
# };
# "Mod+Ctrl+0" = {
# action.spawn = [
# "output-scale"
# "1.0"
# ];
# repeat = true;
# hotkey-overlay.title = "Reset display scale";
# };
2026-04-04 16:46:30 -04:00
2026-04-11 14:20:23 -04:00
# # Window and column size
# "Mod+F" = {
# action.maximize-column = { };
# repeat = false;
# hotkey-overlay.title = "Maximize Column";
# };
# "Mod+Shift+F" = {
# action.fullscreen-window = { };
# repeat = false;
# hotkey-overlay.title = "Fullscreen";
# };
# "Mod+Ctrl+F" = {
# action.expand-column-to-available-width = { };
# repeat = false;
# hotkey-overlay.title = "Fill empty column space";
# };
# "Mod+Equal" = {
# action.set-column-width = "+10%";
# repeat = true;
# hotkey-overlay.title = "Increase column width";
# };
# "Mod+Minus" = {
# action.set-column-width = "-10%";
# repeat = true;
# hotkey-overlay.title = "Decrease column width";
# };
# "Mod+Shift+Equal" = {
# action.set-window-height = "+10%";
# repeat = true;
# hotkey-overlay.title = "Increase window height";
# };
# "Mod+Shift+Minus" = {
# action.set-window-height = "-10%";
# repeat = true;
# hotkey-overlay.title = "Decrease window height";
# };
# "Mod+Z" = {
# action.toggle-window-floating = { };
# repeat = false;
# hotkey-overlay.title = "Toggle floating";
# };
# "Mod+T" = {
# action.toggle-column-tabbed-display = { };
# repeat = false;
# hotkey-overlay.title = "Toggle tabbed column";
# };
2026-04-04 16:46:30 -04:00
2026-04-11 14:20:23 -04:00
# # Window and column movement
# "Mod+K" = {
# action.focus-window-or-monitor-up = { };
# repeat = false;
# hotkey-overlay.title = "Focus window up";
# };
# "Mod+J" = {
# action.focus-window-or-monitor-down = { };
# repeat = false;
# hotkey-overlay.title = "Focus window down";
# };
# "Mod+H" = {
# action.focus-column-or-monitor-left = { };
# repeat = false;
# hotkey-overlay.title = "Focus window left";
# };
# "Mod+L" = {
# action.focus-column-or-monitor-right = { };
# repeat = false;
# hotkey-overlay.title = "Focus window right";
# };
# "Mod+BracketLeft" = {
# action.consume-or-expel-window-left = { };
# repeat = false;
# hotkey-overlay.title = "Move window left";
# };
# "Mod+BracketRight" = {
# action.consume-or-expel-window-right = { };
# repeat = false;
# hotkey-overlay.title = "Move window right";
# };
# "Mod+Shift+K" = {
# action.move-column-to-monitor-up = { };
# repeat = false;
# hotkey-overlay.title = "Move column up";
# };
# "Mod+Shift+J" = {
# action.move-column-to-monitor-down = { };
# repeat = false;
# hotkey-overlay.title = "Move column down";
# };
# "Mod+Shift+H" = {
# action.move-column-left-or-to-monitor-left = { };
# repeat = false;
# hotkey-overlay.title = "Move column left";
# };
# "Mod+Shift+L" = {
# action.move-column-right-or-to-monitor-right = { };
# repeat = false;
# hotkey-overlay.title = "Move column right";
# };
2026-04-04 16:46:30 -04:00
2026-04-11 14:20:23 -04:00
# # Workspaces
# "Mod+Ctrl+K" = {
# action.focus-workspace-up = { };
# repeat = false;
# hotkey-overlay.title = "Focus workspace up";
# };
# "Mod+Ctrl+J" = {
# action.focus-workspace-down = { };
# repeat = false;
# hotkey-overlay.title = "Focus workspace down";
# };
# "Mod+Ctrl+Shift+K" = {
# action.move-column-to-workspace-up = { };
# repeat = false;
# hotkey-overlay.title = "Move column to workspace up";
# };
# "Mod+Ctrl+Shift+J" = {
# action.move-column-to-workspace-down = { };
# repeat = false;
# hotkey-overlay.title = "Move column to workspace down";
# };
2026-04-04 16:46:30 -04:00
2026-04-11 14:20:23 -04:00
# # Overview
# "Mod+Tab" = {
# action.toggle-overview = { };
# repeat = false;
# hotkey-overlay.title = "Toggle overview";
# };
# };
# window-rules = [
# {
# geometry-corner-radius = {
# bottom-left = 10.0;
# bottom-right = 10.0;
# top-left = 10.0;
# top-right = 10.0;
# };
# clip-to-geometry = true;
# }
# # Unfortunately windows like firefox extensions set their titles after spawning preventing
# # the window rules from being applied. There is a script to fix this but it is pretty hacky.
# # {
# # matches = [
# # {
# # title = "^Extension:.*";
# # app-id = "firefox";
# # }
# # ];
# # open-floating = true;
# # }
# {
# matches = [
# { app-id = "foot"; }
# { app-id = "Alacritty"; }
# ];
# opacity = 0.90;
# default-column-width.proportion = 0.4;
# }
# ];
# layer-rules = [
# {
# # Use noctalia wallpaper as overview backdrop
# matches = [ { namespace = "^noctalia-overview*"; } ];
# place-within-backdrop = true;
# }
# ];
# prefer-no-csd = true;
# screenshot-path = "${config.xdg.userDirs.extraConfig.SCREENSHOTS}/%Y%m%d-%H%M%S.png";
# hotkey-overlay = {
# skip-at-startup = true;
# };
# spawn-at-startup = [
# { argv = [ "noctalia-shell" ]; }
# ];
# cursor = {
# size = config.home.pointerCursor.size;
# theme = config.home.pointerCursor.name;
# hide-when-typing = true;
# };
# gestures = {
# hot-corners.enable = false;
# };
# xwayland-satellite = {
# enable = true;
# path = lib.getExe pkgs.xwayland-satellite-unstable;
# };
# environment = {
# "NIXOS_OZONE_WL" = "1";
# };
# debug = {
# # Allows notification actions and window activation from Noctalia.
# honor-xdg-activation-with-invalid-serial = { };
# };
# # Support for external 'includes' sounds like it is in the works.
# # Will just have to wait until then for noctalia color scheme integration.
# };
2026-04-04 16:46:30 -04:00
};
}