{ config, lib, ... }: with lib; let cfg = config.features.desktop.hyprland; in { options.features.desktop.hyprland.enable = mkEnableOption "Hyprland related stuff"; config = mkIf cfg.enable { wayland.windowManager.hyprland = { settings = { xwayland = { force_zero_scaling = true; }; exec-once = [ "hyprpanel" "while ! hyprpaper-random; do sleep 0.5; done" "wl-paste --type text --watch cliphist store" # Stores only text data "wl-paste --type image --watch cliphist store" # Stores only image data "wl-paste -p -t text --watch clipman store -P --histpath=\"~/.local/share/clipman-primary.json\"" ]; env = [ "XCURSOR_SIZE,32" "HYPRCURSOR_THEME,Bibata-Modern-Ice" "WLR_NO_HARDWARE_CURSORS,1" "GTK_THEME,Dracula" "XDG_CURRENT_DESKTOP,Hyprland" "XDG_SESSION_TYPE,wayland" "XDG_SESSION_DESKTOP,Hyprland" "NIXOS_OZONE_WL,1" ]; input = { kb_layout = "de,us"; kb_variant = ""; kb_model = ""; kb_rules = ""; kb_options = "ctrl:nocaps"; follow_mouse = 1; }; general = { gaps_in = 5; gaps_out = 5; border_size = 1; # Keeping the existing active border as requested "col.active_border" = "rgba(9742b5ee) rgba(9742b5ee) 45deg"; "col.inactive_border" = "rgba(${config.colorScheme.palette.base03}aa)"; layout = "dwindle"; }; decoration = { shadow = { enabled = true; range = 60; render_power = 3; color = "rgba(${config.colorScheme.palette.base00}66)"; offset = "1 2"; scale = 0.97; }; rounding = 8; blur = { enabled = true; size = 3; passes = 3; }; active_opacity = 0.9; inactive_opacity = 0.5; }; 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; }; master = { new_status = "master"; }; device = [ { name = "epic-mouse-v1"; sensitivity = -0.5; } { name = "zsa-technology-labs-moonlander-mark-i"; kb_layout = "us"; } { name = "keychron-keychron-k7"; kb_layout = "us"; } ]; windowrule = [ # Floating dialogs "match:class file_progress, float on" "match:class confirm, float on" "match:class dialog, float on" "match:class download, float on" "match:class notification, float on" "match:class error, float on" "match:class splash, float on" "match:class confirmreset, float on" "match:title Open File, float on" "match:title branchdialog, float on" "match:class pavucontrol-qt, float on" "match:class pavucontrol, float on" # wlogout "match:class wlogout, fullscreen on" "match:title wlogout, float on" "match:title wlogout, fullscreen on" # mpv "match:class mpv, float on" "match:class mpv, idle_inhibit focus" "match:class mpv, opacity 1.0 override" # Media/Volume/PiP "match:title ^(Media viewer)$, float on" "match:title ^(Volume Control)$, float on" "match:title ^(Picture-in-Picture)$, float on" # Pomodoro timer "match:title ^(floating-pomodoro)$, float on" "match:title ^(floating-pomodoro)$, size 250 50" "match:title ^(floating-pomodoro)$, move 12 (monitor_h-150)" "match:title ^(floating-pomodoro)$, pin on" # Streamlabs overlays "match:initial_title .*streamlabs.com.*, float on" "match:initial_title .*streamlabs.com.*, pin on" "match:initial_title .*streamlabs.com.*, size 800 400" "match:initial_title .*alert-box.*, move 100%-820 102" "match:initial_title .*chat-box.*, move 100%-820 512" "match:initial_title .*streamlabs.com.*, opacity 0.5 override" "match:initial_title .*streamlabs.com.*, idle_inhibit focus" "match:initial_title .*streamlabs.com.*, no_anim on" "match:initial_title .*streamlabs.com.*, decorate off" "match:initial_title .*streamlabs.com.*, no_shadow on" "match:initial_title .*streamlabs.com.*, no_blur on" "border_color rgb(ffffff), match:xwayland 1" ]; "$mainMod" = "SUPER"; "$terminal" = "kitty"; bind = [ "$mainMod, return, exec, $terminal nu -c zellij-ps" # "$mainMod, t, exec, warp-terminal" "$mainMod, t, exec, $terminal -e nu -c 'nitch; exec nu'" "$mainMod SHIFT, t, exec, launch-timer" "$mainMod, n, exec, $terminal -e nvim" "$mainMod, z, exec, uwsm app -- zeditor" "$mainMod, o, exec, hyprctl setprop activewindow opaque toggle" "$mainMod, r, exec, hyprctl dispatch focuswindow \"initialtitle:.*alert-box.*\" && hyprctl dispatch moveactive exact 4300 102 && hyprctl dispatch focuswindow \"initialtitle:.*chat-box.*\" && hyprctl dispatch moveactive exact 4300 512" "$mainMod, b, exec, uwsm app -- thunar" "$mainMod SHIFT, B, exec, uwsm app -- vivaldi" "$mainMod, Escape, exec, uwsm app -- wlogout -p layer-shell" "$mainMod, Space, togglefloating" "$mainMod, q, killactive" "$mainMod, M, exit" "$mainMod, F, fullscreen" "$mainMod SHIFT, V, togglefloating" "$mainMod, D, exec, uwsm app -- rofi -show drun -run-command \"uwsm app -- {cmd}\"" "$mainMod, V, exec, uwsm app -- cliphist list | rofi -dmenu | cliphist decode | wl-copy" "$mainMod, C, exec, bash -c 'FILE=/tmp/screenshot_$(date +%s).png; grim -g \"$(slurp)\" \"$FILE\" && ksnip \"$FILE\"'" "$mainMod SHIFT, S, exec, uwsm app -- rofi -show emoji" "$mainMod, P, exec, uwsm app -- rofi-pass" "$mainMod SHIFT, P, pseudo" "$mainMod, R, exec, stt-ptt start" "$mainMod, J, togglesplit" "$mainMod, h, movefocus, l" "$mainMod, l, movefocus, r" "$mainMod, k, movefocus, u" "$mainMod, j, movefocus, d" "$mainMod, 1, workspace, 1" "$mainMod, 2, workspace, 2" "$mainMod, 3, workspace, 3" "$mainMod, 4, workspace, 4" "$mainMod, 5, workspace, 5" "$mainMod, 6, workspace, 6" "$mainMod, 7, workspace, 7" "$mainMod, 8, workspace, 8" "$mainMod, 9, workspace, 9" "$mainMod, 0, workspace, 10" "$mainMod SHIFT, 1, movetoworkspace, 1" "$mainMod SHIFT, 2, movetoworkspace, 2" "$mainMod SHIFT, 3, movetoworkspace, 3" "$mainMod SHIFT, 4, movetoworkspace, 4" "$mainMod SHIFT, 5, movetoworkspace, 5" "$mainMod SHIFT, 6, movetoworkspace, 6" "$mainMod SHIFT, 7, movetoworkspace, 7" "$mainMod SHIFT, 8, movetoworkspace, 8" "$mainMod SHIFT, 9, movetoworkspace, 9" "$mainMod SHIFT, 0, movetoworkspace, 10" "$mainMod, mouse_down, workspace, e+1" "$mainMod, mouse_up, workspace, e-1" ]; bindr = [ "$mainMod, R, exec, stt-ptt stop" ]; bindm = [ "$mainMod, mouse:272, movewindow" "$mainMod, mouse:273, resizewindow" ]; }; }; services.hypridle = { enable = true; settings = { general = { before_sleep_cmd = "hyprlock"; after_sleep_cmd = "hyprctl dispatch dpms on"; inhibit_sleep = 3; }; listener = [ { timeout = 300; # 5 min on-timeout = "hyprlock"; } { timeout = 420; # 5.5 min on-timeout = "hyprctl dispatch dpms off"; on-resume = "hyprctl dispatch dpms on"; } ]; }; }; services.hyprpaper.enable = true; programs.hyprlock = { enable = true; settings = { "$font" = "JetBrainsMono Nerd Font"; "$base" = "rgb(${config.colorScheme.palette.base00})"; "$text" = "rgb(${config.colorScheme.palette.base05})"; "$textAlpha" = "${config.colorScheme.palette.base05}"; "$accentAlpha" = "${config.colorScheme.palette.base0D}"; "$red" = "rgb(${config.colorScheme.palette.base08})"; "$yellow" = "rgb(${config.colorScheme.palette.base0A})"; general = { hide_cursor = true; }; background = { monitor = ""; path = "${config.home.homeDirectory}/.config/hypr/wallpapers/wallhaven-lmmo8r.jpg"; blur_passes = 0; color = "rgb(${config.colorScheme.palette.base00})"; }; label = [ { monitor = ""; text = "$TIME"; color = "$text"; font_size = 90; font_family = "$font"; position = "30, 0"; halign = "left"; valign = "top"; } { monitor = ""; text = ''cmd[update:43200000] echo "$(date +"%A, %d %B %Y")"''; color = "$text"; font_size = 25; font_family = "$font"; position = "30, -150"; halign = "left"; valign = "top"; } ]; input-field = [ { monitor = ""; size = "300, 60"; outline_thickness = 4; dots_size = 0.2; dots_spacing = 0.2; dots_center = true; outer_color = "rgb(${config.colorScheme.palette.base0D})"; inner_color = "rgb(${config.colorScheme.palette.base00})"; font_color = "rgb(${config.colorScheme.palette.base05})"; fade_on_empty = false; placeholder_text = ''󰌾 Logged in as $USER''; hide_input = false; check_color = "rgb(${config.colorScheme.palette.base0D})"; fail_color = "rgb(${config.colorScheme.palette.base08})"; fail_text = ''$FAIL ($ATTEMPTS)''; capslock_color = "rgb(${config.colorScheme.palette.base0A})"; position = "0, -35"; halign = "center"; valign = "center"; } ]; }; }; }; }