feat(niri): XF86 keysym actions

This commit is contained in:
js0ny 2025-11-11 04:33:45 +00:00
parent 40f9eeed47
commit 73c6e134ad
11 changed files with 478 additions and 306 deletions

View file

@ -13,9 +13,10 @@ Remote | Git Branch | Diagnostics | Command | | MID | | Line:Column | Indent | E
-- Config -- Config
local config = { local config = {
options = { options = {
disabled_filetypes = { -- While setting globalstatus, always enable lualine
statusline = { "NvimTree", "alpha", "grug-far", "snacks_dashboard", "Avante", "AvanteInput" }, -- disabled_filetypes = {
}, -- statusline = { "NvimTree", "alpha", "grug-far", "snacks_dashboard", "Avante", "AvanteInput", "neo-tree" },
-- },
-- Disable sections and component separators -- Disable sections and component separators
component_separators = { left = "", right = "" }, component_separators = { left = "", right = "" },
section_separators = { left = "", right = "" }, section_separators = { left = "", right = "" },

View file

@ -79,11 +79,63 @@ return {
}, },
-- fill any relevant options here -- fill any relevant options here
filesystem = { filesystem = {
filtered_items = {
visible = false,
hide_dotfiles = true,
hide_gitignored = true,
hide_ignored = true,
ignore_files = {
".neotreeignore",
".ignore",
},
hide_hidden = true, -- Windows
hide_by_name = {
"node_modules",
},
always_show = {
".gitignore",
},
always_show_by_pattern = {
".env",
},
never_show = {
".DS_Store",
"thumbs.db",
},
},
group_empty_dirs = true,
follow_current_file = { follow_current_file = {
enabled = true, enabled = true,
leave_dirs_open = true, leave_dirs_open = true,
}, },
}, },
git_status = {
window = {
position = "float",
mappings = {
["A"] = "git_add_all",
["gu"] = "git_unstage_file",
["gU"] = "git_undo_last_commit",
["ga"] = "git_add_file",
["gr"] = "git_revert_file",
["gc"] = "git_commit",
["gp"] = "git_push",
["gg"] = "git_commit_and_push",
["o"] = {
"show_help",
nowait = false,
config = { title = "Order by", prefix_key = "o" },
},
["oc"] = { "order_by_created", nowait = false },
["od"] = { "order_by_diagnostics", nowait = false },
["om"] = { "order_by_modified", nowait = false },
["on"] = { "order_by_name", nowait = false },
["os"] = { "order_by_size", nowait = false },
["ot"] = { "order_by_type", nowait = false },
},
},
},
}, },
keys = { keys = {
{ {

View file

@ -40,4 +40,16 @@
description = "Default icon theme"; description = "Default icon theme";
}; };
}; };
options.currentHost = {
keyboardBacklightDevice = lib.mkOption {
type = lib.types.str;
default = "";
description = "Device Identifier that used for brightnessctl, get the identifier via brightnessctl --list";
};
keyboardBacklightStep = lib.mkOption {
type = lib.types.str;
default = "34%";
description = "Step to change keyboard backlight, integer or percentage accepted";
};
};
} }

View file

@ -21,6 +21,4 @@ in {
]; ];
home.sessionVariables.TERMINAL = config.currentUser.defaultTerminal; home.sessionVariables.TERMINAL = config.currentUser.defaultTerminal;
home.stateVersion = "25.05";
} }

View file

