Hyprland and Hyprland-related configuration files

Table of Contents

This is my hyprland configuration alongside with other configuration for various applications I use.

Hyprland

~/.config/hypr/hypland.conf

Modular Configuration

source = ./hypr.d/variables.conf
source = ./hypr.d/general.conf
source = ./hypr.d/workspaces.conf
source = ./hypr.d/keybindings.conf
source = ./hypr.d/decorations.conf
source = ./hypr.d/animation.conf
source = ./hypr.d/autostart.conf
source = ./hypr.d/input.conf
source = ./hypr.d/devices.conf
source = ./hypr.d/groups.conf
source = ./hypr.d/misc.conf
source = ./hypr.d/binds.conf
source = ./hypr.d/xwayland.conf
source = ./hypr.d/ecosystem.conf
source = ./hypr.d/cursor.conf
source = ./hypr.d/dwindle.conf
source = ./hypr.d/master.conf
source = ./hypr.d/gestures.conf
source = ./hypr.d/windowrule.conf
source = ./hypr.d/layerrule.conf

variables

$terminal = kitty
$fileManager = thunar
$menu = wofi --show drun
$editor = emacsclient -c -a emacs
$editor_term = emacsclient -t -a ""
$mail = thunderbird
$browser = firefox
$mainMod = SUPER # Sets "Windows" key as main modifier

env = QT_QPA_PLATFORM,wayland;xcb
env = QT_QPA_PLATFORMTHEME,qt5ct # change to qt6ct if you have that
env = QT_AUTO_SCREEN_SCALE_FACTOR,1
env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1
env = SDL_VIDEODRIVER,wayland
env = CLUTTER_BACKEND,wayland
env = GTK_THEME,Breeze-Dark
env = GTK2_RC_FILES,/usr/share/themes/Breeze-Dark/gtk-2.0
env = XCURSOR_THEME,Bibata-Modern-Classic
env = XCURSOR_SIZE,24
env = HYPRCURSOR_THEME,Bibata-Modern-Classic
env = HYPRCURSOR_SIZE,24
env = XDG_SESSION_DESKTOP,Hyprland
env = GDK_BACKEND,wayland,x11,*
  • wallpapers
    $w1 = hyprctl hyprpaper wallpaper ",~/.local/share/wallpapers/nord/Minimal-Nord.png"
    $w2 = hyprctl hyprpaper wallpaper ",~/.local/share/wallpapers/nord/linux-friends-4k.png"
    $w3 = hyprctl hyprpaper wallpaper ",~/.local/share/wallpapers/nord/nord_buildings.png"
    $w4 = hyprctl hyprpaper wallpaper ",~/.local/share/wallpapers/nord/keyboard.png"
    $w5 = hyprctl hyprpaper wallpaper ",~/.local/share/wallpapers/nord/nord_lake.png"
    $w6 = hyprctl hyprpaper wallpaper ",~/.local/share/wallpapers/nord/nord_alone_tree.png"
    $w7 = hyprctl hyprpaper wallpaper ",~/.local/share/wallpapers/nord/nord_mountains.png"
    $w8 = hyprctl hyprpaper wallpaper ",~/.local/share/wallpapers/nord/wild.png"
    $w9 = hyprctl hyprpaper wallpaper ",~/.local/share/wallpapers/nord/nord_space.png"
    $w10 = hyprctl hyprpaper wallpaper ",~/.local/share/wallpapers/nord/nord_valley.png"
    
  • colors
    $color00 = rgba(46,52,64,1)
    $color01 = rgba(59,66,82,1)
    $color02 = rgba(67,76,94,1)
    $color03 = rgba(76,86,106,1)
    $color04 = rgba(216,222,233,1)
    $color05 = rgba(229,233,240,1)
    $color06 = rgba(236,239,244,1)
    $color07 = rgba(143,188,187,1)
    $color08 = rgba(136,192,208,1)
    $color09 = rgba(129,161,193,1)
    $color10 = rgba(94,129,172,1)
    $color11 = rgba(191,97,106,1)
    $color12 = rgba(208,135,112,1)
    $color13 = rgba(235,203,139,1)
    $color14 = rgba(163,190,140,1)
    $color15 = rgba(180,142,173,1)
    

general

general {
  gaps_in = 5
  gaps_out = 10,20,10,20
  float_gaps = 0
  gaps_workspaces = 0
  no_focus_fallback = false
  resize_on_border = false
  border_size = 2 
  allow_tearing = false
  layout = dwindle

  col.active_border = $color08 $color13 45deg
  col.inactive_border = $color04 $color00 45deg
  col.nogroup_border = $color09 $color08 45deg
  col.nogroup_border_active = $color14 $color15 45deg

  snap {
    enabled = true
      window_gap = 10
      monitor_gap = 10
      border_overlap = false
      respect_gaps = true
  }
}

