# settings/hyprland.nix { config, pkgs, lib, inputs, ... }: { config = lib.mkIf (config.networking.hostName == "FredOS-Gaming") { programs.hyprland = { enable = true; xwayland.enable = true; }; xdg.portal = { enable = true; extraPortals = with pkgs; [ xdg-desktop-portal-hyprland xdg-desktop-portal-gtk ]; config.hyprland.default = [ "hyprland" "gtk" ]; }; security.polkit.enable = true; # Polkit GUI agent for GUI sudo prompts under Hyprland systemd.user.services.polkit-gnome-authentication-agent-1 = { description = "polkit-gnome-authentication-agent-1"; wantedBy = [ "graphical-session.target" ]; partOf = [ "graphical-session.target" ]; after = [ "graphical-session.target" ]; serviceConfig = { Type = "simple"; ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"; Restart = "on-failure"; }; }; environment.systemPackages = with pkgs; [ ghostty waybar wofi mako grim slurp wl-clipboard cliphist brightnessctl pamixer playerctl hyprpaper hyprlock hypridle hyprshot networkmanagerapplet pavucontrol polkit_gnome ]; home-manager.users.fred = { config, lib, pkgs, ... }: { wayland.windowManager.hyprland = { enable = true; systemd.variables = [ "--all" ]; settings = { # Pin the OC'd 190 Hz mode so we don't fall back to 60. monitor = "DP-2,3440x1440@190,0x0,1"; # FredOS-Gaming has both a Ryzen iGPU (card0, 1002:164E) and a # Navi 22 dGPU (card1, 1002:73DF). Force aquamarine + clients onto # the dGPU so we don't pay PRIME-copy latency every frame. env = [ "AQ_DRM_DEVICES,/dev/dri/card1" "WLR_DRM_DEVICES,/dev/dri/card1" "DRI_PRIME,pci-0000_03_00_0" ]; "$mod" = "SUPER"; "$term" = "ghostty"; "$menu" = "wofi --show drun"; exec-once = [ "waybar" "mako" "hyprpaper" "nm-applet --indicator" "wl-paste --type text --watch cliphist store" "wl-paste --type image --watch cliphist store" ]; general = { gaps_in = 6; gaps_out = 12; border_size = 2; layout = "dwindle"; resize_on_border = true; }; decoration = { rounding = 8; # Blur disabled — two passes at 3440x1440 was the biggest # contributor to per-frame compositor latency. Re-enable with # smaller size/passes if you miss the look. blur = { enabled = false; }; }; render = { direct_scanout = true; # fullscreen apps bypass compositor }; animations = { enabled = true; # speed = tenths of a second; 2 = 0.2s. Drop to 1 for instant-ish. bezier = [ "snap, 0.05, 0.9, 0.1, 1.0" ]; animation = [ "windows, 1, 2, snap" "windowsOut, 1, 2, snap, popin 80%" "border, 1, 3, default" "fade, 1, 2, default" "workspaces, 1, 2, snap" ]; }; input = { kb_layout = "gb,no"; kb_options = "grp:alt_shift_toggle"; follow_mouse = 1; accel_profile = "flat"; sensitivity = 0; }; dwindle = { preserve_split = true; pseudotile = true; # New windows split the focused container 50/50 — your usual # 2-way layout falls out of dwindle's defaults. }; misc = { disable_hyprland_logo = true; disable_splash_rendering = true; focus_on_activate = true; # VRR off — the OC'd 190 Hz mode on the G34WQCP doesn't advertise # FreeSync, so vrr=2 was set but never actually engaged. Leaving # it set caused pacing weirdness; explicitly off keeps things # honest. vrr = 0; vfr = false; # keep compositor ticking, don't idle between frames }; cursor = { # Counterintuitive on AMD: HW cursor plane can micro-stutter from # atomic KMS commits, while SW cursors get redrawn at the # compositor's 190 Hz rate. Many AMD users report SW feels # smoother. Flip back to 0 if you'd rather try the HW path. no_hardware_cursors = true; enable_hyprcursor = false; }; # Mirror the GNOME bindings so muscle memory carries over bind = [ "$mod, T, exec, $term" "$mod, E, exec, nautilus" "$mod, R, exec, $menu" "$mod, Q, killactive" "$mod SHIFT, E, exit" # Floating / layout "$mod, V, togglefloating" "$mod, F, fullscreen, 0" "$mod, P, pseudo" "$mod, S, togglesplit" # Focus "$mod, left, movefocus, l" "$mod, right, movefocus, r" "$mod, up, movefocus, u" "$mod, down, movefocus, d" "$mod, H, movefocus, l" "$mod, L, movefocus, r" "$mod, K, movefocus, u" "$mod, J, movefocus, d" # Move windows "$mod SHIFT, left, movewindow, l" "$mod SHIFT, right, movewindow, r" "$mod SHIFT, up, movewindow, u" "$mod SHIFT, down, movewindow, d" # 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" "$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" # Screenshots — Shift+Super+S matches your GNOME binding "$mod SHIFT, S, exec, hyprshot -m region --clipboard-only" ", Print, exec, hyprshot -m output --clipboard-only" # Settings shortcut — Super+I matches your GNOME binding "$mod, I, exec, pavucontrol" ]; bindm = [ "$mod, mouse:272, movewindow" "$mod, mouse:273, resizewindow" ]; bindel = [ ", XF86AudioRaiseVolume, exec, pamixer -i 5" ", XF86AudioLowerVolume, exec, pamixer -d 5" ", XF86AudioMute, exec, pamixer -t" ", XF86MonBrightnessUp, exec, brightnessctl set 5%+" ", XF86MonBrightnessDown, exec, brightnessctl set 5%-" ]; bindl = [ ", XF86AudioPlay, exec, playerctl play-pause" ", XF86AudioNext, exec, playerctl next" ", XF86AudioPrev, exec, playerctl previous" ]; }; }; home.file.".config/hypr/hyprpaper.conf".text = '' preload = ${config.home.homeDirectory}/.local/share/backgrounds/wallpaper.png wallpaper = ,${config.home.homeDirectory}/.local/share/backgrounds/wallpaper.png splash = false ''; }; }; }