@ -1,294 +0,0 @@
{
config,
pkgs,
...
}: let
term = config.currentUser.defaultTerminal;
termRunner = config.currentUser.defaultTerminalRunner;
iconTheme = config.currentUser.iconTheme;
explorer = config.currentUser.defaultExplorer;
explorerTerm = config.currentUser.defaultTerminalExplorer;
launcher = "rofi";
in {
imports = [
./packages.nix
];
programs.niri = {
enable = true;
package = pkgs.niri;
settings = {
prefer-no-csd = true;
screenshot-path = "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png";
spawn-at-startup = [
{argv = ["waybar"];}
{argv = ["dunst"];}
{argv = ["fcitx5"];}
# polkit/portal helpers
{argv = ["${pkgs.kdePackages.xdg-desktop-portal-kde}/libexec/xdg-desktop-portal-kde"];}
{argv = ["${pkgs.hyprpolkitagent}/libexec/hyprpolkitagent"];}
];
input = {
keyboard = {
xkb = {};
numlock = true;
};
touchpad = {
tap = true;
natural-scroll = true;
};
mouse = {};
trackpoint = {};
};
layout = {
gaps = 16;
center-focused-column = "never";
preset-column-widths = [
{proportion = 0.33333;}
{proportion = 0.5;}
{proportion = 0.66667;}
];
default-column-width = {proportion = 0.5;};
focus-ring = {
enable = true;
width = 4;
active.color = "#7fc8ff";
inactive.color = "#505050";
};
border = {
enable = false;
width = 4;
active.color = "#ffc87f";
inactive.color = "#505050";
urgent.color = "#9b0000";
};
shadow = {
enable = false;
softness = 30;
spread = 5;
offset = {
x = 0;
y = 5;
};
color = "#0007";
};
};
window-rules = [
{
matches = [
{
app-id = "firefox$";
title = "^Picture-in-Picture$";
}
# Anki add new flashcard
{
app-id = "^anki$";
title = "^Add$";
}
# Dolphin compressing files
{
app-id = "^org.kde.dolphin$";
title = "^Compressing.*$";
}
{
app-id = "^thunar$";
title = "^File Operation Progress$";
}
### IM Medias
{
app-id = "^QQ$";
title = "^$";
}
{
app-id = "^org.telegram.desktop$";
title = "^Media viewer$";
}
{
app-id = "^wechat$";
title = "^$";
}
{
app-id = "^org.pulseaudio.pavucontrol$";
title = "^Volume Control$";
}
];
open-floating = true;
}
];
binds = with config.lib.niri.actions; {
"Mod+Shift+Slash".action = show-hotkey-overlay;
"Mod+Return".hotkey-overlay.title = "Open a Terminal: ${term}";
"Mod+Return".action = spawn "${term}";
"Mod+D".hotkey-overlay.title = "Run an Application: rofi";
"Mod+D".action =
spawn "${launcher}" "-show" "drun" "-icon-theme" "${iconTheme}" "-show-icons";
"Alt+Space".hotkey-overlay.title = "Run an Application: rofi";
"Alt+Space".action =
spawn "${launcher}" "-show" "drun" "-icon-theme" "${iconTheme}" "-show-icons";
"Mod+Shift+W".hotkey-overlay.title = "Search open Window: rofi";
"Mod+Shift+W".action =
spawn "${launcher}" "-show" "window" "-icon-theme" "${iconTheme}" "-show-icons";
"Mod+E".hotkey-overlay.title = "Run file explorer";
"Mod+E".action = spawn "${explorer}";
"Mod+Shift+E".hotkey-overlay.title = "Run terminal explorer";
"Mod+Shift+E".action = spawn "${termRunner}" "${explorerTerm}";
"XF86AudioRaiseVolume".allow-when-locked = true;
"XF86AudioRaiseVolume".action =
spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+";
"XF86AudioLowerVolume".allow-when-locked = true;
"XF86AudioLowerVolume".action =
spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-";
"XF86AudioMute".allow-when-locked = true;
"XF86AudioMute".action = spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle";
"XF86AudioMicMute".allow-when-locked = true;
"XF86AudioMicMute".action = spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle";
"Mod+Tab".action = toggle-overview;
"Mod+Q".action = close-window;
"Mod+Left".action = focus-column-left;
"Mod+Down".action = focus-window-down;
"Mod+Up".action = focus-window-up;
"Mod+Right".action = focus-column-right;
"Mod+H".action = focus-column-left;
"Mod+J".action = focus-window-down;
"Mod+K".action = focus-window-up;
"Mod+L".action = focus-column-right;
"Mod+Shift+Left".action = move-column-left;
"Mod+Shift+Down".action = move-window-down;
"Mod+Shift+Up".action = move-window-up;
"Mod+Shift+Right".action = move-column-right;
"Mod+Shift+H".action = move-column-left;
"Mod+Shift+J".action = move-window-down;
"Mod+Shift+K".action = move-window-up;
"Mod+Shift+L".action = move-column-right;
"Mod+Home".action = focus-column-first;
"Mod+End".action = focus-column-last;
"Mod+Ctrl+Home".action = move-column-to-first;
"Mod+Ctrl+End".action = move-column-to-last;
"Mod+Alt+Left".action = focus-monitor-left;
"Mod+Alt+Down".action = focus-monitor-down;
"Mod+Alt+Up".action = focus-monitor-up;
"Mod+Alt+Right".action = focus-monitor-right;
"Mod+Alt+H".action = focus-monitor-left;
"Mod+Alt+J".action = focus-monitor-down;
"Mod+Alt+K".action = focus-monitor-up;
"Mod+Alt+L".action = focus-monitor-right;
"Mod+Shift+Ctrl+Left".action = move-column-to-monitor-left;
"Mod+Shift+Ctrl+Down".action = move-column-to-monitor-down;
"Mod+Shift+Ctrl+Up".action = move-column-to-monitor-up;
"Mod+Shift+Ctrl+Right".action = move-column-to-monitor-right;
"Mod+Shift+Ctrl+H".action = move-column-to-monitor-left;
"Mod+Shift+Ctrl+J".action = move-column-to-monitor-down;
"Mod+Shift+Ctrl+K".action = move-column-to-monitor-up;
"Mod+Shift+Ctrl+L".action = move-column-to-monitor-right;
"Mod+Page_Down".action = focus-workspace-down;
"Mod+Page_Up".action = focus-workspace-up;
"Mod+U".action = focus-workspace-down;
"Mod+I".action = focus-workspace-up;
"Mod+Ctrl+Page_Down".action = move-column-to-workspace-down;
"Mod+Ctrl+Page_Up".action = move-column-to-workspace-up;
"Mod+Ctrl+U".action = move-column-to-workspace-down;
"Mod+Ctrl+I".action = move-column-to-workspace-up;
"Mod+Shift+Page_Down".action = move-workspace-down;
"Mod+Shift+Page_Up".action = move-workspace-up;
"Mod+Shift+U".action = move-workspace-down;
"Mod+Shift+I".action = move-workspace-up;
"Mod+WheelScrollDown".cooldown-ms = 150;
"Mod+WheelScrollDown".action = focus-workspace-down;
"Mod+WheelScrollUp".cooldown-ms = 150;
"Mod+WheelScrollUp".action = focus-workspace-up;
"Mod+Ctrl+WheelScrollDown".cooldown-ms = 150;
"Mod+Ctrl+WheelScrollDown".action = move-column-to-workspace-down;
"Mod+Ctrl+WheelScrollUp".cooldown-ms = 150;
"Mod+Ctrl+WheelScrollUp".action = move-column-to-workspace-up;
"Mod+WheelScrollRight".action = focus-column-right;
"Mod+WheelScrollLeft".action = focus-column-left;
"Mod+Ctrl+WheelScrollRight".action = move-column-right;
"Mod+Ctrl+WheelScrollLeft".action = move-column-left;
"Mod+Shift+WheelScrollDown".action = focus-column-right;
"Mod+Shift+WheelScrollUp".action = focus-column-left;
"Mod+Ctrl+Shift+WheelScrollDown".action = move-column-right;
"Mod+Ctrl+Shift+WheelScrollUp".action = move-column-left;
"Mod+1".action = focus-workspace 1;
"Mod+2".action = focus-workspace 2;
"Mod+3".action = focus-workspace 3;
"Mod+4".action = focus-workspace 4;
"Mod+5".action = focus-workspace 5;
"Mod+6".action = focus-workspace 6;
"Mod+7".action = focus-workspace 7;
"Mod+8".action = focus-workspace 8;
"Mod+9".action = focus-workspace 9;
"Mod+Shift+1".action.move-column-to-workspace = 1;
"Mod+Shift+2".action.move-column-to-workspace = 2;
"Mod+Shift+3".action.move-column-to-workspace = 3;
"Mod+Shift+4".action.move-column-to-workspace = 4;
"Mod+Shift+5".action.move-column-to-workspace = 5;
"Mod+Shift+6".action.move-column-to-workspace = 6;
"Mod+Shift+7".action.move-column-to-workspace = 7;
"Mod+Shift+8".action.move-column-to-workspace = 8;
"Mod+Shift+9".action.move-column-to-workspace = 9;
"Mod+BracketLeft".action = consume-or-expel-window-left;
"Mod+BracketRight".action = consume-or-expel-window-right;
"Mod+Comma".action = consume-window-into-column;
"Mod+Period".action = expel-window-from-column;
"Mod+R".action = switch-preset-column-width;
"Mod+Shift+R".action = switch-preset-window-height;
"Mod+Ctrl+R".action = reset-window-height;
"Mod+F".action = maximize-column;
"Mod+Shift+M".action = fullscreen-window;
"Mod+Ctrl+F".action = expand-column-to-available-width;
"Mod+C".action = center-column;
"Mod+Ctrl+C".action = center-visible-columns;
"Mod+Minus".action = set-column-width "-10%";
"Mod+Equal".action = set-column-width "+10%";
"Mod+Shift+Minus".action = set-window-height "-10%";
"Mod+Shift+Equal".action = set-window-height "+10%";
"Mod+V".action = toggle-window-floating;
"Mod+Shift+V".action = switch-focus-between-floating-and-tiling;
"Mod+W".action = toggle-column-tabbed-display;
"Mod+Shift+S".action.screenshot = {show-pointer = true;};
"Print".action.screenshot = {show-pointer = true;};
# "Ctrl+Print".action.screenshot-screen = {true};
"Alt+Print".action.screenshot-window = {write-to-disk = true;};
"Mod+Escape".allow-inhibiting = false;
"Mod+Escape".action = toggle-keyboard-shortcuts-inhibit;
"Ctrl+Alt+Delete".action = quit;
};
};
};
}

