feature(niri): Init module

This commit is contained in:
DashieTM 2025-10-05 13:24:30 +02:00
parent 9be8a82a29
commit 1857504bac
13 changed files with 1446 additions and 254 deletions

449
lib/wm.nix Normal file
View file

@ -0,0 +1,449 @@
{lib, ...}: let
browserName = config:
if (builtins.isString config.mods.homePackages.browser)
then config.mods.homePackages.browser
else if config.mods.homePackages.browser ? meta && config.mods.homePackages.browser.meta ? mainProgram
then config.mods.homePackages.browser.meta.mainProgram
else config.mods.homePackages.browser.pname;
mkSimpleBind = modKeys: key: command: args: {
inherit modKeys key command args;
};
mkRepeatSimpleBind = modKeys: key: command: args: {
inherit modKeys key command args;
meta.hyprland.repeat = true;
};
mkSimpleCustomBind = modKeys: key: niri: hyprland: args: {
inherit modKeys key args;
command = {
inherit niri hyprland;
};
};
mkRepeatCustomBind = modKeys: key: niri: hyprland: args: {
inherit modKeys key args;
command = {
inherit niri hyprland;
};
meta.hyprland.repeat = true;
};
mkBindWithDesc = modKeys: key: command: args: desc:
{
meta.niri.desc = desc;
}
// mkSimpleBind modKeys key command args;
in {
defaultWindowRules = {
niri = [
''
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
match app-id=r#"^org\.gnome\.World\.Secrets$"#
block-out-from "screen-capture"
''
''
match app-id=r#"^steam$"#
open-on-workspace "0"
''
''
geometry-corner-radius 12
clip-to-geometry true
''
];
hyprland = [
# window rules
"float,class:^(.*)(OxiCalc)(.*)$"
"float,class:^(.*)(winecfg.exe)(.*)$"
"float,class:^(.*)(copyq)(.*)$"
"center,class:^(.*)(swappy)(.*)$"
"workspace 10 silent,class:^(.*)(steam)(.*)$"
# Otherwise neovide will ignore tiling
"suppressevent fullscreen maximize,class:^(.*)(neovide)(.*)$"
];
};
defaultStartup = config: {
all = [
"systemctl --user import-environment"
"dbus-update-activation-environment --systemd --all"
"hyprctl setcursor ${config.mods.stylix.cursor.name} ${toString config.mods.stylix.cursor.size}"
# ensures the systemd service knows what "hyprctl" is :)
(
if config.mods.gaming.gamemode
then "systemctl try-restart gamemoded.service --user"
else ""
)
# other programs
"${browserName config}"
(
if config.mods.oxi.hyprdock.enable
then "hyprdock --server"
else ""
)
(
if config.mods.hypr.hyprpaper.enable
then "hyprpaper"
else ""
)
(
if config.mods.hypr.hyprland.useIronbar
then "ironbar"
else ""
)
(
if config.mods.oxi.oxipaste.enable
then "oxipaste_daemon"
else ""
)
(
if config.mods.oxi.oxinoti.enable
then "oxinoti"
else ""
)
];
niri = [
"XDG_CURRENT_DESKTOP=Niri"
"XDG_SESSION_DESKTOP=Niri"
"XDG_SESSION_TYPE=wayland"
];
hyprland = [
"XDG_CURRENT_DESKTOP=Hyprland"
"XDG_SESSION_DESKTOP=Hyprland"
"XDG_SESSION_TYPE=wayland"
];
};
defaultEnv = config: {
all = {
GTK_CSD = "0";
TERM = "kitty /bin/fish";
HYPRCURSOR_THEME = config.mods.stylix.cursor.name;
HYPRCURSOR_SIZE = toString config.mods.stylix.cursor.size;
XCURSOR_THEME = config.mods.stylix.cursor.name;
XCURSOR_SIZE = toString config.mods.stylix.cursor.size;
QT_QPA_PLATFORM = "wayland";
QT_QPA_PLATFORMTHEME = "qt5ct";
QT_WAYLAND_FORCE_DPI = "96";
QT_AUTO_SCREEN_SCALE_FACTOR = "0";
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
QT_SCALE_FACTOR = "1";
EDITOR = "neovide --novsync --nofork";
LIBVA_DRIVER_NAME =
if config.mods.gpu.nvidia.enable
then "nvidia"
else "";
GBM_BACKEND =
if config.mods.gpu.nvidia.enable
then "nvidia-drm"
else "";
__GLX_VENDOR_LIBRARY_NAME =
if config.mods.gpu.nvidia.enable
then "nvidia"
else "";
};
niri = {};
hyprland = {};
};
defaultBinds = config: [
(mkSimpleBind ["Mod"] "1" "focusWorkspace" ["1"])
(mkSimpleBind ["Mod"] "2" "focusWorkspace" ["2"])
(mkSimpleBind ["Mod"] "3" "focusWorkspace" ["3"])
(mkSimpleBind ["Mod"] "4" "focusWorkspace" ["4"])
(mkSimpleBind ["Mod"] "5" "focusWorkspace" ["5"])
(mkSimpleBind ["Mod"] "6" "focusWorkspace" ["6"])
(mkSimpleBind ["Mod"] "7" "focusWorkspace" ["7"])
(mkSimpleBind ["Mod"] "8" "focusWorkspace" ["8"])
(mkSimpleBind ["Mod"] "9" "focusWorkspace" ["9"])
(mkSimpleBind ["Mod"] "0" "focusWorkspace" ["0"])
(mkSimpleBind ["Mod" "Shift"] "1" "moveToWorkspace" ["1"])
(mkSimpleBind ["Mod" "Shift"] "2" "moveToWorkspace" ["2"])
(mkSimpleBind ["Mod" "Shift"] "3" "moveToWorkspace" ["3"])
(mkSimpleBind ["Mod" "Shift"] "4" "moveToWorkspace" ["4"])
(mkSimpleBind ["Mod" "Shift"] "5" "moveToWorkspace" ["5"])
(mkSimpleBind ["Mod" "Shift"] "6" "moveToWorkspace" ["6"])
(mkSimpleBind ["Mod" "Shift"] "7" "moveToWorkspace" ["7"])
(mkSimpleBind ["Mod" "Shift"] "8" "moveToWorkspace" ["8"])
(mkSimpleBind ["Mod" "Shift"] "9" "moveToWorkspace" ["9"])
(mkSimpleBind ["Mod" "Shift"] "0" "moveToWorkspace" ["0"])
(mkSimpleBind ["Mod"] "B" "toggleFullscreen" [])
(mkSimpleBind ["Mod"] "V" "toggleFloating" [])
(mkSimpleBind ["Mod" "Shift"] "M" "quit" [])
(mkSimpleBind ["Mod"] "Left" "moveWindowLeft" [])
(mkSimpleBind ["Mod"] "Down" "moveWindowDown" [])
(mkSimpleBind ["Mod"] "Up" "moveWindowUp" [])
(mkSimpleBind ["Mod"] "Right" "moveWindowRight" [])
(mkRepeatSimpleBind ["Mod"] "J" "moveFocusLeft" [])
(mkRepeatSimpleBind ["Mod"] "K" "moveFocusDown" [])
(mkRepeatSimpleBind ["Mod"] "L" "moveFocusUp" [])
(mkRepeatSimpleBind ["Mod"] "semicolon" "moveFocusRight" [])
(mkBindWithDesc ["Mod"] "Q" "killActive" [] "Kill active window")
(mkBindWithDesc ["Mod"] "N" "spawn" ["neovide"] "Open Neovide")
(mkBindWithDesc ["Mod"] "T" "spawn-sh" ["kitty" "-1"] "Open Kitty")
(mkBindWithDesc ["Mod" "Shift"] "L" "spawn" ["hyprlock"] "Lock screen")
(
if config.mods.yazi.enable
then mkBindWithDesc ["Mod"] "E" "spawn-sh" ["EDITOR='neovide --no-fork' kitty yazi"] "Open Yazi"
else {}
)
(
if config.mods.anyrun.enable
then mkBindWithDesc ["Mod"] "R" "spawn" ["anyrun"] "Open Anyrun"
else {}
)
(
if config.mods.oxi.oxirun.enable
then mkBindWithDesc ["Mod"] "R" "spawn" ["oxirun"] "Open OxiRun"
else {}
)
(
if config.mods.oxi.oxidash.enable
then mkBindWithDesc ["Mod"] "M" "spawn" ["oxidash"] "Open OxiDash"
else {}
)
(
if config.mods.oxi.oxicalc.enable
then mkBindWithDesc ["Mod"] "G" "spawn" ["oxicalc"] "Open Oxicalc"
else {}
)
(
if config.mods.oxi.oxishut.enable
then mkBindWithDesc ["Mod"] "D" "spawn" ["oxishut"] "Open OxiShut"
else {}
)
(
if config.mods.oxi.oxipaste.enable
then mkBindWithDesc ["Mod"] "A" "spawn" ["oxipaste"] "Open Oxipaste"
else {}
)
(
if config.mods.oxi.hyprdock.enable
then mkBindWithDesc ["Mod" "Shift"] "P" "spawn" ["hyprdock --gui"] "Open Hyprdock"
else {}
)
(
if config.mods.hypr.hyprlock.enable
then mkBindWithDesc ["Mod" "Shift" "Alt"] "L" "spawn-sh" ["playerctl -a pause & hyprlock & systemctl suspend"] "Lock and suspend"
else {}
)
(
if config.mods.hypr.hyprlock.enable
then mkBindWithDesc ["Mod" "Shift" "Alt"] "K" "spawn-sh" ["playerctl -a pause & hyprlock & systemctl hibernate"] "Lock and hibernate"
else {}
)
(mkBindWithDesc ["Mod"] "F" "spawn" ["${browserName config}"] "Open Browser")
(
if
(
browserName config == "firefox" || browserName config == "zen"
)
then mkBindWithDesc ["Mod" "Shift"] "F" "spawn" ["${browserName config} -p special"] "Open Browser Special Profile"
else {}
)
(mkBindWithDesc ["Mod"] "S" "spawn-sh" [''grim -g \"$(slurp)\" - | wl-copy''] "Take Screenshot")
(mkBindWithDesc ["Mod" "Shift"] "S" "spawn-sh" [''grim -g \"$(slurp)\" - | satty -f -''] "Take Screenshot and edit")
(
if config.mods.scripts.audioControl
then {
key = "XF86AudioMute";
command = "spawn-sh";
args = ["audioControl mute"];
meta.niri = {
allowWhileLocked = true;
desc = "Mute Audio";
};
}
else {}
)
(
if config.mods.scripts.audioControl
then {
key = "XF86AudioRaiseVolume";
command = "spawn-sh";
args = ["audioControl +5%"];
meta.niri = {
allowWhileLocked = true;
desc = "Raise Audio Volume";
};
}
else {}
)
(
if config.mods.scripts.audioControl
then {
key = "XF86AudioLowerVolume";
command = "spawn-sh";
args = ["audioControl -5%"];
meta.niri = {
allowWhileLocked = true;
desc = "Lower Audio Volume";
};
}
else {}
)
{
key = "XF86AudioPlay";
command = "spawn-sh";
args = ["playerctl play-pause"];
meta.niri = {
allowWhileLocked = true;
desc = "Play/Pause";
};
}
{
key = "XF86AudioNext";
command = "spawn-sh";
args = ["playerctl next"];
meta.niri = {
allowWhileLocked = true;
desc = "Next Song";
};
}
{
key = "XF86AudioPrev";
command = "spawn-sh";
args = ["playerctl previous"];
meta.niri = {
allowWhileLocked = true;
desc = "Previous Song";
};
}
(
if config.mods.scripts.changeBrightness
then {
key = "XF86MonBrightnessDown";
command = "spawn-sh";
args = ["changeBrightness -10%"];
meta.niri = {
allowWhileLocked = true;
desc = "Lower Brigthness";
};
}
else {}
)
(
if config.mods.scripts.changeBrightness
then {
key = "XF86MonBrightnessUp";
command = "spawn-sh";
args = ["changeBrightness +10%"];
meta.niri = {
allowWhileLocked = true;
desc = "Raise Brigthness";
};
}
else {}
)
# Niri only keybinds
(mkSimpleCustomBind ["Mod"] "BracketLeft" "consume-or-expel-window-left" null [])
(mkSimpleCustomBind ["Mod"] "BracketRight" "consume-or-expel-window-right" null [])
(mkSimpleCustomBind ["Mod"] "Comma" "consume-window-into-column" null [])
(mkSimpleCustomBind ["Mod"] "Period" "expel-window-from-column" null [])
(mkSimpleCustomBind ["Mod"] "Y" "switch-preset-column-width" null [])
(mkSimpleCustomBind ["Mod"] "Tab" "focus-workspace-previous" null [])
(mkSimpleCustomBind ["Mod" "Shift"] "V" "switch-focus-between-floating-and-tiling" null [])
(mkSimpleCustomBind ["Mod" "Shift"] "B" "expand-column-to-available-width" null [])
(mkSimpleCustomBind ["Mod"] "U" "set-column-width" null ["-10%"])
(mkSimpleCustomBind ["Mod"] "P" "set-column-width" null ["+10%"])
(mkSimpleCustomBind ["Mod"] "O" "set-column-width" null ["50%"])
(mkSimpleCustomBind ["Mod" "Shift"] "Minus" "set-window-height" null ["-10%"])
(mkSimpleCustomBind ["Mod" "Shift"] "Equal" "set-window-height" null ["+10%"])
(mkSimpleCustomBind ["Mod" "Ctrl"] "1" "move-column-to-workspace" null ["1"])
(mkSimpleCustomBind ["Mod" "Ctrl"] "2" "move-column-to-workspace" null ["2"])
(mkSimpleCustomBind ["Mod" "Ctrl"] "3" "move-column-to-workspace" null ["3"])
(mkSimpleCustomBind ["Mod" "Ctrl"] "4" "move-column-to-workspace" null ["4"])
(mkSimpleCustomBind ["Mod" "Ctrl"] "5" "move-column-to-workspace" null ["5"])
(mkSimpleCustomBind ["Mod" "Ctrl"] "6" "move-column-to-workspace" null ["6"])
(mkSimpleCustomBind ["Mod" "Ctrl"] "7" "move-column-to-workspace" null ["7"])
(mkSimpleCustomBind ["Mod" "Ctrl"] "8" "move-column-to-workspace" null ["8"])
(mkSimpleCustomBind ["Mod" "Ctrl"] "9" "move-column-to-workspace" null ["9"])
(mkSimpleCustomBind ["Mod" "Ctrl"] "0" "move-column-to-workspace" null ["0"])
(mkSimpleCustomBind ["Mod" "Shift"] "J" "focus-monitor-left" null [])
(mkSimpleCustomBind ["Mod" "Shift"] "semicolon" "focus-monitor-right" null [])
(mkSimpleCustomBind ["Mod" "Ctrl"] "J" "move-column-to-monitor-left" null [])
(mkSimpleCustomBind ["Mod" "Ctrl"] "semicolon" "move-column-to-monitor-right" null [])
(mkSimpleCustomBind ["Mod" "Shift"] "Slash" "show-hotkey-overlay" null [])
{
modKeys = ["Mod"];
key = "W";
command.niri = "toggle-overview";
meta.niri = {
desc = "Overview";
repeat = false;
};
}
{
modKeys = ["Mod"];
key = "Escape";
command.niri = "toggle-keyboard-shortcuts-inhibit";
meta.niri = {
allowInhibit = false;
};
}
{
modKeys = ["Mod"];
key = "WheelScrollUp";
command.niri = "focus-workspace-up";
meta.niri.cooldown = 150;
}
{
modKeys = ["Mod"];
key = "WheelScrollDown";
command.niri = "focus-workspace-down";
meta.niri.cooldown = 150;
}
{
modKeys = ["Mod"];
key = "WheelScrollRight";
command.niri = "focus-column-right";
meta.niri.cooldown = 150;
}
{
modKeys = ["Mod"];
key = "WheelScrollLeft";
command.niri = "focus-column-left";
meta.niri.cooldown = 150;
}
# Hyprland only keybinds
(mkSimpleCustomBind ["Mod"] "C" null "togglesplit" [])
(mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "1" null "movetoworkspacesilent" ["1"])
(mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "2" null "movetoworkspacesilent" ["2"])
(mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "3" null "movetoworkspacesilent" ["3"])
(mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "4" null "movetoworkspacesilent" ["4"])
(mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "5" null "movetoworkspacesilent" ["5"])
(mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "6" null "movetoworkspacesilent" ["6"])
(mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "7" null "movetoworkspacesilent" ["7"])
(mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "8" null "movetoworkspacesilent" ["8"])
(mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "9" null "movetoworkspacesilent" ["9"])
(mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "0" null "movetoworkspacesilent" ["0"])
(mkRepeatCustomBind ["Mod"] "U" null "resizeactive" ["-20" "0"])
(mkRepeatCustomBind ["Mod"] "P" null "resizeactive" ["20" "0"])
(mkRepeatCustomBind ["Mod"] "O" null "resizeactive" ["0" "-20"])
(mkRepeatCustomBind ["Mod"] "I" null "resizeactive" ["0" "20"])
(mkSimpleCustomBind ["Mod" "ALT"] "J" null "layoutmsg" ["preselect" "l"])
(mkSimpleCustomBind ["Mod" "ALT"] "K" null "layoutmsg" ["preselect" "d"])
(mkSimpleCustomBind ["Mod" "ALT"] "L" null "layoutmsg" ["preselect" "u"])
(mkSimpleCustomBind ["Mod" "ALT"] "semicolon" null "layoutmsg" ["preselect" "r"])
(mkSimpleCustomBind ["Mod" "ALT"] "H" null "layoutmsg" ["preselect" "n"])
(
if config.mods.hypr.hyprland.hyprspaceEnable
then {
modKeys = ["Mod"];
key = "W";
command.hyprland = "overview:toggle";
args = [];
}
else {}
)
];
}