From 92cb6ca5d671377b16112df35476099b83d4afda Mon Sep 17 00:00:00 2001 From: Youwen Wu Date: Thu, 16 Jan 2025 22:43:06 -0800 Subject: [PATCH] feat: next generation hyprscroller layout --- .../desktop-environment/hyprland/binds.nix | 67 +++++++++++++++---- .../desktop-environment/hyprland/default.nix | 26 ++++++- overlays/default.nix | 11 +++ reference/users/youwen/hm.nix | 2 +- 4 files changed, 89 insertions(+), 17 deletions(-) diff --git a/hm/modules/linux/desktop-environment/hyprland/binds.nix b/hm/modules/linux/desktop-environment/hyprland/binds.nix index 2c84058..4df876b 100644 --- a/hm/modules/linux/desktop-environment/hyprland/binds.nix +++ b/hm/modules/linux/desktop-environment/hyprland/binds.nix @@ -10,19 +10,64 @@ in { wayland.windowManager.hyprland.settings = lib.mkIf cfg.enable { bind = - [ + ( + if cfg.hyprscroller.enable then + [ + "$mod+Shift, $Left, scroller:movewindow, l" + "$mod+Shift, $Right, scroller:movewindow, r" + "$mod+Shift, $Up, scroller:movewindow, u" + "$mod+Shift, $Down, scroller:movewindow, d" + + # Move around + "$mod, $Left, scroller:movefocus, l" + "$mod, $Right, scroller:movefocus, r" + "$mod, $Up, scroller:movefocus, u" + "$mod, $Down, scroller:movefocus, d" + ] + else + # Move windows around + [ + "$mod+Shift, $Left, movewindow, l" + "$mod+Shift, $Right, movewindow, r" + "$mod+Shift, $Up, movewindow, u" + "$mod+Shift, $Down, movewindow, d" + + # Move around + "$mod, $Left, movefocus, l" + "$mod, $Right, movefocus, r" + "$mod, $Up, movefocus, u" + "$mod, $Down, movefocus, d" + + "$mod, V, togglesplit" + ] + ) + ++ (lib.optionals cfg.hyprscroller.enable [ + "$mod, comma, scroller:admitwindow" + "$mod, period, scroller:expelwindow" + "$mod, F, scroller:fitsize, active" + "$mod, Y, scroller:fitsize, all" + "$mod, semicolon, scroller:cyclesize, next" + "$mod, apostrophe, scroller:cyclesize, previous" + + "$mod+Shift, U, movetoworkspace, r+1" + "$mod+Shift, I, movetoworkspace, r-1" + + "$mod, U, workspace, r+1" + "$mod, I, workspace, r-1" + + # harder to reach number keys + "$mod, A, workspace, 1" + "$mod, D, workspace, 2" + + "$mod, C, scroller:setmode, c" + "$mod, V, scroller:setmode, r" + ]) + ++ [ # Window actions "$mod, Q, killactive" "$mod, W, togglefloating" - "$mod, V, togglesplit" "$mod, Return, fullscreen" - # Move around - "$mod, $Left, movefocus, l" - "$mod, $Right, movefocus, r" - "$mod, $Up, movefocus, u" - "$mod, $Down, movefocus, d" - "$mod, 1, workspace, 1" "$mod, 2, workspace, 2" "$mod, 3, workspace, 3" @@ -34,12 +79,6 @@ in "$mod, 9, workspace, 9" "$mod, 0, workspace, 10" - # Move windows around - "$mod+Shift, $Left, movewindow, l" - "$mod+Shift, $Right, movewindow, r" - "$mod+Shift, $Up, movewindow, u" - "$mod+Shift, $Down, movewindow, d" - "$mod+Ctrl, bracketright, movetoworkspace, r+1" "$mod+Ctrl, bracketleft, movetoworkspace, r-1" diff --git a/hm/modules/linux/desktop-environment/hyprland/default.nix b/hm/modules/linux/desktop-environment/hyprland/default.nix index e856333..2501c0e 100644 --- a/hm/modules/linux/desktop-environment/hyprland/default.nix +++ b/hm/modules/linux/desktop-environment/hyprland/default.nix @@ -23,6 +23,13 @@ in Whether to enable and rice Hyprland as well as some basic desktop utilities. ''; }; + hyprscroller.enable = lib.mkOption { + type = lib.types.bool; + default = cfg.enable; + description = '' + Whether to enable the hyprscroller scrolling layout. + ''; + }; useAdvancedBindings = lib.mkEnableOption "advanced keybinds"; applyGtkFix = lib.mkOption { type = lib.types.bool; @@ -78,6 +85,7 @@ in wayland.windowManager.hyprland = { enable = true; + plugins = lib.mkIf cfg.hyprscroller.enable [ pkgs.hyprlandPlugins.hyprscroller ]; settings = { "$mod" = "SUPER"; "$Left" = "H"; @@ -126,6 +134,7 @@ in "winIn, 0.1, 1.1, 0.1, 1.1" "winOut, 0.3, -0.3, 0, 1" "liner, 1, 1, 1, 1" + "windup, 0.05, 0.9, 0.1, 1.05" ]; animation = [ @@ -134,9 +143,18 @@ in "windowsOut, 1, 5, winOut, slide" "windowsMove, 1, 5, wind, slide" "fade, 1, 10, default" - "workspaces, 1, 5, wind" # "layers, 1, 8, default, slide" ] + ++ ( + if cfg.hyprscroller.enable then + [ + "workspaces, 1, 5, wind, slidevert" + ] + else + [ + "workspaces, 1, 5, wind" + ] + ) ++ (lib.optionals (!osConfig.liminalOS.powersave) [ "border, 1, 1, liner" "borderangle, 1, 30, liner, loop" @@ -155,7 +173,7 @@ in # "col.inactive_border" = pkgs.lib.mkForce "rgba(b4befecc) rgba(6c7086cc) 45deg"; "col.active_border" = "rgba(${colors.base0A}ff) rgba(${colors.base09}ff) 45deg"; "col.inactive_border" = "rgba(${colors.base01}cc) rgba(${colors.base02}cc) 45deg"; - layout = "dwindle"; + layout = if cfg.hyprscroller.enable then "scroller" else "dwindle"; resize_on_border = "true"; }; @@ -187,6 +205,10 @@ in input = { sensitivity = if config.liminalOS.formFactor == "laptop" then "0.0" else "-0.65"; }; + plugin.scroller = lib.mkIf cfg.hyprscroller.enable { + column_widths = "onethird onehalf twothirds one"; + column_heights = "onethird onehalf twothirds one"; + }; }; }; diff --git a/overlays/default.nix b/overlays/default.nix index e9fae22..f544474 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -11,5 +11,16 @@ in { nixpkgs.overlays = [ (import ../pkgs { inherit pkgs; }) + (final: prev: { + hyprlandPlugins.hyprscroller = prev.hyprlandPlugins.hyprscroller.overrideAttrs { + version = "0-unstable-2025-01-16"; + src = prev.fetchFromGitHub { + owner = "dawsers"; + repo = "hyprscroller"; + rev = "e250f38bde9659ee8459c05a173bcc5c2655418f"; + hash = "sha256-rqDfY/wPG2F5NfHx6yEWMRybapNwmjjawQ7tWe6gDaw="; + }; + }; + }) ]; } diff --git a/reference/users/youwen/hm.nix b/reference/users/youwen/hm.nix index 4319f7a..b6cf2b6 100644 --- a/reference/users/youwen/hm.nix +++ b/reference/users/youwen/hm.nix @@ -14,7 +14,7 @@ liminalOS = { utils.easyeffects.enable = true; desktop.hyprland.screenlocker.useNvidiaCrashFix = true; - desktop.hyprland.useAdvancedBindings = true; + desktop.hyprland.useAdvancedBindings = false; }; programs.git = {