View file

@ -0,0 +1,81 @@
{pkgs, ...}: {
imports = [
../packages.nix
./window-rules.nix
./keymaps.nix
];
programs.niri = {
enable = true;
package = pkgs.niri;
settings = {
prefer-no-csd = true;
screenshot-path = "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png";
spawn-at-startup = [
{argv = ["waybar"];}
{argv = ["dunst"];}
{argv = ["fcitx5"];}
# polkit/portal helpers
{argv = ["${pkgs.kdePackages.xdg-desktop-portal-kde}/libexec/xdg-desktop-portal-kde"];}
{argv = ["${pkgs.hyprpolkitagent}/libexec/hyprpolkitagent"];}
];
input = {
keyboard = {
xkb = {};
numlock = true;
};
touchpad = {
tap = true;
natural-scroll = true;
disabled-on-external-mouse = true;
};
mouse = {};
trackpoint = {};
};
layout = {
gaps = 16;
center-focused-column = "never";
preset-column-widths = [
{proportion = 0.33333;}
{proportion = 0.5;}
{proportion = 0.66667;}
];
default-column-width = {proportion = 0.5;};
focus-ring = {
enable = true;
width = 4;
active.color = "#7fc8ff";
inactive.color = "#505050";
};
border = {
enable = false;
width = 4;
active.color = "#ffc87f";
inactive.color = "#505050";
urgent.color = "#9b0000";
};
shadow = {
enable = false;
softness = 30;
spread = 5;
offset = {
x = 0;
y = 5;
};
color = "#0007";
};
};
};
};
}

