{ lib, pkgs, config, namespace, ... }: let inherit (lib) types mkIf; inherit (lib.${namespace}) mkOpt enabled; cfg = config.${namespace}.programs.graphical.wms.hyprland; in { options.${namespace}.programs.graphical.wms.hyprland = { enable = lib.mkEnableOption "Hyprland"; mainMod = mkOpt types.str "SUPER" "Hyprland main modifier key"; monitors = mkOpt (with types; listOf str) [ ", preferred, auto, 1" ] "Hyprland monitor configuration"; }; config = mkIf cfg.enable { services.swaync = enabled; wayland.windowManager.hyprland = { enable = true; extraConfig = builtins.readFile ./config/hyprland.conf; settings = { "$mainMod" = cfg.mainMod; "$terminal" = "ghostty"; "$menu" = "wofi --show drun"; monitor = cfg.monitors; bind = [ # Super Bindings (macOS Transition) "ALT_SHIFT, 1, exec, hyprshot -m output" "ALT_SHIFT, 2, exec, hyprshot -m window" "ALT_SHIFT, 3, exec, hyprshot -m region" # Primary Bindings "$mainMod, SPACE, exec, $menu" "$mainMod, RETURN, exec, $terminal" "$mainMod, Q, killactive" "$mainMod, M, exit" "$mainMod, V, togglefloating" "$mainMod, P, pseudo" # dwindle "$mainMod, J, togglesplit" # dwindle "$mainMod, S, togglespecialworkspace, magic" "$mainMod SHIFT, S, movetoworkspace, special:magic" # Window Focus "$mainMod, left, movefocus, l" "$mainMod, right, movefocus, r" "$mainMod, up, movefocus, u" "$mainMod, down, movefocus, d" # Workspace Switch "$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" # Window Workspace Move "$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 SHIFT, right, workspace, +1" "$mainMod SHIFT, left, workspace, -1" ]; bindm = [ # Window Resizing "$mainMod, mouse:272, movewindow" "$mainMod, mouse:273, resizewindow" ]; bindel = [ # Multimedia & Brightness Keys ",XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+" ",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" ",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" ",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" ",XF86MonBrightnessUp, exec, brightnessctl s 10%+" ",XF86MonBrightnessDown, exec, brightnessctl s 10%-" # macOS Keyboard Brightness "ALT, XF86MonBrightnessUp, exec, brightnessctl -d kbd_backlight s 10%+" "ALT, XF86MonBrightnessDown, exec, brightnessctl -d kbd_backlight s 10%-" ]; bindl = [ # Player Controls ", XF86AudioNext, exec, playerctl next" ", XF86AudioPause, exec, playerctl play-pause" ", XF86AudioPlay, exec, playerctl play-pause" ", XF86AudioPrev, exec, playerctl previous" ]; }; }; programs.waybar = { enable = true; style = builtins.readFile ./config/waybar-style.css; settings = [{ layer = "top"; position = "top"; mod = "dock"; exclusive = true; passtrough = false; gtk-layer-shell = true; height = 0; modules-left = [ "hyprland/workspaces" "hyprland/window" ]; # modules-center = [ "hyprland/window" ]; modules-right = [ "tray" "cpu" "memory" "pulseaudio" "network" "backlight" "battery" "clock" ]; "hyprland/window" = { format = "{}"; }; "wlr/workspaces" = { on-scroll-up = "hyprctl dispatch workspace e+1"; on-scroll-down = "hyprctl dispatch workspace e-1"; all-outputs = true; on-click = "activate"; }; battery = { states = { warning = 30; critical = 15; }; format = "{icon}"; format-charging = "󰂄"; format-plugged = "󰂄"; format-alt = "{icon}"; format-icons = [ "󰂃" "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ]; }; cpu = { interval = 10; format = " {}%"; max-length = 10; on-click = ""; }; memory = { interval = 30; format = " {}%"; format-alt = " {used:0.1f}G"; max-length = 10; }; backlight = { format = "{icon}"; format-icons = [ "󰋙" "󰫃" "󰫄" "󰫅" "󰫆" "󰫇" "󰫈" ]; on-scroll-up = "brightnessctl s 1%-"; on-scroll-down = "brightnessctl s +1%"; }; tray = { icon-size = 13; tooltip = false; spacing = 10; }; network = { interval = 1; format-wifi = "󰖩"; format-ethernet = "󰈀"; format-linked = "󰈁"; format-disconnected = ""; on-click-right = "${pkgs.networkmanagerapplet}/bin/nm-connection-editor"; # tooltip-format = '' # Network Details # Interface: {ifname} # IP: {ipaddr}/{cidr} # Gateway: {gwaddr} # 󰜷 {bandwidthUpBytes}\n󰜮 {bandwidthDownBytes}''; tooltip-format = '' Network Details Interface: {ifname} SSID: {essid} IP Address: {ipaddr}/{cidr} Gateway: {gwaddr} 󰜷 {bandwidthUpBytes} / 󰜮 {bandwidthDownBytes} ''; }; clock = { format = " {:%Y-%m-%d %H:%M:%S}"; interval = 1; tooltip-format = '' {:%Y %B} {calendar}''; }; pulseaudio = { format = "{icon} {volume}%"; tooltip = false; format-muted = " Muted"; on-click = "pamixer -t"; on-scroll-up = "pamixer -i 5"; on-scroll-down = "pamixer -d 5"; scroll-step = 5; format-icons = { headphone = ""; hands-free = ""; headset = ""; phone = ""; portable = ""; car = ""; default = [ "" "" "" ]; }; }; "pulseaudio#microphone" = { format = "{format_source}"; tooltip = false; format-source = " {volume}%"; format-source-muted = " Muted"; on-click = "pamixer --default-source -t"; on-scroll-up = "pamixer --default-source -i 5"; on-scroll-down = "pamixer --default-source -d 5"; scroll-step = 5; }; }]; }; home.packages = with pkgs; [ brightnessctl hyprshot wofi wofi-emoji ]; xdg.configFile = { "wofi/config".source = ./config/wofi.conf; "wofi/style.css".source = ./config/wofi-style.css; "uwsp/env".text = '' export XCURSOR_SIZE=64 ''; }; }; }