From 6802dee96fbe76bf7cf0ae88db74a7c124301791 Mon Sep 17 00:00:00 2001 From: Zuckerberg Date: Thu, 5 Mar 2026 23:29:40 -0800 Subject: [PATCH] try out hyprland --- common/pc/default.nix | 1 + common/pc/hyprland.nix | 49 ++++++++ home/googlebot.nix | 1 + home/hyprland.nix | 276 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 327 insertions(+) create mode 100644 common/pc/hyprland.nix create mode 100644 home/hyprland.nix diff --git a/common/pc/default.nix b/common/pc/default.nix index 0c23eeb..587c0f8 100644 --- a/common/pc/default.nix +++ b/common/pc/default.nix @@ -6,6 +6,7 @@ in { imports = [ ./kde.nix + ./hyprland.nix ./yubikey.nix ./chromium.nix ./firefox.nix diff --git a/common/pc/hyprland.nix b/common/pc/hyprland.nix new file mode 100644 index 0000000..b406fca --- /dev/null +++ b/common/pc/hyprland.nix @@ -0,0 +1,49 @@ +{ lib, config, pkgs, ... }: + +let + cfg = config.de; +in +{ + config = lib.mkIf cfg.enable { + programs.hyprland.enable = true; + programs.hyprland.withUWSM = true; + programs.hyprland.xwayland.enable = true; + + xdg.portal.extraPortals = [ pkgs.xdg-desktop-portal-hyprland ]; + + environment.systemPackages = with pkgs; [ + # Bar + waybar + + # Launcher + wofi + + # Notifications + mako + + # Lock/idle + hyprlock + hypridle + + # Wallpaper + hyprpaper + + # Polkit + hyprpolkitagent + + # Screenshots + grim + slurp + + # Clipboard + wl-clipboard + cliphist + + # Color picker + hyprpicker + + # Brightness (laptop keybinds) + brightnessctl + ]; + }; +} diff --git a/home/googlebot.nix b/home/googlebot.nix index 8747a1a..f0340dc 100644 --- a/home/googlebot.nix +++ b/home/googlebot.nix @@ -8,6 +8,7 @@ let thisMachineIsPersonal = osConfig.thisMachine.hasRole."personal"; in { + imports = [ ./hyprland.nix ]; home.username = "googlebot"; home.homeDirectory = "/home/googlebot"; diff --git a/home/hyprland.nix b/home/hyprland.nix new file mode 100644 index 0000000..f4f41da --- /dev/null +++ b/home/hyprland.nix @@ -0,0 +1,276 @@ +{ lib, osConfig, pkgs, ... }: + +let + thisMachineIsPersonal = osConfig.thisMachine.hasRole."personal"; +in +{ + config = lib.mkIf thisMachineIsPersonal { + wayland.windowManager.hyprland = { + enable = true; + systemd.enable = false; # Required when using UWSM + + settings = { + "$mod" = "SUPER"; + "$terminal" = "ghostty"; + "$menu" = "wofi --show drun"; + + general = { + gaps_in = 5; + gaps_out = 10; + border_size = 2; + "col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg"; + "col.inactive_border" = "rgba(595959aa)"; + layout = "dwindle"; + }; + + decoration = { + rounding = 10; + + blur = { + enabled = true; + size = 3; + passes = 1; + }; + + shadow = { + enabled = true; + range = 4; + render_power = 3; + color = "rgba(1a1a1aee)"; + }; + }; + + animations = { + enabled = true; + bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; + animation = [ + "windows, 1, 7, myBezier" + "windowsOut, 1, 7, default, popin 80%" + "border, 1, 10, default" + "borderangle, 1, 8, default" + "fade, 1, 7, default" + "workspaces, 1, 6, default" + ]; + }; + + dwindle = { + pseudotile = true; + preserve_split = true; + }; + + input = { + follow_mouse = 1; + touchpad = { + natural_scroll = true; + }; + }; + + misc = { + force_default_wallpaper = 0; + }; + + bind = [ + # Applications + "$mod, Return, exec, $terminal" + "$mod, D, exec, $menu" + "$mod, L, exec, hyprlock" + + # Window management + "$mod, Q, killactive" + "$mod, F, fullscreen" + "$mod, V, togglefloating" + "$mod, P, pseudo" + "$mod, J, togglesplit" + + # Move focus + "$mod, left, movefocus, l" + "$mod, right, movefocus, r" + "$mod, up, movefocus, u" + "$mod, down, movefocus, d" + + # Switch workspaces + "$mod, 1, workspace, 1" + "$mod, 2, workspace, 2" + "$mod, 3, workspace, 3" + "$mod, 4, workspace, 4" + "$mod, 5, workspace, 5" + "$mod, 6, workspace, 6" + "$mod, 7, workspace, 7" + "$mod, 8, workspace, 8" + "$mod, 9, workspace, 9" + "$mod, 0, workspace, 10" + + # Move active window to workspace + "$mod SHIFT, 1, movetoworkspace, 1" + "$mod SHIFT, 2, movetoworkspace, 2" + "$mod SHIFT, 3, movetoworkspace, 3" + "$mod SHIFT, 4, movetoworkspace, 4" + "$mod SHIFT, 5, movetoworkspace, 5" + "$mod SHIFT, 6, movetoworkspace, 6" + "$mod SHIFT, 7, movetoworkspace, 7" + "$mod SHIFT, 8, movetoworkspace, 8" + "$mod SHIFT, 9, movetoworkspace, 9" + "$mod SHIFT, 0, movetoworkspace, 10" + + # Scroll through workspaces + "$mod, mouse_down, workspace, e+1" + "$mod, mouse_up, workspace, e-1" + + # Screenshots + ", Print, exec, grim -g \"$(slurp)\" - | wl-copy" + "SHIFT, Print, exec, grim - | wl-copy" + + # Clipboard history + "$mod SHIFT, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy" + ]; + + bindm = [ + # Move/resize with mouse + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + + bindel = [ + # Volume + ", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + + # Brightness + ", XF86MonBrightnessUp, exec, brightnessctl s 10%+" + ", XF86MonBrightnessDown, exec, brightnessctl s 10%-" + ]; + + bindl = [ + ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ]; + + exec-once = [ + "waybar" + "mako" + "hyprpaper" + "wl-paste --type text --watch cliphist store" + "wl-paste --type image --watch cliphist store" + ]; + }; + }; + + # Waybar + programs.waybar = { + enable = true; + settings = { + mainBar = { + layer = "top"; + position = "top"; + height = 30; + modules-left = [ "hyprland/workspaces" ]; + modules-center = [ "clock" ]; + modules-right = [ "network" "pulseaudio" "battery" "tray" ]; + + clock = { + format = "{:%H:%M %Y-%m-%d}"; + }; + + battery = { + format = "{capacity}% {icon}"; + format-icons = [ "" "" "" "" "" ]; + }; + + network = { + format-wifi = "{essid} ({signalStrength}%) "; + format-ethernet = "{ipaddr}/{cidr} "; + format-disconnected = "Disconnected "; + }; + + pulseaudio = { + format = "{volume}% {icon}"; + format-muted = ""; + format-icons = { + default = [ "" "" "" ]; + }; + on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; + }; + + tray = { + spacing = 10; + }; + }; + }; + }; + + # Notifications + services.mako = { + enable = true; + settings = { + default-timeout = 5000; + border-radius = 5; + }; + }; + + # Idle daemon + services.hypridle = { + enable = true; + settings = { + general = { + lock_cmd = "pidof hyprlock || hyprlock"; + before_sleep_cmd = "loginctl lock-session"; + after_sleep_cmd = "hyprctl dispatch dpms on"; + }; + + listener = [ + { + timeout = 300; + on-timeout = "loginctl lock-session"; + } + { + timeout = 330; + on-timeout = "hyprctl dispatch dpms off"; + on-resume = "hyprctl dispatch dpms on"; + } + { + timeout = 1800; + on-timeout = "systemctl suspend"; + } + ]; + }; + }; + + # Lock screen + programs.hyprlock = { + enable = true; + settings = { + general = { + hide_cursor = true; + grace = 5; + }; + + background = [ + { + monitor = ""; + color = "rgba(25, 20, 20, 1.0)"; + blur_passes = 2; + blur_size = 7; + } + ]; + + input-field = [ + { + monitor = ""; + size = "200, 50"; + outline_thickness = 3; + dots_size = 0.33; + dots_spacing = 0.15; + outer_color = "rgb(151515)"; + inner_color = "rgb(200, 200, 200)"; + font_color = "rgb(10, 10, 10)"; + fade_on_empty = true; + placeholder_text = "Password..."; + hide_input = false; + position = "0, -20"; + halign = "center"; + valign = "center"; + } + ]; + }; + }; + }; +}