workspaces

  • normal workspaces

    workspaces.gif

    Figure 1: hyprpaper workspaces

    These workspaces are just standard workspaces, the way I set them is to have dedicated workspaces for each applications, such as web browsers, terminal emulators, etc.

    workspace = 1, name:terminal
    workspace = 2, name:code
    workspace = 3, name:web
    workspace = 4, name:mail
    workspace = 5, name:file
    workspace = 6, name:office
    workspace = 7, name:messaging
    workspace = 8, name:media
    workspace = 9, name:remote
    workspace = 10, name:games
    
  • special workspaces

    In other window managers, a special workspace is often called scratchpad. The difference is in Hyprland we can have up to 97 of them, each with different names. The way I use it is to have one special workspace for an application, usually one that needs to always run in the background, like a music player, calculator and other. What I like from Hyprland (though I'm sure other WM also have), is the ability to only start the application when the workspace is opened. See the keybindings section for the detail.

    workspace = special:music, on-created-empty:[tiled] $terminal --class ncmpcpp -e ncmpcpp
    workspace = special:khal, on-created-empty:[tiled] $terminal --class khal -e khal interactive
    workspace = special:proc, on-created-empty:[tiled] $terminal --class htop -e htop
    workspace = special:emacs, on-created-empty:[tiled] $terminal --class emacsclient -e $editor_term
    workspace = special:dired, on-created-empty:[tiled] $terminal --class emacsclient -e $editor_term -e '(dired (getenv "HOME"))'
    workspace = special:keys, on-created-empty:[float] showmethekey-gtk
    workspace = special:nvim, on-created-empty:$terminal --class vim -e nvim
    

keybindings

  • Application
    • builtin functions
      bind = $mainMod, F4, killactive,
      bind = Alt, F4, killactive,
      bind = $mainMod, P, pseudo, # dwindle
      bind = $mainMod, J, togglesplit, # dwindle
      
  • lock
    bind = $mainMod Alt, Q, exec, hyprlock
    
  • clipboard
    bind = $mainMod, C, exec, cliphist list | wofi -dmenu -p "Clipboard:" -theme "hyprland-clipboard" | cliphist decode | wl-copy
    
  • emoji
    bind = $mainMod, Comma, exec, wofi-emoji
    
  • symbol
    bind = $mainMod, Period, exec, wofi-symbol
    
  • pwvucontrol
    bind = $mainMod, V, exec, pwvucontrol
    
  • easyeffects
    bind = $mainMod Alt, V, exec, easyeffects
    
  • editor
    bind = $mainMod Alt, N, exec, $editor
    
  • pass
    bind = $mainMod Alt, P, exec, wofi-pass
    
  • calculator
    bind = $mainMod Alt, C, exec, wofi-calc
    
  • browser
    bind = $mainMod Alt, f, exec, $browser
    
  • tesseract
    bind = SuperShift,T,exec,grim -g "$(slurp -d -c D1E5F4BB -b 1B232866 -s 00000000)" "tmp.png" && tesseract -l eng "tmp.png" - | wl-copy && rm "tmp.png"
    
  • file manager
    bind = $mainMod, E, exec, $fileManager
    
  • terminal
    bind = $mainMod, Return, exec, $terminal
    bind = $mainMod Shift, Return, exec, $terminal -e tmux new -A -s main
    
  • wofi-power-menu
    bind = $mainMod, Q, exec, wofi-power-menu
    
  • menu
    bind = $mainMod, D, exec, $menu
    
  • window
    # Move focus with mainMod + arrow keys
    bind = $mainMod, left, movefocus, l
    bind = $mainMod, right, movefocus, r
    bind = $mainMod, up, movefocus, u
    bind = $mainMod, down, movefocus, d
    
    bind = $mainMod, h, movefocus, l
    bind = $mainMod, l, movefocus, r
    bind = $mainMod, k, movefocus, u
    bind = $mainMod, j, movefocus, d
    
    bind = $mainMod, F, fullscreen, 0
    bind = $mainMod Shift, F, fullscreen, 1
    bind = $mainMod Control, F, fullscreenstate, -1 -1
    bind = $mainMod, Space, togglefloating,
    
    # resize
    binde = $mainMod Control, H, resizeactive, -10 0
    binde = $mainMod Control, J, resizeactive, 0 10
    binde = $mainMod Control, K, resizeactive, 0 -10
    binde = $mainMod Control, L, resizeactive, 10 0
    
    binde = $mainMod Control, left, resizeactive, -10 0
    binde = $mainMod Control, down, resizeactive, 0 10
    binde = $mainMod Control, up, resizeactive, 0 -10
    binde = $mainMod Control, right, resizeactive, 10 0
    
    # move window
    bind = $mainMod Shift, H, movewindow, l
    bind = $mainMod Shift, J, movewindow, d
    bind = $mainMod Shift, K, movewindow, u
    bind = $mainMod Shift, L, movewindow, r
    
    # Window split ratio
    binde = Super, Minus, splitratio, -0.1
    binde = Super, Equal, splitratio, 0.1
    binde = Super, Semicolon, splitratio, -0.1
    binde = Super, Apostrophe, splitratio, 0.1
    
  • workspaces
    # Switch workspaces with mainMod + [0-9]
    bind = $mainMod, 1, workspace, 1
    bind = $mainMod, 1, exec, $w1
    bind = $mainMod, 2, workspace, 2
    bind = $mainMod, 2, exec, $w2
    bind = $mainMod, 3, workspace, 3
    bind = $mainMod, 3, exec, $w3
    bind = $mainMod, 4, workspace, 4
    bind = $mainMod, 4, exec, $w4
    bind = $mainMod, 5, workspace, 5
    bind = $mainMod, 5, exec, $w5
    bind = $mainMod, 6, workspace, 6
    bind = $mainMod, 6, exec, $w6
    bind = $mainMod, 7, workspace, 7
    bind = $mainMod, 7, exec, $w7
    bind = $mainMod, 8, workspace, 8
    bind = $mainMod, 8, exec, $w8
    bind = $mainMod, 9, workspace, 9
    bind = $mainMod, 9, exec, $w9
    bind = $mainMod, 0, workspace, 10
    bind = $mainMod, 0, exec, $w10
    bind = $mainMod, TAB, workspace, previous
    
    # Move active window to a workspace with mainMod + SHIFT + [0-9]
    bind = $mainMod SHIFT, 1, movetoworkspace, 1
    bind = $mainMod SHIFT, 2, movetoworkspace, 2
    bind = $mainMod SHIFT, 3, movetoworkspace, 3
    bind = $mainMod SHIFT, 4, movetoworkspace, 4
    bind = $mainMod SHIFT, 5, movetoworkspace, 5
    bind = $mainMod SHIFT, 6, movetoworkspace, 6
    bind = $mainMod SHIFT, 7, movetoworkspace, 7
    bind = $mainMod SHIFT, 8, movetoworkspace, 8
    bind = $mainMod SHIFT, 9, movetoworkspace, 9
    bind = $mainMod SHIFT, 0, movetoworkspace, 10
    bind = $mainMod SHIFT, TAB, movetoworkspace, previous
    
    • workspaces with mouse
      # Scroll through existing workspaces with mainMod + scroll
      bind = $mainMod, mouse_down, workspace, e+1
      bind = $mainMod, mouse_up, workspace, e-1
      
      # Move/resize windows with mainMod + LMB/RMB and dragging
      bindm = $mainMod, mouse:272, movewindow
      bindm = $mainMod, mouse:273, resizewindow
      
  • monitor
    bind = $mainMod Alt, H, focusmonitor, l
    bind = $mainMod Alt, J, focusmonitor, d
    bind = $mainMod Alt, K, focusmonitor, u
    bind = $mainMod Alt, L, focusmonitor, r
    
    bind = $mainMod Control, H, movecurrentworkspacetomonitor, l
    bind = $mainMod Control, J, movecurrentworkspacetomonitor, d
    bind = $mainMod Control, K, movecurrentworkspacetomonitor, u
    bind = $mainMod Control, L, movecurrentworkspacetomonitor, r
    
  • laptops
    # lid switch
    # trigger when the switch is toggled
    bindl=,switch:Lid Switch,exec,hyprlock
    # trigger when the switch is turning on
    #bindl=,switch:on:[switch name],exec,hyprctl keyword monitor ", 2560x1600, 0x0, 1"
    # trigger when the switch is turning off
    #bindl=,switch:off:[switch name],exec,hyprctl keyword monitor ", disable"
    
  • special workspaces
    • music
      bind = $mainMod, minus, togglespecialworkspace, music
      bind = $mainMod Alt, minus, togglespecialworkspace, music
      
  • groups
    bind = $mainMod, bracketleft, changegroupactive, b
    bind = $mainMod, bracketright, changegroupactive, f
    
    bind = $mainMod, T, togglegroup
    
    bind = $mainMod, G, submap, group
    submap = group
    bind = , T, togglegroup
    bind = $mainMod Control, F, changegroupactive, f
    bind = $mainMod Control, B, changegroupactive, b
    
    bind = $mainMod, bracketleft, changegroupactive, b
    bind = $mainMod, bracketright, changegroupactive, f
    # bind = $mainMod Alt, L, lockactivegroup
    bind = $mainMod, G, lockgroups, toggle
    bind = $mainMod Alt, G, lockactivegroup, toggle
    
    bind = $mainMod Shift, left, moveintogroup, l
    bind = $mainMod Shift, right, moveintogroup, r
    bind = $mainMod Shift, up, moveintogroup, u
    bind = $mainMod Shift, down, moveintogroup, d
    
    bind = $mainMod Shift, H, moveintogroup, l
    bind = $mainMod Shift, L, moveintogroup, r
    bind = $mainMod Shift, K, moveintogroup, u
    bind = $mainMod Shift, J, moveintogroup, d
    
    bind = $mainMod Control, left, moveoutofgroup, l
    bind = $mainMod Control, right, moveoutofgroup, r
    bind = $mainMod Control, up, moveoutofgroup, u
    bind = $mainMod Control, down, moveoutofgroup, d
    
    bind = $mainMod Control, H, moveoutofgroup, l
    bind = $mainMod Control, L, moveoutofgroup, r
    bind = $mainMod Control, K, moveoutofgroup, u
    bind = $mainMod Control, J, moveoutofgroup, d
    
    bind = $mainMod, left, movefocus, l
    bind = $mainMod, right, movefocus, r
    bind = $mainMod, up, movefocus, u
    bind = $mainMod, down, movefocus, d
    
    bind = $mainMod, H, movefocus, l
    bind = $mainMod, L, movefocus, r
    bind = $mainMod, K, movefocus, u
    bind = $mainMod, J, movefocus, d
    
    bind = , escape, submap, reset
    bind = Control, G, submap, reset
    submap = reset
    
    bind = $mainMod Control, F, changegroupactive, f
    bind = $mainMod Control, B, changegroupactive, b
    
  • multimedia keys
    # Laptop multimedia keys for volume and LCD brightness
    bindel = , XF86AudioRaiseVolume, exec, ~/.local/bin/dunst-volume -i 1
    bindel = , XF86AudioLowerVolume, exec, ~/.local/bin/dunst-volume -d 1
    bindel = , XF86AudioMute, exec, ~/.local/bin/dunst-volume -t
    bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
    
    binde = , XF86MonBrightnessUp, exec, ~/.local/bin/dunst-backlight +1%
    binde = , XF86MonBrightnessDown, exec, ~/.local/bin/dunst-backlight 1%-
    
    # Requires playerctl
    bindl = , XF86AudioNext, exec, playerctl next
    bindl = , XF86AudioPause, exec, playerctl play-pause
    bindl = , XF86AudioPlay, exec, playerctl play-pause
    bindl = , XF86AudioPrev, exec, playerctl previous
    
  • For keyboard with no multimedia keys
    bindel = $mainMod, F9, exec, ~/.local/bin/dunst-volume -i 1 # volume up
    bindel = $mainMod, F8, exec, ~/.local/bin/dunst-volume -d 1 # volume down
    bindel = $mainMod, F7, exec, ~/.local/bin/dunst-volume -t # volume toggle
    binde = $mainMod Shift, F3, exec, ~/.local/bin/dunst-backlight +1% # brightness increase
    binde = $mainMod Shift, F2, exec, ~/.local/bin/dunst-backlight 1%- # brightness decrease
    binde = $mainMod Control, Up, exec, playerctl play-pause
    bindel = $mainMod, F11, exec, playerctl play-pause
    bind = $mainMod Control, Down, exec, playerctl stop
    bindel = $mainMod Control, Right, exec, playerctl next
    bindel = $mainMod, F12, exec, playerctl next
    bindel = $mainMod Control, Left, exec, playerctl previous
    bindel = $mainMod, F10, exec, playerctl previous
    
  • Screenshot

    All the screenshot functionalities provided by grimshot and will save the output to a file but also save it into the copy ring.

    bind = , Print, exec, grimshot --notify savecopy area "$(echo ~/Pictures/Screenshots/Screenshot1-$(date +'%Y%m%d_%H%M%S').png)"
    bind = Control, Print, exec, grimshot --notify savecopy area "$(echo ~/Pictures/Screenshots/Screenshot1-$(date +'%Y%m%d_%H%M%S').png)"
    bind = Alt, Print, exec, grimshot --notify savecopy window "$(echo ~/Pictures/Screenshots/Screenshot1-$(date +'%Y%m%d_%H%M%S').png)"
    bind = $mainMod Shift, S, exec, grimshot --notify savecopy area "$(echo ~/Pictures/Screenshots/Screenshot1-$(date +'%Y%m%d_%H%M%S').png)"
    
    • screen-record

      Pressing the keybinding once will record, pressing once again will stop. The saved .gif will be under the ~/Videos directory.

      bind = $mainMod, Print, exec, ~/.local/bin/screen-record
      
  • dunst
    bind = $mainMod Alt, grave, exec, dunstctl history-pop
    bind = $mainMod SHIFT, grave, exec, dunstctl context
    bind = $mainMod, grave, exec, dunstctl action
    bind = $mainMod Control, grave, exec, dunstctl close
    
  • builtin zoom

    With mouse

    bind = $mainMod Control, mouse_down, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '.float * 1.1')
    bind = $mainMod Control, mouse_up, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '(.float * 0.9) | if . < 1 then 1 else . end')
    

    With keyboard

    binde = $mainMod Control, equal, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '.float * 1.1')
    binde = $mainMod Control, minus, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '(.float * 0.9) | if . < 1 then 1 else . end')
    binde = $mainMod Control, KP_ADD, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '.float * 1.1')
    binde = $mainMod Control, KP_SUBTRACT, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '(.float * 0.9) | if . < 1 then 1 else . end')
    
  • set opacity
    binde = $mainMod, F2, exec, ~/.local/bin/hypr-set-opacicty --decrease
    binde = $mainMod, F3, exec, ~/.local/bin/hypr-set-opacicty --increase
    