View file

@ -0,0 +1,204 @@
{config, ...}: let
term = config.currentUser.defaultTerminal;
termRunner = config.currentUser.defaultTerminalRunner;
iconTheme = config.currentUser.iconTheme;
explorer = config.currentUser.defaultExplorer;
explorerTerm = config.currentUser.defaultTerminalExplorer;
launcher = "rofi";
kbdBacklightDev = config.currentHost.keyboardBacklightDevice;
kbdBacklightStep = config.currentHost.keyboardBacklightStep;
in {
programs.niri.settings.binds = with config.lib.niri.actions; {
"Mod+Shift+Slash".action = show-hotkey-overlay;
"Mod+Return".hotkey-overlay.title = "Open a Terminal: ${term}";
"Mod+Return".action = spawn "${term}";
"Mod+D".hotkey-overlay.title = "Run an Application: rofi";
"Mod+D".action =
spawn "${launcher}" "-show" "drun" "-icon-theme" "${iconTheme}" "-show-icons";
"Alt+Space".hotkey-overlay.title = "Run an Application: rofi";
"Alt+Space".action =
spawn "${launcher}" "-show" "drun" "-icon-theme" "${iconTheme}" "-show-icons";
"Mod+Shift+W".hotkey-overlay.title = "Search open Window: rofi";
"Mod+Shift+W".action =
spawn "${launcher}" "-show" "window" "-icon-theme" "${iconTheme}" "-show-icons";
"Mod+E".hotkey-overlay.title = "Run file explorer";
"Mod+E".action = spawn "${explorer}";
"Mod+Shift+E".hotkey-overlay.title = "Run terminal explorer";
"Mod+Shift+E".action = spawn "${termRunner}" "-e" "${explorerTerm}";
"XF86AudioRaiseVolume".allow-when-locked = true;
"XF86AudioRaiseVolume".action =
spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+";
"XF86AudioLowerVolume".allow-when-locked = true;
"XF86AudioLowerVolume".action =
spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-";
"XF86AudioMute".allow-when-locked = true;
"XF86AudioMute".action = spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle";
"XF86AudioMicMute".allow-when-locked = true;
"XF86AudioMicMute".action = spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle";
"XF86MonBrightnessUp" = {
action = spawn "brightnessctl" "set" "10%+";
allow-when-locked = true;
};
"XF86MonBrightnessDown" = {
action = spawn "brightnessctl" "set" "10%-";
allow-when-locked = true;
};
"XF86AudioPrev".action = spawn "playerctl" "previous";
"XF86AudioNext".action = spawn "playerctl" "next";
"XF86AudioPlay".action = spawn "playerctl" "playpause";
# NOTE: This is a host-specific config
# G14 Built-in Fn+Enter
"XF86Calculator".action = spawn "";
# INFO: Seems that niri does not support touchpad toggle, waiting for upstream implementation.
"XF86TouchpadToggle".action = spawn "";
# TODO: Write logic for default case
"XF86KbdBrightnessUp".action = spawn "brightnessctl" "--device" "${kbdBacklightDev}" "set" "${kbdBacklightStep}+";
"XF86KbdBrightnessDown".action = spawn "brightnessctl" "--device" "${kbdBacklightDev}" "set" "${kbdBacklightStep}-";
# NOTE: This is a host-specific config
# G14 Power Profiles Switcher
# ROG Key: XF86Launch1
# AURA Key: XF86Launch3
# Fan Key: XF86Launch4
"XF86Launch4".action = spawn "powerprofiles-next"; # See ../packages.nix
"XF86Launch1".action =
spawn "${launcher}" "-show" "drun" "-icon-theme" "${iconTheme}" "-show-icons";
"Mod+Tab".action = toggle-overview;
"Mod+Q".action = close-window;
"Mod+Left".action = focus-column-left;
"Mod+Down".action = focus-window-down;
"Mod+Up".action = focus-window-up;
"Mod+Right".action = focus-column-right;
"Mod+H".action = focus-column-left;
"Mod+J".action = focus-window-down;
"Mod+K".action = focus-window-up;
"Mod+L".action = focus-column-right;
"Mod+Shift+Left".action = move-column-left;
"Mod+Shift+Down".action = move-window-down;
"Mod+Shift+Up".action = move-window-up;
"Mod+Shift+Right".action = move-column-right;
"Mod+Shift+H".action = move-column-left;
"Mod+Shift+J".action = move-window-down;
"Mod+Shift+K".action = move-window-up;
"Mod+Shift+L".action = move-column-right;
"Mod+Home".action = focus-column-first;
"Mod+End".action = focus-column-last;
"Mod+Ctrl+Home".action = move-column-to-first;
"Mod+Ctrl+End".action = move-column-to-last;
"Mod+Alt+Left".action = focus-monitor-left;
"Mod+Alt+Down".action = focus-monitor-down;
"Mod+Alt+Up".action = focus-monitor-up;
"Mod+Alt+Right".action = focus-monitor-right;
"Mod+Alt+H".action = focus-monitor-left;
"Mod+Alt+J".action = focus-monitor-down;
"Mod+Alt+K".action = focus-monitor-up;
"Mod+Alt+L".action = focus-monitor-right;
"Mod+Shift+Ctrl+Left".action = move-column-to-monitor-left;
"Mod+Shift+Ctrl+Down".action = move-column-to-monitor-down;
"Mod+Shift+Ctrl+Up".action = move-column-to-monitor-up;
"Mod+Shift+Ctrl+Right".action = move-column-to-monitor-right;
"Mod+Shift+Ctrl+H".action = move-column-to-monitor-left;
"Mod+Shift+Ctrl+J".action = move-column-to-monitor-down;
"Mod+Shift+Ctrl+K".action = move-column-to-monitor-up;
"Mod+Shift+Ctrl+L".action = move-column-to-monitor-right;
"Mod+Page_Down".action = focus-workspace-down;
"Mod+Page_Up".action = focus-workspace-up;
"Mod+U".action = focus-workspace-down;
"Mod+I".action = focus-workspace-up;
"Mod+Ctrl+Page_Down".action = move-column-to-workspace-down;
"Mod+Ctrl+Page_Up".action = move-column-to-workspace-up;
"Mod+Ctrl+U".action = move-column-to-workspace-down;
"Mod+Ctrl+I".action = move-column-to-workspace-up;
"Mod+Shift+Page_Down".action = move-workspace-down;
"Mod+Shift+Page_Up".action = move-workspace-up;
"Mod+Shift+U".action = move-workspace-down;
"Mod+Shift+I".action = move-workspace-up;
"Mod+WheelScrollDown".cooldown-ms = 150;
"Mod+WheelScrollDown".action = focus-workspace-down;
"Mod+WheelScrollUp".cooldown-ms = 150;
"Mod+WheelScrollUp".action = focus-workspace-up;
"Mod+Ctrl+WheelScrollDown".cooldown-ms = 150;
"Mod+Ctrl+WheelScrollDown".action = move-column-to-workspace-down;
"Mod+Ctrl+WheelScrollUp".cooldown-ms = 150;
"Mod+Ctrl+WheelScrollUp".action = move-column-to-workspace-up;
"Mod+WheelScrollRight".action = focus-column-right;
"Mod+WheelScrollLeft".action = focus-column-left;
"Mod+Ctrl+WheelScrollRight".action = move-column-right;
"Mod+Ctrl+WheelScrollLeft".action = move-column-left;
"Mod+Shift+WheelScrollDown".action = focus-column-right;
"Mod+Shift+WheelScrollUp".action = focus-column-left;
"Mod+Ctrl+Shift+WheelScrollDown".action = move-column-right;
"Mod+Ctrl+Shift+WheelScrollUp".action = move-column-left;
"Mod+1".action = focus-workspace 1;
"Mod+2".action = focus-workspace 2;
"Mod+3".action = focus-workspace 3;
"Mod+4".action = focus-workspace 4;
"Mod+5".action = focus-workspace 5;
"Mod+6".action = focus-workspace 6;
"Mod+7".action = focus-workspace 7;
"Mod+8".action = focus-workspace 8;
"Mod+9".action = focus-workspace 9;
"Mod+Shift+1".action.move-column-to-workspace = 1;
"Mod+Shift+2".action.move-column-to-workspace = 2;
"Mod+Shift+3".action.move-column-to-workspace = 3;
"Mod+Shift+4".action.move-column-to-workspace = 4;
"Mod+Shift+5".action.move-column-to-workspace = 5;
"Mod+Shift+6".action.move-column-to-workspace = 6;
"Mod+Shift+7".action.move-column-to-workspace = 7;
"Mod+Shift+8".action.move-column-to-workspace = 8;
"Mod+Shift+9".action.move-column-to-workspace = 9;
"Mod+BracketLeft".action = consume-or-expel-window-left;
"Mod+BracketRight".action = consume-or-expel-window-right;
"Mod+Comma".action = consume-window-into-column;
"Mod+Period".action = expel-window-from-column;
"Mod+R".action = switch-preset-column-width;
"Mod+Shift+R".action = switch-preset-window-height;
"Mod+Ctrl+R".action = reset-window-height;
"Mod+M".action = maximize-column;
"Mod+Shift+M".action = fullscreen-window;
"Mod+Ctrl+F".action = expand-column-to-available-width;
"Mod+C".action = center-column;
"Mod+Ctrl+C".action = center-visible-columns;
"Mod+Minus".action = set-column-width "-10%";
"Mod+Equal".action = set-column-width "+10%";
"Mod+Shift+Minus".action = set-window-height "-10%";
"Mod+Shift+Equal".action = set-window-height "+10%";
"Mod+F".action = toggle-window-floating;
"Mod+Shift+F".action = switch-focus-between-floating-and-tiling;
"Mod+W".action = toggle-column-tabbed-display;
"Mod+Shift+S".action.screenshot = {show-pointer = true;};
"Print".action.screenshot = {show-pointer = true;};
# "Ctrl+Print".action.screenshot-screen = {true};
"Alt+Print".action.screenshot-window = {write-to-disk = true;};
"Mod+Escape".allow-inhibiting = false;
"Mod+Escape".action = toggle-keyboard-shortcuts-inhibit;
"Ctrl+Alt+Delete".action = quit;
};
}

