wip
This commit is contained in:
parent
72afd686c0
commit
614342b9f7
13 changed files with 1336 additions and 612 deletions
|
|
@ -10,7 +10,7 @@
|
||||||
url = "github:nix-community/lanzaboote/v0.4.2";
|
url = "github:nix-community/lanzaboote/v0.4.2";
|
||||||
inputs.nixpkgs.follows = "unstable";
|
inputs.nixpkgs.follows = "unstable";
|
||||||
};
|
};
|
||||||
statix.url = "github:oppiliappan/statix";
|
statix.url = "github:oppiliappan/statix?ref=master";
|
||||||
# Darkreader requires es20, hence a stable pin
|
# Darkreader requires es20, hence a stable pin
|
||||||
pkgsDarkreader.url = "github:NixOs/nixpkgs/nixos-24.11";
|
pkgsDarkreader.url = "github:NixOs/nixpkgs/nixos-24.11";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
mkDashDefault,
|
mkDashDefault,
|
||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
|
pkgs,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
username = config.conf.username;
|
username = config.conf.username;
|
||||||
|
|
|
||||||
449
lib/wm.nix
Normal file
449
lib/wm.nix
Normal 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 {}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
@ -49,6 +49,7 @@
|
||||||
./virtmanager.nix
|
./virtmanager.nix
|
||||||
./xkb.nix
|
./xkb.nix
|
||||||
./xone.nix
|
./xone.nix
|
||||||
|
./wm.nix
|
||||||
./yazi
|
./yazi
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
mkDashDefault,
|
|
||||||
pkgs,
|
pkgs,
|
||||||
lib,
|
lib,
|
||||||
options,
|
options,
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ in {
|
||||||
abbr --add ls 'lsd'
|
abbr --add ls 'lsd'
|
||||||
abbr --add :q 'exit'
|
abbr --add :q 'exit'
|
||||||
abbr --add gh 'git push origin'
|
abbr --add gh 'git push origin'
|
||||||
|
abbr --add gu 'git push upstream'
|
||||||
abbr --add gl 'git pull origin'
|
abbr --add gl 'git pull origin'
|
||||||
abbr --add gm 'git commit -m'
|
abbr --add gm 'git commit -m'
|
||||||
abbr --add ga "git add -A"
|
abbr --add ga "git add -A"
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,10 @@
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
monitor = lib.mkOption {
|
monitor = lib.mkOption {
|
||||||
default = "${config.mods.hypr.hyprland.defaultMonitor}";
|
default =
|
||||||
|
if config.mods.wm.monitors != []
|
||||||
|
then (builtins.elemAt config.mods.wm.monitors 0).name
|
||||||
|
else "";
|
||||||
example = "eDP-1";
|
example = "eDP-1";
|
||||||
type = lib.types.str;
|
type = lib.types.str;
|
||||||
description = ''
|
description = ''
|
||||||
|
|
@ -27,7 +30,10 @@
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
scale = lib.mkOption {
|
scale = lib.mkOption {
|
||||||
default = "${config.mods.hypr.hyprland.defaultMonitorScale}";
|
default =
|
||||||
|
if config.mods.wm.monitors != []
|
||||||
|
then builtins.toString (builtins.elemAt config.mods.wm.monitors 0).scale
|
||||||
|
else "";
|
||||||
example = "1.5";
|
example = "1.5";
|
||||||
type = lib.types.str;
|
type = lib.types.str;
|
||||||
description = ''
|
description = ''
|
||||||
|
|
@ -46,7 +52,14 @@
|
||||||
description = "The compositor/greeter command to run";
|
description = "The compositor/greeter command to run";
|
||||||
};
|
};
|
||||||
resolution = lib.mkOption {
|
resolution = lib.mkOption {
|
||||||
default = "${config.mods.hypr.hyprland.defaultMonitorMode}";
|
default =
|
||||||
|
if config.mods.wm.monitors != []
|
||||||
|
then let
|
||||||
|
resX = builtins.toString (builtins.elemAt config.mods.wm.monitors 0).resolutionX;
|
||||||
|
resY = builtins.toString (builtins.elemAt config.mods.wm.monitors 0).resolutionY;
|
||||||
|
refresh = builtins.toString (builtins.elemAt config.mods.wm.monitors 0).refreshrate;
|
||||||
|
in "${resX}x${resY}@${refresh}"
|
||||||
|
else "";
|
||||||
example = "3440x1440@180";
|
example = "3440x1440@180";
|
||||||
type = lib.types.str;
|
type = lib.types.str;
|
||||||
description = ''
|
description = ''
|
||||||
|
|
@ -83,7 +96,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
config = let
|
config = let
|
||||||
username = config.conf.username;
|
inherit (config.conf) username;
|
||||||
in
|
in
|
||||||
lib.mkIf config.mods.greetd.enable (
|
lib.mkIf config.mods.greetd.enable (
|
||||||
lib.optionalAttrs (options ? environment) {
|
lib.optionalAttrs (options ? environment) {
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,7 @@
|
||||||
pkgs,
|
pkgs,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
browserName =
|
defaultWmConf = import ../../../lib/wm.nix {inherit lib;};
|
||||||
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;
|
|
||||||
in {
|
in {
|
||||||
options.mods.hypr.hyprland = {
|
options.mods.hypr.hyprland = {
|
||||||
enable = lib.mkOption {
|
enable = lib.mkOption {
|
||||||
|
|
@ -22,64 +17,12 @@ in {
|
||||||
Enable Hyprland
|
Enable Hyprland
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
defaultMonitor = lib.mkOption {
|
|
||||||
default = "";
|
|
||||||
example = "eDP-1";
|
|
||||||
type = lib.types.str;
|
|
||||||
description = ''
|
|
||||||
main monitor
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
defaultMonitorMode = lib.mkOption {
|
|
||||||
default = "";
|
|
||||||
example = "3440x1440@180";
|
|
||||||
type = lib.types.str;
|
|
||||||
description = ''
|
|
||||||
main monitor mode: width x height @ refreshrate
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
defaultMonitorScale = lib.mkOption {
|
|
||||||
default = "1";
|
|
||||||
example = "1.5";
|
|
||||||
type = lib.types.str;
|
|
||||||
description = ''
|
|
||||||
main monitor scaling
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
monitor = lib.mkOption {
|
|
||||||
default = [
|
|
||||||
# main monitor
|
|
||||||
"${config.mods.hypr.hyprland.defaultMonitor},${config.mods.hypr.hyprland.defaultMonitorMode},0x0,${config.mods.hypr.hyprland.defaultMonitorScale}"
|
|
||||||
# all others
|
|
||||||
];
|
|
||||||
example = ["DP-1,3440x1440@180,2560x0,1,vrr,0"];
|
|
||||||
type = with lib.types; listOf str;
|
|
||||||
description = ''
|
|
||||||
The monitor configuration for hyprland.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
workspace = lib.mkOption {
|
|
||||||
default = [];
|
|
||||||
example = ["2,monitor:DP-1, default:true"];
|
|
||||||
type = with lib.types; listOf str;
|
|
||||||
description = ''
|
|
||||||
The workspace configuration for hyprland.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
noAtomic = lib.mkOption {
|
noAtomic = lib.mkOption {
|
||||||
default = false;
|
default = false;
|
||||||
example = true;
|
example = true;
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
description = ''
|
description = ''
|
||||||
Use tearing
|
Use tearing (Warning, can be buggy)
|
||||||
'';
|
|
||||||
};
|
|
||||||
extraAutostart = lib.mkOption {
|
|
||||||
default = [];
|
|
||||||
example = ["your application"];
|
|
||||||
type = lib.types.listOf lib.types.str;
|
|
||||||
description = ''
|
|
||||||
Extra exec_once.
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
useIronbar = lib.mkOption {
|
useIronbar = lib.mkOption {
|
||||||
|
|
@ -90,14 +33,6 @@ in {
|
||||||
Whether to use ironbar in hyprland.
|
Whether to use ironbar in hyprland.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
ironbarSingleMonitor = lib.mkOption {
|
|
||||||
default = true;
|
|
||||||
example = false;
|
|
||||||
type = lib.types.bool;
|
|
||||||
description = ''
|
|
||||||
Whether to use ironbar on a single monitor.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
useDefaultConfig = lib.mkOption {
|
useDefaultConfig = lib.mkOption {
|
||||||
default = true;
|
default = true;
|
||||||
example = false;
|
example = false;
|
||||||
|
|
@ -160,7 +95,151 @@ in {
|
||||||
hyprpicker
|
hyprpicker
|
||||||
];
|
];
|
||||||
|
|
||||||
wayland.windowManager.hyprland = {
|
wayland.windowManager.hyprland = let
|
||||||
|
mkWorkspace = workspaces:
|
||||||
|
builtins.map (workspace: let
|
||||||
|
default =
|
||||||
|
if workspace.default
|
||||||
|
then ",default:true"
|
||||||
|
else "";
|
||||||
|
in "${workspace.name},monitor:${workspace.monitor}${default}")
|
||||||
|
workspaces;
|
||||||
|
mkTransform = transform:
|
||||||
|
if transform == "0"
|
||||||
|
then 0
|
||||||
|
else if transform == "90"
|
||||||
|
then 1
|
||||||
|
else if transform == "180"
|
||||||
|
then 2
|
||||||
|
else if transform == "270"
|
||||||
|
then 3
|
||||||
|
else 4;
|
||||||
|
mkVrr = vrr:
|
||||||
|
if vrr
|
||||||
|
then "1"
|
||||||
|
else "0";
|
||||||
|
mkMonitors = monitors:
|
||||||
|
builtins.map (
|
||||||
|
monitor: "${monitor.name},${builtins.toString monitor.resolutionX}x${builtins.toString monitor.resolutionY}@${builtins.toString monitor.refreshrate},${builtins.toString monitor.positionX}x${builtins.toString monitor.positionY},${builtins.toString monitor.scale}, transform,${builtins.toString (mkTransform monitor.transform)}, vrr,${mkVrr monitor.vrr}"
|
||||||
|
)
|
||||||
|
monitors;
|
||||||
|
|
||||||
|
mkMods = bind: let
|
||||||
|
mods = bind.modKeys or [];
|
||||||
|
in
|
||||||
|
builtins.map (mod:
|
||||||
|
if mod == "Mod"
|
||||||
|
then (lib.strings.toUpper config.mods.wm.modKey) + " "
|
||||||
|
else lib.strings.toUpper mod)
|
||||||
|
mods
|
||||||
|
|> lib.strings.concatStringsSep "";
|
||||||
|
mkArgs = args:
|
||||||
|
if args != []
|
||||||
|
then (lib.strings.concatStringsSep " " args)
|
||||||
|
else "";
|
||||||
|
shouldRepeat = bind: bind ? meta && bind.meta ? hyprland && bind.meta.hyprland ? repeat && bind.meta.hyprland.repeat;
|
||||||
|
|
||||||
|
defaultBinds = cfg:
|
||||||
|
if cfg.mods.wm.useDefaultBinds
|
||||||
|
then defaultWmConf.defaultBinds cfg
|
||||||
|
else [];
|
||||||
|
|
||||||
|
mkEBinds = cfg: let
|
||||||
|
binds = cfg.mods.wm.binds ++ defaultBinds cfg;
|
||||||
|
in
|
||||||
|
binds
|
||||||
|
|> builtins.filter (bind: bind ? command && shouldRepeat bind && !hasInvalidCustomCommand bind)
|
||||||
|
|> builtins.map (
|
||||||
|
bind: "${mkMods bind},${bind.key},${mkCommand bind}"
|
||||||
|
);
|
||||||
|
mkBinds = cfg: let
|
||||||
|
binds = cfg.mods.wm.binds ++ defaultBinds cfg;
|
||||||
|
in
|
||||||
|
binds
|
||||||
|
|> builtins.filter (bind: bind ? command && !(shouldRepeat bind) && !hasInvalidCustomCommand bind)
|
||||||
|
|> builtins.map (
|
||||||
|
bind: "${mkMods bind},${bind.key},${mkCommand bind}"
|
||||||
|
);
|
||||||
|
mkCommand = bind: let
|
||||||
|
args = bind.args or [];
|
||||||
|
in
|
||||||
|
if bind.command == "quit"
|
||||||
|
then "exit"
|
||||||
|
else if bind.command == "killActive"
|
||||||
|
then "killactive"
|
||||||
|
else if bind.command == "moveWindowRight"
|
||||||
|
then "movewindow,r"
|
||||||
|
else if bind.command == "moveWindowDown"
|
||||||
|
then "movewindow,d"
|
||||||
|
else if bind.command == "moveWindowLeft"
|
||||||
|
then "movewindow,l"
|
||||||
|
else if bind.command == "moveWindowUp"
|
||||||
|
then "movewindow,u"
|
||||||
|
else if bind.command == "moveFocusUp"
|
||||||
|
then "movefocus,u"
|
||||||
|
else if bind.command == "moveFocusRight"
|
||||||
|
then "movefocus,r"
|
||||||
|
else if bind.command == "moveFocusDown"
|
||||||
|
then "movefocus,d"
|
||||||
|
else if bind.command == "moveFocusLeft"
|
||||||
|
then "movefocus,l"
|
||||||
|
else if bind.command == "toggleFloating"
|
||||||
|
then "togglefloating"
|
||||||
|
else if bind.command == "toggleFullscreen"
|
||||||
|
then "fullscreen"
|
||||||
|
else if bind.command == "focusWorkspace"
|
||||||
|
then "workspace" + "," + mkArgs args
|
||||||
|
else if bind.command == "moveToWorkspace"
|
||||||
|
then "movetoworkspace" + "," + mkArgs args
|
||||||
|
else if bind.command == "spawn"
|
||||||
|
then "exec" + "," + mkArgs args
|
||||||
|
else if bind.command == "spawn-sh"
|
||||||
|
then "exec" + "," + mkArgs args
|
||||||
|
else bind.command.hyprland + "," + mkArgs args;
|
||||||
|
hasInvalidCustomCommand = bind: !(builtins.isString bind.command) && bind.command.hyprland or null == null;
|
||||||
|
|
||||||
|
mkEnv = config: let
|
||||||
|
defaultEnv =
|
||||||
|
if config.mods.wm.useDefaultEnv
|
||||||
|
then defaultWmConf.defaultEnv config
|
||||||
|
else {
|
||||||
|
all = {};
|
||||||
|
hyprland = {};
|
||||||
|
};
|
||||||
|
userEnv =
|
||||||
|
if config.mods.wm.env ? all
|
||||||
|
then config.mods.wm.env.all // config.mods.wm.env.hyprland
|
||||||
|
else config.mods.wm.env;
|
||||||
|
env = userEnv // defaultEnv.all // defaultEnv.hyprland;
|
||||||
|
in
|
||||||
|
lib.attrsets.mapAttrsToList (
|
||||||
|
name: value: "${name},${value}"
|
||||||
|
)
|
||||||
|
env;
|
||||||
|
mkAutoStart = config: let
|
||||||
|
defaultStartup =
|
||||||
|
if config.mods.wm.useDefaultStartup
|
||||||
|
then defaultWmConf.defaultStartup config
|
||||||
|
else {
|
||||||
|
all = [];
|
||||||
|
hyprland = [];
|
||||||
|
};
|
||||||
|
userStartup =
|
||||||
|
if config.mods.wm.startup ? all
|
||||||
|
then config.mods.wm.startup.all ++ config.mods.wm.startup.hyprland
|
||||||
|
else config.mods.wm.startup;
|
||||||
|
autoStart = userStartup ++ defaultStartup.all ++ defaultStartup.hyprland;
|
||||||
|
in
|
||||||
|
autoStart;
|
||||||
|
mkWindowRule = config: let
|
||||||
|
defaultWindowRules =
|
||||||
|
if config.mods.wm.useDefaultWindowRules
|
||||||
|
then defaultWmConf.defaultWindowRules.hyprland
|
||||||
|
else [];
|
||||||
|
in
|
||||||
|
# defaultWindowRules ++ config.mods.wm.windowRules.hyprland;
|
||||||
|
defaultWindowRules;
|
||||||
|
in {
|
||||||
enable = true;
|
enable = true;
|
||||||
package = mkDashDefault pkgs.hyprland;
|
package = mkDashDefault pkgs.hyprland;
|
||||||
plugins =
|
plugins =
|
||||||
|
|
@ -174,124 +253,13 @@ in {
|
||||||
lib.mkMerge
|
lib.mkMerge
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"$mod" = mkDashDefault "SUPER";
|
"$mod" = mkDashDefault config.mods.wm.modKey;
|
||||||
|
|
||||||
bindm = [
|
bindm = [
|
||||||
"$mod, mouse:272, movewindow"
|
"$mod, mouse:272, movewindow"
|
||||||
"$mod, mouse:273, resizeactive"
|
"$mod, mouse:273, resizeactive"
|
||||||
];
|
];
|
||||||
|
|
||||||
bind = [
|
|
||||||
# screenshots
|
|
||||||
''$mod SUPER,S,exec,grim -g "$(slurp)" - | wl-copy''
|
|
||||||
''$mod SUPERSHIFT,S,exec,grim -g "$(slurp)" - | satty -f -''
|
|
||||||
|
|
||||||
# regular programs
|
|
||||||
"$mod SUPER,F,exec,${browserName}"
|
|
||||||
(lib.mkIf (
|
|
||||||
browserName == "firefox" || browserName == "zen"
|
|
||||||
) "$mod SUPERSHIFT,F,exec,${browserName} -p special")
|
|
||||||
"$mod SUPER,T,exec,kitty -1"
|
|
||||||
"$mod SUPER,E,exec,nautilus -w"
|
|
||||||
(lib.mkIf config.mods.yazi.enable "$mod SUPER,Y,exec, EDITOR='neovide --no-fork' kitty yazi")
|
|
||||||
"$mod SUPER,N,exec,neovide"
|
|
||||||
(lib.mkIf config.mods.anyrun.enable "$mod SUPER,R,exec,anyrun")
|
|
||||||
(lib.mkIf config.mods.oxi.oxirun.enable "$mod SUPER,R,exec,oxirun")
|
|
||||||
(lib.mkIf config.mods.oxi.oxidash.enable "$mod SUPER,M,exec,oxidash")
|
|
||||||
(lib.mkIf config.mods.oxi.oxicalc.enable "$mod SUPER,G,exec,oxicalc")
|
|
||||||
(lib.mkIf config.mods.oxi.oxishut.enable "$mod SUPER,D,exec,oxishut")
|
|
||||||
(lib.mkIf config.mods.oxi.oxipaste.enable "$mod SUPER,A,exec,oxipaste")
|
|
||||||
(lib.mkIf config.mods.oxi.hyprdock.enable "$mod SUPERSHIFT,P,exec,hyprdock --gui")
|
|
||||||
(lib.mkIf config.mods.hypr.hyprlock.enable "$mod SUPERSHIFT,L,exec, playerctl -a pause & hyprlock & systemctl suspend")
|
|
||||||
(lib.mkIf config.mods.hypr.hyprlock.enable "$mod SUPERSHIFT,K,exec, playerctl -a pause & hyprlock & systemctl hibernate")
|
|
||||||
|
|
||||||
# media keys
|
|
||||||
(lib.mkIf config.mods.scripts.audioControl ",XF86AudioMute,exec, audioControl mute")
|
|
||||||
(lib.mkIf config.mods.scripts.audioControl ",XF86AudioLowerVolume,exec, audioControl sink -5%")
|
|
||||||
(lib.mkIf config.mods.scripts.audioControl ",XF86AudioRaiseVolume,exec, audioControl sink +5%")
|
|
||||||
",XF86AudioPlay,exec, playerctl play-pause"
|
|
||||||
",XF86AudioNext,exec, playerctl next"
|
|
||||||
",XF86AudioPrev,exec, playerctl previous"
|
|
||||||
(lib.mkIf config.mods.scripts.changeBrightness ",XF86MonBrightnessDown,exec, changeBrightness 10%-")
|
|
||||||
(lib.mkIf config.mods.scripts.changeBrightness ",XF86MonBrightnessUp,exec, changeBrightness +10%")
|
|
||||||
|
|
||||||
# hyprland keybinds
|
|
||||||
# misc
|
|
||||||
"$mod SUPER,V,togglefloating,"
|
|
||||||
"$mod SUPER,B,fullscreen,"
|
|
||||||
"$mod SUPER,C,togglesplit"
|
|
||||||
"$mod SUPER,Q,killactive,"
|
|
||||||
"$mod SUPERSHIFTALT,M,exit,"
|
|
||||||
"$mod SUPERSHIFT,W,togglespecialworkspace"
|
|
||||||
|
|
||||||
# move
|
|
||||||
"$mod SUPER,left,movewindow,l"
|
|
||||||
"$mod SUPER,right,movewindow,r"
|
|
||||||
"$mod SUPER,up,movewindow,u"
|
|
||||||
"$mod SUPER,down,movewindow,d"
|
|
||||||
|
|
||||||
# workspaces
|
|
||||||
"$mod SUPER,1,workspace,1"
|
|
||||||
"$mod SUPER,2,workspace,2"
|
|
||||||
"$mod SUPER,3,workspace,3"
|
|
||||||
"$mod SUPER,4,workspace,4"
|
|
||||||
"$mod SUPER,5,workspace,5"
|
|
||||||
"$mod SUPER,6,workspace,6"
|
|
||||||
"$mod SUPER,7,workspace,7"
|
|
||||||
"$mod SUPER,8,workspace,8"
|
|
||||||
"$mod SUPER,9,workspace,9"
|
|
||||||
"$mod SUPER,0,workspace,10"
|
|
||||||
|
|
||||||
# move to workspace
|
|
||||||
"$mod SUPERSHIFT,1,movetoworkspace,1"
|
|
||||||
"$mod SUPERSHIFT,2,movetoworkspace,2"
|
|
||||||
"$mod SUPERSHIFT,3,movetoworkspace,3"
|
|
||||||
"$mod SUPERSHIFT,4,movetoworkspace,4"
|
|
||||||
"$mod SUPERSHIFT,5,movetoworkspace,5"
|
|
||||||
"$mod SUPERSHIFT,6,movetoworkspace,6"
|
|
||||||
"$mod SUPERSHIFT,7,movetoworkspace,7"
|
|
||||||
"$mod SUPERSHIFT,8,movetoworkspace,8"
|
|
||||||
"$mod SUPERSHIFT,9,movetoworkspace,9"
|
|
||||||
"$mod SUPERSHIFT,0,movetoworkspace,10"
|
|
||||||
|
|
||||||
# move to workspace silent
|
|
||||||
"$mod SUPERSHIFTALT,1,movetoworkspacesilent,1"
|
|
||||||
"$mod SUPERSHIFTALT,2,movetoworkspacesilent,2"
|
|
||||||
"$mod SUPERSHIFTALT,3,movetoworkspacesilent,3"
|
|
||||||
"$mod SUPERSHIFTALT,4,movetoworkspacesilent,4"
|
|
||||||
"$mod SUPERSHIFTALT,5,movetoworkspacesilent,5"
|
|
||||||
"$mod SUPERSHIFTALT,6,movetoworkspacesilent,6"
|
|
||||||
"$mod SUPERSHIFTALT,7,movetoworkspacesilent,7"
|
|
||||||
"$mod SUPERSHIFTALT,8,movetoworkspacesilent,8"
|
|
||||||
"$mod SUPERSHIFTALT,9,movetoworkspacesilent,9"
|
|
||||||
"$mod SUPERSHIFTALT,0,movetoworkspacesilent,10"
|
|
||||||
|
|
||||||
# preselection
|
|
||||||
"$mod SUPERALT,j,layoutmsg,preselect l"
|
|
||||||
"$mod SUPERALT,k,layoutmsg,preselect d"
|
|
||||||
"$mod SUPERALT,l,layoutmsg,preselect u"
|
|
||||||
"$mod SUPERALT,semicolon,layoutmsg,preselect r"
|
|
||||||
"$mod SUPERALT,h,layoutmsg,preselect n"
|
|
||||||
];
|
|
||||||
|
|
||||||
binde = [
|
|
||||||
# hyprland keybinds
|
|
||||||
# focus
|
|
||||||
"$mod SUPER,J,movefocus,l"
|
|
||||||
"$mod SUPER,semicolon,movefocus,r"
|
|
||||||
"$mod SUPER,L,movefocus,u"
|
|
||||||
"$mod SUPER,K,movefocus,d"
|
|
||||||
|
|
||||||
# resize
|
|
||||||
"$mod SUPER,U,resizeactive,-20 0"
|
|
||||||
"$mod SUPER,P,resizeactive,20 0"
|
|
||||||
"$mod SUPER,O,resizeactive,0 -20"
|
|
||||||
"$mod SUPER,I,resizeactive,0 20"
|
|
||||||
|
|
||||||
(lib.mkIf config.mods.hypr.hyprland.hyprspaceEnable
|
|
||||||
"SUPER, W, overview:toggle")
|
|
||||||
];
|
|
||||||
|
|
||||||
general = {
|
general = {
|
||||||
gaps_out = mkDashDefault "3,5,5,5";
|
gaps_out = mkDashDefault "3,5,5,5";
|
||||||
border_size = mkDashDefault 3;
|
border_size = mkDashDefault 3;
|
||||||
|
|
@ -364,70 +332,19 @@ in {
|
||||||
"3, horizontal, workspace"
|
"3, horizontal, workspace"
|
||||||
];
|
];
|
||||||
|
|
||||||
monitor = mkDashDefault config.mods.hypr.hyprland.monitor;
|
|
||||||
workspace = mkDashDefault config.mods.hypr.hyprland.workspace;
|
|
||||||
|
|
||||||
env = [
|
|
||||||
"GTK_CSD,0"
|
|
||||||
''TERM,"kitty /bin/fish"''
|
|
||||||
"XDG_CURRENT_DESKTOP=Hyprland"
|
|
||||||
"XDG_SESSION_TYPE=wayland"
|
|
||||||
"XDG_SESSION_DESKTOP=Hyprland"
|
|
||||||
"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"''
|
|
||||||
|
|
||||||
(lib.mkIf config.mods.gpu.nvidia.enable "LIBVA_DRIVER_NAME,nvidia")
|
|
||||||
(lib.mkIf config.mods.gpu.nvidia.enable "XDG_SESSION_TYPE,wayland")
|
|
||||||
(lib.mkIf config.mods.gpu.nvidia.enable "GBM_BACKEND,nvidia-drm")
|
|
||||||
(lib.mkIf config.mods.gpu.nvidia.enable "__GLX_VENDOR_LIBRARY_NAME,nvidia")
|
|
||||||
];
|
|
||||||
|
|
||||||
layerrule = [
|
layerrule = [
|
||||||
# layer rules
|
# layer rules
|
||||||
# mainly to disable animations within slurp and grim
|
# mainly to disable animations within slurp and grim
|
||||||
"noanim, selection"
|
"noanim, selection"
|
||||||
];
|
];
|
||||||
|
|
||||||
windowrule = [
|
workspace = mkDashDefault (mkWorkspace config.mods.wm.workspaces);
|
||||||
# window rules
|
monitor = mkDashDefault (mkMonitors config.mods.wm.monitors);
|
||||||
"float,class:^(.*)(OxiCalc)(.*)$"
|
env = mkDashDefault (mkEnv config);
|
||||||
"float,class:^(.*)(winecfg.exe)(.*)$"
|
bind = mkDashDefault (mkBinds config);
|
||||||
"float,class:^(.*)(copyq)(.*)$"
|
binde = mkDashDefault (mkEBinds config);
|
||||||
"center,class:^(.*)(swappy)(.*)$"
|
windowrule = mkDashDefault (mkWindowRule config);
|
||||||
"workspace 10 silent,class:^(.*)(steam)(.*)$"
|
exec-once = mkDashDefault (mkAutoStart config);
|
||||||
|
|
||||||
# Otherwise neovide will ignore tiling
|
|
||||||
"suppressevent fullscreen maximize,class:^(.*)(neovide)(.*)$"
|
|
||||||
];
|
|
||||||
|
|
||||||
exec-once =
|
|
||||||
[
|
|
||||||
# environment
|
|
||||||
"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 :)
|
|
||||||
(lib.mkIf config.mods.gaming.gamemode "systemctl try-restart gamemoded.service --user")
|
|
||||||
|
|
||||||
# other programs
|
|
||||||
"${browserName}"
|
|
||||||
(lib.mkIf config.mods.oxi.hyprdock.enable "hyprdock --server")
|
|
||||||
(lib.mkIf config.mods.hypr.hyprpaper.enable "hyprpaper")
|
|
||||||
(lib.mkIf config.mods.hypr.hyprland.useIronbar "ironbar")
|
|
||||||
(lib.mkIf config.mods.oxi.oxipaste.enable "oxipaste_daemon")
|
|
||||||
(lib.mkIf config.mods.oxi.oxinoti.enable "oxinoti")
|
|
||||||
]
|
|
||||||
++ config.mods.hypr.hyprland.extraAutostart;
|
|
||||||
|
|
||||||
plugin = config.mods.hypr.hyprland.pluginConfig;
|
plugin = config.mods.hypr.hyprland.pluginConfig;
|
||||||
}
|
}
|
||||||
config.mods.hypr.hyprland.customConfig
|
config.mods.hypr.hyprland.customConfig
|
||||||
|
|
|
||||||
|
|
@ -24,14 +24,22 @@
|
||||||
|
|
||||||
input-field = [
|
input-field = [
|
||||||
{
|
{
|
||||||
monitor = "${config.mods.hypr.hyprland.defaultMonitor}";
|
monitor = "${
|
||||||
|
if config.mods.wm.monitors != []
|
||||||
|
then (builtins.elemAt config.mods.wm.monitors 0).name
|
||||||
|
else ""
|
||||||
|
}";
|
||||||
placeholder_text = "password or something";
|
placeholder_text = "password or something";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
label = [
|
label = [
|
||||||
{
|
{
|
||||||
monitor = "${config.mods.hypr.hyprland.defaultMonitor}";
|
monitor = "${
|
||||||
|
if config.mods.wm.monitors != []
|
||||||
|
then (builtins.elemAt config.mods.wm.monitors 0).name
|
||||||
|
else ""
|
||||||
|
}";
|
||||||
text = "$TIME";
|
text = "$TIME";
|
||||||
font_size = 50;
|
font_size = 50;
|
||||||
position = "0, 200";
|
position = "0, 200";
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
mkDashDefault,
|
|
||||||
lib,
|
lib,
|
||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
|
@ -7,7 +6,7 @@
|
||||||
options,
|
options,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
username = config.conf.username;
|
inherit (config.conf) username;
|
||||||
base16 = pkgs.callPackage inputs.base16.lib {};
|
base16 = pkgs.callPackage inputs.base16.lib {};
|
||||||
scheme = base16.mkSchemeAttrs config.stylix.base16Scheme;
|
scheme = base16.mkSchemeAttrs config.stylix.base16Scheme;
|
||||||
ironbarDefaultConfig = useBatteryModule: {
|
ironbarDefaultConfig = useBatteryModule: {
|
||||||
|
|
@ -183,8 +182,15 @@
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
monitorConfig = useBatteryModule:
|
monitorConfig = useBatteryModule:
|
||||||
if config.mods.hypr.hyprland.ironbarSingleMonitor
|
if config.mods.ironbar.ironbarSingleMonitor
|
||||||
then {monitors.${config.mods.hypr.hyprland.defaultMonitor} = ironbarDefaultConfig useBatteryModule;}
|
then {
|
||||||
|
monitors.${
|
||||||
|
if config.mods.wm.monitors != []
|
||||||
|
then (builtins.elemAt config.mods.wm.monitors 0).name
|
||||||
|
else ""
|
||||||
|
} =
|
||||||
|
ironbarDefaultConfig useBatteryModule;
|
||||||
|
}
|
||||||
else ironbarDefaultConfig useBatteryModule;
|
else ironbarDefaultConfig useBatteryModule;
|
||||||
in {
|
in {
|
||||||
options.mods = {
|
options.mods = {
|
||||||
|
|
@ -195,6 +201,14 @@ in {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
description = "Enables ironbar";
|
description = "Enables ironbar";
|
||||||
};
|
};
|
||||||
|
ironbarSingleMonitor = lib.mkOption {
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
type = lib.types.bool;
|
||||||
|
description = ''
|
||||||
|
Whether to use ironbar on a single monitor.
|
||||||
|
'';
|
||||||
|
};
|
||||||
useDefaultConfig = lib.mkOption {
|
useDefaultConfig = lib.mkOption {
|
||||||
default = true;
|
default = true;
|
||||||
example = false;
|
example = false;
|
||||||
|
|
@ -257,6 +271,7 @@ in {
|
||||||
@import url("/home/${username}/.config/gtk-3.0/gtk.css");
|
@import url("/home/${username}/.config/gtk-3.0/gtk.css");
|
||||||
|
|
||||||
@define-color primary #${scheme.base0D};
|
@define-color primary #${scheme.base0D};
|
||||||
|
@define-color warning #${scheme.base0F};
|
||||||
@define-color muted-text #${scheme.base05};
|
@define-color muted-text #${scheme.base05};
|
||||||
@define-color background #${scheme.base00};
|
@define-color background #${scheme.base00};
|
||||||
@define-color secondary-background #${scheme.base02};
|
@define-color secondary-background #${scheme.base02};
|
||||||
|
|
@ -406,6 +421,10 @@ in {
|
||||||
color: @primary;
|
color: @primary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.workspaces .item:not(.visible) {
|
||||||
|
color: @warning;
|
||||||
|
}
|
||||||
|
|
||||||
.workspaces .item.focused {
|
.workspaces .item.focused {
|
||||||
background-color: @primary;
|
background-color: @primary;
|
||||||
color: @background;
|
color: @background;
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,7 @@
|
||||||
pkgs,
|
pkgs,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
browserName =
|
defaultWmConf = import ../../lib/wm.nix {inherit lib;};
|
||||||
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;
|
|
||||||
in {
|
in {
|
||||||
options.mods.niri = {
|
options.mods.niri = {
|
||||||
enable = lib.mkOption {
|
enable = lib.mkOption {
|
||||||
|
|
@ -22,6 +17,23 @@ in {
|
||||||
Enable Niri
|
Enable Niri
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
useDefaultConfig = lib.mkOption {
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
type = lib.types.bool;
|
||||||
|
description = ''
|
||||||
|
Use preconfigured Niri config.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
customConfig = lib.mkOption {
|
||||||
|
default = '''';
|
||||||
|
example = '''';
|
||||||
|
type = lib.types.lines;
|
||||||
|
description = ''
|
||||||
|
Custom Niri configuration.
|
||||||
|
Will be merged with default configuration if enabled.
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf config.mods.niri.enable (
|
config = lib.mkIf config.mods.niri.enable (
|
||||||
|
|
@ -44,8 +56,243 @@ in {
|
||||||
xwayland-satellite
|
xwayland-satellite
|
||||||
];
|
];
|
||||||
|
|
||||||
xdg.configFile."niri/config.kdl" = {
|
xdg.configFile."niri/config.kdl" = let
|
||||||
text =
|
mkNiriMod = mods:
|
||||||
|
builtins.map (mod:
|
||||||
|
if mod == "Mod"
|
||||||
|
then config.mods.wm.modKey + "+"
|
||||||
|
else "${mod}" + "+")
|
||||||
|
mods
|
||||||
|
|> lib.strings.concatStringsSep "";
|
||||||
|
mkNiriArg = args:
|
||||||
|
if args != []
|
||||||
|
then "\"${(lib.strings.concatStringsSep " " args)}\""
|
||||||
|
else "";
|
||||||
|
mkNiriCommand = bind: let
|
||||||
|
args = bind.args or [];
|
||||||
|
in
|
||||||
|
if bind.command == "quit"
|
||||||
|
then "quit;"
|
||||||
|
else if bind.command == "killActive"
|
||||||
|
then "close-window;"
|
||||||
|
else if bind.command == "moveFocusTop"
|
||||||
|
then "focus-window-up;"
|
||||||
|
else if bind.command == "focusWorkspace"
|
||||||
|
then "focus-workspace" + " " + mkNiriArg args + ";"
|
||||||
|
else if bind.command == "moveWindowRight"
|
||||||
|
then "move-column-right-or-to-monitor-right;"
|
||||||
|
else if bind.command == "moveWindowDown"
|
||||||
|
then "move-window-down;"
|
||||||
|
else if bind.command == "moveWindowLeft"
|
||||||
|
then "move-column-left-or-to-monitor-left;"
|
||||||
|
else if bind.command == "moveWindowUp"
|
||||||
|
then "move-window-up;"
|
||||||
|
else if bind.command == "moveFocusUp"
|
||||||
|
then "focus-window-up;"
|
||||||
|
else if bind.command == "moveFocusRight"
|
||||||
|
then "focus-column-or-monitor-right;"
|
||||||
|
else if bind.command == "moveFocusDown"
|
||||||
|
then "focus-window-down;"
|
||||||
|
else if bind.command == "moveFocusLeft"
|
||||||
|
then "focus-column-or-monitor-left;"
|
||||||
|
else if bind.command == "toggleFloating"
|
||||||
|
then "toggle-window-floating;"
|
||||||
|
else if bind.command == "toggleFullscreen"
|
||||||
|
then "fullscreen-window;"
|
||||||
|
else if bind.command == "moveToWorkspace"
|
||||||
|
then "move-window-to-workspace" + " " + mkNiriArg args + ";"
|
||||||
|
else if bind.command == "spawn"
|
||||||
|
then "spawn" + " " + mkNiriArg args + ";"
|
||||||
|
else if bind.command == "spawn-sh"
|
||||||
|
then "spawn-sh" + " " + mkNiriArg args + ";"
|
||||||
|
else if bind.command.niri != null
|
||||||
|
then bind.command.niri + " " + mkNiriArg args + ";"
|
||||||
|
else "";
|
||||||
|
|
||||||
|
mkNiriBinds = cfg:
|
||||||
|
'' binds {
|
||||||
|
''
|
||||||
|
+ (
|
||||||
|
(
|
||||||
|
builtins.map (
|
||||||
|
bind:
|
||||||
|
/*
|
||||||
|
kdl
|
||||||
|
*/
|
||||||
|
if bind ? key && bind ? command
|
||||||
|
then ''
|
||||||
|
${mkNiriMod (bind.modKeys or [])}${bind.key} ${
|
||||||
|
if
|
||||||
|
bind ? meta
|
||||||
|
&& bind.meta ? niri
|
||||||
|
then
|
||||||
|
(
|
||||||
|
if
|
||||||
|
bind.meta.niri ? desc
|
||||||
|
&& bind.meta.niri.desc != ""
|
||||||
|
then "hotkey-overlay-title=\"" + bind.meta.niri.desc + "\""
|
||||||
|
else ""
|
||||||
|
)
|
||||||
|
+ " "
|
||||||
|
+ (
|
||||||
|
if
|
||||||
|
bind.meta.niri ? repeat
|
||||||
|
&& bind.meta.niri.repeat
|
||||||
|
then "repeat=true"
|
||||||
|
else "repeat=false"
|
||||||
|
)
|
||||||
|
+ " "
|
||||||
|
+ (
|
||||||
|
if
|
||||||
|
bind.meta.niri ? allowWhileLocked
|
||||||
|
&& bind.meta.niri.allowWhileLocked
|
||||||
|
then "allow-when-locked=true"
|
||||||
|
else ""
|
||||||
|
)
|
||||||
|
+ " "
|
||||||
|
+ (
|
||||||
|
if
|
||||||
|
bind.meta.niri ? allowInhibit
|
||||||
|
&& bind.meta.niri.allowInhibit
|
||||||
|
then "allow-inhibiting=true"
|
||||||
|
else "allow-inhibiting=false"
|
||||||
|
)
|
||||||
|
else ""
|
||||||
|
} { ${
|
||||||
|
mkNiriCommand bind
|
||||||
|
} }
|
||||||
|
''
|
||||||
|
else ''''
|
||||||
|
)
|
||||||
|
((
|
||||||
|
cfg.mods.wm.binds
|
||||||
|
++ (
|
||||||
|
if cfg.mods.wm.useDefaultBinds
|
||||||
|
then defaultWmConf.defaultBinds cfg
|
||||||
|
else []
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|> builtins.filter (bind: !(hasInvalidCustomCommand bind)))
|
||||||
|
)
|
||||||
|
|> lib.strings.concatLines
|
||||||
|
)
|
||||||
|
+ ''
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
mkVrr = vrr:
|
||||||
|
if vrr
|
||||||
|
then "true"
|
||||||
|
else "false";
|
||||||
|
mkNiriMonitors = cfg:
|
||||||
|
(builtins.map (
|
||||||
|
monitor:
|
||||||
|
# TODO vrr
|
||||||
|
/*
|
||||||
|
kdl
|
||||||
|
*/
|
||||||
|
''
|
||||||
|
output "${monitor.name}" {
|
||||||
|
variable-refresh-rate on-demand=${mkVrr monitor.vrr}
|
||||||
|
mode "${builtins.toString monitor.resolutionX}x${builtins.toString monitor.resolutionY}@${builtins.toString monitor.refreshrate}"
|
||||||
|
scale ${builtins.toString monitor.scale}
|
||||||
|
transform "${
|
||||||
|
if (monitor.transform == "0")
|
||||||
|
then "normal"
|
||||||
|
else monitor.transform
|
||||||
|
}"
|
||||||
|
position x=${builtins.toString monitor.positionX} y=${builtins.toString monitor.positionY}
|
||||||
|
}
|
||||||
|
''
|
||||||
|
)
|
||||||
|
cfg.mods.wm.monitors)
|
||||||
|
|> lib.strings.concatLines;
|
||||||
|
mkNiriWorkspaces = cfg:
|
||||||
|
(builtins.map (
|
||||||
|
workspace:
|
||||||
|
/*
|
||||||
|
kdl
|
||||||
|
*/
|
||||||
|
''
|
||||||
|
workspace "${workspace.name}" {
|
||||||
|
open-on-output "${workspace.monitor}"
|
||||||
|
}
|
||||||
|
''
|
||||||
|
)
|
||||||
|
cfg.mods.wm.workspaces)
|
||||||
|
|> lib.strings.concatLines;
|
||||||
|
mkNiriWindowRules = cfg: (
|
||||||
|
(
|
||||||
|
builtins.map (
|
||||||
|
rule:
|
||||||
|
/*
|
||||||
|
kdl
|
||||||
|
*/
|
||||||
|
''
|
||||||
|
window-rule {
|
||||||
|
${rule}
|
||||||
|
}
|
||||||
|
''
|
||||||
|
)
|
||||||
|
(
|
||||||
|
cfg.mods.wm.windowRules.niri
|
||||||
|
++ (
|
||||||
|
if cfg.mods.wm.useDefaultWindowRules
|
||||||
|
then defaultWmConf.defaultWindowRules.niri
|
||||||
|
else []
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|> lib.strings.concatLines
|
||||||
|
);
|
||||||
|
hasInvalidCustomCommand = bind: !(bind ? command) || (!(builtins.isString bind.command) && bind.command.niri or null == null);
|
||||||
|
mkNiriEnv = config: let
|
||||||
|
defaultEnv =
|
||||||
|
if config.mods.wm.useDefaultEnv
|
||||||
|
then defaultWmConf.defaultEnv config
|
||||||
|
else {
|
||||||
|
all = {};
|
||||||
|
niri = {};
|
||||||
|
};
|
||||||
|
userEnv =
|
||||||
|
if config.mods.wm.env ? all
|
||||||
|
then config.mods.wm.env.all // config.mods.wm.env.niri
|
||||||
|
else config.mods.wm.env;
|
||||||
|
env =
|
||||||
|
userEnv
|
||||||
|
// defaultEnv.all
|
||||||
|
// defaultEnv.niri;
|
||||||
|
in
|
||||||
|
''
|
||||||
|
environment {
|
||||||
|
''
|
||||||
|
+ (
|
||||||
|
lib.attrsets.mapAttrsToList (
|
||||||
|
name: value: "${name} \"${value}\""
|
||||||
|
)
|
||||||
|
env
|
||||||
|
|> lib.strings.concatLines
|
||||||
|
)
|
||||||
|
+ ''
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
mkNiriAutoStart = config: let
|
||||||
|
defaultStartup =
|
||||||
|
if config.mods.wm.useDefaultStartup
|
||||||
|
then defaultWmConf.defaultStartup config
|
||||||
|
else {
|
||||||
|
all = {};
|
||||||
|
niri = {};
|
||||||
|
};
|
||||||
|
userStartup =
|
||||||
|
if config.mods.wm.startup ? all
|
||||||
|
then config.mods.wm.startup.all ++ config.mods.wm.startup.niri
|
||||||
|
else config.mods.wm.startup;
|
||||||
|
autoStart = userStartup ++ defaultStartup.all ++ defaultStartup.niri;
|
||||||
|
in
|
||||||
|
(builtins.map (value: "spawn-at-startup \"${value}\"")
|
||||||
|
autoStart)
|
||||||
|
|> lib.strings.concatLines;
|
||||||
|
defaultConfig =
|
||||||
/*
|
/*
|
||||||
kdl
|
kdl
|
||||||
*/
|
*/
|
||||||
|
|
@ -69,31 +316,10 @@ in {
|
||||||
accel-speed 0.2
|
accel-speed 0.2
|
||||||
accel-profile "flat"
|
accel-profile "flat"
|
||||||
}
|
}
|
||||||
|
|
||||||
focus-follows-mouse max-scroll-amount="25%"
|
focus-follows-mouse max-scroll-amount="25%"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Outputs
|
|
||||||
output "DP-1" {
|
|
||||||
mode "3440x1440@180"
|
|
||||||
scale 1
|
|
||||||
transform "normal"
|
|
||||||
position x=2560 y=0
|
|
||||||
}
|
|
||||||
|
|
||||||
output "DP-2" {
|
|
||||||
mode "2560x1440@165"
|
|
||||||
scale 1
|
|
||||||
transform "normal"
|
|
||||||
position x=0 y=0
|
|
||||||
}
|
|
||||||
|
|
||||||
output "DP-3" {
|
|
||||||
mode "1920x1080@144.001"
|
|
||||||
scale 1
|
|
||||||
transform "90"
|
|
||||||
position x=6000 y=0
|
|
||||||
}
|
|
||||||
|
|
||||||
layout {
|
layout {
|
||||||
// Set gaps around windows in logical pixels.
|
// Set gaps around windows in logical pixels.
|
||||||
gaps 10
|
gaps 10
|
||||||
|
|
@ -103,15 +329,14 @@ in {
|
||||||
preset-column-widths {
|
preset-column-widths {
|
||||||
proportion 0.33333
|
proportion 0.33333
|
||||||
proportion 0.5
|
proportion 0.5
|
||||||
proportion 0.66667
|
proportion 1.0
|
||||||
}
|
}
|
||||||
|
|
||||||
default-column-width { proportion 0.5; }
|
default-column-width { proportion 0.5; }
|
||||||
// You can change how the focus ring looks.
|
|
||||||
focus-ring {
|
focus-ring {
|
||||||
width 3
|
width 3
|
||||||
inactive-color "#505050"
|
inactive-color "#505050"
|
||||||
active-gradient from="#ff0000" to="#0000ff" angle=45
|
active-gradient from="#ff0000" to="#00ff00" angle=45
|
||||||
}
|
}
|
||||||
|
|
||||||
border {
|
border {
|
||||||
|
|
@ -129,337 +354,25 @@ in {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autostart
|
// Autostart
|
||||||
spawn-at-startup "ironbar"
|
|
||||||
spawn-at-startup "oxinoti"
|
|
||||||
spawn-at-startup "oxipaste_daemon"
|
|
||||||
|
|
||||||
// To run a shell command (with variables, pipes, etc.), use spawn-sh-at-startup:
|
|
||||||
// spawn-sh-at-startup "qs -c ~/source/qs/MyAwesomeShell"
|
|
||||||
|
|
||||||
hotkey-overlay {
|
hotkey-overlay {
|
||||||
skip-at-startup
|
skip-at-startup
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uncomment this line to ask the clients to omit their client-side decorations if possible.
|
|
||||||
// If the client will specifically ask for CSD, the request will be honored.
|
|
||||||
// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.
|
|
||||||
// This option will also fix border/focus ring drawing behind some semitransparent windows.
|
|
||||||
// After enabling or disabling this, you need to restart the apps for this to take effect.
|
|
||||||
prefer-no-csd
|
prefer-no-csd
|
||||||
|
''
|
||||||
// You can change the path where screenshots are saved.
|
+ mkNiriMonitors config
|
||||||
// A ~ at the front will be expanded to the home directory.
|
+ mkNiriBinds config
|
||||||
// The path is formatted with strftime(3) to give you the screenshot date and time.
|
+ mkNiriWorkspaces config
|
||||||
screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
|
+ mkNiriWindowRules config
|
||||||
|
+ mkNiriEnv config
|
||||||
// You can also set this to null to disable saving screenshots to disk.
|
+ mkNiriAutoStart config;
|
||||||
// screenshot-path null
|
in
|
||||||
|
mkDashDefault {
|
||||||
// Animation settings.
|
text =
|
||||||
// The wiki explains how to configure individual animations:
|
if config.mods.niri.useDefaultConfig
|
||||||
// https://yalter.github.io/niri/Configuration:-Animations
|
then defaultConfig + config.mods.niri.customConfig
|
||||||
animations {
|
else config.mods.niri.customConfig;
|
||||||
// Uncomment to turn off all animations.
|
|
||||||
// off
|
|
||||||
|
|
||||||
// Slow down all animations by this factor. Values below 1 speed them up instead.
|
|
||||||
// slowdown 3.0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Block screencapture
|
|
||||||
window-rule {
|
|
||||||
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
|
|
||||||
match app-id=r#"^org\.gnome\.World\.Secrets$"#
|
|
||||||
|
|
||||||
block-out-from "screen-capture"
|
|
||||||
}
|
|
||||||
|
|
||||||
window-rule {
|
|
||||||
match app-id=r#"^nheko$"#
|
|
||||||
match app-id=r#"^vesktop$"#
|
|
||||||
|
|
||||||
open-maximized true
|
|
||||||
}
|
|
||||||
|
|
||||||
// General rules
|
|
||||||
window-rule {
|
|
||||||
geometry-corner-radius 12
|
|
||||||
clip-to-geometry true
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
binds {
|
|
||||||
// Keys consist of modifiers separated by + signs, followed by an XKB key name
|
|
||||||
// in the end. To find an XKB name for a particular key, you may use a program
|
|
||||||
// like wev.
|
|
||||||
//
|
|
||||||
// "Mod" is a special modifier equal to Super when running on a TTY, and to Alt
|
|
||||||
// when running as a winit window.
|
|
||||||
//
|
|
||||||
// Most actions that you can bind here can also be invoked programmatically with
|
|
||||||
// `niri msg action do-something`.
|
|
||||||
|
|
||||||
// Mod-Shift-/, which is usually the same as Mod-?,
|
|
||||||
// shows a list of important hotkeys.
|
|
||||||
Mod+Shift+Slash { show-hotkey-overlay; }
|
|
||||||
|
|
||||||
// Suggested binds for running programs: terminal, app launcher, screen locker.
|
|
||||||
Mod+T hotkey-overlay-title="Open a Terminal: alacritty" { spawn "kitty"; }
|
|
||||||
Mod+R hotkey-overlay-title="Run an Application: fuzzel" { spawn "oxirun"; }
|
|
||||||
Super+Shift+L hotkey-overlay-title="Lock the Screen: hyprlock" { spawn "hyprlock"; }
|
|
||||||
Mod+F hotkey-overlay-title="Browser: Zen" { spawn "zen"; }
|
|
||||||
Mod+G hotkey-overlay-title="Run oxicalc" { spawn "oxicalc"; }
|
|
||||||
Mod+A hotkey-overlay-title="Run Clipboard manager" { spawn "oxipaste"; }
|
|
||||||
Mod+D hotkey-overlay-title="Run Shutdown window" { spawn "oxishut"; }
|
|
||||||
Mod+M hotkey-overlay-title="Run Notification Center" { spawn "oxidash"; }
|
|
||||||
|
|
||||||
// Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.
|
|
||||||
// Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.
|
|
||||||
// For example, this is a standard bind to toggle the screen reader (orca).
|
|
||||||
// Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh "pkill orca || exec orca"; }
|
|
||||||
|
|
||||||
// Example volume keys mappings for PipeWire & WirePlumber.
|
|
||||||
// The allow-when-locked=true property makes them work even when the session is locked.
|
|
||||||
// Using spawn-sh allows to pass multiple arguments together with the command.
|
|
||||||
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+"; }
|
|
||||||
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; }
|
|
||||||
XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
|
|
||||||
XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }
|
|
||||||
|
|
||||||
// Example brightness key mappings for brightnessctl.
|
|
||||||
// You can use regular spawn with multiple arguments too (to avoid going through "sh"),
|
|
||||||
// but you need to manually put each argument in separate "" quotes.
|
|
||||||
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
|
|
||||||
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
|
|
||||||
|
|
||||||
// Open/close the Overview: a zoomed-out view of workspaces and windows.
|
|
||||||
// You can also move the mouse into the top-left hot corner,
|
|
||||||
// or do a four-finger swipe up on a touchpad.
|
|
||||||
Mod+W repeat=false { toggle-overview; }
|
|
||||||
|
|
||||||
Mod+Q repeat=false { close-window; }
|
|
||||||
|
|
||||||
Mod+Left { focus-column-left; }
|
|
||||||
Mod+Down { focus-window-down; }
|
|
||||||
Mod+Up { focus-window-up; }
|
|
||||||
Mod+Right { focus-column-right; }
|
|
||||||
Mod+J { focus-column-left; }
|
|
||||||
Mod+K { focus-window-down; }
|
|
||||||
Mod+L { focus-window-up; }
|
|
||||||
Mod+semicolon { focus-column-right; }
|
|
||||||
|
|
||||||
Mod+Ctrl+Left { move-column-left; }
|
|
||||||
Mod+Ctrl+Down { move-window-down; }
|
|
||||||
Mod+Ctrl+Up { move-window-up; }
|
|
||||||
Mod+Ctrl+Right { move-column-right; }
|
|
||||||
Mod+Ctrl+J { move-column-left; }
|
|
||||||
Mod+Ctrl+K { move-window-down; }
|
|
||||||
Mod+Ctrl+L { move-window-up; }
|
|
||||||
Mod+Ctrl+semicolon { move-column-right; }
|
|
||||||
|
|
||||||
// Alternative commands that move across workspaces when reaching
|
|
||||||
// the first or last window in a column.
|
|
||||||
// Mod+J { focus-window-or-workspace-down; }
|
|
||||||
// Mod+K { focus-window-or-workspace-up; }
|
|
||||||
// Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
|
|
||||||
// Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
|
|
||||||
|
|
||||||
Mod+Home { focus-column-first; }
|
|
||||||
Mod+End { focus-column-last; }
|
|
||||||
Mod+Ctrl+Home { move-column-to-first; }
|
|
||||||
Mod+Ctrl+End { move-column-to-last; }
|
|
||||||
|
|
||||||
Mod+Shift+Left { focus-monitor-left; }
|
|
||||||
Mod+Shift+Down { focus-monitor-down; }
|
|
||||||
Mod+Shift+Up { focus-monitor-up; }
|
|
||||||
Mod+Shift+Right { focus-monitor-right; }
|
|
||||||
Mod+Shift+H { focus-monitor-left; }
|
|
||||||
Mod+Shift+J { focus-monitor-down; }
|
|
||||||
Mod+Shift+K { focus-monitor-up; }
|
|
||||||
Mod+Shift+L { focus-monitor-right; }
|
|
||||||
|
|
||||||
Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
|
|
||||||
Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
|
|
||||||
Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
|
|
||||||
Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
|
|
||||||
Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
|
|
||||||
Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
|
|
||||||
Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
|
|
||||||
Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
|
|
||||||
|
|
||||||
// Alternatively, there are commands to move just a single window:
|
|
||||||
// Mod+Shift+Ctrl+Left { move-window-to-monitor-left; }
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// And you can also move a whole workspace to another monitor:
|
|
||||||
// Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; }
|
|
||||||
// ...
|
|
||||||
|
|
||||||
Mod+Page_Down { focus-workspace-down; }
|
|
||||||
Mod+Page_Up { focus-workspace-up; }
|
|
||||||
Mod+U { focus-workspace-down; }
|
|
||||||
Mod+I { focus-workspace-up; }
|
|
||||||
Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
|
|
||||||
Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
|
|
||||||
Mod+Ctrl+U { move-column-to-workspace-down; }
|
|
||||||
Mod+Ctrl+I { move-column-to-workspace-up; }
|
|
||||||
|
|
||||||
// Alternatively, there are commands to move just a single window:
|
|
||||||
// Mod+Ctrl+Page_Down { move-window-to-workspace-down; }
|
|
||||||
// ...
|
|
||||||
|
|
||||||
Mod+Shift+Page_Down { move-workspace-down; }
|
|
||||||
Mod+Shift+Page_Up { move-workspace-up; }
|
|
||||||
Mod+Shift+U { move-workspace-down; }
|
|
||||||
Mod+Shift+I { move-workspace-up; }
|
|
||||||
|
|
||||||
// You can bind mouse wheel scroll ticks using the following syntax.
|
|
||||||
// These binds will change direction based on the natural-scroll setting.
|
|
||||||
//
|
|
||||||
// To avoid scrolling through workspaces really fast, you can use
|
|
||||||
// the cooldown-ms property. The bind will be rate-limited to this value.
|
|
||||||
// You can set a cooldown on any bind, but it's most useful for the wheel.
|
|
||||||
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
|
|
||||||
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
|
|
||||||
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
|
|
||||||
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
|
|
||||||
|
|
||||||
Mod+WheelScrollRight { focus-column-right; }
|
|
||||||
Mod+WheelScrollLeft { focus-column-left; }
|
|
||||||
Mod+Ctrl+WheelScrollRight { move-column-right; }
|
|
||||||
Mod+Ctrl+WheelScrollLeft { move-column-left; }
|
|
||||||
|
|
||||||
// Usually scrolling up and down with Shift in applications results in
|
|
||||||
// horizontal scrolling; these binds replicate that.
|
|
||||||
Mod+Shift+WheelScrollDown { focus-column-right; }
|
|
||||||
Mod+Shift+WheelScrollUp { focus-column-left; }
|
|
||||||
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
|
|
||||||
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
|
|
||||||
|
|
||||||
// Similarly, you can bind touchpad scroll "ticks".
|
|
||||||
// Touchpad scrolling is continuous, so for these binds it is split into
|
|
||||||
// discrete intervals.
|
|
||||||
// These binds are also affected by touchpad's natural-scroll, so these
|
|
||||||
// example binds are "inverted", since we have natural-scroll enabled for
|
|
||||||
// touchpads by default.
|
|
||||||
// Mod+TouchpadScrollDown { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02+"; }
|
|
||||||
// Mod+TouchpadScrollUp { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.02-"; }
|
|
||||||
|
|
||||||
// You can refer to workspaces by index. However, keep in mind that
|
|
||||||
// niri is a dynamic workspace system, so these commands are kind of
|
|
||||||
// "best effort". Trying to refer to a workspace index bigger than
|
|
||||||
// the current workspace count will instead refer to the bottommost
|
|
||||||
// (empty) workspace.
|
|
||||||
//
|
|
||||||
// For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on
|
|
||||||
// will all refer to the 3rd workspace.
|
|
||||||
Mod+1 { focus-workspace 1; }
|
|
||||||
Mod+2 { focus-workspace 2; }
|
|
||||||
Mod+3 { focus-workspace 3; }
|
|
||||||
Mod+4 { focus-workspace 4; }
|
|
||||||
Mod+5 { focus-workspace 5; }
|
|
||||||
Mod+6 { focus-workspace 6; }
|
|
||||||
Mod+7 { focus-workspace 7; }
|
|
||||||
Mod+8 { focus-workspace 8; }
|
|
||||||
Mod+9 { focus-workspace 9; }
|
|
||||||
Mod+Ctrl+1 { move-column-to-workspace 1; }
|
|
||||||
Mod+Ctrl+2 { move-column-to-workspace 2; }
|
|
||||||
Mod+Ctrl+3 { move-column-to-workspace 3; }
|
|
||||||
Mod+Ctrl+4 { move-column-to-workspace 4; }
|
|
||||||
Mod+Ctrl+5 { move-column-to-workspace 5; }
|
|
||||||
Mod+Ctrl+6 { move-column-to-workspace 6; }
|
|
||||||
Mod+Ctrl+7 { move-column-to-workspace 7; }
|
|
||||||
Mod+Ctrl+8 { move-column-to-workspace 8; }
|
|
||||||
Mod+Ctrl+9 { move-column-to-workspace 9; }
|
|
||||||
|
|
||||||
// Alternatively, there are commands to move just a single window:
|
|
||||||
// Mod+Ctrl+1 { move-window-to-workspace 1; }
|
|
||||||
|
|
||||||
// Switches focus between the current and the previous workspace.
|
|
||||||
// Mod+Tab { focus-workspace-previous; }
|
|
||||||
|
|
||||||
// The following binds move the focused window in and out of a column.
|
|
||||||
// If the window is alone, they will consume it into the nearby column to the side.
|
|
||||||
// If the window is already in a column, they will expel it out.
|
|
||||||
Mod+BracketLeft { consume-or-expel-window-left; }
|
|
||||||
Mod+BracketRight { consume-or-expel-window-right; }
|
|
||||||
|
|
||||||
// Consume one window from the right to the bottom of the focused column.
|
|
||||||
Mod+Comma { consume-window-into-column; }
|
|
||||||
// Expel the bottom window from the focused column to the right.
|
|
||||||
Mod+Period { expel-window-from-column; }
|
|
||||||
|
|
||||||
Mod+Y { switch-preset-column-width; }
|
|
||||||
// Cycling through the presets in reverse order is also possible.
|
|
||||||
// Mod+R { switch-preset-column-width-back; }
|
|
||||||
Mod+Shift+R { switch-preset-window-height; }
|
|
||||||
Mod+Ctrl+R { reset-window-height; }
|
|
||||||
Mod+B { fullscreen-window; }
|
|
||||||
|
|
||||||
// Expand the focused column to space not taken up by other fully visible columns.
|
|
||||||
// Makes the column "fill the rest of the space".
|
|
||||||
Mod+Ctrl+F { expand-column-to-available-width; }
|
|
||||||
|
|
||||||
Mod+C { center-column; }
|
|
||||||
|
|
||||||
// Center all fully visible columns on screen.
|
|
||||||
Mod+Ctrl+C { center-visible-columns; }
|
|
||||||
|
|
||||||
// Finer width adjustments.
|
|
||||||
// This command can also:
|
|
||||||
// * set width in pixels: "1000"
|
|
||||||
// * adjust width in pixels: "-5" or "+5"
|
|
||||||
// * set width as a percentage of screen width: "25%"
|
|
||||||
// * adjust width as a percentage of screen width: "-10%" or "+10%"
|
|
||||||
// Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,
|
|
||||||
// set-column-width "100" will make the column occupy 200 physical screen pixels.
|
|
||||||
Mod+Minus { set-column-width "-10%"; }
|
|
||||||
Mod+Equal { set-column-width "+10%"; }
|
|
||||||
|
|
||||||
// Finer height adjustments when in column with other windows.
|
|
||||||
Mod+Shift+Minus { set-window-height "-10%"; }
|
|
||||||
Mod+Shift+Equal { set-window-height "+10%"; }
|
|
||||||
|
|
||||||
// Move the focused window between the floating and the tiling layout.
|
|
||||||
Mod+V { toggle-window-floating; }
|
|
||||||
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
|
|
||||||
|
|
||||||
// Toggle tabbed column display mode.
|
|
||||||
// Windows in this column will appear as vertical tabs,
|
|
||||||
// rather than stacked on top of each other.
|
|
||||||
// Mod+W { toggle-column-tabbed-display; }
|
|
||||||
|
|
||||||
// Actions to switch layouts.
|
|
||||||
// Note: if you uncomment these, make sure you do NOT have
|
|
||||||
// a matching layout switch hotkey configured in xkb options above.
|
|
||||||
// Having both at once on the same hotkey will break the switching,
|
|
||||||
// since it will switch twice upon pressing the hotkey (once by xkb, once by niri).
|
|
||||||
// Mod+Space { switch-layout "next"; }
|
|
||||||
// Mod+Shift+Space { switch-layout "prev"; }
|
|
||||||
|
|
||||||
Mod+S { screenshot; }
|
|
||||||
Ctrl+Print { screenshot-screen; }
|
|
||||||
Alt+Print { screenshot-window; }
|
|
||||||
|
|
||||||
// Applications such as remote-desktop clients and software KVM switches may
|
|
||||||
// request that niri stops processing the keyboard shortcuts defined here
|
|
||||||
// so they may, for example, forward the key presses as-is to a remote machine.
|
|
||||||
// It's a good idea to bind an escape hatch to toggle the inhibitor,
|
|
||||||
// so a buggy application can't hold your session hostage.
|
|
||||||
//
|
|
||||||
// The allow-inhibiting=false property can be applied to other binds as well,
|
|
||||||
// which ensures niri always processes them, even when an inhibitor is active.
|
|
||||||
Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
|
|
||||||
|
|
||||||
// The quit action will show a confirmation dialog to avoid accidental exits.
|
|
||||||
Mod+Shift+M { quit; }
|
|
||||||
// Ctrl+Alt+Delete { quit; }
|
|
||||||
|
|
||||||
// Powers off the monitors. To turn them back on, do any input like
|
|
||||||
// moving the mouse or pressing any other key.
|
|
||||||
Mod+Shift+P { power-off-monitors; }
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -54,8 +54,8 @@
|
||||||
lib.optionalAttrs (options ? home.packages) {
|
lib.optionalAttrs (options ? home.packages) {
|
||||||
programs = {
|
programs = {
|
||||||
hyprdock = {
|
hyprdock = {
|
||||||
enable = config.mods.oxi.hyprdock.enable;
|
inherit (config.mods.oxi.hyprdock) enable;
|
||||||
settings = config.mods.oxi.hyprdock.settings;
|
inherit (config.mods.oxi.hyprdock) settings;
|
||||||
};
|
};
|
||||||
oxicalc.enable = lib.mkIf config.mods.oxi.oxicalc.enable true;
|
oxicalc.enable = lib.mkIf config.mods.oxi.oxicalc.enable true;
|
||||||
ReSet = lib.mkIf config.mods.oxi.ReSet.enable {
|
ReSet = lib.mkIf config.mods.oxi.ReSet.enable {
|
||||||
|
|
@ -75,7 +75,7 @@
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
// lib.optionalAttrs (options ? services.logind) {
|
// lib.optionalAttrs (options ? services.logind) {
|
||||||
services.logind.lidSwitchExternalPower = "ignore";
|
services.logind.settings.Login.HandleLidSwitchExternalPower = "ignore";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
403
modules/programs/wm.nix
Normal file
403
modules/programs/wm.nix
Normal file
|
|
@ -0,0 +1,403 @@
|
||||||
|
{lib, ...}: let
|
||||||
|
wmWorkspace = with lib.types; {
|
||||||
|
options = {
|
||||||
|
name = lib.mkOption {
|
||||||
|
default = "";
|
||||||
|
example = "1";
|
||||||
|
type = str;
|
||||||
|
description = "Name of the workspace";
|
||||||
|
};
|
||||||
|
default = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
type = bool;
|
||||||
|
description = "Whether the workspace is the default workspace. (Currently doesn't do anything on niri)";
|
||||||
|
};
|
||||||
|
monitor = lib.mkOption {
|
||||||
|
default = "";
|
||||||
|
example = "DP-1";
|
||||||
|
type = str;
|
||||||
|
description = "Name of the monitor to bind the workspace to";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
wmOptions = with lib.types; {
|
||||||
|
options = {
|
||||||
|
name = lib.mkOption {
|
||||||
|
default = "DP-1";
|
||||||
|
example = "DP-1";
|
||||||
|
type = str;
|
||||||
|
description = "Name of the monitor";
|
||||||
|
};
|
||||||
|
resolutionX = lib.mkOption {
|
||||||
|
default = 1920;
|
||||||
|
example = 2560;
|
||||||
|
type = number;
|
||||||
|
description = "ResolutionX of the monitor";
|
||||||
|
};
|
||||||
|
resolutionY = lib.mkOption {
|
||||||
|
default = 1080;
|
||||||
|
example = 1440;
|
||||||
|
type = number;
|
||||||
|
description = "ResolutionY of the monitor";
|
||||||
|
};
|
||||||
|
refreshrate = lib.mkOption {
|
||||||
|
default = 60;
|
||||||
|
example = 144;
|
||||||
|
type = number;
|
||||||
|
description = "Refreshrate of the monitor";
|
||||||
|
};
|
||||||
|
positionX = lib.mkOption {
|
||||||
|
default = 0;
|
||||||
|
example = 1920;
|
||||||
|
type = number;
|
||||||
|
description = "PositionX of the monitor";
|
||||||
|
};
|
||||||
|
positionY = lib.mkOption {
|
||||||
|
default = 0;
|
||||||
|
example = 1080;
|
||||||
|
type = number;
|
||||||
|
description = "PositionY of the monitor";
|
||||||
|
};
|
||||||
|
scale = lib.mkOption {
|
||||||
|
default = 1;
|
||||||
|
example = 2;
|
||||||
|
type = number;
|
||||||
|
description = "Scale of the monitor";
|
||||||
|
};
|
||||||
|
transform = lib.mkOption {
|
||||||
|
default = "0";
|
||||||
|
example = "90";
|
||||||
|
type = enum ["0" "90" "180" "270" "360"];
|
||||||
|
description = "Transform of the monitor";
|
||||||
|
};
|
||||||
|
vrr = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
type = bool;
|
||||||
|
description = "VRR status of the monitor";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
modKeys = lib.types.enum ["Mod" "Super" "Alt" "Shift" "Ctrl"];
|
||||||
|
|
||||||
|
customCommand = with lib.types; {
|
||||||
|
options = {
|
||||||
|
niri = lib.mkOption {
|
||||||
|
default = null;
|
||||||
|
example = "kitty";
|
||||||
|
type = either null str;
|
||||||
|
description = "Command to use in niri";
|
||||||
|
};
|
||||||
|
hyprland = lib.mkOption {
|
||||||
|
default = null;
|
||||||
|
example = "kitty";
|
||||||
|
type = either null str;
|
||||||
|
description = "Command to use in hyprland";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
envOptions = with lib.types; {
|
||||||
|
options = {
|
||||||
|
all = lib.mkOption {
|
||||||
|
default = {};
|
||||||
|
example = {};
|
||||||
|
type = attrsOf str;
|
||||||
|
description = "General Env";
|
||||||
|
};
|
||||||
|
niri = lib.mkOption {
|
||||||
|
default = {};
|
||||||
|
example = {};
|
||||||
|
type = attrsOf str;
|
||||||
|
description = "Niri Env";
|
||||||
|
};
|
||||||
|
hyprland = lib.mkOption {
|
||||||
|
default = {};
|
||||||
|
example = {};
|
||||||
|
type = attrsOf str;
|
||||||
|
description = "Hyprland Env";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
startupOptions = with lib.types; {
|
||||||
|
options = {
|
||||||
|
all = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = [];
|
||||||
|
type = listOf str;
|
||||||
|
description = "General Startup commands";
|
||||||
|
};
|
||||||
|
niri = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = [];
|
||||||
|
type = listOf str;
|
||||||
|
description = "Niri Startup commands";
|
||||||
|
};
|
||||||
|
hyprland = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = [];
|
||||||
|
type = listOf str;
|
||||||
|
description = "Hyprland Startup commands";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
windowRuleOptions = with lib.types; {
|
||||||
|
options = {
|
||||||
|
niri = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = [];
|
||||||
|
type = listOf lines;
|
||||||
|
description = "Niri window rules";
|
||||||
|
};
|
||||||
|
hyprland = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = [];
|
||||||
|
type = listOf str;
|
||||||
|
description = "Hyprland window rules";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
bindOptions = with lib.types; {
|
||||||
|
options = {
|
||||||
|
modKeys = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = ["Mod"];
|
||||||
|
type = listOf modKeys;
|
||||||
|
description = "List of modifier keys";
|
||||||
|
};
|
||||||
|
key = lib.mkOption {
|
||||||
|
default = "";
|
||||||
|
example = "Q";
|
||||||
|
type = str;
|
||||||
|
description = "Key to bind";
|
||||||
|
};
|
||||||
|
command = lib.mkOption {
|
||||||
|
default = "";
|
||||||
|
example = "killActive";
|
||||||
|
type = either (submodule customCommand) (enum [
|
||||||
|
"spawn"
|
||||||
|
"spawn-sh"
|
||||||
|
"quit"
|
||||||
|
"killActive"
|
||||||
|
"moveFocusUp"
|
||||||
|
"moveFocusRight"
|
||||||
|
"moveFocusDown"
|
||||||
|
"moveFocusLeft"
|
||||||
|
"moveWindowUp"
|
||||||
|
"moveWindowRight"
|
||||||
|
"moveWindowDown"
|
||||||
|
"moveWindowLeft"
|
||||||
|
"focusWorkspace"
|
||||||
|
"moveToWorkspace"
|
||||||
|
"toggleFloating"
|
||||||
|
"toggleFullscreen"
|
||||||
|
]);
|
||||||
|
description = "Command to execute";
|
||||||
|
};
|
||||||
|
args = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = [];
|
||||||
|
type = listOf str;
|
||||||
|
description = "Additional arguments for the command";
|
||||||
|
};
|
||||||
|
meta = lib.mkOption {
|
||||||
|
default = {};
|
||||||
|
example = {};
|
||||||
|
type = submodule {
|
||||||
|
options = {
|
||||||
|
niri = lib.mkOption {
|
||||||
|
default = {};
|
||||||
|
type = submodule {
|
||||||
|
options = {
|
||||||
|
desc = lib.mkOption {
|
||||||
|
default = "";
|
||||||
|
type = str;
|
||||||
|
description = "Description for Hotkey overview";
|
||||||
|
};
|
||||||
|
repeat = lib.mkOption {
|
||||||
|
type = bool;
|
||||||
|
default = true;
|
||||||
|
description = "Whether to repeat the keybind on hold";
|
||||||
|
};
|
||||||
|
allowInhibit = lib.mkOption {
|
||||||
|
type = bool;
|
||||||
|
default = true;
|
||||||
|
description = "Whether to allow inhibiting";
|
||||||
|
};
|
||||||
|
allowWhileLocked = lib.mkOption {
|
||||||
|
type = bool;
|
||||||
|
default = false;
|
||||||
|
description = "Whether to allow while locked";
|
||||||
|
};
|
||||||
|
cooldown = lib.mkOption {
|
||||||
|
type = number;
|
||||||
|
default = 0;
|
||||||
|
description = "Cooldown on bind";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
description = "Niri meta for keybinds";
|
||||||
|
};
|
||||||
|
hyprland = lib.mkOption {
|
||||||
|
default = {};
|
||||||
|
type = submodule {
|
||||||
|
options = {
|
||||||
|
repeat = lib.mkOption {
|
||||||
|
type = bool;
|
||||||
|
default = true;
|
||||||
|
description = "Whether to repeat the keybind on hold";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
description = "Niri meta for keybinds";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
description = "Custom metadata per bind. Note, only supported environments are taken into account.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options.mods.wm = {
|
||||||
|
modKey = lib.mkOption {
|
||||||
|
default = "Super";
|
||||||
|
example = "Alt";
|
||||||
|
type = modKeys;
|
||||||
|
description = "Mod key";
|
||||||
|
};
|
||||||
|
|
||||||
|
env = lib.mkOption {
|
||||||
|
default = {};
|
||||||
|
example = {
|
||||||
|
all = {
|
||||||
|
EDITOR = "Neovim";
|
||||||
|
};
|
||||||
|
niri = {
|
||||||
|
EDITOR = "Emacs";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
type = with lib.types; either (submodule envOptions) (attrsOf str);
|
||||||
|
description = "Environment configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
useDefaultEnv = lib.mkOption {
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
type = lib.types.bool;
|
||||||
|
description = "Whether to use default env variables";
|
||||||
|
};
|
||||||
|
|
||||||
|
startup = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = {
|
||||||
|
all = ["oxinoti"];
|
||||||
|
niri = ["someniricommand"];
|
||||||
|
hyprland = ["somehyprlandcommand"];
|
||||||
|
};
|
||||||
|
type = with lib.types; either (submodule startupOptions) (listOf str);
|
||||||
|
description = "Start commands";
|
||||||
|
};
|
||||||
|
|
||||||
|
useDefaultStartup = lib.mkOption {
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
type = lib.types.bool;
|
||||||
|
description = "Whether to use default autostart commands";
|
||||||
|
};
|
||||||
|
|
||||||
|
useDefaultWindowRules = lib.mkOption {
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
type = lib.types.bool;
|
||||||
|
description = "Whether to use default window rules";
|
||||||
|
};
|
||||||
|
|
||||||
|
windowRules = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = {
|
||||||
|
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"
|
||||||
|
''
|
||||||
|
];
|
||||||
|
};
|
||||||
|
type = lib.types.submodule windowRuleOptions;
|
||||||
|
description = "Window rules";
|
||||||
|
};
|
||||||
|
|
||||||
|
workspaces = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = [
|
||||||
|
{
|
||||||
|
name = "chat";
|
||||||
|
monitor = "DP-1";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
type =
|
||||||
|
lib.types.listOf (lib.types.submodule wmWorkspace);
|
||||||
|
description = "Workspace configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
monitors = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = [
|
||||||
|
{
|
||||||
|
name = "DP-1";
|
||||||
|
resolutionX = 1920;
|
||||||
|
resolutionY = 1080;
|
||||||
|
refreshrate = 144;
|
||||||
|
positionX = 0;
|
||||||
|
positionY = 0;
|
||||||
|
scale = 1;
|
||||||
|
transform = "0";
|
||||||
|
vrr = false;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
type =
|
||||||
|
lib.types.listOf (lib.types.submodule wmOptions);
|
||||||
|
description = "Monitor configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
useDefaultBinds = lib.mkOption {
|
||||||
|
default = true;
|
||||||
|
example = false;
|
||||||
|
type = lib.types.bool;
|
||||||
|
description = "Whether to use default keybinds";
|
||||||
|
};
|
||||||
|
|
||||||
|
binds = lib.mkOption {
|
||||||
|
default = [];
|
||||||
|
example = [
|
||||||
|
{
|
||||||
|
modKeys = ["Mod"];
|
||||||
|
key = "Q";
|
||||||
|
command = "killActive";
|
||||||
|
args = [];
|
||||||
|
meta = {
|
||||||
|
niri = {
|
||||||
|
desc = "Kill the active window";
|
||||||
|
repeat = false;
|
||||||
|
};
|
||||||
|
hyprland = {};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
type =
|
||||||
|
lib.types.listOf (lib.types.submodule bindOptions);
|
||||||
|
description = "Bind configuration";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue