{ config, pkgs, lib, ... }: let cfg = config.local.window-manager.hyprland; easyfocus = pkgs.callPackage ./easyfocus-hyprland.nix { }; in { options.local.window-manager.hyprland = with lib; { enable = mkEnableOption "hyprland window manager"; }; config = lib.mkIf cfg.enable { home.packages = with pkgs.unstable; [ wl-clipboard dmenu-wayland ]; xdg.configFile."easyfocus-hyprland/config.yaml".text = '' chars: 'aoeuhtns' window_background_color: '1d1f21' window_background_opacity: 0.2 label_background_color: '1d1f21' label_background_opacity: 1.0 label_text_color: 'c5c8c6' focused_background_color: '285577' focused_background_opacity: 1.0 focused_text_color: 'ffffff' font_family: monospace font_weight: bold font_size: 60px label_padding_x: 16 label_padding_y: 16 label_border_radius: 4 label_margin_x: 4 label_margin_y: 50 ''; wayland.windowManager.hyprland = { enable = true; package = pkgs.unstable.hyprland; systemd.enable = true; xwayland.enable = true; settings = { # monitors monitor = ",preferred,auto,1"; # env env = [ "XCURSOR_SIZE,24" "HYPRCURSOR_SIZE,24" ]; # look and feel general = { gaps_in = 5; gaps_out = 20; border_size = 1; "col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg"; "col.inactive_border" = "rgba(595959aa)"; resize_on_border = false; allow_tearing = false; layout = "master"; }; decoration = { rounding = 5; active_opacity = 1.0; inactive_opacity = 1.0; drop_shadow = false; blur = { enabled = false; }; }; animations = { enabled = false; }; master = { orientation = "top"; new_is_master = false; }; gestures = { workspace_swipe = false; }; xwayland = { force_zero_scaling = true; }; "$terminal" = "wezterm start"; "$browser" = "librewolf"; "$menu" = "dmenu-wl_run"; "$m1" = "ALT_L"; "$m4" = "MOD4"; bind = lib.flatten [ # programs "$m1 SHIFT, Return, exec, $terminal" "$m1 SHIFT, B, exec, $browser" "$m1 SHIFT, S, exec, flameshot gui" "$m1, P, exec, $menu" # focus (lib.flip lib.mapAttrsToList { k = "prev"; j = "next"; } (k: d: [ "$m1, ${k}, layoutmsg, cycle${d}" "$m1 SHIFT, ${k}, layoutmsg, swap${d}" ])) "$m1, Return, layoutmsg, swapwithmaster, master" "$m1, S, exec, ${easyfocus}/bin/easyfocus-hyprland" # comma (,) "$m1, code:44, layoutmsg, addmaster" # period (.) "$m1, code:46, layoutmsg, removemaster" # windows "$m4 SHIFT, C, killactive" "$m1, Space, fullscreen, 0" # workspaces (lib.flip map [ 1 2 3 4 5 6 7 8 9 0 ] (i: let wid = if i == 0 then 10 else i; in [ # switch warkspaces with mod + [0-9] "$m1, ${toString i}, workspace, ${toString wid}" # move active window to a workspace with mod + shift + [0-9] "$m1 SHIFT, ${toString i}, movetoworkspacesilent, ${toString wid}" ] )) # system "$m4, L, exec, waylock" "$m4 SHIFT, Q, exit" ]; bindm = [ "$m1, mouse:272, movewindow" "$m1, mouse:273, resizewindow" ]; input = let kb = config.home.keyboard; in { kb_model = kb.model; kb_layout = kb.layout; kb_variant = kb.variant; kb_options = lib.head kb.options; }; }; }; }; }