From 4cf5cd8fc57df3410efdc0c1da978953987bce3b Mon Sep 17 00:00:00 2001 From: deva Date: Fri, 23 Aug 2024 18:07:41 -0400 Subject: [PATCH] niri base done, need to theme & make AGSbar --- flake.nix | 1 - modules/home/dv.nix | 1 + modules/home/gui-core.nix | 20 +-- modules/home/niri.nix | 349 +++++++++++++++++++++++++++++++++++++- modules/nixos/gui.nix | 9 +- 5 files changed, 349 insertions(+), 31 deletions(-) diff --git a/flake.nix b/flake.nix index 28c2f27..55d150f 100644 --- a/flake.nix +++ b/flake.nix @@ -49,7 +49,6 @@ modules = [ inputs.disko.nixosModules.default (import ./disko.nix {device="/dev/disk/by-id/nvme-Samsung_SSD_980_PRO_with_Heatsink_1TB_S6WSNJ0T900943T";}) - inputs.niri.nixosModules.niri ./waves.nix ]; }; diff --git a/modules/home/dv.nix b/modules/home/dv.nix index 15a9517..8ae70f2 100644 --- a/modules/home/dv.nix +++ b/modules/home/dv.nix @@ -34,6 +34,7 @@ outputs.overlays.additions outputs.overlays.modifications outputs.overlays.unstable-packages + inputs.niri.overlays.niri ]; home = { file.".ssh/id_user.pub".text = builtins.readFile ../nixos/id_user.pub; diff --git a/modules/home/gui-core.nix b/modules/home/gui-core.nix index 3bfb860..882540a 100644 --- a/modules/home/gui-core.nix +++ b/modules/home/gui-core.nix @@ -1,16 +1,10 @@ {pkgs, ...}: { -home.packages = [ - pkgs.noto-fonts - pkgs.noto-fonts-emoji - - pkgs.material-design-icons - (pkgs.google-fonts.override {fonts = ["Overpass" "Nunito"];}) - (pkgs.nerdfonts.override {fonts = ["NerdFontsSymbolsOnly"];}) + home.packages = with pkgs; [ + noto-fonts + noto-fonts-emoji + material-design-icons + cozette + (google-fonts.override {fonts = ["Overpass" "Nunito"];}) + (nerdfonts.override {fonts = ["NerdFontsSymbolsOnly"];}) ]; - xsession.windowManager.bspwm = { - enable = true; - startupPrograms = [ - "wezterm" - ]; - }; } diff --git a/modules/home/niri.nix b/modules/home/niri.nix index ee7c9b7..fef2d20 100644 --- a/modules/home/niri.nix +++ b/modules/home/niri.nix @@ -1,12 +1,343 @@ -{...}: { - programs.niri.config = '' - window-rule { - match app-id=r#"^org\.wezfurlong\.wezterm$"# - default-column-width {} - } +{ + pkgs, + config, + lib, + ... +}: { + home.packages = with pkgs; [ + wl-clipboard + wayland-utils + libsecret + cage + gamescope + xwayland-satellite + ]; + programs.fuzzel.enable = true; + programs.fuzzel.settings.main.terminal = "wezterm"; + services.mako = { + font = "cozette 12"; + enable = true; + }; + programs.niri.enable = true; + programs.niri.package = pkgs.niri-stable; + programs.niri.settings = { + input.keyboard.xkb.layout = "no"; + input.keyboard.repeat-delay = 200; + input.keyboard.repeat-rate = 30; + # input.mouse.accel-speed = 1.0; + input.mouse = { + accel-speed = 0.0; + accel-profile = "flat"; + }; + input.touchpad = { + tap = true; + dwt = true; + click-method = "clickfinger"; + natural-scroll = true; + }; + prefer-no-csd = true; + layout = { + gaps = 16; + struts.left = 64; + struts.right = 64; + border.width = 4; + }; + hotkey-overlay.skip-at-startup = true; + debug.wait-for-frame-completion-before-queueing = true; + window-rules = [ + { + matches = [{app-id = "^org\.wezfurlong\.wezterm$";}]; + default-column-width = {}; + opacity = 0.95; + } + ]; + animations.shaders.window-resize = '' + vec4 resize_color(vec3 coords_curr_geo, vec3 size_curr_geo) { + vec3 coords_next_geo = niri_curr_geo_to_next_geo * coords_curr_geo; - binds { - Super+T { spawn "wezterm"; } - } + vec3 coords_stretch = niri_geo_to_tex_next * coords_curr_geo; + vec3 coords_crop = niri_geo_to_tex_next * coords_next_geo; + + // We can crop if the current window size is smaller than the next window + // size. One way to tell is by comparing to 1.0 the X and Y scaling + // coefficients in the current-to-next transformation matrix. + bool can_crop_by_x = niri_curr_geo_to_next_geo[0][0] <= 1.0; + bool can_crop_by_y = niri_curr_geo_to_next_geo[1][1] <= 1.0; + + vec3 coords = coords_stretch; + if (can_crop_by_x) + coords.x = coords_crop.x; + if (can_crop_by_y) + coords.y = coords_crop.y; + + vec4 color = texture2D(niri_tex_next, coords.st); + + // However, when we crop, we also want to crop out anything outside the + // current geometry. This is because the area of the shader is unspecified + // and usually bigger than the current geometry, so if we don't fill pixels + // outside with transparency, the texture will leak out. + // + // When stretching, this is not an issue because the area outside will + // correspond to client-side decoration shadows, which are already supposed + // to be outside. + if (can_crop_by_x && (coords_curr_geo.x < 0.0 || 1.0 < coords_curr_geo.x)) + color = vec4(0.0); + if (can_crop_by_y && (coords_curr_geo.y < 0.0 || 1.0 < coords_curr_geo.y)) + color = vec4(0.0); + + return color; + } ''; + binds = with config.lib.niri.actions; let + sh = spawn "sh" "-c"; + + screenshot-area-script = pkgs.writeShellScript "screenshot-area" '' + grim -o $(niri msg --json focused-output | jq -r .name) - | swayimg --config=info.mode=off --fullscreen - & + SWAYIMG=$! + niri msg action do-screen-transition -d 1200 + sleep 1.2 + grim -g "$(slurp)" - | wl-copy -t image/png + niri msg action do-screen-transition + kill $SWAYIMG + ''; + + screenshot-area = spawn "${screenshot-area-script}"; + in + lib.attrsets.mergeAttrsList [ + { + "Mod+T".action = spawn "wezterm"; + "Mod+D".action = spawn "fuzzel"; + } + ]; + }; + programs.niri.config = '' + debug { + wait-for-frame-completion-before-queueing + } + + window-rule { + match app-id=r#"^org\.wezfurlong\.wezterm$"# + default-column-width {} + } + + 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. + Mod+Shift+Slash { show-hotkey-overlay; } + + // Suggested binds for running programs: terminal, app launcher, screen locker. + Mod+T { spawn "wezterm"; } + Mod+D { spawn "fuzzel"; } + Super+Alt+L { 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"; } + + Mod+Q { close-window; } + + Mod+Left { focus-column-left; } + Mod+Down { focus-window-down; } + Mod+Up { focus-window-up; } + Mod+Right { focus-column-right; } + Mod+H { focus-column-left; } + Mod+J { focus-window-down; } + Mod+K { focus-window-up; } + Mod+L { focus-column-right; } + + Mod+Ctrl+Left { move-column-left; } + Mod+Ctrl+Down { move-window-down; } + Mod+Ctrl+Up { move-window-up; } + Mod+Ctrl+Right { move-column-right; } + Mod+Ctrl+H { move-column-left; } + Mod+Ctrl+J { move-window-down; } + Mod+Ctrl+K { move-window-up; } + Mod+Ctrl+L { 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 { move-column-to-monitor-left; } + Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } + Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } + Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } + Mod+Shift+Ctrl+L { 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 { focus-workspace-down; } + Mod+Page_Up { focus-workspace-up; } + Mod+U { focus-workspace-down; } + Mod+I { focus-workspace-up; } + Mod+Ctrl+Page_Down { move-column-to-workspace-down; } + Mod+Ctrl+Page_Up { move-column-to-workspace-up; } + Mod+Ctrl+U { move-column-to-workspace-down; } + Mod+Ctrl+I { 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 { move-workspace-down; } + Mod+Shift+Page_Up { move-workspace-up; } + Mod+Shift+U { move-workspace-down; } + Mod+Shift+I { 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 { focus-workspace-down; } + Mod+WheelScrollUp cooldown-ms=150 { 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 { focus-column-right; } + Mod+WheelScrollLeft { focus-column-left; } + Mod+Ctrl+WheelScrollRight { move-column-right; } + Mod+Ctrl+WheelScrollLeft { move-column-left; } + + // Usually scrolling up and down with Shift in applications results in + // horizontal scrolling; these binds replicate that. + Mod+Shift+WheelScrollDown { focus-column-right; } + Mod+Shift+WheelScrollUp { focus-column-left; } + Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } + Mod+Ctrl+Shift+WheelScrollUp { 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 { focus-workspace 1; } + Mod+2 { focus-workspace 2; } + Mod+3 { focus-workspace 3; } + Mod+4 { focus-workspace 4; } + Mod+5 { focus-workspace 5; } + Mod+6 { focus-workspace 6; } + Mod+7 { focus-workspace 7; } + Mod+8 { focus-workspace 8; } + Mod+9 { focus-workspace 9; } + Mod+Ctrl+1 { move-column-to-workspace 1; } + Mod+Ctrl+2 { move-column-to-workspace 2; } + Mod+Ctrl+3 { move-column-to-workspace 3; } + Mod+Ctrl+4 { move-column-to-workspace 4; } + Mod+Ctrl+5 { move-column-to-workspace 5; } + Mod+Ctrl+6 { move-column-to-workspace 6; } + Mod+Ctrl+7 { move-column-to-workspace 7; } + Mod+Ctrl+8 { move-column-to-workspace 8; } + Mod+Ctrl+9 { 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; } + + Mod+Comma { consume-window-into-column; } + Mod+Period { expel-window-from-column; } + + // There are also commands that consume or expel a single window to the side. + // Mod+BracketLeft { consume-or-expel-window-left; } + // Mod+BracketRight { consume-or-expel-window-right; } + + Mod+R { switch-preset-column-width; } + Mod+Shift+R { reset-window-height; } + Mod+F { maximize-column; } + Mod+Shift+F { fullscreen-window; } + Mod+C { 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, + // set-column-width "100" will make the column occupy 200 physical screen pixels. + Mod+Minus { set-column-width "-10%"; } + Mod+Equal { set-column-width "+10%"; } + + // Finer height adjustments when in column with other windows. + Mod+Shift+Minus { set-window-height "-10%"; } + Mod+Shift+Equal { 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). + // Mod+Space { switch-layout "next"; } + // Mod+Shift+Space { switch-layout "prev"; } + + Print { screenshot; } + Ctrl+Print { screenshot-screen; } + Alt+Print { screenshot-window; } + + // The quit action will show a confirmation dialog to avoid accidental exits. + Mod+Shift+E { 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 { power-off-monitors; } + } + ''; } diff --git a/modules/nixos/gui.nix b/modules/nixos/gui.nix index e7d0bf0..6462967 100644 --- a/modules/nixos/gui.nix +++ b/modules/nixos/gui.nix @@ -1,8 +1 @@ -{ - services.xserver.enable = true; - services.xserver.desktopManager = { - xterm.enable = false; - xfce.enable = true; - }; - services.xserver.displayManager.defaultSession = "xfce"; -} +{...}: {}