diff --git a/dot_config/flake/flake.lock b/dot_config/flake/flake.lock index ef24c89..42fc195 100644 --- a/dot_config/flake/flake.lock +++ b/dot_config/flake/flake.lock @@ -152,11 +152,11 @@ ] }, "locked": { - "lastModified": 1756496801, - "narHash": "sha256-IYIsnPy+cJxe8RbDHBrCtfJY0ry2bG2H7WvMcewiGS8=", + "lastModified": 1756579987, + "narHash": "sha256-duCce8zGsaMsrqqOmLOsuaV1PVIw/vXWnKuLKZClsGg=", "owner": "nix-community", "repo": "home-manager", - "rev": "77a71380c38fb2a440b4b5881bbc839f6230e1cb", + "rev": "99a69bdf8a3c6bf038c4121e9c4b6e99706a187a", "type": "github" }, "original": { @@ -165,6 +165,62 @@ "type": "github" } }, + "niri": { + "inputs": { + "niri-stable": "niri-stable", + "niri-unstable": "niri-unstable", + "nixpkgs": "nixpkgs_3", + "nixpkgs-stable": "nixpkgs-stable", + "xwayland-satellite-stable": "xwayland-satellite-stable", + "xwayland-satellite-unstable": "xwayland-satellite-unstable" + }, + "locked": { + "lastModified": 1756593635, + "narHash": "sha256-tus6sIQr5EA9J1Vqpf5TN6MtLTpbIqqThUncgAMteRo=", + "owner": "sodiboo", + "repo": "niri-flake", + "rev": "01285d6ffb9214e6e524cfb7a4752a3c20be6b2b", + "type": "github" + }, + "original": { + "owner": "sodiboo", + "repo": "niri-flake", + "type": "github" + } + }, + "niri-stable": { + "flake": false, + "locked": { + "lastModified": 1756556321, + "narHash": "sha256-RLD89dfjN0RVO86C/Mot0T7aduCygPGaYbog566F0Qo=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "01be0e65f4eb91a9cd624ac0b76aaeab765c7294", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "ref": "v25.08", + "repo": "niri", + "type": "github" + } + }, + "niri-unstable": { + "flake": false, + "locked": { + "lastModified": 1756556321, + "narHash": "sha256-RLD89dfjN0RVO86C/Mot0T7aduCygPGaYbog566F0Qo=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "01be0e65f4eb91a9cd624ac0b76aaeab765c7294", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "repo": "niri", + "type": "github" + } + }, "nix": { "inputs": { "flake-parts": "flake-parts", @@ -232,13 +288,29 @@ "type": "github" } }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1756469547, + "narHash": "sha256-YvtD2E7MYsQ3r7K9K2G7nCslCKMPShoSEAtbjHLtH0k=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "41d292bfc37309790f70f4c120b79280ce40af16", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs-unstable": { "locked": { - "lastModified": 1756386758, - "narHash": "sha256-1wxxznpW2CKvI9VdniaUnTT2Os6rdRJcRUf65ZK9OtE=", + "lastModified": 1756542300, + "narHash": "sha256-tlOn88coG5fzdyqz6R93SQL5Gpq+m/DsWpekNFhqPQk=", "owner": "nixos", "repo": "nixpkgs", - "rev": "dfb2f12e899db4876308eba6d93455ab7da304cd", + "rev": "d7600c775f877cd87b4f5a831c28aa94137377aa", "type": "github" }, "original": { @@ -263,6 +335,22 @@ } }, "nixpkgs_3": { + "locked": { + "lastModified": 1756542300, + "narHash": "sha256-tlOn88coG5fzdyqz6R93SQL5Gpq+m/DsWpekNFhqPQk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d7600c775f877cd87b4f5a831c28aa94137377aa", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { "locked": { "lastModified": 1756469547, "narHash": "sha256-YvtD2E7MYsQ3r7K9K2G7nCslCKMPShoSEAtbjHLtH0k=", @@ -283,9 +371,43 @@ "darwin": "darwin", "determinate": "determinate", "home-manager": "home-manager", - "nixpkgs": "nixpkgs_3", + "niri": "niri", + "nixpkgs": "nixpkgs_4", "nixpkgs-unstable": "nixpkgs-unstable" } + }, + "xwayland-satellite-stable": { + "flake": false, + "locked": { + "lastModified": 1755491097, + "narHash": "sha256-m+9tUfsmBeF2Gn4HWa6vSITZ4Gz1eA1F5Kh62B0N4oE=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "388d291e82ffbc73be18169d39470f340707edaa", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "ref": "v0.7", + "repo": "xwayland-satellite", + "type": "github" + } + }, + "xwayland-satellite-unstable": { + "flake": false, + "locked": { + "lastModified": 1756570086, + "narHash": "sha256-vnbIvAqSt+hSd6blDc9IMvZKxAcHpqLhy25tDvosrug=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "1d156aa8d30b124ff770488e5e34289a08ff4207", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "type": "github" + } } }, "root": "root", diff --git a/dot_config/flake/flake.nix b/dot_config/flake/flake.nix index d0b3958..0508d07 100644 --- a/dot_config/flake/flake.nix +++ b/dot_config/flake/flake.nix @@ -9,6 +9,20 @@ url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; + niri = { + url = "github:sodiboo/niri-flake"; + }; + + noctalia = { + url = "github:noctalia-dev/noctalia-shell"; + inputs.nixpkgs.follows = "nixpkgs-unstable"; + }; + + quickshell = { + url = "github:outfoxxed/quickshell"; + inputs.nixpkgs.follows = "nixpkgs-unstable"; + inputs.quickshell.follows = "quickshell"; + }; darwin = { url = "github:nix-darwin/nix-darwin/nix-darwin-25.05"; @@ -22,6 +36,9 @@ nixpkgs-unstable, determinate, home-manager, + niri, + noctalia, + quickshell, darwin, ... } @ inputs: let diff --git a/dot_config/flake/home/darkman.nix b/dot_config/flake/home/darkman.nix index 8bb013d..8ecbce6 100644 --- a/dot_config/flake/home/darkman.nix +++ b/dot_config/flake/home/darkman.nix @@ -1,4 +1,4 @@ -{...}: { +{pkgs, ...}: { services.darkman = { enable = true; settings = { @@ -6,15 +6,25 @@ }; lightModeScripts = { - fish = '' - yes | fish_config theme save "Rosé Pine Dawn" + # fish = '' + # yes | fish_config theme save "Rosé Pine Dawn" + # ''; + + gtk-theme = '' + ${pkgs.dconf}/bin/dconf write \ + /org/gnome/desktop/interface/color-scheme "'prefer-light'" ''; }; darkModeScripts = { - fish = '' - yes | fish_config theme save "Rosé Pine" + gtk-theme = '' + ${pkgs.dconf}/bin/dconf write \ + /org/gnome/desktop/interface/color-scheme "'prefer-dark'" ''; + + # fish = '' + # yes | fish_config theme save "Rosé Pine" + # ''; }; }; } diff --git a/dot_config/flake/home/ghostty.nix b/dot_config/flake/home/ghostty.nix index 74ba421..1960597 100644 --- a/dot_config/flake/home/ghostty.nix +++ b/dot_config/flake/home/ghostty.nix @@ -1,6 +1,5 @@ { pkgs, - lib, ... }: let catppuccin = pkgs.fetchFromGitHub { diff --git a/dot_config/flake/home/gui.nix b/dot_config/flake/home/gui.nix index 875e52c..8f8da7e 100644 --- a/dot_config/flake/home/gui.nix +++ b/dot_config/flake/home/gui.nix @@ -6,7 +6,7 @@ home.packages = with pkgs; [ adw-gtk3 - discord + pkgs.mods.discord # Office libreoffice diff --git a/dot_config/flake/home/niri.nix b/dot_config/flake/home/niri.nix new file mode 100644 index 0000000..bdda960 --- /dev/null +++ b/dot_config/flake/home/niri.nix @@ -0,0 +1,625 @@ +{ + pkgs, + inputs, + config, + ... +}: { + imports = [ + ./darkman.nix + ]; + + programs.fuzzel.enable = true; + + home.packages = with pkgs; [ + inputs.noctalia.packages.${system}.default + inputs.quickshell.packages.${system}.default + ]; + + programs.niri.settings = { + cursor = { + size = 12; + }; + + # This config is in the KDL format: https://kdl.dev + # "/-" comments out the following node. + # Check the wiki for a full description of the configuration: + # https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction + + # Input device configuration. + # Find the full list of options on the wiki: + # https://github.com/YaLTeR/niri/wiki/Configuration:-Input + input = { + # keyboard { + # xkb { + # // You can set rules, model, layout, variant and options. + # // For more information, see xkeyboard-config(7). + + # // For example: + # // layout "us,ru" + # // options "grp:win_space_toggle,compose:ralt,ctrl:nocaps" + # } + + # // Enable numlock on startup, omitting this setting disables it. + # numlock + # } + + # // Next sections include libinput settings. + # // Omitting settings disables them, or leaves them at their default values. + # touchpad { + # // off + # tap + # // dwt + # // dwtp + # // drag false + # // drag-lock + # natural-scroll + # // accel-speed 0.2 + # // accel-profile "flat" + # // scroll-method "two-finger" + # // disabled-on-external-mouse + # } + + # mouse { + # // off + # // natural-scroll + # // accel-speed 0.2 + # // accel-profile "flat" + # // scroll-method "no-scroll" + # } + + # trackpoint { + # // off + # // natural-scroll + # // accel-speed 0.2 + # // accel-profile "flat" + # // scroll-method "on-button-down" + # // scroll-button 273 + # // middle-emulation + # } + + # // Uncomment this to make the mouse warp to the center of newly focused windows. + # // warp-mouse-to-focus + + # // Focus windows and outputs automatically when moving the mouse into them. + # // Setting max-scroll-amount="0%" makes it work only on windows already fully on screen. + # // focus-follows-mouse max-scroll-amount="0%" + }; + + # // You can configure outputs by their name, which you can find + # // by running `niri msg outputs` while inside a niri instance. + # // The built-in laptop monitor is usually called "eDP-1". + # // Find more information on the wiki: + # // https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs + # // Remember to uncomment the node by removing "/-"! + # /-output "eDP-1" { + # // Uncomment this line to disable this output. + # // off + + # // 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. + # mode "1920x1080@120.030" + + # // You can use integer or fractional scale, for example use 1.5 for 150% scale. + # scale 2 + + # // Transform allows to rotate the output counter-clockwise, valid values are: + # // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270. + # transform "normal" + + # // 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 and rotation 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. + # // If the position is unset or results in an overlap, the output is instead placed + # // automatically. + # position x=1280 y=0 + # } + + # // Settings that influence how windows are positioned and sized. + # // Find more information on the wiki: + # // https://github.com/YaLTeR/niri/wiki/Configuration:-Layout + # layout { + # // Set gaps around windows in logical pixels. + # gaps 16 + + # // 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. + # // - "always", the focused column will always be centered. + # // - "on-overflow", focusing a column will center it if it doesn't fit + # // together with the previously focused column. + # center-focused-column "never" + + # // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. + # 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. + # proportion 0.33333 + # proportion 0.5 + # proportion 0.66667 + + # // Fixed sets the width in logical pixels exactly. + # // fixed 1920 + # } + + # // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between. + # // preset-window-heights { } + + # // You can change the default width of the new windows. + # default-column-width { proportion 0.5; } + # // If you leave the brackets empty, the windows themselves will decide their initial width. + # // default-column-width {} + + # // 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. + # // + # // Alternatively, you can override it with a window rule called + # // `draw-border-with-background`. + + # // You can change how the focus ring looks. + # focus-ring { + # // Uncomment this line to disable the focus ring. + # // off + + # // How many logical pixels the ring extends out from the windows. + # 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. + # active-color "#7fc8ff" + + # // Color of the ring on inactive monitors. + # inactive-color "#505050" + + # // 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. + # // Changing the color space is also supported, check the wiki for more info. + # // + # // 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". + # // + # // 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. + # border { + # // The settings are the same as for the focus ring. + # // If you enable the border, you probably want to disable the focus ring. + # off + + # width 4 + # active-color "#ffc87f" + # inactive-color "#505050" + + # // Color of the border around windows that request your attention. + # urgent-color "#9b0000" + + # // active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view" + # // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" + # } + + # // You can enable drop shadows for windows. + # shadow { + # // Uncomment the next line to enable shadows. + # // on + + # // By default, the shadow draws only around its window, and not behind it. + # // Uncomment this setting to make the shadow draw behind its window. + # // + # // Note that niri has no way of knowing about the CSD window corner + # // radius. It has to assume that windows have square corners, leading to + # // shadow artifacts inside the CSD rounded corners. This setting fixes + # // those artifacts. + # // + # // However, instead you may want to set prefer-no-csd and/or + # // geometry-corner-radius. Then, niri will know the corner radius and + # // draw the shadow correctly, without having to draw it behind the + # // window. These will also remove client-side shadows if the window + # // draws any. + # // + # // draw-behind-window true + + # // You can change how shadows look. The values below are in logical + # // pixels and match the CSS box-shadow properties. + + # // Softness controls the shadow blur radius. + # softness 30 + + # // Spread expands the shadow. + # spread 5 + + # // Offset moves the shadow relative to the window. + # offset x=0 y=5 + + # // You can also change the shadow color and opacity. + # color "#0007" + # } + + # // 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. + # struts { + # // left 64 + # // right 64 + # // top 64 + # // bottom 64 + # } + # } + + # // 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. + # // See the binds section below for more spawn examples. + + # // This line starts waybar, a commonly used bar for Wayland compositors. + spawn-at-startup = [ + {argv = ["noctalia-shell"];} + ]; + + # // Uncomment this line to ask the clients to omit their client-side decorations if possible. + # // If the client will specifically ask for CSD, the request will be honored. + # // Additionally, clients will be informed that they are tiled, removing some client-side rounded corners. + # // This option will also fix border/focus ring drawing behind some semitransparent windows. + # // After enabling or disabling this, you need to restart the apps for this to take effect. + # // prefer-no-csd + + # // 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. + # 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. + # // screenshot-path null + + # // Animation settings. + # // The wiki explains how to configure individual animations: + # // https://github.com/YaLTeR/niri/wiki/Configuration:-Animations + # animations { + # // Uncomment to turn off all animations. + # // off + + # // Slow down all animations by this factor. Values below 1 speed them up instead. + # // slowdown 3.0 + # } + + # // Window rules let you adjust behavior for individual windows. + # // Find more information on the wiki: + # // https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules + + # // Work around WezTerm's initial configure bug + # // by setting an empty default-column-width. + # 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. + # match app-id=r#"^org\.wezfurlong\.wezterm$"# + # default-column-width {} + # } + + # // Open the Firefox picture-in-picture player as floating by default. + # window-rule { + # // This app-id regular expression will work for both: + # // - host Firefox (app-id is "firefox") + # // - Flatpak Firefox (app-id is "org.mozilla.firefox") + # match app-id=r#"firefox$"# title="^Picture-in-Picture$" + # open-floating true + # } + + # // Example: block out two password managers from screen capture. + # // (This example rule is commented out with a "/-" in front.) + # /-window-rule { + # match app-id=r#"^org\.keepassxc\.KeePassXC$"# + # match app-id=r#"^org\.gnome\.World\.Secrets$"# + + # block-out-from "screen-capture" + + # // Use this instead if you want them visible on third-party screenshot tools. + # // block-out-from "screencast" + # } + + # // Example: enable rounded corners for all windows. + # // (This example rule is commented out with a "/-" in front.) + # /-window-rule { + # geometry-corner-radius 12 + # clip-to-geometry true + # } + + outputs."eDP-1".scale = 1.0; + + binds = with config.lib.niri.actions; { + # // Keys consist of modifiers separated by + signs, followed by an XKB key name + # // in the end. To find an XKB name for a particular key, you may use a program + # // like wev. + # // + # // "Mod" is a special modifier equal to Super when running on a TTY, and to Alt + # // when running as a winit window. + # // + # // Most actions that you can bind here can also be invoked programmatically with + # // `niri msg action do-something`. + + # // Mod-Shift-/, which is usually the same as Mod-?, + # // shows a list of important hotkeys. + "Mod+Shift+Slash".action = show-hotkey-overlay; + + # Suggested binds for running programs: terminal, app launcher, screen locker. + "Mod+T" = { + hotkey-overlay.title = "Open a Terminal: ghostty"; + action = spawn "ghostty"; + }; + "Mod+D" = { + hotkey-overlay.title = "Run an Application: fuzzel"; + action = spawn "fuzzel"; + }; + # Super+Alt+L hotkey-overlay-title="Lock the Screen: swaylock" { spawn "swaylock"; } + + # // You can also use a shell. Do this if you need pipes, multiple commands, etc. + # // Note: the entire command goes as a single argument in the end. + # // Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; } + + # // Example volume keys mappings for PipeWire & WirePlumber. + # // The allow-when-locked=true property makes them work even when the session is locked. + # XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; } + # XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; } + # XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; } + # XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; } + + # // Open/close the Overview: a zoomed-out view of workspaces and windows. + # // You can also move the mouse into the top-left hot corner, + # // or do a four-finger swipe up on a touchpad. + # Mod+O repeat=false { 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+Ctrl+Left".action = move-column-left; + "Mod+Ctrl+Down".action = move-window-down; + "Mod+Ctrl+Up".action = move-window-up; + "Mod+Ctrl+Right".action = move-column-right; + "Mod+Ctrl+H".action = move-column-left; + "Mod+Ctrl+J".action = move-window-down; + "Mod+Ctrl+K".action = move-window-up; + "Mod+Ctrl+L".action = move-column-right; + + # // Alternative commands that move across workspaces when reaching + # // the first or last window in a column. + # // Mod+J { focus-window-or-workspace-down; } + # // Mod+K { focus-window-or-workspace-up; } + # // Mod+Ctrl+J { move-window-down-or-to-workspace-down; } + # // Mod+Ctrl+K { move-window-up-or-to-workspace-up; } + + # Mod+Home { focus-column-first; } + # Mod+End { focus-column-last; } + # Mod+Ctrl+Home { move-column-to-first; } + # Mod+Ctrl+End { move-column-to-last; } + + # Mod+Shift+Left { focus-monitor-left; } + # Mod+Shift+Down { focus-monitor-down; } + # Mod+Shift+Up { focus-monitor-up; } + # Mod+Shift+Right { focus-monitor-right; } + # Mod+Shift+H { focus-monitor-left; } + # Mod+Shift+J { focus-monitor-down; } + # Mod+Shift+K { focus-monitor-up; } + # Mod+Shift+L { focus-monitor-right; } + + "Mod+Shift+Ctrl+Left".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; + + # // Alternatively, there are commands to move just a single window: + # // Mod+Shift+Ctrl+Left { move-window-to-monitor-left; } + # // ... + + # // And you can also move a whole workspace to another monitor: + # // Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; } + # // ... + + "Mod+Page_Down".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; + + # // Alternatively, there are commands to move just a single window: + # // Mod+Ctrl+Page_Down { move-window-to-workspace-down; } + # // ... + + "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; + + # // You can bind mouse wheel scroll ticks using the following syntax. + # // These binds will change direction based on the natural-scroll setting. + # // + # // To avoid scrolling through workspaces really fast, you can use + # // the cooldown-ms property. The bind will be rate-limited to this value. + # // You can set a cooldown on any bind, but it's most useful for the wheel. + "Mod+WheelScrollDown" = { + cooldown-ms = 150; + action = focus-workspace-down; + }; + + "Mod+WheelScrollUp" = { + cooldown-ms = 150; + action = focus-workspace-up; + }; + # Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } + # Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } + + "Mod+WheelScrollRight".action = focus-column-right; + "Mod+WheelScrollLeft".action = focus-column-left; + "Mod+Ctrl+WheelScrollRight".action = move-column-right; + "Mod+Ctrl+WheelScrollLeft".action = move-column-left; + + # Usually scrolling up and down with Shift in applications results in + # horizontal scrolling; these binds replicate that. + "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; + + # // Similarly, you can bind touchpad scroll "ticks". + # // Touchpad scrolling is continuous, so for these binds it is split into + # // discrete intervals. + # // These binds are also affected by touchpad's natural-scroll, so these + # // example binds are "inverted", since we have natural-scroll enabled for + # // touchpads by default. + # // Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; } + # // Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; } + + # You can refer to workspaces by index. However, keep in mind that + # niri is a dynamic workspace system, so these commands are kind of + # "best effort". Trying to refer to a workspace index bigger than + # the current workspace count will instead refer to the bottommost + # (empty) workspace. + # + # For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on + # will all refer to the 3rd workspace. + "Mod+1".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+Ctrl+1".action = move-column-to-workspace 1; + # "Mod+Ctrl+2".action = move-column-to-workspace 2; + # "Mod+Ctrl+3".action = move-column-to-workspace 3; + # "Mod+Ctrl+4".action = move-column-to-workspace 4; + # "Mod+Ctrl+5".action = move-column-to-workspace 5; + # "Mod+Ctrl+6".action = move-column-to-workspace 6; + # "Mod+Ctrl+7".action = move-column-to-workspace 7; + # "Mod+Ctrl+8".action = move-column-to-workspace 8; + # "Mod+Ctrl+9".action = move-column-to-workspace 9; + + # Alternatively, there are commands to move just a single window: + # Mod+Ctrl+1 { move-window-to-workspace 1; } + + # Switches focus between the current and the previous workspace. + # Mod+Tab { focus-workspace-previous; } + + # The following binds move the focused window in and out of a column. + # If the window is alone, they will consume it into the nearby column to the side. + # If the window is already in a column, they will expel it out. + "Mod+BracketLeft".action = consume-or-expel-window-left; + "Mod+BracketRight".action = consume-or-expel-window-right; + + # Consume one window from the right to the bottom of the focused column. + "Mod+Comma".action = consume-window-into-column; + # Expel the bottom window from the focused column to the right. + "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+F".action = fullscreen-window; + + # Expand the focused column to space not taken up by other fully visible columns. + # Makes the column "fill the rest of the space". + "Mod+Ctrl+F".action = expand-column-to-available-width; + + "Mod+C".action = center-column; + + # Center all fully visible columns on screen. + "Mod+Ctrl+C".action = center-visible-columns; + + # Finer width adjustments. + # This command can also: + # * set width in pixels: "1000" + # * adjust width in pixels: "-5" or "+5" + # * set width as a percentage of screen width: "25%" + # * adjust width as a percentage of screen width: "-10%" or "+10%" + # Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0, + # set-column-width "100" will make the column occupy 200 physical screen pixels. + "Mod+Minus".action = set-column-width "-10%"; + "Mod+Equal".action = set-column-width "+10%"; + + "Print".action = screenshot; + # "Ctrl+Print".action = screenshot-screen; + # "Alt+Print" .action = screenshot-window; + + # // Finer height adjustments when in column with other windows. + # Mod+Shift+Minus { set-window-height "-10%"; } + # Mod+Shift+Equal { set-window-height "+10%"; } + + # // Move the focused window between the floating and the tiling layout. + "Mod+V".action = toggle-window-floating; + "Mod+Shift+V".action = switch-focus-between-floating-and-tiling; + + # Toggle tabbed column display mode. + # Windows in this column will appear as vertical tabs, + # rather than stacked on top of each other. + "Mod+W".action = toggle-column-tabbed-display; + + # // Actions to switch layouts. + # // Note: if you uncomment these, make sure you do NOT have + # // a matching layout switch hotkey configured in xkb options above. + # // Having both at once on the same hotkey will break the switching, + # // since it will switch twice upon pressing the hotkey (once by xkb, once by niri). + # // Mod+Space { switch-layout "next"; } + # // Mod+Shift+Space { switch-layout "prev"; } + + # Applications such as remote-desktop clients and software KVM switches may + # request that niri stops processing the keyboard shortcuts defined here + # so they may, for example, forward the key presses as-is to a remote machine. + # It's a good idea to bind an escape hatch to toggle the inhibitor, + # so a buggy application can't hold your session hostage. + # + # The allow-inhibiting=false property can be applied to other binds as well, + # which ensures niri always processes them, even when an inhibitor is active. + # Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } + + # The quit action will show a confirmation dialog to avoid accidental exits. + "Mod+Shift+E".action = quit; + # Ctrl+Alt+Delete { quit; } + + # Powers off the monitors. To turn them back on, do any input like + # moving the mouse or pressing any other key. + # "Mod+Shift+P".action = power-off-monitors; + }; + }; +} diff --git a/dot_config/flake/machines/hinge/darwin.nix b/dot_config/flake/machines/hinge/darwin.nix index b2850c1..e55e1a0 100644 --- a/dot_config/flake/machines/hinge/darwin.nix +++ b/dot_config/flake/machines/hinge/darwin.nix @@ -11,11 +11,7 @@ in { ]; nixpkgs = { - overlays = [ - outputs.overlays.additions - outputs.overlays.modifications - outputs.overlays.unstable-packages - ]; + overlays = builtins.attrValues outputs.overlays; config = { allowUnfree = true; diff --git a/dot_config/flake/machines/mal/configuration.nix b/dot_config/flake/machines/mal/configuration.nix index fb4628d..9a267e2 100644 --- a/dot_config/flake/machines/mal/configuration.nix +++ b/dot_config/flake/machines/mal/configuration.nix @@ -17,11 +17,7 @@ in { ]; nixpkgs = { - overlays = [ - outputs.overlays.additions - outputs.overlays.modifications - outputs.overlays.unstable-packages - ]; + overlays = builtins.attrValues outputs.overlays; config = { allowUnfree = true; diff --git a/dot_config/flake/machines/wash/configuration.nix b/dot_config/flake/machines/wash/configuration.nix index 298c4b1..6ee33bf 100644 --- a/dot_config/flake/machines/wash/configuration.nix +++ b/dot_config/flake/machines/wash/configuration.nix @@ -1,4 +1,5 @@ { + inputs, outputs, pkgs, ... @@ -12,14 +13,12 @@ ../../modules/nixos/gnome.nix # ../../modules/nixos/android-studio.nix ../../modules/nixos/docker.nix + + inputs.niri.nixosModules.niri ]; nixpkgs = { - overlays = [ - outputs.overlays.additions - outputs.overlays.modifications - outputs.overlays.unstable-packages - ]; + overlays = builtins.attrValues outputs.overlays; config = { allowUnfree = true; @@ -133,6 +132,11 @@ ]; programs.nix-ld.enable = true; + + services.desktopManager.cosmic.enable = true; + + programs.niri.enable = true; + programs.niri.package = pkgs.niri-unstable; # Install firefox. programs.firefox.enable = true; diff --git a/dot_config/flake/machines/wash/home.nix b/dot_config/flake/machines/wash/home.nix index 50b5bd1..ef5d576 100644 --- a/dot_config/flake/machines/wash/home.nix +++ b/dot_config/flake/machines/wash/home.nix @@ -8,6 +8,7 @@ ../../home/gui.nix ../../home/gnome.nix + ../../home/niri.nix ../../home/helide ]; diff --git a/dot_config/flake/overlays/default.nix b/dot_config/flake/overlays/default.nix index bb89376..6943f14 100644 --- a/dot_config/flake/overlays/default.nix +++ b/dot_config/flake/overlays/default.nix @@ -3,6 +3,23 @@ modifications = final: prev: { mods = { + discord = final.stdenv.mkDerivation { + pname = "discord-wayland"; + version = prev.discord.version; + + buildInputs = [final.makeWrapper]; + nativeBuildInputs = [final.makeWrapper]; + + unpackPhase = "true"; + installPhase = '' + mkdir -p $out/bin + ln -s ${prev.discord}/bin/discord $out/bin/.discord-wrapped + wrapProgram $out/bin/.discord-wrapped \ + --prefix PATH : ${final.lib.makeBinPath [final.xdg-utils final.coreutils]} \ + --add-flags "--enable-features=UseOzonePlatform --ozone-platform=wayland" + ln -s $out/bin/.discord-wrapped $out/bin/discord + ''; + }; }; }; @@ -12,4 +29,6 @@ config.allowUnfree = true; }; }; + + niri = inputs.niri.overlays.niri; }