diff --git a/Justfile b/Justfile index a93108ca..7b2e8e08 100644 --- a/Justfile +++ b/Justfile @@ -124,6 +124,14 @@ hypr mode="default": use {{utils_nu}} *; nixos-switch $"(hostname)-hyprland" {{mode}} +# Deploy the niri nixosConfiguration by hostname match +[linux] +[group('desktop')] +niri mode="default": + #!/usr/bin/env nu + use {{utils_nu}} *; + nixos-switch $"(hostname)-niri" {{mode}} + ############################################################################ # # Darwin related commands diff --git a/flake.lock b/flake.lock index 17a1f64f..ae6bbe28 100644 --- a/flake.lock +++ b/flake.lock @@ -539,6 +539,62 @@ "url": "ssh://git@github.com/ryan4yin/nix-secrets.git" } }, + "niri": { + "inputs": { + "niri-stable": "niri-stable", + "niri-unstable": "niri-unstable", + "nixpkgs": "nixpkgs_2", + "nixpkgs-stable": "nixpkgs-stable_2", + "xwayland-satellite-stable": "xwayland-satellite-stable", + "xwayland-satellite-unstable": "xwayland-satellite-unstable" + }, + "locked": { + "lastModified": 1755424351, + "narHash": "sha256-xcorYLNdtLpb0wH5CPlUcpmYQUxeK95j1X855xQw+DY=", + "owner": "sodiboo", + "repo": "niri-flake", + "rev": "9aa137af01f05386e5bb5050e983750017007a66", + "type": "github" + }, + "original": { + "owner": "sodiboo", + "repo": "niri-flake", + "type": "github" + } + }, + "niri-stable": { + "flake": false, + "locked": { + "lastModified": 1748151941, + "narHash": "sha256-z4viQZLgC2bIJ3VrzQnR+q2F3gAOEQpU1H5xHtX/2fs=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "8ba57fcf25d2fc9565131684a839d58703f1dae7", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "ref": "v25.05.1", + "repo": "niri", + "type": "github" + } + }, + "niri-unstable": { + "flake": false, + "locked": { + "lastModified": 1755419373, + "narHash": "sha256-EFH3zbpyLYjEboNV2Lmkxf9joEuFCmeYX+MMLRPStpg=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "a6febb86aa5af0df7bf2792ca027ef95a503d599", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "repo": "niri", + "type": "github" + } + }, "nix-darwin": { "inputs": { "nixpkgs": [ @@ -738,6 +794,22 @@ } }, "nixpkgs-stable_2": { + "locked": { + "lastModified": 1755274400, + "narHash": "sha256-rTInmnp/xYrfcMZyFMH3kc8oko5zYfxsowaLv1LVobY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ad7196ae55c295f53a7d1ec39e4a06d922f3b899", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable_3": { "locked": { "lastModified": 1755274400, "narHash": "sha256-rTInmnp/xYrfcMZyFMH3kc8oko5zYfxsowaLv1LVobY=", @@ -770,6 +842,22 @@ } }, "nixpkgs_2": { + "locked": { + "lastModified": 1755186698, + "narHash": "sha256-wNO3+Ks2jZJ4nTHMuks+cxAiVBGNuEBXsT29Bz6HASo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fbcf476f790d8a217c3eab4e12033dc4a0f6d23c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { "locked": { "lastModified": 1755186698, "narHash": "sha256-wNO3+Ks2jZJ4nTHMuks+cxAiVBGNuEBXsT29Bz6HASo=", @@ -919,15 +1007,16 @@ "lanzaboote": "lanzaboote", "my-asahi-firmware": "my-asahi-firmware", "mysecrets": "mysecrets", + "niri": "niri", "nix-darwin": "nix-darwin", "nix-gaming": "nix-gaming", "nixos-apple-silicon": "nixos-apple-silicon", "nixos-generators": "nixos-generators", "nixpak": "nixpak", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs_3", "nixpkgs-darwin": "nixpkgs-darwin", "nixpkgs-ollama": "nixpkgs-ollama", - "nixpkgs-stable": "nixpkgs-stable_2", + "nixpkgs-stable": "nixpkgs-stable_3", "nixpkgs-unstable": "nixpkgs-unstable", "nuenv": "nuenv", "nur-ryan4yin": "nur-ryan4yin", @@ -1077,6 +1166,39 @@ "type": "github" } }, + "xwayland-satellite-stable": { + "flake": false, + "locked": { + "lastModified": 1748488455, + "narHash": "sha256-IiLr1alzKFIy5tGGpDlabQbe6LV1c9ABvkH6T5WmyRI=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "3ba30b149f9eb2bbf42cf4758d2158ca8cceef73", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "ref": "v0.6", + "repo": "xwayland-satellite", + "type": "github" + } + }, + "xwayland-satellite-unstable": { + "flake": false, + "locked": { + "lastModified": 1755219541, + "narHash": "sha256-yKV6xHaPbEbh5RPxAJnb9yTs1wypr7do86hFFGQm1w8=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "5a184d435927c3423f0ad189ea2b490578450fb7", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "type": "github" + } + }, "zig": { "inputs": { "flake-compat": [ diff --git a/flake.nix b/flake.nix index 1f087fd8..ab1ebb8f 100644 --- a/flake.nix +++ b/flake.nix @@ -143,6 +143,8 @@ inputs.nixpkgs.follows = "nixpkgs"; }; + niri.url = "github:sodiboo/niri-flake"; + ######################## Some non-flake repositories ######################################### polybar-themes = { diff --git a/home/linux/gui/hyprland/values/anyrun.nix b/home/linux/gui/base/desktop/anyrun.nix similarity index 100% rename from home/linux/gui/hyprland/values/anyrun.nix rename to home/linux/gui/base/desktop/anyrun.nix diff --git a/home/linux/gui/hyprland/conf/hypridle.conf b/home/linux/gui/base/desktop/conf/hypridle.conf similarity index 100% rename from home/linux/gui/hyprland/conf/hypridle.conf rename to home/linux/gui/base/desktop/conf/hypridle.conf diff --git a/home/linux/gui/hyprland/conf/mako/config b/home/linux/gui/base/desktop/conf/mako/config similarity index 100% rename from home/linux/gui/hyprland/conf/mako/config rename to home/linux/gui/base/desktop/conf/mako/config diff --git a/home/linux/gui/hyprland/conf/mako/icons/brightness-100.png b/home/linux/gui/base/desktop/conf/mako/icons/brightness-100.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/brightness-100.png rename to home/linux/gui/base/desktop/conf/mako/icons/brightness-100.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/brightness-20.png b/home/linux/gui/base/desktop/conf/mako/icons/brightness-20.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/brightness-20.png rename to home/linux/gui/base/desktop/conf/mako/icons/brightness-20.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/brightness-40.png b/home/linux/gui/base/desktop/conf/mako/icons/brightness-40.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/brightness-40.png rename to home/linux/gui/base/desktop/conf/mako/icons/brightness-40.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/brightness-60.png b/home/linux/gui/base/desktop/conf/mako/icons/brightness-60.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/brightness-60.png rename to home/linux/gui/base/desktop/conf/mako/icons/brightness-60.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/brightness-80.png b/home/linux/gui/base/desktop/conf/mako/icons/brightness-80.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/brightness-80.png rename to home/linux/gui/base/desktop/conf/mako/icons/brightness-80.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/dropper.png b/home/linux/gui/base/desktop/conf/mako/icons/dropper.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/dropper.png rename to home/linux/gui/base/desktop/conf/mako/icons/dropper.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/microphone-mute.png b/home/linux/gui/base/desktop/conf/mako/icons/microphone-mute.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/microphone-mute.png rename to home/linux/gui/base/desktop/conf/mako/icons/microphone-mute.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/microphone.png b/home/linux/gui/base/desktop/conf/mako/icons/microphone.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/microphone.png rename to home/linux/gui/base/desktop/conf/mako/icons/microphone.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/music.png b/home/linux/gui/base/desktop/conf/mako/icons/music.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/music.png rename to home/linux/gui/base/desktop/conf/mako/icons/music.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/palette.png b/home/linux/gui/base/desktop/conf/mako/icons/palette.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/palette.png rename to home/linux/gui/base/desktop/conf/mako/icons/palette.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/picture.png b/home/linux/gui/base/desktop/conf/mako/icons/picture.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/picture.png rename to home/linux/gui/base/desktop/conf/mako/icons/picture.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/timer.png b/home/linux/gui/base/desktop/conf/mako/icons/timer.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/timer.png rename to home/linux/gui/base/desktop/conf/mako/icons/timer.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/volume-high.png b/home/linux/gui/base/desktop/conf/mako/icons/volume-high.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/volume-high.png rename to home/linux/gui/base/desktop/conf/mako/icons/volume-high.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/volume-low.png b/home/linux/gui/base/desktop/conf/mako/icons/volume-low.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/volume-low.png rename to home/linux/gui/base/desktop/conf/mako/icons/volume-low.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/volume-mid.png b/home/linux/gui/base/desktop/conf/mako/icons/volume-mid.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/volume-mid.png rename to home/linux/gui/base/desktop/conf/mako/icons/volume-mid.png diff --git a/home/linux/gui/hyprland/conf/mako/icons/volume-mute.png b/home/linux/gui/base/desktop/conf/mako/icons/volume-mute.png similarity index 100% rename from home/linux/gui/hyprland/conf/mako/icons/volume-mute.png rename to home/linux/gui/base/desktop/conf/mako/icons/volume-mute.png diff --git a/home/linux/gui/hyprland/conf/waybar/config.jsonc b/home/linux/gui/base/desktop/conf/waybar/config.jsonc similarity index 100% rename from home/linux/gui/hyprland/conf/waybar/config.jsonc rename to home/linux/gui/base/desktop/conf/waybar/config.jsonc diff --git a/home/linux/gui/hyprland/conf/waybar/mocha.css b/home/linux/gui/base/desktop/conf/waybar/mocha.css similarity index 100% rename from home/linux/gui/hyprland/conf/waybar/mocha.css rename to home/linux/gui/base/desktop/conf/waybar/mocha.css diff --git a/home/linux/gui/hyprland/conf/waybar/style.css b/home/linux/gui/base/desktop/conf/waybar/style.css similarity index 100% rename from home/linux/gui/hyprland/conf/waybar/style.css rename to home/linux/gui/base/desktop/conf/waybar/style.css diff --git a/home/linux/gui/hyprland/conf/wlogout/icons/hibernate.png b/home/linux/gui/base/desktop/conf/wlogout/icons/hibernate.png similarity index 100% rename from home/linux/gui/hyprland/conf/wlogout/icons/hibernate.png rename to home/linux/gui/base/desktop/conf/wlogout/icons/hibernate.png diff --git a/home/linux/gui/hyprland/conf/wlogout/icons/lock.png b/home/linux/gui/base/desktop/conf/wlogout/icons/lock.png similarity index 100% rename from home/linux/gui/hyprland/conf/wlogout/icons/lock.png rename to home/linux/gui/base/desktop/conf/wlogout/icons/lock.png diff --git a/home/linux/gui/hyprland/conf/wlogout/icons/logout.png b/home/linux/gui/base/desktop/conf/wlogout/icons/logout.png similarity index 100% rename from home/linux/gui/hyprland/conf/wlogout/icons/logout.png rename to home/linux/gui/base/desktop/conf/wlogout/icons/logout.png diff --git a/home/linux/gui/hyprland/conf/wlogout/icons/reboot.png b/home/linux/gui/base/desktop/conf/wlogout/icons/reboot.png similarity index 100% rename from home/linux/gui/hyprland/conf/wlogout/icons/reboot.png rename to home/linux/gui/base/desktop/conf/wlogout/icons/reboot.png diff --git a/home/linux/gui/hyprland/conf/wlogout/icons/shutdown.png b/home/linux/gui/base/desktop/conf/wlogout/icons/shutdown.png similarity index 100% rename from home/linux/gui/hyprland/conf/wlogout/icons/shutdown.png rename to home/linux/gui/base/desktop/conf/wlogout/icons/shutdown.png diff --git a/home/linux/gui/hyprland/conf/wlogout/icons/suspend.png b/home/linux/gui/base/desktop/conf/wlogout/icons/suspend.png similarity index 100% rename from home/linux/gui/hyprland/conf/wlogout/icons/suspend.png rename to home/linux/gui/base/desktop/conf/wlogout/icons/suspend.png diff --git a/home/linux/gui/hyprland/conf/wlogout/layout b/home/linux/gui/base/desktop/conf/wlogout/layout similarity index 100% rename from home/linux/gui/hyprland/conf/wlogout/layout rename to home/linux/gui/base/desktop/conf/wlogout/layout diff --git a/home/linux/gui/hyprland/conf/wlogout/style.css b/home/linux/gui/base/desktop/conf/wlogout/style.css similarity index 100% rename from home/linux/gui/hyprland/conf/wlogout/style.css rename to home/linux/gui/base/desktop/conf/wlogout/style.css diff --git a/home/linux/gui/base/desktop/default.nix b/home/linux/gui/base/desktop/default.nix new file mode 100644 index 00000000..d58dafe7 --- /dev/null +++ b/home/linux/gui/base/desktop/default.nix @@ -0,0 +1,56 @@ +{ + config, + pkgs, + ... +}: +{ + imports = [ + ./anyrun.nix + ]; + + home.packages = with pkgs; [ + swaybg # the wallpaper + wl-clipboard # copying and pasting + hyprpicker # color picker + brightnessctl + hyprshot # screen shot + wf-recorder # screen recording + # audio + alsa-utils # provides amixer/alsamixer/... + networkmanagerapplet # provide GUI app: nm-connection-editor + ]; + + xdg.configFile = + let + mkSymlink = config.lib.file.mkOutOfStoreSymlink; + confPath = "${config.home.homeDirectory}/nix-config/home/linux/gui/base/desktop/conf"; + in + { + "mako".source = mkSymlink "${confPath}/mako"; + "waybar".source = mkSymlink "${confPath}/waybar"; + "wlogout".source = mkSymlink "${confPath}/wlogout"; + "hypr/hypridle.conf".source = mkSymlink "${confPath}/hypridle.conf"; + }; + + # status bar + programs.waybar = { + enable = true; + systemd.enable = true; + }; + # Disable catppuccin to avoid conflict with my non-nix config. + catppuccin.waybar.enable = false; + + # screen locker + programs.swaylock.enable = true; + + # Logout Menu + programs.wlogout.enable = true; + catppuccin.wlogout.enable = false; + + # Hyprland idle daemon + services.hypridle.enable = true; + + # notification daemon, the same as dunst + services.mako.enable = true; + catppuccin.mako.enable = false; +} diff --git a/home/linux/gui/hyprland/values/wayland-apps.nix b/home/linux/gui/base/wayland-apps.nix similarity index 100% rename from home/linux/gui/hyprland/values/wayland-apps.nix rename to home/linux/gui/base/wayland-apps.nix diff --git a/home/linux/gui/hyprland/conf/configs/exec.conf b/home/linux/gui/hyprland/conf/exec.conf similarity index 100% rename from home/linux/gui/hyprland/conf/configs/exec.conf rename to home/linux/gui/hyprland/conf/exec.conf diff --git a/home/linux/gui/hyprland/conf/configs/fcitx5.conf b/home/linux/gui/hyprland/conf/fcitx5.conf similarity index 100% rename from home/linux/gui/hyprland/conf/configs/fcitx5.conf rename to home/linux/gui/hyprland/conf/fcitx5.conf diff --git a/home/linux/gui/hyprland/conf/configs/keybindings.conf b/home/linux/gui/hyprland/conf/keybindings.conf similarity index 100% rename from home/linux/gui/hyprland/conf/configs/keybindings.conf rename to home/linux/gui/hyprland/conf/keybindings.conf diff --git a/home/linux/gui/hyprland/conf/configs/settings.conf b/home/linux/gui/hyprland/conf/settings.conf similarity index 100% rename from home/linux/gui/hyprland/conf/configs/settings.conf rename to home/linux/gui/hyprland/conf/settings.conf diff --git a/home/linux/gui/hyprland/conf/configs/windowrules.conf b/home/linux/gui/hyprland/conf/windowrules.conf similarity index 100% rename from home/linux/gui/hyprland/conf/configs/windowrules.conf rename to home/linux/gui/hyprland/conf/windowrules.conf diff --git a/home/linux/gui/hyprland/default.nix b/home/linux/gui/hyprland/default.nix index 22a7a707..3aa7e63c 100644 --- a/home/linux/gui/hyprland/default.nix +++ b/home/linux/gui/hyprland/default.nix @@ -2,7 +2,6 @@ pkgs, config, lib, - anyrun, ... }@args: with lib; @@ -11,7 +10,6 @@ let in { imports = [ - # anyrun.homeManagerModules.default # the module is already in hm now. ./options ]; diff --git a/home/linux/gui/hyprland/values/hyprland.nix b/home/linux/gui/hyprland/values/hyprland.nix index aaf18223..895a56d0 100644 --- a/home/linux/gui/hyprland/values/hyprland.nix +++ b/home/linux/gui/hyprland/values/hyprland.nix @@ -1,6 +1,5 @@ { pkgs, - pkgs-stable, config, ... }: @@ -11,38 +10,12 @@ in xdg.configFile = let mkSymlink = config.lib.file.mkOutOfStoreSymlink; - hyprPath = "${config.home.homeDirectory}/nix-config/home/linux/gui/hyprland/conf"; + confPath = "${config.home.homeDirectory}/nix-config/home/linux/gui/hyprland/conf"; in { - "mako".source = mkSymlink "${hyprPath}/mako"; - "waybar".source = mkSymlink "${hyprPath}/waybar"; - "wlogout".source = mkSymlink "${hyprPath}/wlogout"; - "hypr/hypridle.conf".source = mkSymlink "${hyprPath}/hypridle.conf"; - "hypr/configs".source = mkSymlink "${hyprPath}/configs"; + "hypr/configs".source = mkSymlink confPath; }; - # status bar - programs.waybar = { - enable = true; - systemd.enable = true; - }; - # Disable catppuccin to avoid conflict with my non-nix config. - catppuccin.waybar.enable = false; - - # screen locker - programs.swaylock.enable = true; - - # Logout Menu - programs.wlogout.enable = true; - catppuccin.wlogout.enable = false; - - # Hyprland idle daemon - services.hypridle.enable = true; - - # notification daemon, the same as dunst - services.mako.enable = true; - catppuccin.mako.enable = false; - # NOTE: # We have to enable hyprland/i3's systemd user service in home-manager, # so that gammastep/wallpaper-switcher's user service can be start correctly! diff --git a/home/linux/gui/hyprland/values/packages.nix b/home/linux/gui/hyprland/values/packages.nix deleted file mode 100644 index a681cfcb..00000000 --- a/home/linux/gui/hyprland/values/packages.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - pkgs, - ... -}: -{ - - home.packages = with pkgs; [ - swaybg # the wallpaper - wl-clipboard # copying and pasting - hyprpicker # color picker - brightnessctl - - hyprshot # screen shot - wf-recorder # screen recording - - # audio - alsa-utils # provides amixer/alsamixer/... - networkmanagerapplet # provide GUI app: nm-connection-editor - ]; -} diff --git a/home/linux/gui/niri/default.nix b/home/linux/gui/niri/default.nix new file mode 100644 index 00000000..93d3f4a1 --- /dev/null +++ b/home/linux/gui/niri/default.nix @@ -0,0 +1,590 @@ +{ + pkgs, + config, + lib, + niri, + ... +}@args: +let + cfg = config.modules.desktop.niri; +in +{ + options.modules.desktop.niri = { + enable = lib.mkEnableOption "niri compositor"; + settings = lib.mkOption { + type = + with lib.types; + let + valueType = + nullOr (oneOf [ + bool + int + float + str + path + (attrsOf valueType) + (listOf valueType) + ]) + // { + description = "niri configuration value"; + }; + in + valueType; + default = { }; + }; + }; + + config = lib.mkIf cfg.enable { + # NOTE: this executable is used by greetd to start a wayland session when system boot up + # with such a vendor-no-locking script, we can switch to another wayland compositor without modifying greetd's config in NixOS module + home.file.".wayland-session" = { + source = pkgs.writeScript "init-session" '' + # trying to stop a previous niri session + systemctl --user is-active niri.service && systemctl --user stop niri.service + # and then we start a new one + /run/current-system/sw/bin/niri-session + ''; + executable = true; + }; + + programs.niri.config = + let + inherit (niri.lib.kdl) + node + plain + leaf + flag + ; + in + cfg.settings + ++ [ + (plain "input" [ + (plain "keyboard" [ + (plain "xkb" [ + # You can set rules, model, layout, variant and options. + # For more information, see xkeyboard-config(7). + + # For example: + # (leaf "layout" "us,ru") + # (leaf "options" "grp:win_space_toggle,compose:ralt,ctrl:nocaps") + ]) + + # You can set the keyboard repeat parameters. The defaults match wlroots and sway. + # Delay is in milliseconds before the repeat starts. Rate is in characters per second. + # (leaf "repeat-delay" 600) + # (leaf "repeat-rate" 25) + + # Niri can remember the keyboard layout globally (the default) or per-window. + # - "global" - layout change is global for all windows. + # - "window" - layout is tracked for each window individually. + # (leaf "track-layout" "global") + ]) + + # Next sections include libinput settings. + # Omitting settings disables them, or leaves them at their default values. + (plain "touchpad" [ + (flag "tap") + # (flag "dwt") + # (flag "dwtp") + (flag "natural-scroll") + # (leaf "accel-speed" 0.2) + # (leaf "accel-profile" "flat") + # (leaf "tap-button-map" "left-middle-right") + ]) + + (plain "mouse" [ + # (flag "natural-scroll") + # (leaf "accel-speed" 0.2) + # (leaf "accel-profile" "flat") + ]) + + # By default, niri will take over the power button to make it sleep + # instead of power off. + # Uncomment this if you would like to configure the power button elsewhere + # (i.e. logind.conf). + # (flag "disable-power-key-handling") + ]) + + (plain "layout" [ + # By default focus ring and border are rendered as a solid background rectangle + # behind windows. That is, they will show up through semitransparent windows. + # This is because windows using client-side decorations can have an arbitrary shape. + # + # If you don't like that, you should uncomment `prefer-no-csd` below. + # Niri will draw focus ring and border *around* windows that agree to omit their + # client-side decorations. + + # You can change how the focus ring looks. + (plain "focus-ring" [ + # Uncomment this line to disable the focus ring. + # (flag "off") + + # How many logical pixels the ring extends out from the windows. + (leaf "width" 4) + + # Colors can be set in a variety of ways: + # - CSS named colors: "red" + # - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa" + # - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others. + + # Color of the ring on the active monitor. + (leaf "active-color" "#7fc8ff") + + # Color of the ring on inactive monitors. + (leaf "inactive-color" "#505050") + + # Additionally, there's a legacy RGBA syntax: + # (leaf "active-color" [ 127 200 255 255 ]) + + # You can also use gradients. They take precedence over solid colors. + # Gradients are rendered the same as CSS linear-gradient(angle, from, to). + # The angle is the same as in linear-gradient, and is optional, + # defaulting to 180 (top-to-bottom gradient). + # You can use any CSS linear-gradient tool on the web to set these up. + # + # (leaf "active-gradient" { from="#80c8ff"; to="#bbddff"; angle=45; }) + + # You can also color the gradient relative to the entire view + # of the workspace, rather than relative to just the window itself. + # To do that, set relative-to="workspace-view"; + # + # (leaf "inactive-gradient" { from="#505050"; to="#808080"; angle=45; relative-to="workspace-view"; }) + ]) + + # You can also add a border. It's similar to the focus ring, but always visible. + (plain "border" [ + # The settings are the same as for the focus ring. + # If you enable the border, you probably want to disable the focus ring. + (flag "off") + + (leaf "width" 4) + (leaf "active-color" "#ffc87f") + (leaf "inactive-color" "#505050") + + # (leaf "active-gradient" { from="#ffbb66"; to="#ffc880"; angle=45; relative-to="workspace-view"; }) + # (leaf "inactive-gradient" { from="#505050"; to="#808080"; angle=45; relative-to="workspace-view"; }) + ]) + + # You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. + (plain "preset-column-widths" [ + # Proportion sets the width as a fraction of the output width, taking gaps into account. + # For example, you can perfectly fit four windows sized "proportion 0.25" on an output. + # The default preset widths are 1/3, 1/2 and 2/3 of the output. + (leaf "proportion" (1.0 / 3.0)) + (leaf "proportion" (1.0 / 2.0)) + (leaf "proportion" (2.0 / 3.0)) + + # Fixed sets the width in logical pixels exactly. + # (leaf "fixed" 1920) + ]) + + # You can change the default width of the new windows. + (plain "default-column-width" [ + (leaf "proportion" 0.5) + ]) + # If you leave the children empty, the windows themselves will decide their initial width. + # (plain "default-column-width" []) + + # Set gaps around windows in logical pixels. + (leaf "gaps" 8) + + # Struts shrink the area occupied by windows, similarly to layer-shell panels. + # You can think of them as a kind of outer gaps. They are set in logical pixels. + # Left and right struts will cause the next window to the side to always be visible. + # Top and bottom struts will simply add outer gaps in addition to the area occupied by + # layer-shell panels and regular gaps. + (plain "struts" [ + # (leaf "left" 64) + # (leaf "right" 64) + # (leaf "top" 64) + # (leaf "bottom" 64) + ]) + + # When to center a column when changing focus, options are: + # - "never", default behavior, focusing an off-screen column will keep at the left + # or right edge of the screen. + # - "on-overflow", focusing a column will center it if it doesn't fit + # together with the previously focused column. + # - "always", the focused column will always be centered. + (leaf "center-focused-column" "never") + ]) + + # Add lines like this to spawn processes at startup. + # Note that running niri as a session supports xdg-desktop-autostart, + # which may be more convenient to use. + # (leaf "spawn-at-startup" [ "alacritty" "-e" "fish" ]) + + # You can override environment variables for processes spawned by niri. + (plain "environment" [ + # Set a variable like this: + # (leaf "QT_QPA_PLATFORM" "wayland") + + # Remove a variable by using null as the value: + # (leaf "DISPLAY" null) + ]) + + (plain "cursor" [ + # Change the theme and size of the cursor as well as set the + # `XCURSOR_THEME` and `XCURSOR_SIZE` env variables. + # (leaf "xcursor-theme" "default") + # (leaf "xcursor-size" 24) + ]) + + # 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 rounded corners. + # (flag "prefer-no-csd") + + # You can change the path where screenshots are saved. + # A ~ at the front will be expanded to the home directory. + # The path is formatted with strftime(3) to give you the screenshot date and time. + (leaf "screenshot-path" "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png") + + # You can also set this to null to disable saving screenshots to disk. + # (leaf "screenshot-path" null) + + # Settings for the "Important Hotkeys" overlay. + (plain "hotkey-overlay" [ + # Uncomment this line if you don't want to see the hotkey help at niri startup. + # (flag "skip-at-startup") + ]) + + # Animation settings. + (plain "animations" [ + # Uncomment to turn off all animations. + # (flag "off") + + # Slow down all animations by this factor. Values below 1 speed them up instead. + # (leaf "slowdown" 3.0) + + # You can configure all individual animations. + # Available settings are the same for all of them. + # - off disables the animation. + # + # Niri supports two animation types: easing and spring. + # You can set properties for only ONE of them. + # + # Easing has the following settings: + # - duration-ms sets the duration of the animation in milliseconds. + # - curve sets the easing curve. Currently, available curves + # are "ease-out-cubic" and "ease-out-expo". + # + # Spring animations work better with touchpad gestures, because they + # take into account the velocity of your fingers as you release the swipe. + # The parameters are less obvious and generally should be tuned + # with trial and error. Notably, you cannot directly set the duration. + # You can use this app to help visualize how the spring parameters + # change the animation: https://flathub.org/apps/app.drey.Elastic + # + # A spring animation is configured like this: + # - (leaf "spring" { damping-ratio=1.0; stiffness=1000; epsilon=0.0001; }) + # + # The damping ratio goes from 0.1 to 10.0 and has the following properties: + # - below 1.0: underdamped spring, will oscillate in the end. + # - above 1.0: overdamped spring, won't oscillate. + # - 1.0: critically damped spring, comes to rest in minimum possible time + # without oscillations. + # + # However, even with damping ratio = 1.0 the spring animation may oscillate + # if "launched" with enough velocity from a touchpad swipe. + # + # Lower stiffness will result in a slower animation more prone to oscillation. + # + # Set epsilon to a lower value if the animation "jumps" in the end. + # + # The spring mass is hardcoded to 1.0 and cannot be changed. Instead, change + # stiffness proportionally. E.g. increasing mass by 2x is the same as + # decreasing stiffness by 2x. + + # Animation when switching workspaces up and down, + # including after the touchpad gesture. + (plain "workspace-switch" [ + # (flag "off") + # (leaf "spring" { damping-ratio=1.0; stiffness=1000; epsilon=0.0001; }) + ]) + + # All horizontal camera view movement: + # - When a window off-screen is focused and the camera scrolls to it. + # - When a new window appears off-screen and the camera scrolls to it. + # - When a window resizes bigger and the camera scrolls to show it in full. + # - And so on. + (plain "horizontal-view-movement" [ + # (flag "off") + # (leaf "spring" { damping-ratio=1.0; stiffness=800; epsilon=0.0001; }) + ]) + + # Window opening animation. Note that this one has different defaults. + (plain "window-open" [ + # (flag "off") + # (leaf "duration-ms" 150) + # (leaf "curve" "ease-out-expo") + + # Example for a slightly bouncy window opening: + # (leaf "spring" { damping-ratio=0.8; stiffness=1000; epsilon=0.0001; }) + ]) + + # Config parse error and new default config creation notification + # open/close animation. + (plain "config-notification-open-close" [ + # (flag "off") + # (leaf "spring" { damping-ratio=0.6; stiffness=1000; epsilon=0.001; }) + ]) + ]) + + # Window rules let you adjust behavior for individual windows. + # They are processed in order of appearance in this file. + # (plain "window-rule" [ + # # Match directives control which windows this rule will apply to. + # # You can match by app-id and by title. + # # The window must match all properties of the match directive. + # (leaf "match" { + # app-id = "org.myapp.MyApp"; + # title = "My Cool App"; + # }) + # + # # There can be multiple match directives. A window must match any one + # # of the rule's match directives. + # # + # # If there are no match directives, any window will match the rule. + # (leaf "match" { title = "Second App"; }) + # + # # You can also add exclude directives which have the same properties. + # # If a window matches any exclude directive, it won't match this rule. + # # + # # Both app-id and title are regular expressions. + # # Literal nix strings can be helpful here. + # (leaf "exclude" { app-id = ''\.unwanted\.''; }) + # + # # Here are the properties that you can set on a window rule. + # # You can override the default column width. + # (plain "default-column-width" [ + # (leaf "proportion" 0.75) + # ]) + # + # # You can set the output that this window will initially open on. + # # If such an output does not exist, it will open on the currently + # # focused output as usual. + # (leaf "open-on-output" "eDP-1") + # + # # Make this window open as a maximized column. + # (leaf "open-maximized" true) + # + # # Make this window open fullscreen. + # (leaf "open-fullscreen" true) + # # You can also set this to false to prevent a window from opening fullscreen. + # # (leaf "open-fullscreen" false) + # ]) + # + # # Here's a useful example. Work around WezTerm's initial configure bug + # # by setting an empty default-column-width. + # (plain "window-rule" [ + # # This regular expression is intentionally made as specific as possible, + # # since this is the default config, and we want no false positives. + # # You can get away with just app-id="wezterm" if you want. + # # The regular expression can match anywhere in the string. + # (leaf "match" { app-id = ''^org\.wezfurlong\.wezterm$''; }) + # (plain "default-column-width" [ ]) + # ]) + + (plain "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. + (plain "Mod+Shift+Slash" [ (flag "show-hotkey-overlay") ]) + + # Suggested binds for running programs: terminal, app launcher, screen locker. + (plain "Mod+Return" [ (leaf "spawn" [ "foot" ]) ]) + (plain "Mod+Shift+Return" [ (leaf "spawn" [ "alacritty" ]) ]) + (plain "Mod+D" [ (leaf "spawn" [ "anyrun" ]) ]) + (plain "CTRL+Alt+L" [ (leaf "spawn" [ "swaylock" ]) ]) + + # You can also use a shell: + # (plain "Mod+T" [(leaf "spawn" [ "bash" "-c" "notify-send hello && exec alacritty" ])]) + + # Example volume keys mappings for PipeWire & WirePlumber. + (plain "XF86AudioRaiseVolume" [ + (leaf "spawn" [ + "wpctl" + "set-volume" + "@DEFAULT_AUDIO_SINK@" + "0.1+" + ]) + ]) + (plain "XF86AudioLowerVolume" [ + (leaf "spawn" [ + "wpctl" + "set-volume" + "@DEFAULT_AUDIO_SINK@" + "0.1-" + ]) + ]) + + (plain "Mod+Q" [ (flag "close-window") ]) + + (plain "Mod+Left" [ (flag "focus-column-left") ]) + (plain "Mod+Down" [ (flag "focus-window-down") ]) + (plain "Mod+Up" [ (flag "focus-window-up") ]) + (plain "Mod+Right" [ (flag "focus-column-right") ]) + (plain "Mod+H" [ (flag "focus-column-left") ]) + (plain "Mod+J" [ (flag "focus-window-down") ]) + (plain "Mod+K" [ (flag "focus-window-up") ]) + (plain "Mod+L" [ (flag "focus-column-right") ]) + + (plain "Mod+Ctrl+Left" [ (flag "move-column-left") ]) + (plain "Mod+Ctrl+Down" [ (flag "move-window-down") ]) + (plain "Mod+Ctrl+Up" [ (flag "move-window-up") ]) + (plain "Mod+Ctrl+Right" [ (flag "move-column-right") ]) + (plain "Mod+Ctrl+H" [ (flag "move-column-left") ]) + (plain "Mod+Ctrl+J" [ (flag "move-window-down") ]) + (plain "Mod+Ctrl+K" [ (flag "move-window-up") ]) + (plain "Mod+Ctrl+L" [ (flag "move-column-right") ]) + + # Alternative commands that move across workspaces when reaching + # the first or last window in a column. + # (plain "Mod+J" [(flag "focus-window-or-workspace-down")]) + # (plain "Mod+K" [(flag "focus-window-or-workspace-up")]) + # (plain "Mod+Ctrl+J" [(flag "move-window-down-or-to-workspace-down")]) + # (plain "Mod+Ctrl+K" [(flag "move-window-up-or-to-workspace-up")]) + + (plain "Mod+Home" [ (flag "focus-column-first") ]) + (plain "Mod+End" [ (flag "focus-column-last") ]) + (plain "Mod+Ctrl+Home" [ (flag "move-column-to-first") ]) + (plain "Mod+Ctrl+End" [ (flag "move-column-to-last") ]) + + (plain "Mod+Shift+Left" [ (flag "focus-monitor-left") ]) + (plain "Mod+Shift+Down" [ (flag "focus-monitor-down") ]) + (plain "Mod+Shift+Up" [ (flag "focus-monitor-up") ]) + (plain "Mod+Shift+Right" [ (flag "focus-monitor-right") ]) + (plain "Mod+Shift+H" [ (flag "focus-monitor-left") ]) + (plain "Mod+Shift+J" [ (flag "focus-monitor-down") ]) + (plain "Mod+Shift+K" [ (flag "focus-monitor-up") ]) + (plain "Mod+Shift+L" [ (flag "focus-monitor-right") ]) + + (plain "Mod+Shift+Ctrl+Left" [ (flag "move-column-to-monitor-left") ]) + (plain "Mod+Shift+Ctrl+Down" [ (flag "move-column-to-monitor-down") ]) + (plain "Mod+Shift+Ctrl+Up" [ (flag "move-column-to-monitor-up") ]) + (plain "Mod+Shift+Ctrl+Right" [ (flag "move-column-to-monitor-right") ]) + (plain "Mod+Shift+Ctrl+H" [ (flag "move-column-to-monitor-left") ]) + (plain "Mod+Shift+Ctrl+J" [ (flag "move-column-to-monitor-down") ]) + (plain "Mod+Shift+Ctrl+K" [ (flag "move-column-to-monitor-up") ]) + (plain "Mod+Shift+Ctrl+L" [ (flag "move-column-to-monitor-right") ]) + + # Alternatively, there are commands to move just a single window: + # (plain "Mod+Shift+Ctrl+Left" [(flag "move-window-to-monitor-left")]) + # ... + + # And you can also move a whole workspace to another monitor: + # (plain "Mod+Shift+Ctrl+Left" [(flag "move-workspace-to-monitor-left")]) + # ... + + (plain "Mod+Page_Down" [ (flag "focus-workspace-down") ]) + (plain "Mod+Page_Up" [ (flag "focus-workspace-up") ]) + (plain "Mod+U" [ (flag "focus-workspace-down") ]) + (plain "Mod+I" [ (flag "focus-workspace-up") ]) + (plain "Mod+Ctrl+Page_Down" [ (flag "move-column-to-workspace-down") ]) + (plain "Mod+Ctrl+Page_Up" [ (flag "move-column-to-workspace-up") ]) + (plain "Mod+Ctrl+U" [ (flag "move-column-to-workspace-down") ]) + (plain "Mod+Ctrl+I" [ (flag "move-column-to-workspace-up") ]) + + # Alternatively, there are commands to move just a single window: + # (plain "Mod+Ctrl+Page_Down" [(flag "move-window-to-workspace-down")]) + # ... + + (plain "Mod+Shift+Page_Down" [ (flag "move-workspace-down") ]) + (plain "Mod+Shift+Page_Up" [ (flag "move-workspace-up") ]) + (plain "Mod+Shift+U" [ (flag "move-workspace-down") ]) + (plain "Mod+Shift+I" [ (flag "move-workspace-up") ]) + + # 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. + (plain "Mod+1" [ (leaf "focus-workspace" 1) ]) + (plain "Mod+2" [ (leaf "focus-workspace" 2) ]) + (plain "Mod+3" [ (leaf "focus-workspace" 3) ]) + (plain "Mod+4" [ (leaf "focus-workspace" 4) ]) + (plain "Mod+5" [ (leaf "focus-workspace" 5) ]) + (plain "Mod+6" [ (leaf "focus-workspace" 6) ]) + (plain "Mod+7" [ (leaf "focus-workspace" 7) ]) + (plain "Mod+8" [ (leaf "focus-workspace" 8) ]) + (plain "Mod+9" [ (leaf "focus-workspace" 9) ]) + (plain "Mod+Ctrl+1" [ (leaf "move-column-to-workspace" 1) ]) + (plain "Mod+Ctrl+2" [ (leaf "move-column-to-workspace" 2) ]) + (plain "Mod+Ctrl+3" [ (leaf "move-column-to-workspace" 3) ]) + (plain "Mod+Ctrl+4" [ (leaf "move-column-to-workspace" 4) ]) + (plain "Mod+Ctrl+5" [ (leaf "move-column-to-workspace" 5) ]) + (plain "Mod+Ctrl+6" [ (leaf "move-column-to-workspace" 6) ]) + (plain "Mod+Ctrl+7" [ (leaf "move-column-to-workspace" 7) ]) + (plain "Mod+Ctrl+8" [ (leaf "move-column-to-workspace" 8) ]) + (plain "Mod+Ctrl+9" [ (leaf "move-column-to-workspace" 9) ]) + + # Alternatively, there are commands to move just a single window: + # (plain "Mod+Ctrl+1" [(leaf "move-window-to-workspace" 1)]) + + (plain "Mod+Comma" [ (flag "consume-window-into-column") ]) + (plain "Mod+Period" [ (flag "expel-window-from-column") ]) + + # There are also commands that consume or expel a single window to the side. + # (plain "Mod+BracketLeft" [(flag "consume-or-expel-window-left")]) + # (plain "Mod+BracketRight" [(flag "consume-or-expel-window-right")]) + + (plain "Mod+R" [ (flag "switch-preset-column-width") ]) + (plain "Mod+F" [ (flag "maximize-column") ]) + (plain "Mod+Shift+F" [ (flag "fullscreen-window") ]) + (plain "Mod+C" [ (flag "center-column") ]) + + # 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, + # (leaf "set-column-width" "100") will make the column occupy 200 physical screen pixels. + (plain "Mod+Minus" [ (leaf "set-column-width" "-10%") ]) + (plain "Mod+Equal" [ (leaf "set-column-width" "+10%") ]) + + # Finer height adjustments when in column with other windows. + (plain "Mod+Shift+Minus" [ (leaf "set-window-height" "-10%") ]) + (plain "Mod+Shift+Equal" [ (leaf "set-window-height" "+10%") ]) + + # 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). + # (plain "Mod+Space" [(leaf "switch-layout" "next")]) + # (plain "Mod+Shift+Space" [(leaf "switch-layout" "prev")]) + + (plain "Print" [ (flag "screenshot") ]) + (plain "Ctrl+Print" [ (flag "screenshot-screen") ]) + (plain "Alt+Print" [ (flag "screenshot-window") ]) + + # The quit action will show a confirmation dialog to avoid accidental exits. + # If you want to skip the confirmation dialog, set the flag like so: + # (plain "Mod+Shift+E" [(leaf "quit" { skip-confirmation=true; })]) + (plain "Mod+Shift+E" [ (flag "quit") ]) + + (plain "Mod+Shift+P" [ (flag "power-off-monitors") ]) + + # This debug bind will tint all surfaces green, unless they are being + # directly scanned out. It's therefore useful to check if direct scanout + # is working. + # (plain "Mod+Shift+Ctrl+T" [(flag "toggle-debug-tint")]) + ]) + ]; + }; +} diff --git a/hosts/12kingdoms-shoukei/home.nix b/hosts/12kingdoms-shoukei/home.nix index 6c0d604f..c8fbbf07 100644 --- a/hosts/12kingdoms-shoukei/home.nix +++ b/hosts/12kingdoms-shoukei/home.nix @@ -1,8 +1,11 @@ -{ config, ... }: +{ config, niri, ... }: let hostName = "shoukei"; # Define your hostname. in { + programs.ssh.matchBlocks."github.com".identityFile = + "${config.home.homeDirectory}/.ssh/${hostName}"; + modules.desktop.hyprland = { nvidia = false; settings.source = [ @@ -10,6 +13,35 @@ in ]; }; - programs.ssh.matchBlocks."github.com".identityFile = - "${config.home.homeDirectory}/.ssh/${hostName}"; + modules.desktop.niri = { + settings = + let + inherit (niri.lib.kdl) + node + plain + leaf + flag + ; + in + [ + (node "output" "eDP-1" [ + (leaf "scale" 1.5) + (leaf "transform" "normal") + (leaf "mode" "2560x1600@60") + (leaf "position" { + x = 0; + y = 0; + }) + ]) + + # Settings for debugging. Not meant for normal use. + # These can change or stop working at any point with little notice. + (plain "debug" [ + # Override the DRM device that niri will use for all rendering. + # Fix: niri fails to correctly detect the primary render device + (leaf "render-drm-device" "/dev/dri/renderD128") + ]) + ]; + }; + } diff --git a/hosts/idols-ai/home.nix b/hosts/idols-ai/home.nix index b6ae7b60..6b579a93 100644 --- a/hosts/idols-ai/home.nix +++ b/hosts/idols-ai/home.nix @@ -1,13 +1,68 @@ -{ config, ... }: +{ config, niri, ... }: { - modules.desktop = { - hyprland = { - nvidia = true; - settings.source = [ - "${config.home.homeDirectory}/nix-config/hosts/idols-ai/hypr-hardware.conf" - ]; - }; + programs.ssh.matchBlocks."github.com".identityFile = "${config.home.homeDirectory}/.ssh/idols-ai"; + + modules.desktop.hyprland = { + nvidia = true; + settings.source = [ + "${config.home.homeDirectory}/nix-config/hosts/idols-ai/hypr-hardware.conf" + ]; }; - programs.ssh.matchBlocks."github.com".identityFile = "${config.home.homeDirectory}/.ssh/idols-ai"; + modules.desktop.niri = { + settings = + let + inherit (niri.lib.kdl) + node + plain + leaf + flag + ; + in + [ + # running `niri msg outputs` to find outputs + (node "output" "DP-2" [ + # Uncomment this line to disable this output. + # (flag "off") + + # Scale is a floating-point number, but at the moment only integer values work. + (leaf "scale" 1.5) + + # Transform allows to rotate the output counter-clockwise, valid values are: + # normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270. + (leaf "transform" "normal") + + # Resolution and, optionally, refresh rate of the output. + # The format is "x" or "x@". + # If the refresh rate is omitted, niri will pick the highest refresh rate + # for the resolution. + # If the mode is omitted altogether or is invalid, niri will pick one automatically. + # Run `niri msg outputs` while inside a niri instance to list all outputs and their modes. + (leaf "mode" "3840x2160@144") + + # Position of the output in the global coordinate space. + # This affects directional monitor actions like "focus-monitor-left", and cursor movement. + # The cursor can only move between directly adjacent outputs. + # Output scale has to be taken into account for positioning: + # outputs are sized in logical, or scaled, pixels. + # For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080, + # so to put another output directly adjacent to it on the right, set its x to 1920. + # It the position is unset or results in an overlap, the output is instead placed + # automatically. + (leaf "position" { + x = 0; + y = 0; + }) + ]) + (node "output" "HDMI-A-1" [ + (leaf "scale" 1.5) + (leaf "transform" "normal") + (leaf "mode" "3840x2160@60") + (leaf "position" { + x = 2560; # on the right of DP-2 + y = 0; + }) + ]) + ]; + }; } diff --git a/outputs/aarch64-linux/src/12kingdoms-shoukei.nix b/outputs/aarch64-linux/src/12kingdoms-shoukei.nix index f2fbe22a..61ff28ea 100644 --- a/outputs/aarch64-linux/src/12kingdoms-shoukei.nix +++ b/outputs/aarch64-linux/src/12kingdoms-shoukei.nix @@ -14,17 +14,27 @@ let # Shoukei (祥瓊, Shōkei) name = "shoukei"; base-modules = { - nixos-modules = map mylib.relativeToRoot [ - # common - "secrets/nixos.nix" - "modules/nixos/desktop.nix" - # host specific - "hosts/12kingdoms-${name}" - # nixos hardening - # "hardening/profiles/default.nix" - "hardening/nixpaks" - "hardening/bwraps" - ]; + nixos-modules = + (map mylib.relativeToRoot [ + # common + "secrets/nixos.nix" + "modules/nixos/desktop.nix" + # host specific + "hosts/12kingdoms-${name}" + # nixos hardening + # "hardening/profiles/default.nix" + "hardening/nixpaks" + "hardening/bwraps" + ]) + ++ [ + inputs.niri.nixosModules.niri + { + modules.desktop.fonts.enable = true; + modules.desktop.wayland.enable = true; + modules.secrets.desktop.enable = true; + modules.secrets.preservation.enable = true; + } + ]; home-modules = map mylib.relativeToRoot [ # common "home/linux/gui.nix" @@ -35,14 +45,6 @@ let modules-hyprland = { nixos-modules = [ - { - modules.desktop.wayland.enable = true; - modules.secrets.desktop.enable = true; - modules.secrets.preservation.enable = true; - - # TODO: remove this option - nixpkgs.config.allowUnsupportedSstem = true; - } ] ++ base-modules.nixos-modules; home-modules = [ @@ -50,15 +52,28 @@ let ] ++ base-modules.home-modules; }; + + modules-niri = { + nixos-modules = [ + { programs.niri.enable = true; } + ] + ++ base-modules.nixos-modules; + home-modules = [ + { modules.desktop.niri.enable = true; } + ] + ++ base-modules.home-modules; + }; in { nixosConfigurations = { # host with hyprland compositor "${name}-hyprland" = mylib.nixosSystem (modules-hyprland // args); + "${name}-niri" = mylib.nixosSystem (modules-niri // args); }; # generate iso image for hosts with desktop environment packages = { "${name}-hyprland" = inputs.self.nixosConfigurations."${name}-hyprland".config.formats.iso; + "${name}-niri" = inputs.self.nixosConfigurations."${name}-niri".config.formats.iso; }; } diff --git a/outputs/aarch64-linux/tests/home-manager/expected.nix b/outputs/aarch64-linux/tests/home-manager/expected.nix index 8f338aaa..06990df2 100644 --- a/outputs/aarch64-linux/tests/home-manager/expected.nix +++ b/outputs/aarch64-linux/tests/home-manager/expected.nix @@ -6,6 +6,7 @@ let username = myvars.username; hosts = [ "shoukei-hyprland" + "shoukei-niri" ]; in lib.genAttrs hosts (_: "/home/${username}") diff --git a/outputs/aarch64-linux/tests/home-manager/expr.nix b/outputs/aarch64-linux/tests/home-manager/expr.nix index 05c367a4..2c127312 100644 --- a/outputs/aarch64-linux/tests/home-manager/expr.nix +++ b/outputs/aarch64-linux/tests/home-manager/expr.nix @@ -7,6 +7,7 @@ let username = myvars.username; hosts = [ "shoukei-hyprland" + "shoukei-niri" ]; in lib.genAttrs hosts ( diff --git a/outputs/aarch64-linux/tests/hostname/expected.nix b/outputs/aarch64-linux/tests/hostname/expected.nix index 24df8902..0b061943 100644 --- a/outputs/aarch64-linux/tests/hostname/expected.nix +++ b/outputs/aarch64-linux/tests/hostname/expected.nix @@ -5,6 +5,7 @@ let specialExpected = { "shoukei-hyprland" = "shoukei"; + "shoukei-niri" = "shoukei"; }; specialHostNames = builtins.attrNames specialExpected; diff --git a/outputs/x86_64-linux/src/idols-ai.nix b/outputs/x86_64-linux/src/idols-ai.nix index dece6db9..ed43cd18 100644 --- a/outputs/x86_64-linux/src/idols-ai.nix +++ b/outputs/x86_64-linux/src/idols-ai.nix @@ -8,23 +8,34 @@ mylib, system, genSpecialArgs, + niri, ... }@args: let # 星野 アイ, Hoshino Ai name = "ai"; base-modules = { - nixos-modules = map mylib.relativeToRoot [ - # common - "secrets/nixos.nix" - "modules/nixos/desktop.nix" - # host specific - "hosts/idols-${name}" - # nixos hardening - # "hardening/profiles/default.nix" - "hardening/nixpaks" - "hardening/bwraps" - ]; + nixos-modules = + (map mylib.relativeToRoot [ + # common + "secrets/nixos.nix" + "modules/nixos/desktop.nix" + # host specific + "hosts/idols-${name}" + # nixos hardening + # "hardening/profiles/default.nix" + "hardening/nixpaks" + "hardening/bwraps" + ]) + ++ [ + inputs.niri.nixosModules.niri + { + modules.desktop.fonts.enable = true; + modules.desktop.wayland.enable = true; + modules.secrets.desktop.enable = true; + modules.secrets.preservation.enable = true; + } + ]; home-modules = map mylib.relativeToRoot [ # common "home/linux/gui.nix" @@ -35,12 +46,6 @@ let modules-hyprland = { nixos-modules = [ - { - modules.desktop.fonts.enable = true; - modules.desktop.wayland.enable = true; - modules.secrets.desktop.enable = true; - modules.secrets.preservation.enable = true; - } ] ++ base-modules.nixos-modules; home-modules = [ @@ -48,15 +53,28 @@ let ] ++ base-modules.home-modules; }; + + modules-niri = { + nixos-modules = [ + { programs.niri.enable = true; } + ] + ++ base-modules.nixos-modules; + home-modules = [ + { modules.desktop.niri.enable = true; } + ] + ++ base-modules.home-modules; + }; in { nixosConfigurations = { # host with hyprland compositor "${name}-hyprland" = mylib.nixosSystem (modules-hyprland // args); + "${name}-niri" = mylib.nixosSystem (modules-niri // args); }; # generate iso image for hosts with desktop environment packages = { "${name}-hyprland" = inputs.self.nixosConfigurations."${name}-hyprland".config.formats.iso; + "${name}-niri" = inputs.self.nixosConfigurations."${name}-niri".config.formats.iso; }; } diff --git a/outputs/x86_64-linux/tests/home-manager/expected.nix b/outputs/x86_64-linux/tests/home-manager/expected.nix index 417a2c84..14d95dbf 100644 --- a/outputs/x86_64-linux/tests/home-manager/expected.nix +++ b/outputs/x86_64-linux/tests/home-manager/expected.nix @@ -6,6 +6,7 @@ let username = myvars.username; hosts = [ "ai-hyprland" + "ai-niri" "ruby" "k3s-prod-1-master-1" ]; diff --git a/outputs/x86_64-linux/tests/home-manager/expr.nix b/outputs/x86_64-linux/tests/home-manager/expr.nix index 124368dd..964d201a 100644 --- a/outputs/x86_64-linux/tests/home-manager/expr.nix +++ b/outputs/x86_64-linux/tests/home-manager/expr.nix @@ -7,6 +7,7 @@ let username = myvars.username; hosts = [ "ai-hyprland" + "ai-niri" "ruby" "k3s-prod-1-master-1" ]; diff --git a/outputs/x86_64-linux/tests/hostname/expected.nix b/outputs/x86_64-linux/tests/hostname/expected.nix index 59d9a213..bd18950b 100644 --- a/outputs/x86_64-linux/tests/hostname/expected.nix +++ b/outputs/x86_64-linux/tests/hostname/expected.nix @@ -5,6 +5,7 @@ let specialExpected = { "ai-hyprland" = "ai"; + "ai-niri" = "ai"; }; specialHostNames = builtins.attrNames specialExpected;