{ pkgs, ... }: { imports = [ ./swaylock.nix ./hypr/hypridle.nix ]; home.packages = with pkgs; [ swayosd # volume pop-up swaynotificationcenter # notifications hyprpolkitagent # Privilege managent hyprshot # Screenshot utility # For clipboard management. See below. wl-clipboard xclip ]; wayland.windowManager.hyprland = { enable = true; plugins = [ # https://github.com/outfoxxed/hy3 pkgs.hyprlandPlugins.hy3 # https://github.com/shezdy/hyprsplit pkgs.hyprlandPlugins.hyprsplit ]; # Disable systemd because it conflicts with UWSM systemd.enable = false; settings = { monitor = [ "DP-2, 3440x1440, 0x0, 1" "DP-1, 2560x1440, -1440x-510, 1, transform, 1" ]; "$terminal" = "foot"; "$menu" = "rofi -show combi -combi-modes drun,ssh,run -theme ~/.config/rofi/launcher/style.rasi"; "$browser" = "firefox"; exec-once = [ "nm-applet" "sleep 2 && hyprpm reload -n" "systemctl --user start hyprpolkitagent" "gsettings set org.gnome.desktop.interface color-scheme \"prefer-dark\"" "gsettings set org.gnome.desktop.interface gtk-theme \"Adwaita-dark\"" # Hyprland doesn't paste into Firefox or Wine apps. This program is a workaround. # See https://github.com/hyprwm/Hyprland/issues/2319 # -t text = Only handle text # -w xclip -selection clipboard = Watch for events and invoke xclip "wl-paste -t text -w xclip -selection clipboard" ]; general = { gaps_in = 5; gaps_out = 10; border_size = 2; # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors "col.active_border" = "rgba(eeeeffee) rgba(3366ffee) 45deg"; "col.inactive_border" = "rgba(595959aa)"; # Set to true enable resizing windows by clicking and dragging on borders and gaps resize_on_border = true; # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on allow_tearing = false; layout = "hy3"; }; # https://wiki.hyprland.org/Configuring/Variables/#decoration decoration = { rounding = 5; # Change transparency of focused and unfocused windows active_opacity = 1.0; inactive_opacity = 1.0; shadow = { enabled = true; range = 5; render_power = 3; color = "rgba(1a1a1aee)"; }; # https://wiki.hyprland.org/Configuring/Variables/#blur blur = { enabled = true; size = 3; passes = 1; vibrancy = 0.1696; }; }; # https://wiki.hyprland.org/Configuring/Variables/#animations animations = { enabled = "yes"; # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more bezier = [ "easeOutQuint,0.23,1,0.32,1" "easeInOutCubic,0.65,0.05,0.36,1" "linear,0,0,1,1" "almostLinear,0.5,0.5,0.75,1.0" "quick,0.15,0,0.1,1" ]; animation = [ "global, 1, 10, default" "border, 1, 5.39, easeOutQuint" "windows, 1, 4.79, easeOutQuint" "windowsIn, 1, 4.1, easeOutQuint, popin 87%" "windowsOut, 1, 1.49, linear, popin 87%" "fadeIn, 1, 1.73, almostLinear" "fadeOut, 1, 1.46, almostLinear" "fade, 1, 3.03, quick" "layers, 1, 3.81, easeOutQuint" "layersIn, 1, 4, easeOutQuint, fade" "layersOut, 1, 1.5, linear, fade" "fadeLayersIn, 1, 1.79, almostLinear" "fadeLayersOut, 1, 1.39, almostLinear" "workspaces, 1, 1.94, almostLinear, fade" "workspacesIn, 1, 1.21, almostLinear, fade" "workspacesOut, 1, 1.94, almostLinear, fade" ]; }; # https://wiki.hyprland.org/Configuring/Variables/#misc misc = { force_default_wallpaper = 0; # Set to 0 or 1 to disable the anime mascot wallpapers disable_hyprland_logo = true; # If true disables the random hyprland logo / anime girl background. :( vrr = 1; # Enable variable refresh rate }; cursor = { no_hardware_cursors = true; }; ############### ### PLUGINS ### ############### plugin = { hy3 = { # disable gaps when only one window is onscreen # 0 - always show gaps # 1 - hide gaps with a single window onscreen # 2 - 1 but also show the window border no_gaps_when_only = 0; # default: 0 # policy controlling what happens when a node is removed from a group, # leaving only a group # 0 = remove the nested group # 1 = keep the nested group # 2 = keep the nested group only if its parent is a tab group node_collapse_policy = 2; # default: 2 # offset from group split direction when only one window is in a group group_inset = 10; # default: 10 # if a tab group will automatically be created for the first window spawned in a workspace tab_first_window = false; # tab group settings tabs = { # height of the tab bar height = 20; # default: 15 # padding between the tab bar and its focused node # padding = # default: 5 # the tab bar should animate in/out from the top instead of below the window # from_top = # default: false # rounding of tab bar corners rounding = 2; # default: 3 # render the window title on the bar # render_text = # default: true # center the window title # text_center = # default: false # font to render the window title with # text_font = # default: Sans # height of the window title text_height = 10; # default: 8 # left padding of the window title # text_padding = # default: 3 # active tab bar segment color # col.active = # default: 0xff32b4ff # urgent tab bar segment color # col.urgent = # default: 0xffff4f4f # inactive tab bar segment color # col.inactive = # default: 0x80808080 # active tab bar text color # col.text.active = # default: 0xff000000 # urgent tab bar text color # col.text.urgent = # default: 0xff000000 # inactive tab bar text color # col.text.inactive = # default: 0xff000000 }; # autotiling settings autotile = { # enable autotile # enable = # default: false # make autotile-created groups ephemeral # ephemeral_groups = # default: true # if a window would be squished smaller than this width, a vertical split will be created # -1 = never automatically split vertically # 0 = always automatically split vertically # = pixel width to split at # trigger_width = # default: 0 # if a window would be squished smaller than this height, a horizontal split will be created # -1 = never automatically split horizontally # 0 = always automatically split horizontally # = pixel height to split at # trigger_height = # default: 0 # a space or comma separated list of workspace ids where autotile should be enabled # it's possible to create an exception rule by prefixing the definition with "not:" # workspaces = 1,2 # autotiling will only be enabled on workspaces 1 and 2 # workspaces = not:1,2 # autotiling will be enabled on all workspaces except 1 and 2 # workspaces = # default: all }; }; hyprsplit = { num_workspaces = 10; persistent_workspaces = true; }; }; ############# ### INPUT ### ############# # https://wiki.hyprland.org/Configuring/Variables/#input input = { kb_layout = "us"; # kb_variant = # kb_model = kb_options = "compose:ralt"; # kb_rules = follow_mouse = 1; sensitivity = 0; # -1.0 - 1.0, 0 means no modification. touchpad = { natural_scroll = false; }; }; # Example per-device config # See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more device = { name = "logitech-g502-1"; sensitivity = -0.2; }; ################### ### KEYBINDINGS ### ################### # See https://wiki.hyprland.org/Configuring/Keywords/ "$mainMod" = "SUPER + ALT"; bind = [ "$mainMod, T, exec, $terminal" "$mainMod, B, exec, $browser" "$mainMod, D, exec, $menu" "$mainMod + SHIFT, S, exec, hyprshot -m region --clipboard-only" "$mainMod, C, exec, swaync-client -t" "$mainMod + L_CONTROL, Q, exec, /home/drew/.config/rofi/powermenu/powermenu.sh" "$mainMod, X, exec, /home/drew/.config/rofi/powermenu/powermenu.sh" # "$mainMod, X, exec, hyprlock" # "$mainMod + SHIFT, X, exec, systemctl suspend" "$mainMod, F, togglefloating," "$mainMod + SHIFT, F, fullscreen, 1" "$mainMod + CTRL, left, resizeactive, -20 0" "$mainMod + CTRL, right, resizeactive, 20 0" "$mainMod + CTRL, down, resizeactive, 0 20" "$mainMod + CTRL, up, resizeactive, 0 -20" # Monitors "$mainMod, R, focusmonitor, next" "$mainMod + CTRL, R, movecurrentworkspacetomonitor, l" "$mainMod + CTRL, S, movecurrentworkspacetomonitor, r" # Hy3 Stuff "$mainMod, Q, hy3:killactive," "$mainMod, G, hy3:makegroup, opposite, ephemeral" "$mainMod, W, hy3:makegroup, tab, ephemeral" "$mainMod + SHIFT, W, hy3:changegroup, toggletab" "$mainMod, A, hy3:changefocus, raise" "$mainMod, Z, hy3:changefocus, lower" "$mainMod, O, hy3:changegroup, opposite" "$mainMod, left, hy3:movefocus, l" "$mainMod, right, hy3:movefocus, r" "$mainMod, up, hy3:movefocus, u" "$mainMod, down, hy3:movefocus, d" "$mainMod, r, focusmonitor, l" "$mainMod, s, focusmonitor, r" "$mainMod + SHIFT, left, hy3:movewindow, l" "$mainMod + SHIFT, right, hy3:movewindow, r" "$mainMod + SHIFT, up, hy3:movewindow, u" "$mainMod + SHIFT, down, hy3:movewindow, d" # Switch workspaces with mainMod + [0-9] "$mainMod, 1, split:workspace, 1" "$mainMod, 2, split:workspace, 2" "$mainMod, 3, split:workspace, 3" "$mainMod, 4, split:workspace, 4" "$mainMod, 5, split:workspace, 5" "$mainMod, 6, split:workspace, 6" "$mainMod, 7, split:workspace, 7" "$mainMod, 8, split:workspace, 8" "$mainMod, 9, split:workspace, 9" "$mainMod, 0, split:workspace, 10" # Move active window to a workspace with mainMod + SHIFT + [0-9] # Note: using hy3:movetoworkspace instead of split:movetoworkspace. # The plugins are compatible. "$mainMod SHIFT, 1, hy3:movetoworkspace, 1, follow" "$mainMod SHIFT, 2, hy3:movetoworkspace, 2, follow" "$mainMod SHIFT, 3, hy3:movetoworkspace, 3, follow" "$mainMod SHIFT, 4, hy3:movetoworkspace, 4, follow" "$mainMod SHIFT, 5, hy3:movetoworkspace, 5, follow" "$mainMod SHIFT, 6, hy3:movetoworkspace, 6, follow" "$mainMod SHIFT, 7, hy3:movetoworkspace, 7, follow" "$mainMod SHIFT, 8, hy3:movetoworkspace, 8, follow" "$mainMod SHIFT, 9, hy3:movetoworkspace, 9, follow" "$mainMod SHIFT, 0, hy3:movetoworkspace, 10, follow" # These don't take monitor numbers, but rather differences. It's next/prev but # it'll always just move it to the other monitor "$mainMod SHIFT, r, movewindow, mon:+1" ]; # m = mouse bindings # These use just SUPER so I can hit them with my left hand bindm = [ "SUPER, mouse:272, movewindow" "SUPER, mouse:273, resizewindow" ]; # n = non-consuming bindn = [ ", mouse:272, hy3:focustab, mouse" ]; # l = available when locked bindl = [ # Laptop multimedia keys for volume and LCD brightness ",XF86AudioRaiseVolume, exec, swayosd-client --output-volume raise" ",XF86AudioLowerVolume, exec, swayosd-client --output-volume lower" ",XF86AudioMute, exec, swayosd-client --output-volume mute-toggle" ",XF86AudioMicMute, exec, swayosd-client --input-volume mute-toggle" ",XF86MonBrightnessUp, exec, brightnessctl s 10%+" ",XF86MonBrightnessDown, exec, brightnessctl s 10%-" # Requires playerctl ", XF86AudioNext, exec, playerctl next" ", XF86AudioPause, exec, playerctl play-pause" ", XF86AudioPlay, exec, playerctl play-pause" ", XF86AudioPrev, exec, playerctl previous" ]; ############################## ### WINDOWS AND WORKSPACES ### ############################## # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more windowrulev2 = [ # Ignore maximize requests from apps. You'll probably like this. "suppressevent maximize, class:.*" # Fix some dragging issues with XWayland "nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0" # Make right-click backgrounds not transparent. The menus have no class or title. "opaque,class:(),title:()" "noshadow,class:(),title:()" "noblur,class:(),title:()" ]; # See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules workspace = [ "1, defaultName:L1" "2, defaultName:L2" "3, defaultName:L3" "4, defaultName:L4" "5, defaultName:L5" "6, defaultName:L6" "7, defaultName:L7" "8, defaultName:L8" "9, defaultName:L9" "10, defaultName:L10" "11, defaultName:R1" "12, defaultName:R2" "13, defaultName:R3" "14, defaultName:R4" "15, defaultName:R5" "16, defaultName:R6" "17, defaultName:R7" "18, defaultName:R8" "19, defaultName:R9" "20, defaultName:R10" ]; }; }; programs.hyprlock = { enable = false; settings = { general = { disable_loading_bar = true; hide_cursor = true; }; background = { monitor = ""; color = "rgb(000000)"; }; # Time label = { monitor = ""; text = '' cmd[update:1000] echo "$(date '+%F %T')" ''; font_size = 96; font_family = "NotoSans Nerd Font"; color = "rgb(990000)"; position = "0, 0"; halign = "center"; valign = "center"; }; input-field = { monitor = ""; size = "300, 40"; fade_on_empty = true; outline_thickness = 2; outer_color = "rgb(cc2222) rgb(661111)"; inner_color = "rgb(221111)"; font_color = "rgb(cc2222)"; dots_size = 0.2; dots_spacing = 0.1; placeholder_text = ""; fail_color = "rgb(cc3333)"; capslock_color = "rgb(cccc33)"; halign = "center"; valign = "center"; position = "0, -300px"; }; }; }; # UWSM sessions should not use Hyprland's variables but instead use UWSM's variable management. # See https://wiki.hyprland.org/Configuring/Environment-variables/ home.file.".config/uwsm/env".text = '' export XCURSOR_SIZE="32" export HYPRCURSOR_SIZE="32" export HYPRCURSOR_THEME="phinger" # Nvidia config export LIBVA_DRIVER_NAME="nvidia" export __GLX_VENDOR_LIBRARY_NAME="nvidia" # For window theming export QT_QPA_PLATFORMTHEME="qt6ct # for Qt apps" export GTK_THEME="Adwaita-dark" # Tell electron apps they should use OZone for Wayland export ELECTRON_OZONE_PLATFORM_HINT="auto" ''; }