decorations

decoration {
  rounding = 5 
  rounding_power = 2.0
  active_opacity = 0.95
  inactive_opacity = 0.85
  fullscreen_opacity = 1.0
  dim_modal = true
  dim_inactive = true
  dim_strength = 0.4
  dim_special = 0.3
  dim_around = 0.4
  border_part_of_window = true

  blur {
    enabled = true
      size = 8
      passes = 1
      ignore_opacity = true
      new_optimizations = true
      xray = false
      noise = 0.0117
      contrast = 0.8916
      brightness = 0.8172
      vibrancy = 0.1696
      vibrancy_darkness = 0.0
      special = false
      popups = false
      popups_ignorealpha = 0.2
      input_methods = false
      input_methods_ignorealpha = 0.2
  }

  shadow {
    enabled = true
      range = 4 
      render_power = 3
      sharp = false
      ignore_window = true
      color = 0xee1a1a1a
      offset = 0.0 0.0
      scale = 1.0
  }
}

animation

animations {
  enabled = true
  workspace_wraparound = false

  bezier = linear, 0, 0, 1, 1
  bezier = md3_standard, 0.2, 0, 0, 1
  bezier = md3_decel, 0.05, 0.7, 0.1, 1
  bezier = md3_accel, 0.3, 0, 0.8, 0.15
  bezier = overshot, 0.05, 0.9, 0.1, 1.1
  bezier = crazyshot, 0.1, 1.5, 0.76, 0.92
  bezier = hyprnostretch, 0.05, 0.9, 0.1, 1.0
  bezier = menu_decel, 0.1, 1, 0, 1
  bezier = menu_accel, 0.38, 0.04, 1, 0.07
  bezier = easeInOutCirc, 0.85, 0, 0.15, 1
  bezier = easeOutCirc, 0, 0.55, 0.45, 1
  bezier = easeOutExpo, 0.16, 1, 0.3, 1
  bezier = softAcDecel, 0.26, 0.26, 0.15, 1
  bezier = md2, 0.4, 0, 0.2, 1 # use with .2s duration
  bezier = easeInCirc, 0.55, 0, 1, 0.45

  animation = windows, 1, 3, md3_decel, popin 60%
  animation = windowsIn, 1, 3, md3_decel, popin 60%
  animation = windowsOut, 1, 3, md3_accel, popin 60%
  animation = border, 1, 10, default
  animation = fade, 1, 3, md3_decel

  animation = layersIn, 1, 3, menu_decel, slide
  animation = layersOut, 1, 1.6, menu_accel
  animation = fadeLayersIn, 1, 2, menu_decel
  animation = fadeLayersOut, 1, 4.5, menu_accel
  animation = workspaces, 1, 8, menu_decel, slidefade

  animation = specialWorkspace, 1, 5, md3_decel, slidefadevert
}

