summaryrefslogtreecommitdiff
path: root/home-manager/features/gui/desktops/niri
diff options
context:
space:
mode:
Diffstat (limited to 'home-manager/features/gui/desktops/niri')
-rwxr-xr-xhome-manager/features/gui/desktops/niri/default.nix125
-rw-r--r--home-manager/features/gui/desktops/niri/keybinds.nix168
-rwxr-xr-xhome-manager/features/gui/desktops/niri/parts/fuzzel.nix30
-rwxr-xr-xhome-manager/features/gui/desktops/niri/parts/hyprlock.nix46
-rwxr-xr-xhome-manager/features/gui/desktops/niri/parts/mako.nix26
-rw-r--r--home-manager/features/gui/desktops/niri/parts/quickshell/.envrc1
-rw-r--r--home-manager/features/gui/desktops/niri/parts/quickshell/flake.lock64
-rw-r--r--home-manager/features/gui/desktops/niri/parts/quickshell/flake.nix29
-rw-r--r--home-manager/features/gui/desktops/niri/parts/selectors.nix123
-rwxr-xr-xhome-manager/features/gui/desktops/niri/parts/swww.nix8
-rwxr-xr-xhome-manager/features/gui/desktops/niri/parts/waybar.nix136
-rw-r--r--home-manager/features/gui/desktops/niri/parts/wl-kbptr.nix14
-rw-r--r--home-manager/features/gui/desktops/niri/parts/wluma.nix11
-rw-r--r--home-manager/features/gui/desktops/niri/readme.md9
14 files changed, 790 insertions, 0 deletions
diff --git a/home-manager/features/gui/desktops/niri/default.nix b/home-manager/features/gui/desktops/niri/default.nix
new file mode 100755
index 0000000..6304c66
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/default.nix
@@ -0,0 +1,125 @@
+{
+ config,
+ pkgs,
+ lib,
+ inputs,
+ ...
+}: let
+ cfg = config.features.gui.desktops.niri;
+ aes = config.aesthetics;
+in {
+ imports = [
+ inputs.niri.homeModules.niri
+ ./keybinds.nix
+ ];
+ options.features.gui.desktops.niri.enable = lib.mkEnableOption "niri";
+ config = lib.mkIf cfg.enable {
+ features.gui.desktops.niri.parts = {
+ waybar.enable = true;
+ fuzzel.enable = true;
+ selectors.enable = true;
+ swww.enable = true;
+ mako.enable = true;
+ hyprlock.enable = true;
+ };
+ programs.niri = {
+ enable = true;
+ package = inputs.niri.packages.${pkgs.system}.niri-unstable;
+ settings = {
+ outputs = {
+ "Samsung Electric Company SAMSUNG 0x00000001" = {
+ enable = true;
+ scale = 1.5;
+ };
+ };
+ spawn-at-startup = [
+ # Status Bar
+ {command = ["waybar"];}
+
+ # Wallpaper Daemon
+ {command = ["swww-daemon"];}
+
+ # Allows x apps to be used in wayland.
+ {command = ["${lib.getExe pkgs.xwayland-satellite}"];}
+
+ # Logs the clipboard for use in utilities.
+ {command = ["${pkgs.wl-clipboard}/bin/wl-paste" "--watch" "${pkgs.cliphist}/bin/cliphist" "store"];}
+ ];
+ environment = {
+ DISPLAY = ":0"; # Important for Xwayland.
+ };
+ window-rules = [
+ {
+ geometry-corner-radius = let
+ radius = 4.0;
+ in {
+ top-left = radius;
+ top-right = radius;
+ bottom-left = radius;
+ bottom-right = radius;
+ };
+ clip-to-geometry = true;
+ default-column-width.proportion = 1. / 3.;
+ }
+ {
+ # Prevent Tor from being screen captured.
+ matches = [{app-id = "Tor Browser";}];
+ block-out-from = "screen-capture";
+ }
+ ];
+ switch-events = {
+ lid-close.action.spawn = ["hyprlock"];
+ };
+ prefer-no-csd = true;
+ overview = {
+ backdrop-color = "#${aes.scheme.base01}";
+ };
+ layout = {
+ gaps = 14;
+ insert-hint.enable = false;
+ shadow = {
+ enable = true;
+ softness = 10;
+ spread = 5;
+ offset = {
+ x = 0;
+ y = 0;
+ };
+ };
+ focus-ring = {
+ enable = true;
+ width = 3;
+ active.color = "#${aes.scheme.base09}";
+ };
+ border = {
+ enable = false;
+ width = 3;
+ inactive.color = "#${aes.scheme.base03}";
+ active.color = "#${aes.scheme.base08}";
+ };
+ struts = {
+ # left = -1;
+ # right = -1;
+
+ left = 20;
+ right = 20;
+ top = 20;
+ bottom = 20;
+ };
+ always-center-single-column = false;
+ empty-workspace-above-first = true;
+ };
+ input.keyboard.xkb.options = ''
+ caps:escape,
+ compose:ins
+ '';
+ hotkey-overlay.skip-at-startup = true;
+ input = {
+ touchpad = {
+ click-method = "clickfinger";
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/home-manager/features/gui/desktops/niri/keybinds.nix b/home-manager/features/gui/desktops/niri/keybinds.nix
new file mode 100644
index 0000000..56324bc
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/keybinds.nix
@@ -0,0 +1,168 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}: {
+ config = lib.mkIf config.features.gui.desktops.niri.enable {
+ programs.niri.settings.binds = let
+ left = "h";
+ down = "j";
+ up = "k";
+ right = "l";
+ in {
+ # App Launching Keys
+ "Mod+Q".action.spawn = ["foot"];
+ "Mod+W".action.spawn = ["qutebrowser"];
+ "Mod+Shift+W".action.spawn = ["librewolf"];
+ "Mod+E".action.spawn = ["neovide"];
+
+ # Reboot to gaming OS
+ "Mod+G".action.spawn = ["${lib.getExe (pkgs.writers.writeNuBin "gameos" "pkexec ${pkgs.efibootmgr}/bin/efibootmgr --bootnext 0000; reboot")}"];
+
+ # Clear Notifications
+ "Mod+B".action.spawn = ["makoctl" "dismiss" "-a"];
+
+ # Selectors
+ "Mod+R".action.spawn = ["fuzzel"];
+ "Mod+T".action.spawn = ["tool-selector"];
+ "Mod+Y".action.spawn = ["clipboard-selector"];
+ "Mod+U".action.spawn = ["wallpaper-selector" "--all-outputs"];
+ "Mod+Shift+U".action.spawn = ["wallpaper-selector"];
+ "Mod+Control+U".action.spawn = ["wallpaper-selector" "--randomize" "--all-outputs"];
+ "Mod+Control+Shift+U".action.spawn = ["wallpaper-selector" "--randomize"];
+
+ # Screenshot Keys
+ "Mod+P".action.screenshot = [];
+ "Shift+Mod+P".action.screenshot-screen = [];
+ "Control+Mod+P".action.screenshot-window = [];
+
+ # Power Keys
+ "Mod+comma".action.spawn = ["${lib.getExe (pkgs.writers.writeNuBin "nirilock" "systemctl suspend ; hyprlock")}"];
+
+ # Horizontal Tiling Keys
+ "Mod+A".action.maximize-column = [];
+ "Mod+S".action.switch-preset-column-width = [];
+
+ # Vertical Tiling Keys
+ "Mod+Shift+A".action.reset-window-height = [];
+ "Mod+Shift+S".action.switch-preset-window-height = [];
+ "Mod+D".action.consume-or-expel-window-right = [];
+
+ # Floating Window Management Keys
+ "Mod+Z".action.switch-focus-between-floating-and-tiling = [];
+ "Mod+X".action.toggle-window-floating = [];
+
+ # Other Window Management Keys
+ "Mod+C".action.close-window = [];
+ "Mod+V".action.fullscreen-window = [];
+
+ # Overlay Keys
+ "Mod+F".action.toggle-overview = [];
+
+ # +---------------------+
+ # | Arrow Movement Keys |
+ # +---------------------+
+
+ # Window Focus Keys
+ "Mod+Left".action.focus-column-left = [];
+ "Mod+Right".action.focus-column-right = [];
+ "Mod+Up".action.focus-window-up = [];
+ "Mod+Down".action.focus-window-down = [];
+
+ # Monitor Focus Keys
+ "Mod+Shift+Left".action.focus-monitor-left = [];
+ "Mod+Shift+Right".action.focus-monitor-right = [];
+
+ # Workspace Focus Keys
+ "Mod+Shift+Up".action.focus-workspace-up = [];
+ "Mod+Shift+Down".action.focus-workspace-down = [];
+
+ # Window Motion Keys
+ "Mod+Control+Left".action.move-column-left = [];
+ "Mod+Control+Right".action.move-column-right = [];
+ "Mod+Control+Up".action.move-window-up = [];
+ "Mod+Control+Down".action.move-window-down = [];
+
+ # Window - Monitor Motion Keys
+ "Mod+Control+Shift+Left".action.move-column-to-monitor-left = [];
+ "Mod+Control+Shift+Right".action.move-column-to-monitor-right = [];
+
+ # Window - Workspace Motion Keys
+ "Mod+Control+Shift+Up".action.move-window-to-workspace-up = [];
+ "Mod+Control+Shift+Down".action.move-window-to-workspace-down = [];
+
+ # Workspace Motion Keys
+ "Mod+Alt+Shift+Up".action.move-workspace-up = [];
+ "Mod+Alt+Shift+Down".action.move-workspace-down = [];
+
+ # Workspace - Monitor Motion Keys
+ "Mod+Alt+Shift+Left".action.move-workspace-to-monitor-left = [];
+ "Mod+Alt+Shift+Right".action.move-workspace-to-monitor-right = [];
+
+ # +-------------------+
+ # | Vim Movement Keys |
+ # +-------------------+
+
+ # Window Focus Keys
+ "Mod+${left}".action.focus-column-left = [];
+ "Mod+${right}".action.focus-column-right = [];
+ "Mod+${up}".action.focus-window-up = [];
+ "Mod+${down}".action.focus-window-down = [];
+
+ # Monitor Focus Keys
+ "Mod+Shift+${left}".action.focus-monitor-left = [];
+ "Mod+Shift+${right}".action.focus-monitor-right = [];
+
+ # Workspace Focus Keys
+ "Mod+Shift+${up}".action.focus-workspace-up = [];
+ "Mod+Shift+${down}".action.focus-workspace-down = [];
+
+ # Monitor Motion Keys
+ "Mod+Control+Shift+${left}".action.move-column-to-monitor-left = [];
+ "Mod+Control+Shift+${right}".action.move-column-to-monitor-right = [];
+
+ # Workspace Motion Keys
+ "Mod+Control+Shift+${up}".action.move-window-to-workspace-up = [];
+ "Mod+Control+Shift+${down}".action.move-window-to-workspace-down = [];
+
+ # Window Motion Keys
+ "Mod+Control+${left}".action.move-column-left = [];
+ "Mod+Control+${right}".action.move-column-right = [];
+ "Mod+Control+${up}".action.move-window-up = [];
+ "Mod+Control+${down}".action.move-window-down = [];
+
+ # Workspace Motion Keys
+ "Mod+Alt+Shift+${up}".action.move-workspace-up = [];
+ "Mod+Alt+Shift+${down}".action.move-workspace-down = [];
+
+ # Workspace - Monitor Motion Keys
+ "Mod+Alt+Shift+${left}".action.move-workspace-to-monitor-left = [];
+ "Mod+Alt+Shift+${right}".action.move-workspace-to-monitor-right = [];
+
+ # +-------------------+
+
+ # Numbered Workspace Movement Keys
+ "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+0".action.focus-workspace = 0;
+
+ # XF86 Keys
+ "XF86AudioRaiseVolume".action.spawn = ["wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "5%+"];
+ "XF86AudioLowerVolume".action.spawn = ["wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "5%-"];
+ "XF86AudioMute".action.spawn = ["wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"];
+
+ "XF86MonBrightnessUp".action.spawn = ["${lib.getExe pkgs.brightnessctl}" "s" "+5%"];
+ "XF86MonBrightnessDown".action.spawn = ["${lib.getExe pkgs.brightnessctl}" "s" "5%-"];
+
+ "XF86LaunchB".action.spawn = ["fuzzel"];
+ };
+ };
+}
diff --git a/home-manager/features/gui/desktops/niri/parts/fuzzel.nix b/home-manager/features/gui/desktops/niri/parts/fuzzel.nix
new file mode 100755
index 0000000..e939f88
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/parts/fuzzel.nix
@@ -0,0 +1,30 @@
+{ config, lib, ... }: let
+ cfg = config.features.gui.desktops.niri.parts.fuzzel;
+ aes = config.aesthetics;
+in {
+ options.features.gui.desktops.niri.parts.fuzzel.enable = lib.mkEnableOption "fuzzel";
+ config = lib.mkIf cfg.enable {
+ programs.fuzzel = {
+ enable = true;
+ settings = {
+ main = {
+ width = 20;
+ #terminal = config.custom.libraries.default-applications.terminal-emulator.command;
+ };
+ border = {
+ width = 3;
+ radius = 4;
+ };
+ colors = with aes.scheme; {
+ background = "${base00}ff";
+ selection = "${base00}ff";
+ selection-text = "${base0C}ff";
+ selection-match = "${base0E}ff";
+ match = "${base0E}ff";
+ border = "${base0C}ff";
+ text = "${base05}ff";
+ };
+ };
+ };
+ };
+}
diff --git a/home-manager/features/gui/desktops/niri/parts/hyprlock.nix b/home-manager/features/gui/desktops/niri/parts/hyprlock.nix
new file mode 100755
index 0000000..f8a50e3
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/parts/hyprlock.nix
@@ -0,0 +1,46 @@
+{ config, lib, pkgs, ... }: let
+ cfg = config.features.gui.desktops.niri.parts.hyprlock;
+in {
+ options.features.gui.desktops.niri.parts.hyprlock.enable = lib.mkEnableOption "hyprlock";
+ config = lib.mkIf cfg.enable {
+ home.packages = [(
+ pkgs.writers.writeNuBin "nirilock" /*nu*/ ''
+ niri msg action do-screen-transition --delay-ms 500
+ systemctl suspend
+ hyprlock
+ ''
+ )];
+ programs.niri.settings.window-rules = [
+ {
+ matches = [{ title = "hyprlock"; }];
+ draw-border-with-background = false;
+ }
+ ];
+ programs.hyprlock = {
+ enable = true;
+ settings = {
+ background = {
+ monitor = "";
+ path = "${config.aesthetics.wallpaper}";
+ blur_passes = 0;
+ blur_size = 5;
+ };
+ label = {
+ text = "$TIME";
+ font_size = 65;
+ font_family = "Cantarell Bold";
+
+ position = "0, 0";
+ halign = "center";
+ valign = "center";
+ };
+ input-field = {
+ size = "250, 50";
+ position = "0, -80";
+ outline_thickness = 0;
+ placeholder_text = "";
+ };
+ };
+ };
+ };
+}
diff --git a/home-manager/features/gui/desktops/niri/parts/mako.nix b/home-manager/features/gui/desktops/niri/parts/mako.nix
new file mode 100755
index 0000000..e5bc3b8
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/parts/mako.nix
@@ -0,0 +1,26 @@
+{
+ config,
+ lib,
+ ...
+}: let
+ cfg = config.features.gui.desktops.niri.parts.mako;
+in {
+ options.features.gui.desktops.niri.parts.mako.enable = lib.mkEnableOption "mako";
+ config = lib.mkIf cfg.enable {
+ services.mako = {
+ enable = true;
+ settings = {
+ border-radius = 4;
+ border-size = 3;
+ # margin = "11";
+ margin = "31";
+ padding = "5";
+
+ anchor = "top-center";
+
+ ignore-timeout = true;
+ default-timeout = 10000;
+ };
+ };
+ };
+}
diff --git a/home-manager/features/gui/desktops/niri/parts/quickshell/.envrc b/home-manager/features/gui/desktops/niri/parts/quickshell/.envrc
new file mode 100644
index 0000000..3550a30
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/parts/quickshell/.envrc
@@ -0,0 +1 @@
+use flake
diff --git a/home-manager/features/gui/desktops/niri/parts/quickshell/flake.lock b/home-manager/features/gui/desktops/niri/parts/quickshell/flake.lock
new file mode 100644
index 0000000..29f5851
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/parts/quickshell/flake.lock
@@ -0,0 +1,64 @@
+{
+ "nodes": {
+ "flake-utils": {
+ "inputs": {
+ "systems": [
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1731533236,
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1751498133,
+ "narHash": "sha256-QWJ+NQbMU+NcU2xiyo7SNox1fAuwksGlQhpzBl76g1I=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "d55716bb59b91ae9d1ced4b1ccdea7a442ecbfdb",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "flake-utils": "flake-utils",
+ "nixpkgs": "nixpkgs",
+ "systems": "systems"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/home-manager/features/gui/desktops/niri/parts/quickshell/flake.nix b/home-manager/features/gui/desktops/niri/parts/quickshell/flake.nix
new file mode 100644
index 0000000..2122f1f
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/parts/quickshell/flake.nix
@@ -0,0 +1,29 @@
+{
+ description = "Project flake";
+
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
+ systems.url = "github:nix-systems/default";
+ flake-utils = {
+ url = "github:numtide/flake-utils";
+ inputs.systems.follows = "systems";
+ };
+ };
+
+ outputs = {
+ nixpkgs,
+ flake-utils,
+ ...
+ }:
+ flake-utils.lib.eachDefaultSystem (
+ system: let
+ pkgs = nixpkgs.legacyPackages.${system};
+ in {
+ devShells.default = pkgs.mkShell {
+ packages = with pkgs; [
+ quickshell
+ ];
+ };
+ }
+ );
+}
diff --git a/home-manager/features/gui/desktops/niri/parts/selectors.nix b/home-manager/features/gui/desktops/niri/parts/selectors.nix
new file mode 100644
index 0000000..1adc917
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/parts/selectors.nix
@@ -0,0 +1,123 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}: let
+ cfg = config.features.gui.desktops.niri.parts.selectors;
+ aes = config.aesthetics;
+in {
+ options.features.gui.desktops.niri.parts.selectors.enable = lib.mkEnableOption "selectors";
+ config = lib.mkIf cfg.enable {
+ home.packages = with pkgs; [
+ # Tool Selector
+ (
+ pkgs.writers.writeNuBin "tool-selector"
+ /*
+ nu
+ */
+ ''
+
+ # Tools
+ let tools = {
+ "rebuild nixos": {
+ # footclient -H sudo nixos-rebuild switch --flake ($"~/Sync/setup#(hostname)" | path expand)
+ foot -H nh os switch
+ }
+ "rebuild home": {
+ # foot -H home-manager switch --flake ($"~/Sync/setup#(whoami)@(hostname)" | path expand)
+ foot -H nh home switch
+ }
+ "update flake": {
+ foot -H nix flake update --flake ($"~/Sync/setup/" | path expand)
+ }
+ "manage wifi": {
+ foot ${pkgs.impala}/bin/impala
+ }
+ "manage bluetooth": {
+ foot ${lib.getExe pkgs.bluetui}
+ }
+ "create qr-code": {
+ let temp_file = mktemp
+ let qr_code_bin = ${lib.getExe pkgs.qrtool} encode (${pkgs.wl-clipboard}/bin/wl-paste)
+ $qr_code_bin | ${pkgs.wl-clipboard}/bin/wl-copy
+ $qr_code_bin | save -f $temp_file
+ ${lib.getExe pkgs.imv} $temp_file
+ }
+ "steam big-picture": {
+ rm -r ~/.steam
+ gamescope -f --backend sdl -- steam -bigpicture
+ }
+ }
+
+ # Logic
+ let user_tool_choice = $tools
+ | columns
+ | to text
+ | fuzzel -d --placeholder "Tools"
+ if ($user_tool_choice != "") {
+ do ($tools | get $user_tool_choice)
+ }
+
+ ''
+ )
+
+ # Wallpaper Selector
+ (
+ writers.writeNuBin "wallpaper-selector"
+ /*
+ nu
+ */
+ ''
+ def main [
+ --all-outputs # Change wallpaper for all outputs
+ --randomize
+ ] {
+ mut wallpapers = {}
+ for path in (ls ${aes.wallpapersDir}/**/* | where {|item| $item.type != dir} | get name) {
+ $wallpapers = $wallpapers | insert ($path | path basename | split row "." | get 0) $path
+ }
+ mut prompt = "Wallpaper (current)"
+ if $all_outputs {
+ $prompt = "Wallpaper (all)"
+ }
+ mut wallpaper_path = ""
+ if $randomize {
+ $wallpaper_path = $wallpapers | get (
+ $wallpapers
+ | columns
+ | shuffle
+ | get 0
+ )
+ } else {
+ $wallpaper_path = $wallpapers | get (
+ $wallpapers
+ | columns
+ | to text
+ | ${lib.getExe pkgs.fuzzel} -d --placeholder $prompt
+ )
+ }
+ if $all_outputs {
+ ${lib.getExe pkgs.swww} img $wallpaper_path -t wipe --transition-fps 60 --transition-angle 45
+ } else {
+ let focused_display = niri msg -j focused-output
+ | from json
+ | get name
+ ${lib.getExe pkgs.swww} img $wallpaper_path -t wipe --transition-fps 60 --transition-angle 45 --outputs $focused_display
+ }
+ }
+ ''
+ )
+
+ # Clipboard Selector
+ (
+ writers.writeNuBin "clipboard-selector" ''
+ ${lib.getExe pkgs.cliphist} list
+ | cut -f 2-
+ | ${lib.getExe pkgs.fuzzel} --dmenu
+ | ${pkgs.wl-clipboard}/bin/wl-copy
+ ''
+ )
+ ];
+ };
+}
diff --git a/home-manager/features/gui/desktops/niri/parts/swww.nix b/home-manager/features/gui/desktops/niri/parts/swww.nix
new file mode 100755
index 0000000..dca163b
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/parts/swww.nix
@@ -0,0 +1,8 @@
+{ config, pkgs, lib, ... }: let
+ cfg = config.features.gui.desktops.niri.parts.swww;
+in {
+ options.features.gui.desktops.niri.parts.swww.enable = lib.mkEnableOption "swww";
+ config = lib.mkIf cfg.enable {
+ home.packages = [pkgs.swww];
+ };
+}
diff --git a/home-manager/features/gui/desktops/niri/parts/waybar.nix b/home-manager/features/gui/desktops/niri/parts/waybar.nix
new file mode 100755
index 0000000..7535b0c
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/parts/waybar.nix
@@ -0,0 +1,136 @@
+{ config, pkgs, lib, ... }:
+let
+ cfg = config.features.gui.desktops.niri.parts.waybar;
+ aes = config.aesthetics;
+in {
+ options.features.gui.desktops.niri.parts.waybar.enable = lib.mkEnableOption "waybar";
+ config = lib.mkIf cfg.enable {
+ programs.waybar = {
+ enable = true;
+ settings = {
+ bar = {
+ layer = "top";
+ position = "bottom";
+ height = 32;
+ modules-left = [ "battery" "network" "backlight" "pulseaudio" ];
+ modules-center = [ "niri/workspaces" ];
+ modules-right = [ "clock#date" "clock#time" ];
+ "clock#date" = {
+ format = " {:%A, %B %d}";
+ };
+ "clock#time" = {
+ format = " {:%I:%M}";
+ };
+ pulseaudio = {
+ format = " {volume}%";
+ format-muted = " {volume}%";
+ };
+ network = {
+ format = "{essid}";
+ format-wifi = "{icon} {essid}";
+ format-ethernet = "󰈀 Ethernet";
+ format-disconnected = "󰤭 Disconnected";
+ format-icons = [ "󰤯" "󰤟" "󰤢" "󰤥" "󰤨" ];
+ };
+ battery = {
+ format = "{icon} {capacity}%";
+ format-charging = "󰂄 {capacity}%";
+ format-icons = [ "󰂎" "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ];
+ };
+ backlight = {
+ format = " {percent}%";
+ };
+ "niri/workspaces" = {
+ format = "{icon}";
+ format-icons = {
+ default = "";
+ active = "";
+ /*
+ "1" = "1";
+ "2" = "2";
+ "3" = "3";
+ "4" = "4";
+ "5" = "5";
+ "6" = "6";
+ "7" = "7";
+ "8" = "8";
+ "9" = "9";
+ "10" = "10";
+ "11" = "11";
+ "12" = "12";
+ */
+ };
+ };
+ };
+ };
+ style = let
+ border-radius = "4";
+ padding = "12";
+ in /*css*/ ''
+ @define-color background-color #${aes.scheme.base00};
+ @define-color border-color #${aes.scheme.base0C};
+ @define-color text-color #${aes.scheme.base05};
+ * {
+ font-family: ${aes.font.name};
+ font-weight: 600;
+ font-size: ${aes.font.size.medium}px;
+ }
+ window#waybar {
+ background-color: transparent;
+ }
+ #clock.time, #clock.date, #backlight, #pulseaudio, #battery, #network {
+ background-color: @background-color;
+ color: @text-color;
+ border-radius: ${border-radius}px;
+ border-width: 0px;
+ border-color: @border-color;
+ padding: 0px ${padding}px;
+ }
+ #backlight, #pulseaudio, #battery, #network {
+ margin: 0px 0px ${padding} ${padding};
+ }
+ #workspaces {
+ background-color: @background-color;
+ color: @background-color;
+ border-radius: ${border-radius}px;
+ border-width: 0px;
+ border-color: @border-color;
+ padding: 0px 0px;
+ margin-bottom: ${padding}px;
+ }
+ #workspaces button {
+ font-weight: bold;
+ padding: 0px 4px;
+ margin: 4px 4px;
+ border-radius: ${border-radius}px;
+ color: @background-color;
+ background: @text-color;
+ opacity: 0.5;
+ transition: all 0.3s cubic-bezier(.25,.1,.25,1);
+ }
+ #workspaces button.active {
+ font-weight: bold;
+ padding: 0px 4px;
+ margin: 4px 4px;
+ border-radius: ${border-radius}px;
+ color: @background-color;
+ background: @text-color;
+ transition: all 0.3s cubic-bezier(.25,.1,.25,1);
+ opacity: 1.0;
+ min-width: 40px;
+ }
+ #workspaces button:hover {
+ font-weight: bold;
+ border-radius: ${border-radius}px;
+ color: @background-color;
+ background: @text-color;
+ opacity: 0.8;
+ transition: all 0.3s cubic-bezier(.25,.1,.25,1);
+ }
+ #clock.date, #clock.time {
+ margin: 0px ${padding} ${padding} 0px
+ }
+ '';
+ };
+ };
+}
diff --git a/home-manager/features/gui/desktops/niri/parts/wl-kbptr.nix b/home-manager/features/gui/desktops/niri/parts/wl-kbptr.nix
new file mode 100644
index 0000000..6f6ed56
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/parts/wl-kbptr.nix
@@ -0,0 +1,14 @@
+{ config, lib, pkgs, inputs, ... }: let
+ cfg = config.features.gui.desktops.niri.parts.wl-kbptr;
+in {
+ options.features.gui.desktops.niri.parts.wl-kbptr.enable = lib.mkEnableOption "wl-kbptr";
+ config = lib.mkIf cfg.enable {
+ home.packages = [ pkgs.wl-kbptr ];
+ home.file."wl-kbptr-config" = {
+ target = ".config/wl-kbptr/config";
+ text = ''
+
+ '';
+ };
+ };
+}
diff --git a/home-manager/features/gui/desktops/niri/parts/wluma.nix b/home-manager/features/gui/desktops/niri/parts/wluma.nix
new file mode 100644
index 0000000..21b9edc
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/parts/wluma.nix
@@ -0,0 +1,11 @@
+{ config, lib, ... }: let
+ cfg = config.features.gui.desktops.niri.parts.wluma;
+in {
+ options.features.gui.desktops.niri.parts.wluma.enable = lib.mkEnableOption "wluma";
+ config = lib.mkIf cfg.enable {
+ services.wluma = {
+ enable = true;
+ systemd.enable = true;
+ };
+ };
+}
diff --git a/home-manager/features/gui/desktops/niri/readme.md b/home-manager/features/gui/desktops/niri/readme.md
new file mode 100644
index 0000000..a70f77d
--- /dev/null
+++ b/home-manager/features/gui/desktops/niri/readme.md
@@ -0,0 +1,9 @@
+# Keybinds Scheme
+
+OS: The OS + Arrows combination is for moving between windows within a workspace.
+
+OS + Shift: The OS + Shift + Arrows combination is for moving between workspaces.
+
+OS + Alt: The OS + Alt + Arrows combination is for moving between monitors.
+
+The control key can be used with any of these combos to bring the current window along with you.