diff --git a/flake.lock b/flake.lock index 28bdfaf..a5cab38 100755 --- a/flake.lock +++ b/flake.lock @@ -1001,11 +1001,69 @@ "type": "github" } }, + "niri": { + "inputs": { + "niri-stable": "niri-stable", + "niri-unstable": "niri-unstable", + "nixpkgs": [ + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable_3", + "xwayland-satellite-stable": "xwayland-satellite-stable", + "xwayland-satellite-unstable": "xwayland-satellite-unstable" + }, + "locked": { + "lastModified": 1746142190, + "narHash": "sha256-t36K3TWLMRWoGyjYyo+H8bBquDcp4orZqNZVagWNjwY=", + "owner": "sodiboo", + "repo": "niri-flake", + "rev": "af701c1c16c289b1b14f333d844b4f756308d244", + "type": "github" + }, + "original": { + "owner": "sodiboo", + "repo": "niri-flake", + "type": "github" + } + }, + "niri-stable": { + "flake": false, + "locked": { + "lastModified": 1740117926, + "narHash": "sha256-mTTHA0RAaQcdYe+9A3Jx77cmmyLFHmRoZdd8RpWa+m8=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "b94a5db8790339cf9134873d8b490be69e02ac71", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "ref": "v25.02", + "repo": "niri", + "type": "github" + } + }, + "niri-unstable": { + "flake": false, + "locked": { + "lastModified": 1746124654, + "narHash": "sha256-LmhkAt2KLvf8lp+kEUQuTFmmv7iXO8IkwwSaPasfXJw=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "6c9705dd4b2eaba25f024d1a3efd7943fd393632", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "repo": "niri", + "type": "github" + } + }, "nixos-cosmic": { "inputs": { "flake-compat": "flake-compat_5", "nixpkgs": "nixpkgs_2", - "nixpkgs-stable": "nixpkgs-stable_3", + "nixpkgs-stable": "nixpkgs-stable_4", "rust-overlay": "rust-overlay_2" }, "locked": { @@ -1071,6 +1129,22 @@ } }, "nixpkgs-stable_3": { + "locked": { + "lastModified": 1746055187, + "narHash": "sha256-3dqArYSMP9hM7Qpy5YWhnSjiqniSaT2uc5h2Po7tmg0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3e362ce63e16b9572d8c2297c04f7c19ab6725a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable_4": { "locked": { "lastModified": 1746183838, "narHash": "sha256-kwaaguGkAqTZ1oK0yXeQ3ayYjs8u/W7eEfrFpFfIDFA=", @@ -1291,6 +1365,7 @@ "hyprland-portal": "hyprland-portal", "lix-module": "lix-module", "ngipkgs": "ngipkgs", + "niri": "niri", "nixos-cosmic": "nixos-cosmic", "nixpkgs": "nixpkgs_3", "nur": "nur", @@ -1675,6 +1750,39 @@ "type": "github" } }, + "xwayland-satellite-stable": { + "flake": false, + "locked": { + "lastModified": 1739246919, + "narHash": "sha256-/hBM43/Gd0/tW+egrhlWgOIISeJxEs2uAOIYVpfDKeU=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "44590a416d4a3e8220e19e29e0b6efe64a80315d", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "ref": "v0.5.1", + "repo": "xwayland-satellite", + "type": "github" + } + }, + "xwayland-satellite-unstable": { + "flake": false, + "locked": { + "lastModified": 1745730655, + "narHash": "sha256-Tdsw5lD/XM8i1GnQr7ombqnEaCpt/voPs2AbjuYBbjI=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "56a681bfecc5831f41f8eb0ec8c7e96c6b277153", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "type": "github" + } + }, "yants": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index 98ed683..869d5f5 100755 --- a/flake.nix +++ b/flake.nix @@ -3,7 +3,6 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - lix-module = { url = "https://git.lix.systems/lix-project/nixos-module/archive/2.92.0-3.tar.gz"; inputs.nixpkgs.follows = "nixpkgs"; @@ -17,6 +16,11 @@ url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; + niri = { + url = "github:sodiboo/niri-flake"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + ngipkgs.url = "github:ngi-nix/ngipkgs"; ghostty = { url = "github:ghostty-org/ghostty"; @@ -82,6 +86,7 @@ inputs.nixos-cosmic.nixosModules.default inputs.home-manager.nixosModules.home-manager inputs.lix-module.nixosModules.default + inputs.niri.nixosModules.niri inputs.nur.modules.nixos.default inputs.sops-nix.nixosModules.sops ]; diff --git a/modules/home/default.nix b/modules/home/default.nix index 6dc57df..fb28f7a 100755 --- a/modules/home/default.nix +++ b/modules/home/default.nix @@ -66,6 +66,9 @@ in jamesDsp zoom academic + # hypr + niri + wayland theming ; }; diff --git a/modules/home/gui/desktop/niri/default.nix b/modules/home/gui/desktop/niri/default.nix new file mode 100755 index 0000000..a4da663 --- /dev/null +++ b/modules/home/gui/desktop/niri/default.nix @@ -0,0 +1,314 @@ +{ + config, + flake, + pkgs, + ... +}: +let + + inherit (flake.config.aesthetics.themes) currentTheme palettes cursor; + + inherit (flake.config.people) user0 user1 user2; + + user = config.home.username; + + niri = config.lib.niri.actions; + + themeLogic = + if user == user0 then + currentTheme.theme0 + else if user == user1 then + currentTheme.theme1 + else if user == user2 then + currentTheme.theme2 + else + currentTheme.theme0; + + el = palettes.${themeLogic}.colours; + makeColour = c: "#" + c; +in +{ + programs.niri = { + settings = + let + workspace0 = "messaging"; + workspace1 = "work"; + workspace2 = "gaming"; + workspace3 = "media"; + workspace4 = "extra"; + in + { + prefer-no-csd = true; + + cursor = { + size = cursor.size; + theme = "catppuccin-macchiato-dark-cursors"; + }; + input = { + focus-follows-mouse.enable = true; + mouse.accel-profile = "flat"; + }; + + spawn-at-startup = [ + { command = [ "swaylock" ]; } + { command = [ "wl-clipboard" ]; } + { command = [ "wpaperd" ]; } + { command = [ "gammastep" ]; } + { command = [ "dunst" ]; } + { command = [ "playerctld" ]; } + { command = [ "waybar" ]; } + { command = [ "nm-applet" ]; } + { command = [ "blueman-applet" ]; } + { command = [ "rfkill block bluetooth" ]; } + { command = [ "rfkill unblock bluetooth" ]; } + { command = [ "easyeffects -r" ]; } + { command = [ "vesktop" ]; } + { command = [ "signal" ]; } + { command = [ "floorp" ]; } + ]; + + animations = { + enable = true; + config-notification-open-close = { + spring = { + damping-ratio = 0.600000; + epsilon = 0.001000; + stiffness = 1000; + }; + }; + horizontal-view-movement = { + spring = { + damping-ratio = 1.000000; + epsilon = 0.000100; + stiffness = 800; + }; + }; + window-close = { + easing = { + curve = "ease-out-quad"; + duration-ms = 150; + }; + }; + window-open = { + spring = { + damping-ratio = 1.000000; + epsilon = 0.000100; + stiffness = 800; + }; + }; + window-resize = { + spring = { + damping-ratio = 1.000000; + epsilon = 0.000100; + stiffness = 800; + }; + }; + workspace-switch = { + spring = { + damping-ratio = 1.000000; + epsilon = 0.000100; + stiffness = 1000; + }; + }; + }; + binds = { + "Super+z".action = niri.spawn "obsidian"; + "Super+l".action = niri.spawn "slack"; + "Super+h".action = niri.spawn "feishin"; + "Super+g".action = niri.spawn "scrcpy"; + "Super+k".action = niri.spawn "ghostty -e nu -e y"; + "Super+s".action = niri.spawn "steam"; + "Super+r".action = niri.spawn "ghostty -e zellij a dotfiles"; + "Super+n".action = niri.spawn "signal-desktop"; + "Super+t".action = niri.spawn "zeditor"; + "Super+b".action = niri.spawn "floorp"; + "Super+x".action = niri.spawn "freetube"; + "Super+v".action = niri.spawn "discordcanary"; + "Super+m".action = niri.spawn "element-desktop"; + "Super+d".action = niri.spawn "ghostty"; + "Super+p".action = niri.spawn "bitwarden"; + "Super+Space".action = niri.spawn "fuzzel"; + "Super+Tab".action = niri.close-window; + "Super+u".action = niri.maximize-column; + "Super+comma".action = niri.focus-workspace-down; + "Super+period".action = niri.focus-workspace-up; + "Super+f".action = niri.swap-window-left; + "Super+o".action = niri.swap-window-right; + + # "Ctrl+Alt+1".action = niri.move-window-to-workspace workspace0; + # "Ctrl+Alt+2".action = niri.move-window-to-workspace workspace1; + # "Ctrl+Alt+3".action = niri.move-window-to-workspace workspace2; + # "Ctrl+Alt+4".action = niri.move-window-to-workspace workspace3; + # "Ctrl+Alt+5".action = niri.move-window-to-workspace workspace4; + # "Super+Enter".action = niri.toggle-overview; + + "Super+1".action = niri.focus-workspace workspace0; + "Super+2".action = niri.focus-workspace workspace1; + "Super+3".action = niri.focus-workspace workspace2; + "Super+4".action = niri.focus-workspace workspace3; + "Super+5".action = niri.focus-workspace workspace4; + + "Super+c".action = niri.focus-column-or-monitor-left; + "Super+a".action = niri.focus-window-or-monitor-up; + "Super+e".action = niri.focus-window-or-monitor-down; + "Super+i".action = niri.focus-column-or-monitor-right; + + "Super+Shift+t".action = niri.spawn "ghostty"; + "Super+Shift+s".action = niri.spawn "flameshot gui"; + "Super+Shift+period".action = niri.spawn "emote"; + "Super+Shift+Tab".action = niri.fullscreen-window; + + "Ctrl+Alt+c".action = niri.move-column-left; + "Ctrl+Alt+i".action = niri.move-column-right; + }; + + outputs = { + "DP-1" = { + background-color = makeColour el.base02; + mode = { + width = 2560; + height = 1080; + refresh = 199.92; + }; + position = { + x = 0; + y = 0; + }; + }; + }; + + window-rules = [ + { + open-focused = true; + } + { + matches = + let + windowMatch = c: { + app-id = c; + is-floating = true; + is-focused = true; + }; + in + [ + (windowMatch ".blueman-manager-wrapped") + (windowMatch "org.gnome.Calculator") + (windowMatch "com.github.wwmm.easyeffects") + (windowMatch "emote") + (windowMatch "mpv") + (windowMatch "vlc") + (windowMatch "org.nomacs.ImageLounge") + (windowMatch "flameshot") + (windowMatch "^.protonvpn-app-wrapped$") + (windowMatch "^Picture-in-Picture$") + (windowMatch "^Discord Popout$") + (windowMatch "^Enter name of file to save to…$") + (windowMatch "^File Upload$") + (windowMatch ".scrcpy-wrapped") + (windowMatch "^Battle.net$") + ]; + } + { + matches = [ + { app-id = "floop"; } + { app-id = "org.kde.kdenlive"; } + { app-id = "krita"; } + { app-id = "mpv"; } + { app-id = "vlc"; } + { app-id = "Brave-browser"; } + { app-id = "org.kde.okular"; } + ]; + opacity = 1.0; + } + { + matches = [ + { app-id = "signal"; } + { app-id = "vesktop"; } + ]; + open-on-workspace = workspace0; + } + { + matches = [ + { app-id = "code"; } + { app-id = "zeditor"; } + ]; + open-on-workspace = workspace1; + } + { + matches = [ + { app-id = "steam"; } + { app-id = "org.kde.kdenlive"; } + ]; + open-on-workspace = workspace2; + } + { + matches = [ + { app-id = "feishin"; } + { app-id = ".scrcpy-wrapped"; } + ]; + open-on-workspace = workspace3; + } + { + clip-to-geometry = true; + focus-ring = { + active.color = makeColour el.base0E; + inactive.color = makeColour el.base02; + }; + border = { + width = 1; + active.color = makeColour el.base0E; + inactive.color = makeColour el.base02; + }; + geometry-corner-radius = + let + radius = 10.0; + in + { + top-left = radius; + top-right = radius; + bottom-left = radius; + bottom-right = radius; + }; + } + ]; + + layout = { + gaps = 10; + focus-ring.enable = true; + # struts = { + # top = 0; + # bottom = 0; + # left = 0; + # right = 0; + # }; + shadow = { + enable = true; + color = el.base11; + draw-behind-window = true; + offset.x = 0; + offset.y = 0; + spread = 3; + }; + }; + + workspaces = { + default = { + name = workspace0; + }; + ${workspace1} = { + name = workspace1; + }; + ${workspace2} = { + name = workspace2; + }; + ${workspace3} = { + name = workspace3; + }; + ${workspace4} = { + name = workspace4; + }; + }; + }; + }; + +} diff --git a/modules/home/gui/desktop/wayland/fuzzel/default.nix b/modules/home/gui/desktop/wayland/fuzzel/default.nix new file mode 100755 index 0000000..c055bc6 --- /dev/null +++ b/modules/home/gui/desktop/wayland/fuzzel/default.nix @@ -0,0 +1,62 @@ +{ + config, + flake, + pkgs, + ... +}: +let + + inherit (flake.config.aesthetics.themes) currentTheme palettes fonts; + + inherit (flake.config.people) user0 user1 user2; + + user = config.home.username; + + themeLogic = + if user == user0 then + currentTheme.theme0 + else if user == user1 then + currentTheme.theme1 + else if user == user2 then + currentTheme.theme2 + else + currentTheme.theme0; + + el = palettes.${themeLogic}.colours; + +in +{ + programs.fuzzel = { + enable = true; + settings = { + main = { + prompt = "❯ "; + show-actions = "yes"; + icon-theme = "Papirus-Dark"; + width = 25; + font = "${fonts.names.name0}:weight=bold:size=${toString fonts.sizes.desktop.size0}"; + terminal = "${pkgs.ghostty}/bin/ghostty"; + layer = "overlay"; + }; + border = { + radius = 10; + }; + colors = { + background = "${el.base00}dd"; + text = "${el.base05}ff"; + match = "${el.base0E}ff"; + selection = "${el.base04}ff"; + selection-text = "${el.base05}ff"; + selection-match = "${el.base0E}ff"; + border = "${el.base0E}ff"; + prompt = "${el.base07}ff"; + input = "${el.base05}ff"; + placeholder = "${el.base04}ff"; + counter = "${el.base04}ff"; + }; + dmenu = { + exit-immediately-if-empty = "yes"; + }; + }; + }; +} diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix index 135a205..7a25e34 100755 --- a/modules/nixos/default.nix +++ b/modules/nixos/default.nix @@ -10,8 +10,11 @@ in mullvad syncthing ollama - plasma - sddm + # plasma + # sddm + # hypr + niri + wayland searx portals xserver diff --git a/modules/nixos/desktop/niri/default.nix b/modules/nixos/desktop/niri/default.nix new file mode 100755 index 0000000..57effd6 --- /dev/null +++ b/modules/nixos/desktop/niri/default.nix @@ -0,0 +1,3 @@ +{ + programs.niri.enable = true; +} diff --git a/systems/mars/config/networking.nix b/systems/mars/config/networking.nix index 6bf640b..c47175d 100755 --- a/systems/mars/config/networking.nix +++ b/systems/mars/config/networking.nix @@ -23,7 +23,7 @@ in 3131 # Deskreen 1234 # Elm-land server 5037 # ADB Server - 39578 + 32929 ]; }; };