autostart

exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP QT_QPA_PLATFORMTHEME SSH_AUTH_SOCK
exec-once = dbus-update-activation-environment --systemd --all &
exec-once = /usr/lib/polkit-kde-authentication-agent-1 &
#exec-once = gnome-keyring-daemon --components=pkcs11,secrets,ssh -r -d &
exec-once = dunst -conf ~/.config/dunst/dunstrc &
exec-once = pgrep hypridle || hypridle
exec-once = waybar &
exec-once = hyprpaper &
exec-once = wl-paste --type text --watch cliphist store &
exec-once = wl-paste --type image --watch cliphist store &
exec-once = hyprctl setcursor Bibata-Modern-Classic 24
exec-once = hyprpm reload
exec-once = hyprshade auto &
exec-once = hypridle
exec-once = nm-applet --indicator
exec-once = /usr/bin/kdeconnectd
exec-once = kdeconnect-indicator
exec-once = ~/.local/bin/toggleLeds
exec-once = hyprctl dispatch togglespecialworkspace music
exec-once = sleep 1 && hyprctl dispatch togglespecialworkspace music
#exec-once = $terminal --class ncmpcpp -e ncmpcpp; hyprctl dispatch togglespecialworkspace, music

input

input {
  kb_layout = us
  numlock_by_default = true
}