View file

@ -0,0 +1,74 @@
# vim:foldmethod=marker,
{...}: {
programs.niri = {
settings.window-rules = [
# {{{ float, opacity 0.8, top right: Picture-in-Picture // waybar childs
{
matches = [
{
app-id = "^firefox$";
title = "^Picture-in-Picture$";
}
{
# Applies to all chromium
title = "^Picture in picture$";
}
{
app-id = "^org.pulseaudio.pavucontrol$";
title = "^Volume Control$";
}
];
open-floating = true;
opacity = 0.8;
default-floating-position = {
x = 50;
y = 50;
relative-to = "top-right";
};
}
# }}}
{
matches = [
{
app-id = "^gimp$";
title = "^GIMP Startup$";
}
];
open-focused = false;
}
{
matches = [
# Anki add new flashcard
{
app-id = "^anki$";
title = "^Add$";
}
# Dolphin compressing files
{
app-id = "^org.kde.dolphin$";
title = "^Compressing.*$";
}
{
app-id = "^thunar$";
title = "^File Operation Progress$";
}
### IM Medias
{
app-id = "^QQ$";
title = "^$";
}
{
app-id = "^org.telegram.desktop$";
title = "^Media viewer$";
}
{
app-id = "^wechat$";
title = "^$";
}
];
open-floating = true;
}
];
};
}

