{ pkgs, lib, config, ... }: with lib; let cfg = config.hyprland; in { imports = [ ./waybar ]; options.hyprland = { enable = mkEnableOption "Hyprland"; monitors = mkOption { type = types.listOf types.str; default = [ ]; example = [ "eDP-1,1920x1080@60,0x0,1" ]; description = "Hyprland monitor configuration"; }; extraEnv = mkOption { type = types.listOf types.str; default = [ ]; example = [ "LIBVA_DRIVER_NAME,nvidia" "GBM_BACKEND,nvidia-drm" ]; description = "Extra environment variables for Hyprland"; }; enableGrimblast = mkEnableOption "grimblast screenshot keybinds"; enableWacom = mkEnableOption "Wacom tablet device configuration"; extraKeybinds = mkOption { type = types.listOf types.str; default = [ ]; example = [ "$mainMod,Print,exec,grimblast save active ~/tmp/screenshot.png" ]; description = "Extra keybinds for Hyprland"; }; extraWorkspaces = mkOption { type = types.listOf types.str; default = [ ]; example = [ "1, monitor:eDP-1, persistent:true, default:true" "2, monitor:eDP-1, persistent:true" ]; description = "Extra workspace definitions for Hyprland"; }; monitorVariables = mkOption { type = types.attrsOf types.str; default = { }; example = { "$mon_top" = "desc:BNQ G2420HDBL T2B04424SL000"; "$mon_left" = "desc:Samsung Electric Company LS27A600U HNMT502389"; }; description = "Monitor name variables for workspace configuration"; }; cursorNoHardware = mkEnableOption "disable hardware cursors"; }; config = mkIf cfg.enable { home.packages = with pkgs; [ dunst hyprpaper slurp swww waybar wl-clipboard catppuccin-cursors.macchiatoLavender bibata-cursors libsForQt5.qt5.qtwayland libsForQt5.qt5ct ] ++ optional cfg.enableGrimblast grimblast; services.hyprpaper = { enable = true; settings = { splash = false; }; }; services.hypridle = { enable = true; settings = { general = { lock_cmd = "${pkgs.hyprlock}/bin/hyprlock"; ignore_dbus_inhibit = false; }; listener = { timeout = 240; on-timeout = config.services.hypridle.settings.general.lock_cmd; before_sleep_cmd = config.services.hypridle.settings.general.lock_cmd; }; }; }; programs.hyprlock = { enable = true; settings = { background = [ { monitor = ""; path = "screenshot"; color = "rgba(17, 17, 17, 1.0)"; blur_passes = 3; contrast = 0.8916; brightness = 0.8172; vibrancy = 0.1696; vibrancy_darkness = 0.0; } ]; general = { grace = 0; }; input-field = [ { size = "250, 60"; outline_thickness = 2; dots_size = 0.2; dots_spacing = 0.2; dots_center = true; outer_color = "rgba(0, 0, 0, 0)"; inner_color = "rgba(0, 0, 0, 0.5)"; font_color = "rgb(200, 200, 200)"; fade_on_empty = false; font_family = "JetBrains Mono Nerd Font Mono"; placeholder_text = "Input Password..."; hide_input = false; position = "0, -120"; halign = "center"; valign = "center"; } ]; label = [ { text = "cmd[update:2000] echo \"$(date +\"%b %d %H:%M\")\""; color = "rgba(255, 255, 255, 0.6)"; font_size = 120; font_family = "JetBrains Mono Nerd Font Mono ExtraBold"; position = "0, -300"; halign = "center"; valign = "top"; } ]; }; }; wayland.windowManager.hyprland = { enable = true; package = pkgs.hyprland; systemd.enable = false; settings = { "$mainMod" = "SUPER"; "$shiftMainMod" = "SUPER_SHIFT"; "$term" = "kitty"; } // cfg.monitorVariables // { monitor = cfg.monitors; input = { kb_layout = "no"; follow_mouse = 1; }; device = optional cfg.enableWacom { name = "wacom-one-by-wacom-m-pen"; }; cursor = { hide_on_key_press = true; } // optionalAttrs cfg.cursorNoHardware { no_hardware_cursors = true; }; env = [ "XDG_SESSION_TYPE,wayland" ] ++ cfg.extraEnv; decoration = { rounding = 10; blur = { enabled = true; size = 3; passes = 1; xray = true; }; }; general = { gaps_in = 4; gaps_out = 10; border_size = 2; layout = "dwindle"; resize_on_border = true; }; 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" "specialWorkspace, 1, 4, default, fade" ]; }; dwindle = { pseudotile = true; preserve_split = true; special_scale_factor = 0.85; }; master = { new_status = "master"; }; misc = { force_default_wallpaper = 0; disable_hyprland_logo = true; disable_splash_rendering = true; key_press_enables_dpms = true; mouse_move_enables_dpms = true; }; ecosystem = { no_update_news = true; no_donation_nag = true; }; windowrule = [ { name = "terminal_opacity"; "match:class" = "kitty"; opacity = 0.9; } ]; workspace = [ "special:special, on-created-empty:kitty, rounding:true, decorate:false, border:false" ] ++ cfg.extraWorkspaces; bindm = [ "$mainMod,mouse:272,movewindow" "$shiftMainMod,mouse:272,resizewindow" ]; bind = [ # term "$mainMod,Return,exec,$term" # rofi "$mainMod,D,exec,rofi -show drun" "$mainMod,P,exec,rofi-rbw" "$mainMod,E,exec,rofi -show emoji" # hyprlock "$shiftMainMod,l,exec,${pkgs.hyprlock}/bin/hyprlock" # hyprland "$mainMod,Q,killactive," "CTRLALT,Delete,exit," "$mainMod,Space,togglefloating," "$mainMod,F,fullscreen," # focus "$mainMod,l,movefocus,l" "$mainMod,h,movefocus,r" "$mainMod,k,movefocus,u" "$mainMod,j,movefocus,d" # move "$mainMod,h,movewindow,l" "$mainMod,l,movewindow,r" "$mainMod,k,movewindow,u" "$mainMod,j,movewindow,d" # Force opacity "$shiftMainMod,o,exec, hl-no-opacity" ] ++ cfg.extraKeybinds ++ [ # Special workspace "$mainMod,c,togglespecialworkspace" "$shiftMainMod,c,movetoworkspace, special" ]; exec-once = [ ]; }; }; }; }