devices

This fixes my USB keyboard back light button which by default mapped to Scroll Lock. I don't find other uses for the key so it's only mapped when the specific device connected.

On X11 this can simply achieved using xset leds named "Scroll Lock" for turning on and xset -leds named "Scroll Lock" for turning off.

The device name can be found using hyprctl devices under the Keyboards:. Or using lsusb.

device {
  name = casue-usb-kb
  kb_options = scrolllock:mod3
  numlock_by_default = true
}

groups

group {
  insert_after_current = true
  focus_removed_window = true
  col.border_active = $color10 $color09 45deg
  col.border_inactive = $color03 $color02 45deg
  col.border_locked_active = $color11 $color12 45deg
  col.border_locked_inactive = $color12 $color11 45deg
  drag_into_group = 2
  groupbar {
    enabled = true
    font_family = "JetBrainsMonoNL Nerd Font Mono 8"
    font_size = 8
    gradients = true
    height = 12
    priority = 3
    render_titles = true
    scrolling = true
      rounding = 1
      rounding_power = 2.0
      gradient_rounding = 2
    text_color = $color06
    col.active = $color10
    col.inactive = $color02 $color03 45deg
    col.locked_active = $color14 $color11 45deg
    col.locked_inactive = $color14 $color12 45deg
  }
}

misc

misc {
  # See https://wiki.hyprland.org/Configuring/Variables/ for more
  vfr = 1
  vrr = 3
  focus_on_activate = false
  animate_manual_resizes = true
  animate_mouse_windowdragging = false
  enable_swallow = false
  swallow_regex = (foot|kitty|allacritty|Alacritty)
  force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers
  disable_hyprland_logo = true
  disable_splash_rendering = false
  mouse_move_enables_dpms = true
  key_press_enables_dpms = true
  mouse_move_focuses_monitor = true
  new_window_takes_over_fullscreen = 2
  allow_session_lock_restore = true
  initial_workspace_tracking = false
}

binds

binds {
  workspace_back_and_forth = false
  allow_workspace_cycles = true
  scroll_event_delay = 0
}

xwayland

xwayland {
  enabled = true
}

ecosystem

ecosystem {
  no_update_news = true
  no_donation_nag = true
}

cursor

cursor {
  inactive_timeout = 2
  hide_on_key_press = true
}

dwindle

dwindle {
  # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
  pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
  preserve_split = true # you probably want this
  smart_split = false
  smart_resizing = false
}

master

master {
  # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
}

gestures

gestures {
  # See https://wiki.hyprland.org/Configuring/Variables/ for more
  #workspace_swipe = true
  workspace_swipe_distance = 700
  #workspace_swipe_fingers = 3
  workspace_swipe_cancel_ratio = 0.2
  workspace_swipe_min_speed_to_force = 5
  workspace_swipe_direction_lock = true
  workspace_swipe_direction_lock_threshold = 10
  workspace_swipe_create_new = true
}

