diff --git a/homeManagerModules/desktop/hyprland/default.nix b/homeManagerModules/desktop/hyprland/default.nix index 17e16cea..86ff5be7 100644 --- a/homeManagerModules/desktop/hyprland/default.nix +++ b/homeManagerModules/desktop/hyprland/default.nix @@ -10,206 +10,11 @@ in { wayland.windowManager.hyprland = { enable = true; - settings = let - inherit - (import ./vars.nix {inherit config lib pkgs;}) - brightness - defaultApps - defaultWorkspaces - layerrule - media - modifier - screenshot - volume - windowManagerBinds - windowrulev2 - ; - - inherit (import ./scripts.nix {inherit config lib pkgs;}) clamshell idleD tablet wallpaperD; - - # Hyprland desktop utilities - hyprnome = lib.getExe pkgs.hyprnome; - in { - inherit windowrulev2; - - animations = { - enabled = true; - bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; - - animation = [ - "border, 1, 10, default" - "borderangle, 1, 8, default" - "fade, 1, 7, default" - "specialWorkspace, 1, 6, default, slidevert" - "windows, 1, 7, myBezier" - "windowsOut, 1, 7, default, popin 80%" - "workspaces, 1, 6, default" - ]; - }; - - bind = - [ - "${modifier} CONTROL, F12, exec, ${screenshot.region}" - "${modifier} CONTROL, L, exec, ${defaultApps.lock}" - "${modifier} SHIFT, S, movetoworkspace, special:magic" - "${modifier} SHIFT, V, togglefloating" - "${modifier} SHIFT, W, fullscreen" - "${modifier} SHIFT, backslash, togglesplit" - "${modifier} SHIFT, comma, exec, ${hyprnome} --previous --move" - "${modifier} SHIFT, period, exec, ${hyprnome} --move" - "${modifier}, B, exec, ${defaultApps.browser}" - "${modifier}, C, killactive" - "${modifier}, E, exec, ${defaultApps.editor}" - "${modifier}, F, exec, ${defaultApps.fileManager}" - "${modifier}, F11, exec, pkill -SIGUSR1 waybar" - "${modifier}, M, exec, ${defaultApps.logout}" - "${modifier}, PRINT, exec, ${screenshot.region}" - "${modifier}, R, exec, ${defaultApps.launcher}" - "${modifier}, S, togglespecialworkspace, magic" - "${modifier}, T, exec, ${defaultApps.terminal}" - "${modifier}, comma, exec, ${hyprnome} --previous" - "${modifier}, mouse_down, workspace, +1" - "${modifier}, mouse_up, workspace, -1" - "${modifier}, period, exec, ${hyprnome}" - ", PRINT, exec, ${screenshot.screen}" - "CONTROL, F12, exec, ${screenshot.screen}" - "CTRL ALT,M,submap,move" - "CTRL ALT,R,submap,resize" - ] - ++ builtins.map (x: "${modifier}, ${toString x}, workspace, ${toString x}") defaultWorkspaces - ++ builtins.map (x: "${modifier} SHIFT, ${toString x}, movetoworkspace, ${toString x}") defaultWorkspaces - ++ lib.attrsets.mapAttrsToList (key: direction: "${modifier}, ${key}, movefocus, ${direction}") windowManagerBinds - ++ lib.attrsets.mapAttrsToList (key: direction: "${modifier} SHIFT, ${key}, movewindow, ${direction}") windowManagerBinds - ++ lib.attrsets.mapAttrsToList (key: direction: "${modifier} CONTROL SHIFT, ${key}, movecurrentworkspacetomonitor, ${direction}") windowManagerBinds; - - bindm = [ - # Move/resize windows with mainMod + LMB/RMB and dragging - "${modifier}, mouse:272, movewindow" - "${modifier}, mouse:273, resizewindow" - ]; - - bindl = - [ - # Volume, microphone, and media keys. - ", xf86audiomute, exec, ${volume.mute}" - ", xf86audiomicmute, exec, ${volume.micMute}" - ", xf86audioplay, exec, ${media.play}" - ", xf86audioprev, exec, ${media.prev}" - ", xf86audionext, exec, ${media.next}" - ] - ++ builtins.map (switch: ",switch:${switch},exec,${tablet}") cfg.desktop.hyprland.tabletMode.tabletSwitches - ++ lib.lists.optionals (cfg.desktop.hyprland.laptopMonitors != []) - [ - ",switch:on:Lid Switch,exec,${clamshell} on" - ",switch:off:Lid Switch,exec,${clamshell} off" - ]; - - bindle = [ - # Display, volume, microphone, and media keys. - ", xf86monbrightnessup, exec, ${brightness.up}" - ", xf86monbrightnessdown, exec, ${brightness.down}" - ", xf86audioraisevolume, exec, ${volume.up}" - ", xf86audiolowervolume, exec, ${volume.down}" - ]; - - decoration = { - inherit layerrule; - blur = { - enabled = true; - passes = 1; - size = 8; - }; - - "col.shadow" = "rgba(${lib.strings.removePrefix "#" cfg.theme.colors.shadow}EE)"; - dim_special = 0.5; - drop_shadow = true; - rounding = 10; - shadow_range = 4; - shadow_render_power = 3; - }; - - dwindle.preserve_split = true; - - env = [ - "QT_QPA_PLATFORMTHEME,qt6ct" - "XCURSOR_SIZE,${toString config.home.pointerCursor.size}" - ]; - - exec-once = - [ - wallpaperD - (lib.getExe pkgs.waybar) - idleD - (lib.getExe pkgs.wayland-pipewire-idle-inhibit) - (lib.getExe' pkgs.blueman "blueman-applet") - (lib.getExe' pkgs.networkmanagerapplet "nm-applet") - (lib.getExe' pkgs.playerctl "playerctld") - (lib.getExe' pkgs.swayosd "swayosd-server") - (lib.getExe pkgs.mako) - "${pkgs.mate.mate-polkit}/libexec/polkit-mate-authentication-agent-1" - ] - ++ lib.lists.optional (cfg.desktop.hyprland.redShift) - "${lib.getExe pkgs.gammastep} -l 33.74:-84.38"; - - input = { - follow_mouse = 1; - kb_layout = "us"; - kb_variant = "altgr-intl"; - sensitivity = 0; # -1.0 to 1.0, 0 means no modification. - - touchpad = { - clickfinger_behavior = true; - drag_lock = true; - middle_button_emulation = true; - natural_scroll = true; - tap-to-click = true; - }; - }; - - general = { - "col.active_border" = "rgba(${lib.strings.removePrefix "#" cfg.theme.colors.secondary}EE) rgba(${lib.strings.removePrefix "#" cfg.theme.colors.primary}EE) 45deg"; - "col.inactive_border" = "rgba(${lib.strings.removePrefix "#" cfg.theme.colors.inactive}AA)"; - allow_tearing = false; - border_size = 2; - gaps_in = 5; - gaps_out = 6; - layout = "dwindle"; - }; - - gestures = { - workspace_swipe = true; - workspace_swipe_touch = true; - }; - - master = { - always_center_master = true; - new_status = false; - }; - - misc = { - disable_hyprland_logo = true; - disable_splash_rendering = true; - focus_on_activate = true; - vfr = true; - }; - - monitor = - [",preferred,auto,auto"] - ++ cfg.desktop.hyprland.laptopMonitors - ++ cfg.desktop.hyprland.monitors; - - xwayland.force_zero_scaling = true; - }; + settings = + import ./vars.nix {inherit config lib pkgs;}; extraConfig = let - inherit - (import ./vars.nix {inherit config lib pkgs;}) - defaultWorkspaces - windowManagerBinds - ; - - # Hyprland desktop utilities - hyprnome = lib.getExe pkgs.hyprnome; + inherit (import ./helpers.nix {inherit config lib pkgs;}) defaultWorkspaces windowManagerBinds; in '' submap=resize binde=,down,resizeactive,0 10 @@ -245,8 +50,8 @@ in { } # hyprnome - bind = , comma, exec, ${hyprnome} --previous --move - bind = , period, exec, ${hyprnome} --move + bind = , comma, exec, ${lib.getExe pkgs.hyprnome} --previous --move + bind = , period, exec, ${lib.getExe pkgs.hyprnome} --move bind=,escape,submap,reset submap=reset ''; diff --git a/homeManagerModules/desktop/hyprland/helpers.nix b/homeManagerModules/desktop/hyprland/helpers.nix new file mode 100644 index 00000000..d92c68e1 --- /dev/null +++ b/homeManagerModules/desktop/hyprland/helpers.nix @@ -0,0 +1,63 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.ar.home; +in { + # Media/hardware commands + brightness = rec { + bin = lib.getExe' pkgs.swayosd "swayosd-client"; + up = "${bin} --brightness=raise"; + down = "${bin} --brightness=lower"; + }; + + # Default apps + defaultApps = { + browser = lib.getExe cfg.defaultApps.webBrowser; + editor = lib.getExe cfg.defaultApps.editor; + fileManager = lib.getExe cfg.defaultApps.fileManager; + launcher = lib.getExe pkgs.fuzzel; + lock = lib.getExe pkgs.swaylock; + logout = lib.getExe pkgs.wlogout; + terminal = lib.getExe cfg.defaultApps.terminal; + virtKeyboard = lib.getExe' pkgs.squeekboard "squeekboard"; + }; + + defaultWorkspaces = [1 2 3 4 5 6 7 8 9]; + + media = rec { + bin = lib.getExe pkgs.playerctl; + play = "${bin} play-pause"; + paus = "${bin} pause"; + next = "${bin} next"; + prev = "${bin} previous"; + }; + + screenshot = rec { + bin = lib.getExe pkgs.hyprshot; + folder = "${config.xdg.userDirs.pictures}/screenshots"; + screen = "${bin} -m output -o ${folder}"; + region = "${bin} -m region -o ${folder}"; + }; + + volume = rec { + bin = lib.getExe' pkgs.swayosd "swayosd-client"; + up = "${bin} --output-volume=raise"; + down = "${bin} --output-volume=lower"; + mute = "${bin} --output-volume=mute-toggle"; + micMute = "${bin} --input-volume=mute-toggle"; + }; + + windowManagerBinds = { + down = "d"; + left = "l"; + right = "r"; + up = "u"; + h = "l"; + j = "d"; + k = "u"; + l = "r"; + }; +} diff --git a/homeManagerModules/desktop/hyprland/scripts.nix b/homeManagerModules/desktop/hyprland/scripts.nix index 8cf4af85..e6f18bc8 100644 --- a/homeManagerModules/desktop/hyprland/scripts.nix +++ b/homeManagerModules/desktop/hyprland/scripts.nix @@ -6,7 +6,7 @@ }: let cfg = config.ar.home; hyprctl = lib.getExe' config.wayland.windowManager.hyprland.package "hyprctl"; - inherit (import ./vars.nix {inherit config lib pkgs;}) defaultApps media; + inherit (import ./helpers.nix {inherit config lib pkgs;}) defaultApps media; in { clamshell = pkgs.writeShellScript "hyprland-clamshell" '' NUM_MONITORS=$(${hyprctl} monitors all | grep Monitor | wc --lines) diff --git a/homeManagerModules/desktop/hyprland/vars.nix b/homeManagerModules/desktop/hyprland/vars.nix index 7a12ba75..a2ffd12b 100644 --- a/homeManagerModules/desktop/hyprland/vars.nix +++ b/homeManagerModules/desktop/hyprland/vars.nix @@ -5,75 +5,197 @@ ... }: let cfg = config.ar.home; + inherit (import ./scripts.nix {inherit config lib pkgs;}) clamshell idleD tablet wallpaperD; + inherit + (import ./helpers.nix {inherit config lib pkgs;}) + brightness + defaultApps + defaultWorkspaces + media + screenshot + volume + windowManagerBinds + ; in { - # Media/hardware commands - brightness = rec { - bin = lib.getExe' pkgs.swayosd "swayosd-client"; - up = "${bin} --brightness=raise"; - down = "${bin} --brightness=lower"; + "$mod" = "SUPER"; + + animations = { + enabled = true; + bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; + + animation = [ + "border, 1, 10, default" + "borderangle, 1, 8, default" + "fade, 1, 7, default" + "specialWorkspace, 1, 6, default, slidevert" + "windows, 1, 7, myBezier" + "windowsOut, 1, 7, default, popin 80%" + "workspaces, 1, 6, default" + ]; }; - # Default apps - defaultApps = { - browser = lib.getExe cfg.defaultApps.webBrowser; - editor = lib.getExe cfg.defaultApps.editor; - fileManager = lib.getExe cfg.defaultApps.fileManager; - launcher = lib.getExe pkgs.fuzzel; - lock = lib.getExe pkgs.swaylock; - logout = lib.getExe pkgs.wlogout; - terminal = lib.getExe cfg.defaultApps.terminal; - virtKeyboard = lib.getExe' pkgs.squeekboard "squeekboard"; - }; + bind = + [ + "$mod CONTROL, F12, exec, ${screenshot.region}" + "$mod CONTROL, L, exec, ${defaultApps.lock}" + "$mod SHIFT, S, movetoworkspace, special:magic" + "$mod SHIFT, V, togglefloating" + "$mod SHIFT, W, fullscreen" + "$mod SHIFT, backslash, togglesplit" + "$mod SHIFT, comma, exec, ${lib.getExe pkgs.hyprnome} --previous --move" + "$mod SHIFT, period, exec, ${lib.getExe pkgs.hyprnome} --move" + "$mod, B, exec, ${defaultApps.browser}" + "$mod, C, killactive" + "$mod, E, exec, ${defaultApps.editor}" + "$mod, F, exec, ${defaultApps.fileManager}" + "$mod, F11, exec, pkill -SIGUSR1 waybar" + "$mod, M, exec, ${defaultApps.logout}" + "$mod, PRINT, exec, ${screenshot.region}" + "$mod, R, exec, ${defaultApps.launcher}" + "$mod, S, togglespecialworkspace, magic" + "$mod, T, exec, ${defaultApps.terminal}" + "$mod, comma, exec, ${lib.getExe pkgs.hyprnome} --previous" + "$mod, mouse_down, workspace, +1" + "$mod, mouse_up, workspace, -1" + "$mod, period, exec, ${lib.getExe pkgs.hyprnome}" + ", PRINT, exec, ${screenshot.screen}" + "CONTROL, F12, exec, ${screenshot.screen}" + "CTRL ALT,M,submap,move" + "CTRL ALT,R,submap,resize" + ] + ++ builtins.map (x: "$mod, ${toString x}, workspace, ${toString x}") defaultWorkspaces + ++ builtins.map (x: "$mod SHIFT, ${toString x}, movetoworkspace, ${toString x}") defaultWorkspaces + ++ lib.attrsets.mapAttrsToList (key: direction: "$mod, ${key}, movefocus, ${direction}") windowManagerBinds + ++ lib.attrsets.mapAttrsToList (key: direction: "$mod SHIFT, ${key}, movewindow, ${direction}") windowManagerBinds + ++ lib.attrsets.mapAttrsToList (key: direction: "$mod CONTROL SHIFT, ${key}, movecurrentworkspacetomonitor, ${direction}") windowManagerBinds; - defaultWorkspaces = [1 2 3 4 5 6 7 8 9]; - - layerrule = [ - "blur, launcher" - "blur, logout_dialog" - "blur, notifications" - "blur, swayosd" - "blur, waybar" - "ignorezero, notifications" - "ignorezero, swayosd" - "ignorezero, waybar" + bindm = [ + # Move/resize windows with mainMod + LMB/RMB and dragging + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" ]; - media = rec { - bin = lib.getExe pkgs.playerctl; - play = "${bin} play-pause"; - paus = "${bin} pause"; - next = "${bin} next"; - prev = "${bin} previous"; + bindl = + [ + # Volume, microphone, and media keys. + ", xf86audiomute, exec, ${volume.mute}" + ", xf86audiomicmute, exec, ${volume.micMute}" + ", xf86audioplay, exec, ${media.play}" + ", xf86audioprev, exec, ${media.prev}" + ", xf86audionext, exec, ${media.next}" + ] + ++ builtins.map (switch: ",switch:${switch},exec,${tablet}") cfg.desktop.hyprland.tabletMode.tabletSwitches + ++ lib.lists.optionals (cfg.desktop.hyprland.laptopMonitors != []) + [ + ",switch:on:Lid Switch,exec,${clamshell} on" + ",switch:off:Lid Switch,exec,${clamshell} off" + ]; + + bindle = [ + # Display, volume, microphone, and media keys. + ", xf86monbrightnessup, exec, ${brightness.up}" + ", xf86monbrightnessdown, exec, ${brightness.down}" + ", xf86audioraisevolume, exec, ${volume.up}" + ", xf86audiolowervolume, exec, ${volume.down}" + ]; + + decoration = { + blur = { + enabled = true; + passes = 1; + size = 8; + }; + + "col.shadow" = "rgba(${lib.strings.removePrefix "#" cfg.theme.colors.shadow}EE)"; + dim_special = 0.5; + drop_shadow = true; + + layerrule = [ + "blur, launcher" + "blur, logout_dialog" + "blur, notifications" + "blur, swayosd" + "blur, waybar" + "ignorezero, notifications" + "ignorezero, swayosd" + "ignorezero, waybar" + ]; + + rounding = 10; + shadow_range = 4; + shadow_render_power = 3; }; - modifier = "SUPER"; + dwindle.preserve_split = true; - screenshot = rec { - bin = lib.getExe pkgs.hyprshot; - folder = "${config.xdg.userDirs.pictures}/screenshots"; - screen = "${bin} -m output -o ${folder}"; - region = "${bin} -m region -o ${folder}"; + env = [ + "QT_QPA_PLATFORMTHEME,qt6ct" + "XCURSOR_SIZE,${toString config.home.pointerCursor.size}" + ]; + + exec-once = + [ + wallpaperD + (lib.getExe pkgs.waybar) + idleD + (lib.getExe pkgs.wayland-pipewire-idle-inhibit) + (lib.getExe' pkgs.blueman "blueman-applet") + (lib.getExe' pkgs.networkmanagerapplet "nm-applet") + (lib.getExe' pkgs.playerctl "playerctld") + (lib.getExe' pkgs.swayosd "swayosd-server") + (lib.getExe pkgs.mako) + "${pkgs.mate.mate-polkit}/libexec/polkit-mate-authentication-agent-1" + ] + ++ lib.lists.optional (cfg.desktop.hyprland.redShift) + "${lib.getExe pkgs.gammastep} -l 33.74:-84.38"; + + input = { + follow_mouse = 1; + kb_layout = "us"; + kb_variant = "altgr-intl"; + sensitivity = 0; # -1.0 to 1.0, 0 means no modification. + + touchpad = { + clickfinger_behavior = true; + drag_lock = true; + middle_button_emulation = true; + natural_scroll = true; + tap-to-click = true; + }; }; - volume = rec { - bin = lib.getExe' pkgs.swayosd "swayosd-client"; - up = "${bin} --output-volume=raise"; - down = "${bin} --output-volume=lower"; - mute = "${bin} --output-volume=mute-toggle"; - micMute = "${bin} --input-volume=mute-toggle"; + general = { + "col.active_border" = "rgba(${lib.strings.removePrefix "#" cfg.theme.colors.secondary}EE) rgba(${lib.strings.removePrefix "#" cfg.theme.colors.primary}EE) 45deg"; + "col.inactive_border" = "rgba(${lib.strings.removePrefix "#" cfg.theme.colors.inactive}AA)"; + allow_tearing = false; + border_size = 2; + gaps_in = 5; + gaps_out = 6; + layout = "dwindle"; }; - windowManagerBinds = { - down = "d"; - left = "l"; - right = "r"; - up = "u"; - h = "l"; - j = "d"; - k = "u"; - l = "r"; + gestures = { + workspace_swipe = true; + workspace_swipe_touch = true; }; + master = { + always_center_master = true; + new_status = false; + }; + + misc = { + disable_hyprland_logo = true; + disable_splash_rendering = true; + focus_on_activate = true; + vfr = true; + }; + + monitor = + [",preferred,auto,auto"] + ++ cfg.desktop.hyprland.laptopMonitors + ++ cfg.desktop.hyprland.monitors; + windowrulev2 = [ "center(1),class:(.blueman-manager-wrapped)" "center(1),class:(com.github.wwmm.easyeffects)" @@ -89,4 +211,6 @@ in { "size 40% 60%,class:(pavucontrol)" "suppressevent maximize, class:.*" ]; + + xwayland.force_zero_scaling = true; }