# Hyprland Configuration # Translated from DWM config.def.h and sxhkdrc # Craig Jennings # ============================================================================ # Monitor Configuration # ============================================================================ monitor=,preferred,auto,auto # ============================================================================ # Startup Applications # ============================================================================ exec-once = hyprpm reload exec-once = waybar exec-once = swww-daemon && sleep 1 && swww img ~/pictures/wallpaper/dark-lion.jpg exec-once = dunst exec-once = hypridle exec-once = gammastep exec-once = blueman-applet exec-once = /usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP exec-once = mpd exec-once = signal-desktop --start-in-tray --ozone-platform=wayland exec-once = protonmail-bridge --no-window exec-once = insync start # ============================================================================ # Environment Variables # ============================================================================ env = XCURSOR_SIZE,24 env = XDG_CURRENT_DESKTOP,Hyprland env = XDG_SESSION_TYPE,wayland env = XDG_SESSION_DESKTOP,Hyprland env = _JAVA_AWT_WM_NONREPARENTING,1 # ============================================================================ # Appearance (matching DWM colors) # ============================================================================ # DWM colors: gray1=#222222, gray2=#444444, gray3=#bbbbbb, gray4=#eeeeee, cyan=#daa520 general { gaps_in = 25 gaps_out = 30 border_size = 3 col.active_border = rgba(daa520ff) col.inactive_border = rgba(444444ff) layout = master resize_on_border = true } decoration { rounding = 10 blur { enabled = false } shadow { enabled = false } } animations { enabled = true bezier = myBezier, 0.05, 0.9, 0.1, 1.05 animation = windows, 1, 3, myBezier animation = windowsOut, 1, 3, default, popin 80% animation = fade, 1, 3, default animation = workspaces, 1, 3, default animation = specialWorkspace, 1, 3, default, slidevert } # ============================================================================ # Layout (master-stack like DWM tile) # ============================================================================ master { new_status = slave mfact = 0.55 } dwindle { pseudotile = true preserve_split = true } # ============================================================================ # Input # ============================================================================ input { kb_layout = us kb_options = ctrl:nocaps follow_mouse = 0 touchpad { natural_scroll = true } } # ============================================================================ # Misc # ============================================================================ misc { force_default_wallpaper = 0 disable_hyprland_logo = true } # ============================================================================ # XWayland # ============================================================================ xwayland { force_zero_scaling = true } # ============================================================================ # Window Rules (Hyprland 0.53+ syntax: match:CONDITION, RULE) # ============================================================================ # Floating windows (from DWM rules) windowrule = match:class ^(Gimp)$, float on windowrule = match:class ^(caffeine)$, float on windowrule = match:class ^(blueman-services)$, float on windowrule = match:class ^(Blueman-manager)$, float on windowrule = match:class ^(qalculate-gtk)$, float on windowrule = match:title ^(Event Tester)$, float on # ============================================================================ # Key Bindings # ============================================================================ $mod = SUPER # Terminal and core apps (from DWM) bind = $mod, T, exec, foot bind = $mod, E, exec, emacsclient -c -a "" || emacs bind = $mod, W, exec, $BROWSER bind = $mod, P, exec, fuzzel # From sxhkdrc bind = $mod, SPACE, exec, fuzzel bind = $mod SHIFT, W, exec, $ALTBROWSER bind = CTRL ALT, W, exec, tor-browser bind = CTRL ALT, F, exec, thunar bind = $mod, V, exec, virtualbox bind = $mod SHIFT, L, exec, calibre bind = $mod SHIFT, R, exec, shortwave bind = $mod SHIFT, P, exec, waypaper # Window management (from DWM) # Layout-aware navigation (works across master, scrolling, hy3) bind = $mod, J, exec, layout-navigate next bind = $mod, K, exec, layout-navigate prev bind = $mod SHIFT, J, exec, layout-navigate next move bind = $mod SHIFT, K, exec, layout-navigate prev move bind = $mod, H, splitratio, -0.05 bind = $mod, L, splitratio, +0.05 bind = $mod, RETURN, layoutmsg, swapwithmaster master bind = $mod, G, centerwindow bind = $mod, TAB, workspace, previous bind = $mod SHIFT, C, killactive # Layouts: master -> tab group (monocle) -> scrolling -> floating # Click waybar layout icon to cycle, or use direct keybindings: bind = $mod SHIFT, T, exec, hyprctl keyword general:layout master && hyprctl keyword master:orientation left bind = $mod SHIFT, M, exec, hyprctl keyword general:layout hy3 && hyprctl dispatch hy3:changegroup tab bind = $mod SHIFT, S, exec, hyprctl keyword general:layout scrolling bind = $mod SHIFT, F, togglefloating bind = $mod SHIFT, SPACE, togglefloating # Master layout adjustments bind = $mod, I, layoutmsg, addmaster bind = $mod, D, layoutmsg, removemaster # Focus mode (xtra-dispatchers plugin) # O = "Only this window" / "bring back Others" / "close Others" bind = $mod, O, exec, hyprctl dispatch plugin:xtd:throwunfocused 10 bind = $mod SHIFT, O, exec, hyprctl dispatch plugin:xtd:bringallfrom 10 bind = $mod CTRL, O, exec, hyprctl dispatch plugin:xtd:closeunfocused # Gaps (from DWM) bind = $mod, MINUS, exec, hyprctl keyword general:gaps_out $(( $(hyprctl getoption general:gaps_out -j | jq -r '.custom' | cut -d' ' -f1) - 5 )) && hyprctl keyword general:gaps_in $(( $(hyprctl getoption general:gaps_in -j | jq -r '.custom' | cut -d' ' -f1) - 5 )) bind = $mod, EQUAL, exec, hyprctl keyword general:gaps_out $(( $(hyprctl getoption general:gaps_out -j | jq -r '.custom' | cut -d' ' -f1) + 5 )) && hyprctl keyword general:gaps_in $(( $(hyprctl getoption general:gaps_in -j | jq -r '.custom' | cut -d' ' -f1) + 5 )) bind = $mod SHIFT, EQUAL, exec, hyprctl keyword general:gaps_out 30 && hyprctl keyword general:gaps_in 25 bind = $mod SHIFT, MINUS, exec, hyprctl keyword general:gaps_out 0 && hyprctl keyword general:gaps_in 0 # Toggle bar bind = $mod, B, exec, killall -SIGUSR1 waybar # Fullscreen bind = $mod, F11, fullscreen, 0 # Workspaces 1-9 (from DWM TAGKEYS) bind = $mod, 1, workspace, 1 bind = $mod, 2, workspace, 2 bind = $mod, 3, workspace, 3 bind = $mod, 4, workspace, 4 bind = $mod, 5, workspace, 5 bind = $mod, 6, workspace, 6 bind = $mod, 7, workspace, 7 bind = $mod, 8, workspace, 8 bind = $mod, 9, workspace, 9 bind = $mod, 0, workspace, 10 # Move window to workspace (from DWM tag) bind = $mod SHIFT, 1, movetoworkspacesilent, 1 bind = $mod SHIFT, 2, movetoworkspacesilent, 2 bind = $mod SHIFT, 3, movetoworkspacesilent, 3 bind = $mod SHIFT, 4, movetoworkspacesilent, 4 bind = $mod SHIFT, 5, movetoworkspacesilent, 5 bind = $mod SHIFT, 6, movetoworkspacesilent, 6 bind = $mod SHIFT, 7, movetoworkspacesilent, 7 bind = $mod SHIFT, 8, movetoworkspacesilent, 8 bind = $mod SHIFT, 9, movetoworkspacesilent, 9 bind = $mod SHIFT, 0, movetoworkspacesilent, 10 # Monitor focus (from DWM focusmon) bind = $mod, COMMA, focusmonitor, -1 bind = $mod, PERIOD, focusmonitor, +1 bind = $mod SHIFT, COMMA, movewindow, mon:-1 bind = $mod SHIFT, PERIOD, movewindow, mon:+1 # ============================================================================ # Scratchpads (from DWM togglescratch) # ============================================================================ # Using on-created-empty workspace rules - app launches on first toggle, # subsequent toggles just show/hide the workspace # Workspace rules (auto-launch apps when workspace first accessed) workspace = special:term, on-created-empty:foot --app-id foot-term tmux workspace = special:audio, on-created-empty:foot --app-id foot-audio pulsemixer workspace = special:monitor, on-created-empty:foot --app-id foot-monitor gotop workspace = special:music, on-created-empty:foot --app-id foot-music ncmpcpp workspace = special:files, on-created-empty:foot --app-id foot-files ranger workspace = special:htop, on-created-empty:foot --app-id foot-htop htop workspace = special:network, on-created-empty:foot --app-id foot-network nmtui # Keybindings (single bind per scratchpad - just toggle visibility) bind = $mod SHIFT, RETURN, togglespecialworkspace, term bind = $mod, A, togglespecialworkspace, audio bind = $mod, M, togglespecialworkspace, monitor bind = $mod, SLASH, togglespecialworkspace, music bind = $mod, F, togglespecialworkspace, files bind = $mod SHIFT, H, togglespecialworkspace, htop # Window rules (using app-id/class matching, Hyprland 0.53+ syntax) # Terminal scratchpad windowrule = match:class ^(foot-term)$, float on windowrule = match:class ^(foot-term)$, size (monitor_w*0.6) (monitor_h*0.6) windowrule = match:class ^(foot-term)$, center on # Audio mixer windowrule = match:class ^(foot-audio)$, float on windowrule = match:class ^(foot-audio)$, size (monitor_w*0.6) (monitor_h*0.6) windowrule = match:class ^(foot-audio)$, center on # System monitor windowrule = match:class ^(foot-monitor)$, float on windowrule = match:class ^(foot-monitor)$, size (monitor_w*0.6) (monitor_h*0.6) windowrule = match:class ^(foot-monitor)$, center on # Music player windowrule = match:class ^(foot-music)$, float on windowrule = match:class ^(foot-music)$, size (monitor_w*0.6) (monitor_h*0.6) windowrule = match:class ^(foot-music)$, center on # File manager windowrule = match:class ^(foot-files)$, float on windowrule = match:class ^(foot-files)$, size (monitor_w*0.6) (monitor_h*0.6) windowrule = match:class ^(foot-files)$, center on # Htop windowrule = match:class ^(foot-htop)$, float on windowrule = match:class ^(foot-htop)$, size (monitor_w*0.6) (monitor_h*0.6) windowrule = match:class ^(foot-htop)$, center on # Network manager windowrule = match:class ^(foot-network)$, float on windowrule = match:class ^(foot-network)$, size (monitor_w*0.6) (monitor_h*0.6) windowrule = match:class ^(foot-network)$, center on # Calculator (not a scratchpad, just launches app) bind = $mod, X, exec, qalculate-gtk bind = $mod, C, exec, qalculate-gtk # Media/hardware keys bindel = , XF86AudioRaiseVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ +5% bindel = , XF86AudioLowerVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ -5% bindl = , XF86AudioMute, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle bindel = , XF86MonBrightnessUp, exec, brightnessctl s +10% bindel = , XF86MonBrightnessDown, exec, brightnessctl s 10%- # Microphone toggle (from sxhkdrc) bind = CTRL ALT, SPACE, exec, amixer set Capture toggle && amixer get Capture | grep '\[off\]' && notify-send "Microphone" "Muted" || notify-send "Microphone" "On" # Bluetooth (from DWM and sxhkdrc) bind = $mod SHIFT, B, exec, blueman-manager # Screenshots (Wayland: grim + slurp instead of maim) bind = $mod, S, exec, grim -g "$(slurp)" ~/pictures/screenshots/$(date +%Y.%m.%d-%H%M%S).png && notify-send "Screenshot" "Saved to ~/pictures/screenshots/" bind = , Print, exec, grim ~/pictures/screenshots/$(date +%Y.%m.%d-%H%M%S).png && notify-send "Screenshot" "Full screen saved" # Color picker (Wayland: hyprpicker instead of xcolor) # bind = $mod, C, exec, hyprpicker -a # conflicts with calculator, uncomment if needed # Lock screen (from sxhkdrc: super+Escape) bind = $mod, ESCAPE, exec, hyprlock # Touchpad toggle bind = $mod, F9, exec, toggle-touchpad # Exit/session (from DWM) bind = $mod SHIFT, Q, exec, printf "Exit\nCancel" | fuzzel --dmenu --prompt "Exit Hyprland? " | grep -q "Exit" && hyprctl dispatch exit bind = $mod SHIFT, BACKSPACE, exit bind = $mod SHIFT, ESCAPE, exec, hyprctl reload # Mouse bindings (from DWM buttons) bindm = $mod, mouse:272, movewindow bindm = $mod, mouse:273, resizewindow bindm = $mod SHIFT, mouse:272, resizewindow