windowrule

  • For all windows
    windowrule = noblur,class:.*
    windowrulev2 = suppressevent maximize, class:.* # You'll probably like this.
    windowrulev2 = opacity 0.99, class:.*
    
  • pavucontrol
    windowrulev2 = float,class:^(pavucontrol)$
    windowrulev2 = size 50%,class:^(pavucontrol)$
    
  • pwvucontrol
    windowrulev2 = float,class:^(com.saivert.pwvucontrol)$
    windowrulev2 = size 50%,class:^(com.saivert.pwvucontrol)$
    
  • polkit-kde-agent
    windowrulev2 = float,class:(org.kde.polkit-kde-authentication-agent-1)
    windowrulev2 = center,class:(org.kde.polkit-kde-authentication-agent-1)
    
  • blueman
    windowrulev2 = float,class:(blueman)
    windowrulev2 = center,class:(blueman)
    windowrulev2 = size 50%,class:(blueman)
    
  • thunderbird
    windowrulev2 = float,class:(thunderbird),title:(status)
    windowrulev2 = float,class:(thunderbird),title:(.*)(Reminders)
    windowrulev2 = float,class:(thunderbird),title:(Write:.*)
    windowrulev2 = float,class:(thunderbird),title:(Send.*)
    windowrulev2 = float,class:(thunderbird),title:(Inbox.*)
    windowrulev2 = float,class:(Msgcompose.*)
    windowrulev2 = float, class:(thunderbird),title(.*)(Reminders)$
    windowrulev2 = workspace 4, class:(thunderbird)
    
  • firefox
    windowrulev2 = idleinhibit always, class:firefox title:(.*)(- YouTube)
    windowrulev2 = opacity 1, class:firefox title:(.*)(- YouTube)
    
  • Qtpass
    windowrulev2 = float,class:(QtPass)
    
  • zoom
    windowrulev2 = float,class:(zoom)
    windowrulev2 = opacity 1, class:(zoom)
    windowrulev2 = workspace 10, class:(zoom)
    windowrulev2 = opacity 1, class:(zoom), title:(Settings)
    windowrulev2 = opacity 1, class:(zoom), title:(Zoom Meeting)
    
  • file-roller
    windowrulev2 = float, class:(file-roller)
    windowrulev2 = float, class:(org.gnome.FileRoller)
    windowrulev2 = float, title:(Compress)
    
  • ncmpcpp
    windowrulev2 = float,class:(ncmpcpp)
    windowrulev2 = center,class:(ncmpcpp)
    windowrulev2 = size 50%,class:(ncmpcpp)
    windowrulev2 = workspace special:music,class:(ncmpcpp)
    
  • khal
    windowrulev2 = float, class:(khal)
    windowrulev2 = size 40%, class:(khal)
    windowrulev2 = move onscreen cursor 50% 5%, class:(khal)
    
  • astroid
    windowrulev2 = workspace 4, class:(astroid)
    windowrulev2 = maximize, class:(astroid)
    
  • vlc
    windowrulev2 = workspace 7,class:(vlc)
    windowrulev2 = opacity 1,class:(vlc)
    windowrulev2 = idleinhibit always,class:(vlc)
    
  • remmina
    windowrulev2 = float, workspace 8, class:(org.remmina.Remmina)
    
  • libvirt / virt-manager
    windowrulev2 = float, workspace 9, class:(virt-manager), initialTitle:(QEMU/KVM - Connection Details)
    windowrulev2 = float, workspace 9, class:(virt-manager), initialTitle:(.*on QEMU/KVM)
    
  • transmission
    windowrulev2 = workspace 8,class:^(com.transmissionbt.transmission).*
    windowrulev2 = float,title:(Torrent.*)
    
  • dialogs
    windowrule=float,title:^(Open File)(.*)$
    windowrule=float,title:^(Select a File)(.*)$
    windowrule=float,title:^(Choose wallpaper)(.*)$
    windowrule=float,title:^(Open Folder)(.*)$
    windowrule=float,title:^(Save As)(.*)$
    windowrule=float,title:^(Library)(.*)$
    windowrule=float,title:^(File Upload)(.*)$
    
  • thunar
    windowrule = center, title:^(Open File)(.*)$
    windowrule = center, title:^(Rename.*)(.*)$
    windowrule = center, title:^(Select a File)(.*)$
    windowrule = center, title:^(Choose wallpaper)(.*)$
    windowrule = center, title:^(Open Folder)(.*)$
    windowrule = center, title:^(Save As)(.*)$
    windowrule = center, title:^(Library)(.*)$
    windowrule = center, title:^(File Upload)(.*)$
    windowrulev2 = float, title:(Rename.*)
    windowrulev2 = float, title:(File Operation Progress)
    windowrulev2 = float, class:(thunar),title:(Confirm to replace files)
    
  • no tearing
    windowrulev2 = noshadow,floating:0
    
  • htop
    windowrulev2 = float, class:(htop)
    windowrulev2 = size 100% 40%, class:(htop)
    windowrulev2 = move 0 40, class:(htop)
    
  • nmtui
    windowrulev2 = float, class:(nmtui)
    
  • vim
    windowrulev2 = float, class:(vim)
    windowrulev2 = maximize, class:(vim)
    
  • Emacs (in terminal mode)
    windowrulev2 = maximize, class:(nw-emacs)
    
  • showmethekey
    windowrulev2 = float, class:(one.alynx.showmethekey), title:(Show Me The Key)
    windowrulev2 = nofocus, class:(showmethekey-gtk), title:(Floating Window - Show Me The Key)
    windowrulev2 = opacity 0.4, class:(showmethekey-gtk), title:(Floating Window - Show Me The Key)
    windowrulev2 = center, class:(showmethekey-gtk), title:(Floating Window - Show Me The Key)
    windowrulev2 = float, class:(showmethekey-gtk), title:(Floating Window - Show Me The Key)
    windowrulev2 = pin, class:(showmethekey-gtk), title:(Floating Window - Show Me The Key)
    windowrulev2 = size 100% 10%, class:(showmethekey-gtk), title:(Floating Window - Show Me The Key)
    windowrulev2 = move 0 90%, class:(showmethekey-gtk), title:(Floating Window - Show Me The Key)
    
  • screenkey
    windowrulev2 = float, class:(screenkey)
    
  • steam
    windowrulev2 = opacity 1, class:(steam) initialTitle:(.*)
    windowrulev2 = float, class:(steam) initialTitle:(.*)
    windowrule=immediate,class:.*\.exe
    windowrulev2=immediate,class:(steam_app)
    
  • easyeffect
    windowrulev2 = float, title:(Easy Effects)
    windowrulev2 = size 100% 60%, title:(Easy Effects)
    