View file

@ -1,9 +1,35 @@
{pkgs, ...}: let {pkgs, ...}: let
swayidleWrapper = pkgs.writeShellScriptBin "swayidle-wrapper" '' # swayidleWrapper = pkgs.writeShellScriptBin "swayidle-wrapper" ''
${pkgs.swayidle}/bin/swayidle -w \ # ${pkgs.swayidle}/bin/swayidle -w \
timeout 300 'swaylock -f' \ # timeout 300 'swaylock -f' \
timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \ # timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \
before-sleep 'swaylock -f -c 000000' # before-sleep 'swaylock -f -c 000000'
# '';
powerprofiles-next = pkgs.writeShellScriptBin "powerprofiles-next" ''
#!/usr/bin/env bash
CURRENT_PROFILE=$(${pkgs.power-profiles-daemon}/bin/powerprofilesctl get)
case $CURRENT_PROFILE in
"power-saver")
NEXT_PROFILE="balanced"
ICON="power-profile-balanced-symbolic"
;;
"balanced")
NEXT_PROFILE="performance"
ICON="power-profile-performance-symbolic"
;;
"performance" | *)
NEXT_PROFILE="power-saver"
ICON="power-profile-power-saver-symbolic"
;;
esac
${pkgs.power-profiles-daemon}/bin/powerprofilesctl set $NEXT_PROFILE
echo "Power profile set to: $NEXT_PROFILE"
${pkgs.libnotify}/bin/notify-send -a "powerprofilesctl" "Power Profile" "$NEXT_PROFILE" -i $ICON -u low -t 2000
''; '';
in { in {
imports = [ imports = [
@ -16,7 +42,10 @@ in {
cliphist # Clipboard daemon cliphist # Clipboard daemon
swww # Wallpaper daemon swww # Wallpaper daemon
wmname wmname
swayidleWrapper # swayidleWrapper
brightnessctl
playerctl
powerprofiles-next
]; ];
programs.swaylock = { programs.swaylock = {
enable = true; enable = true;

View file

@ -15,12 +15,20 @@
# File Explorer # File Explorer
"inode/directory" = "org.kde.dolphin.desktop"; "inode/directory" = "org.kde.dolphin.desktop";
# Image Viewer # Image Viewer
# loupe: Performance is incredible
"image/jpeg" = "vimiv.desktop;org.gnome.Loupe.desktop"; "image/jpeg" = "vimiv.desktop;org.gnome.Loupe.desktop";
"image/jpg" = "vimiv.desktop;org.gnome.Loupe.desktop"; "image/jpg" = "vimiv.desktop;org.gnome.Loupe.desktop";
"image/png" = "vimiv.desktop;org.gnome.Loupe.desktop"; "image/png" = "vimiv.desktop;org.gnome.Loupe.desktop";
"image/gif" = "vimiv.desktop;org.gnome.Loupe.desktop"; "image/gif" = "vimiv.desktop;org.gnome.Loupe.desktop";
"image/bmp" = "vimiv.desktop;org.gnome.Loupe.desktop"; "image/bmp" = "vimiv.desktop;org.gnome.Loupe.desktop";
"image/webp" = "vimiv.desktop;org.gnome.Loupe.desktop"; "image/webp" = "vimiv.desktop;org.gnome.Loupe.desktop";
# Audio:
# music: elisa: fully featured, good cjk support
# audio: mpv: simple and fast
"audio/flac" = "mpv.desktop;org.kde.elisa";
"audio/vnd.wave" = "mpv.desktop;org.kde.elisa"; # .wav
# Browser # Browser
"text/html" = "firefox.desktop;chromium-browser.desktop"; "text/html" = "firefox.desktop;chromium-browser.desktop";
"x-scheme-handler/http" = "firefox.desktop;chromium-browser.desktop"; "x-scheme-handler/http" = "firefox.desktop;chromium-browser.desktop";

View file

@ -39,7 +39,7 @@
# Desktop Linux # Desktop Linux
./programs/desktop/plasma.nix ./programs/desktop/plasma.nix
./programs/desktop/wayland-wm/niri.nix ./programs/desktop/wayland-wm/niri
# General Program config # General Program config
../../modules/home/programs/eza.nix ../../modules/home/programs/eza.nix
@ -52,5 +52,12 @@
../../modules/home/dev/nix.nix ../../modules/home/dev/nix.nix
]; ];
currentUser.defaultTerminalRunner = "alacritty";
currentHost = {
keyboardBacklightDevice = "asus::kbd_backlight";
keyboardBacklightStep = "1";
};
home.stateVersion = "25.05"; home.stateVersion = "25.05";
} }