Layer

layerrule = xray 1, .*
# layerrule = noanim, .*
layerrule = noanim, walker
layerrule = noanim, selection
layerrule = noanim, overview
layerrule = noanim, anyrun
layerrule = noanim, indicator.*
layerrule = noanim, osk
layerrule = noanim, hyprpicker
layerrule = blur, shell:*
layerrule = ignorealpha 0.6, shell:*

layerrule = noanim, noanim
layerrule = blur, gtk-layer-shell
layerrule = ignorezero, gtk-layer-shell
layerrule = blur, launcher
layerrule = ignorealpha 0.5, launcher
layerrule = blur, notifications
layerrule = ignorealpha 0.69, notifications

layerrule = animation slide top, sideleft.*
layerrule = animation slide top, sideright.*
layerrule = blur, session

layerrule = blur, bar
layerrule = ignorealpha 0.6, bar
layerrule = blur, corner.*
layerrule = ignorealpha 0.6, corner.*
layerrule = blur, dock
layerrule = ignorealpha 0.6, dock
layerrule = blur, indicator.*
layerrule = ignorealpha 0.6, indicator.*
layerrule = blur, overview
layerrule = ignorealpha 0.6, overview
layerrule = blur, cheatsheet
layerrule = ignorealpha 0.6, cheatsheet
layerrule = blur, sideright
layerrule = ignorealpha 0.6, sideright
layerrule = blur, sideleft
layerrule = ignorealpha 0.6, sideleft
layerrule = blur, indicator*
layerrule = ignorealpha 0.6, indicator*
layerrule = blur, osk
layerrule = ignorealpha 0.6, osk

hyprpaper

preload = ~/.local/share/wallpapers/nord/Minimal-Nord.png
preload = ~/.local/share/wallpapers/nord/linux-friends-4k.png
preload = ~/.local/share/wallpapers/nord/nord_buildings.png
preload = ~/.local/share/wallpapers/nord/keyboard.png
preload = ~/.local/share/wallpapers/nord/nord_mountains.png
preload = ~/.local/share/wallpapers/nord/wild.png
preload = ~/.local/share/wallpapers/nord/nord_lake.png
preload = ~/.local/share/wallpapers/nord/nord_space.png
preload = ~/.local/share/wallpapers/nord/nord_alone_tree.png
preload = ~/.local/share/wallpapers/nord/nord_valley.png
splash = false

# wallpaper = eDP1,~/.local/share/wallpapers/nord/ign-hevlettpackard.png
#wallpaper = DP-1,~/.local/share/wallpapers/nord/ign-hevlettpackard.png
#wallpaper = DP-2,~/.local/share/wallpapers/nord/ign-hevlettpackard.png
#wallpaper = DP-3,~/.local/share/wallpapers/nord/ign-hevlettpackard.png
#wallpaper = DP-4,~/.local/share/wallpapers/nord/ign-hevlettpackard.png
#wallpaper = DP-5,~/.local/share/wallpapers/nord/ign-hevlettpackard.png
#wallpaper = HDMI-A-1,~/.local/share/wallpapers/nord/ign_duaAnime.png
wallpaper = ,~/.local/share/wallpapers/nord/Minimal-Nord.png

hyprshade

[[shades]]
name = "vibrance"
default = true  # shader to use during times when there is no other shader scheduled

[[shades]]
name = "blue-light-filter"
start_time = 19:00:00
end_time = 06:00:00   # optional if you have more than one shade with start_time

hyprlock

# -*- eval: (rainbow-mode 1) -*-

$text_color = rgba(D8DEE9FF)
$entry_background_color = rgba(2E344011)
$entry_border_color = rgba(3B3B3B55)
$entry_color = rgba(FFFFFFFF)
$font_family = Rubik Light
$font_family_clock = Rubik Light
$font_material_symbols = Material Symbols Rounded

background {
  monitor =
  #path = /home/mkncorp.com/kristian.alexander/.local/share/wallpapers/nord/linux-friends-4k.png   # only png supported for now
  path = screenshot
  color = rgba(000000FF)
  # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
  blur_passes = 1 # 0 disables blurring
  blur_size = 3
  noise = 0.0117
  contrast = 0.8916
  brightness = 0.8172
  vibrancy = 0.1696
  vibrancy_darkness = 0.0
}

label { # Greeting
  monitor =
  text = <span foreground='##D8DEE9'>Hi there,</span><span foreground='##8FBCBB'> <i>$DESC</i></span>
  color = rgba(BF616AFF)
  check_color = rgba(EBCB8BFF)
  fail_color = rgba(BF616AFF) # if authentication failed, changes outer_color and fail message color
  fail_text = <span foreground='##D8DEE9'><i>$FAIL <b>($ATTEMPTS)</b></i></span> # can be set to empty
  fail_timeout = 2000 # milliseconds before fail_text and fail_color disappears
  fail_transition = 300 # transition time in ms between normal outer_color and fail_color
  shadow_passes = 1
  shadow_boost = 0.5
  color = $text_color
  font_size = 20
  font_family = $font_family

  position = 0, 240
  halign = center
  valign = center
}

label { # lock icon
  monitor =
  text = lock
  shadow_passes = 1
  shadow_boost = 0.5
  color = $text_color
  font_size = 21
  font_family = $font_material_symbols

  position = 0, 65
  halign = center
  valign = bottom
}

label { # Clock
  monitor =
  text = $TIME
  shadow_passes = 1
  shadow_boost = 0.5
  color = $text_color
  font_size = 65
  font_family = $font_family_clock

  position = 0, 300
  halign = center
  valign = center
}

input-field {
  monitor =
  size = 250, 50
  outline_thickness = 2
  dots_size = 0.1
  dots_spacing = 0.3
  outer_color = $entry_border_color
  inner_color = $entry_background_color
  font_color = $entry_color
  # fade_on_empty = true

  position = 0, 20
  halign = center
  valign = center
}

hypridle

general {
  lock_cmd = pidof hyprlock || hyprlock       # avoid starting multiple hyprlock instances.
  before_sleep_cmd = loginctl lock-session    # lock before suspend.
  # after_sleep_cmd = hyprctl dispatch dpms on  # to avoid having to press a key twice to turn on the display.
}

listener {
  timeout = 180
  on-timeout = loginctl lock-session            # lock screen when timeout has passed
}

listener {
  timeout = 240
  on-timeout = hyprctl dispatch dpms off
  on-resume = hyprctl dispatch dpms on
}

listener {
  timeout = 540
  on-timeout = pidof steam || systemctl suspend || loginctl suspend
}

screen-record

A simple shell script wrapping wf-recorder.

pgrep -x "wf-recorder" && pkill -INT -x wf-recorder && notify-send -h string:wf-recorder:record -t 1000 "Finished Recording" && exit 0

notify-send -h string:wf-recorder:record -t 1000 "Recording in:" "<span color='#90a4f4' font='26px'><i><b>3</b></i></span>"

sleep 1

notify-send -h string:wf-recorder:record -t 1000 "Recording in:" "<span color='#90a4f4' font='26px'><i><b>2</b></i></span>"

sleep 1

notify-send -h string:wf-recorder:record -t 950 "Recording in:" "<span color='#90a4f4' font='26px'><i><b>1</b></i></span>"

sleep 1

dateTime=$(date +%m-%d-%Y-%H:%M:%S)
wf-recorder -F fps=30 -c gif -f $HOME/Videos/screen-record-$dateTime.gif

set-opacity

#!/use/bin/env bash
set -x

MEMORY_FILE="/tmp/hypr_alpha_memory.json"
OPACITY_STEP=0.05
MIN_OPACITY=0.1
MAX_OPACITY=1.0
DEFAULT_ALPHA=1.0

touch $MEMORY_FILE
[[ ! -s $MEMORY_FILE ]] && echo "{}" > "$MEMORY_FILE"

ADDR=$(hyprctl activewindow -j | jq -r '.address')

DIRECTION="$1"
[[ -z "$ADDR" || "$ADDR" == "null" ]] && exit 1

[[ -z "$ADDR" || "$ADDR" == "null" ]] && exit 1

CURRENT_ALPHA=$(cat "$MEMORY_FILE" | jq -r --arg addr "$ADDR" '.[$addr] // 1.0')
case "$DIRECTION" in
    --increase)
        NEW_ALPHA=$(echo "$CURRENT_ALPHA + $OPACITY_STEP" | bc)
        (( $(echo "$NEW_ALPHA > $MAX_OPACITY" | bc -l) )) && NEW_ALPHA=$MAX_OPACITY
        ;;
    --decrease)
        NEW_ALPHA=$(echo "$CURRENT_ALPHA - $OPACITY_STEP" | bc)
        (( $(echo "$NEW_ALPHA < $MIN_OPACITY" | bc -l) )) && NEW_ALPHA=$MIN_OPACITY
        ;;
    --reset)
        NEW_ALPHA=$DEFAULT_ALPHA
        ;;
    *)
        exit 1
        ;;
esac

for PROP in alpha alphainactive alphafullscreen alphaoverride; do
    hyprctl dispatch setprop "address:$ADDR" "$PROP" "$NEW_ALPHA"
done

TMP=$(mktemp)
cat "$MEMORY_FILE" | jq --arg addr "$ADDR" --argjson val "$NEW_ALPHA" '. + {($addr): $val}' > "$TMP" && mv "$TMP" "$MEMORY_FILE"

Date: 2024-03-23 Sat 00:00

Author: Kristian Alexander P

Created: 2025-09-17 Wed 15:28