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 files

source = ./hypr.d/monitors.conf
source = ./hypr.d/variables.conf
source = ./hypr.d/autostart.conf
source = ./hypr.d/input.conf
source = ./hypr.d/general.conf
source = ./hypr.d/groups.conf
source = ./hypr.d/decoration.conf
source = ./hypr.d/animations.conf
source = ./hypr.d/dwindle.conf
source = ./hypr.d/master.conf
source = ./hypr.d/gestures.conf
source = ./hypr.d/binds.conf
source = ./hypr.d/misc.conf
source = ./hypr.d/devices.conf
source = ./hypr.d/windowrule.conf
source = ./hypr.d/workspaces.conf
source = ./hypr.d/keybindings.conf
source = ./hypr.d/xwayland.conf

I split the configuration file into sections, based on the section from the configuration variables.

~/.config/hypr/hypr.d/monitors.conf

# See https://wiki.hyprland.org/Configuring/Monitors/
monitor=,highrr,auto,1
# monitor=,1920x1080@60,auto,1
monitor=DP-1,preferred,auto,1
monitor=DP-2,preferred,auto,1
monitor=DP-3,preferred,auto,1
monitor=DP-4,preferred,auto,1
monitor=DP-5,preferred,auto,1

# laptop
monitor = HDMI-A-1, preferred, auto, 1

# specific monitors
# Samsung
monitor = desc:Samsung Electric Company SMS19A100 HMAC900747, preferred, auto, 1

These are the monitors I used across all my machines.

~/.config/hypr/hypr.d/autostart.conf

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 = dbus-launch --sh-syntax --exit-with-session 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 = thunar --daemon &
exec-once = hypridle
exec-once = emacs --daemon &
exec-once = blueman-applet &
exec-once = blueman-tray &
exec-once = nm-applet --indicator
exec-once = /usr/bin/kdeconnectd
exec-once = kdeconnect-indicator
exec-once = udiskie -t
exec-once = ~/.local/bin/toggleLeds
# exec-once = ~/.local/bin/conky-start &
exec-once = $terminal --class ncmpcpp -e ncmpcpp

Required packages(archlinux):

  • blueman
  • network-manager-applet
  • polkit-kde-agent
  • gnome-keyring
  • udiskie
  • dunst
  • kdeconnect
  • hyprpaper
  • wl-clipboard
  • bibata-cursor-theme
  • hyprshade
  • thunar
  • hypridle

~/.local/bin/toggleLeds is just a script for calling another python scripts (see here for the actual script) for toggling my keyboard leds. I use another bash script since I don't want to hardcode the input device location here.

#!/usr/bin/env bash

if ! $(pgrep ledToggler.py) &>/dev/null; then
    setsid ledToggler.py /dev/input/event4 scrolllock scrolllock 1 1
fi

This is a very hacky solution, and it messes up my scrolling in Emacs. Should be removed when the leds handling is better in wayland, or buy better keyboard. And my keyboard description:

Bus 001 Device 003: ID 2a7a:9597 CASUE USB KB

Additional GTK Settings

exec-once = gsettings set org.gnome.desktop.interface font-name "JetBrainsMonoNL Nerd Font Mono 8"
exec-once = gsettings set org.gnome.desktop.interface cursor-theme Bibata-Modern-Classic
exec-once = gsettings set org.gnome.desktop.interface cursor-size 24
exec-once = gsettings set org.gnome.desktop.interface gtk-theme Breeze
exec-once = gsettings set org.gnome.desktop.interface gtk-key-theme Emacs
exec-once = gsettings set org.gnome.desktop.interface icon-theme Papirus
exec-once = gsettings set org.gnome.desktop.interface color-scheme \'prefer-dark\'
exec-once = gsettings set org.gnome.desktop.interface text-scaling-factor 0.9
exec-once = gsettings set org.gnome.desktop.sound theme-name freedesktop
exec-once = gsettings set org.gnome.desktop.sound input-feedback-sounds true
exec-once = gsettings set org.gnome.desktop.sound allow-volume-above-100-percent true

Required packages(archlinux):

  • nerd-fonts
  • breeze, breeze-gtk and breeze-icons
  • Emacs
  • sound-theme-freedesktop

~/.config/hypr/hypr.d/variables.conf

Applications

$terminal = alacritty --config-file ~/.config/alacritty/alacritty-hyprland.toml
$fileManager = thunar
$menu = rofi -show drun -theme hyprland-menu
$editor = emacsclient -c -a emacs
$editor_term = emacsclient -t -a ""
$mail = thunderbird
$browser = firefox

Environment Variables

env = QT_QPA_PLATFORM,wayland
env = QT_QPA_PLATFORMTHEME,qt5ct # change to qt6ct if you have that
env = QT_AUTO_SCREEN_SCALE_FACTOR,1
env = QT_QPA_PLATFORMTHEME, qt5ct
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

Wallpapers

This will set the wallpaper for each workspaces. The one I used is stored at my gitlab repository.

$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"

~/.config/hypr/hypr.d/input.conf

input {
  kb_layout = us
  kb_variant =
  kb_model =
  kb_options =
  kb_rules =

  numlock_by_default = false

  repeat_rate = 35
  repeat_delay = 250

  follow_mouse = 1

  touchpad {
    natural_scroll = true
    disable_while_typing = true
    tap-to-click = true
    scroll_factor = 0.5
  }

  sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
  special_fallthrough = true
}

~/.config/hypr/hypr.d/general.conf

general {
  # See https://wiki.hyprland.org/Configuring/Variables/ for more

  gaps_in = 4
  gaps_out = 5
  gaps_workspaces = 50
  border_size = 1
  col.active_border = rgb(268bd2)
  col.inactive_border = rgb(6c7c80)
  #col.nogroup_border=0xff89dceb
  #col.nogroup_border_active=0xfff9e2af

  resize_on_border = true
  no_focus_fallback = true
  layout = dwindle

  # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
  allow_tearing = true
  snap {
    enabled = true
    window_gap = 5
    monitor_gap = 30
    #respect_gaps = true
  }
}

~/.config/hypr/hypr.d/decoration.conf

decoration {
    # See https://wiki.hyprland.org/Configuring/Variables/ for more

    rounding = 20
    active_opacity = 0.9
    inactive_opacity = 0.25
    fullscreen_opacity = 1

    blur {
      enabled = true
      xray = true
      special = false
      new_optimizations = true
      size = 14
      passes = 4
      brightness = 1
      noise = 0.01
      contrast = 1
      popups = true
      popups_ignorealpha = 0.6
    }

    shadow {
        enabled = true
        ignore_window = true
        render_power = 4
        range = 20
        offset = 0 2
        color = rgba(0000002A)
    }

    dim_inactive = true
    dim_strength = 0.1
    dim_special = 0
}

~/.config/hypr/hypr.d/animations.conf

animations {
  enabled = true
  workspace_wraparound = true

  # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more

  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

  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, 7, menu_decel, slide

  animation = specialWorkspace, 1, 3, md3_decel, slidevert
}

~/.config/hypr/hypr.d/dwindle.conf

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
}

~/.config/hypr/hypr.d/master.conf

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

~/.config/hypr/hypr.d/gestures.conf

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
}

~/.config/hypr/hypr.d/groups.conf

group {
  insert_after_current = true
  focus_removed_window = true
  col.border_active = rgb(268bd2)
  col.border_inactive = rgb(6c7c80)
  col.border_locked_active = rgb(d33682)
  col.border_locked_inactive = rgb(b58900)
  drag_into_group = 2
  groupbar {
    enabled = true
    font_family = "JetBrainsMonoNL Nerd Font Mono 8"
    font_size = 8
    gradients = true
    height = 14
    priority = 3
    render_titles = true
    scrolling = true
    text_color = rgb(fdf6e3)
    col.active = rgb(268bd2)
    col.inactive = rgb(6c7c80)
    col.locked_active = rgb(dc322f)
    col.locked_inactive = rgb(073642)
  }
}

~/.config/hypr/hypr.d/binds.conf

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

~/.config/hypr/hypr.d/misc.conf

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
}

~/.config/hypr/hypr.d/devices.conf

device {
  name = epic-mouse-v1
  sensitivity = -0.5
}

~/.config/hypr/hypr.d/windowrule.conf

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 9,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)
  • Mount & Blade Warband
    windowrulev2 = opacity 1, class:(mb_warband_linux) initialTitle:(mb_warband_linux)
    

conky

# windowrulev2 = noinitialfocus, class:(Conky)
windowrulev2 = nofocus, class:(Conky)
windowrulev2 = pseudo, class:(Conky)
windowrulev2 = pin, class:(Conky)
# windowrulev2 = suppressevent activate activatefocus, class:(Conky)
windowrulev2 = opacity 1 override 0.5, class:(Conky)

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

~/.config/hypr/hypr.d/workspaces.conf

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:message
workspace = 5, name:file
workspace = 6, name:office
workspace = 7, name:fun
workspace = 8, name:remote
workspace = 9, name:torrent
workspace = 10, name:zoom

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.

Also to conserve resource, I tend to only have terminal based application in these workspaces.

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:mail, on-created-empty:[tiled] thunderbird
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

~/.config/hypr/hypr.d/keybindings.conf

Set the mainMod variable

Super, (or WIN) key, is a more common mod key for window manager anyway.

# See https://wiki.hyprland.org/Configuring/Keywords/ for more
$mainMod = SUPER

Apps keybindings

# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
bind = $mainMod, Return, exec, $terminal
bind = $mainMod, E, exec, $fileManager
bind = $mainMod, F4, exec, hyprctl kill
bind = ALT, F4, killactive,
bind = $mainMod, Q, exec, ~/.local/bin/rofi-logout hyprland-logout
bind = $mainMod Alt, Q, exec, hyprlock
bind = $mainMod, D, exec, $menu
bind = $mainMod, C, exec, cliphist list | rofi -dmenu -p "Clipboard:" -theme "hyprland-clipboard" | cliphist decode | wl-copy
bind = $mainMod, Comma, exec, rofi -theme hyprland-emoji -show emoji
bind = $mainMod Shift, V, exec, pwvucontrol
bind = $mainMod Alt, V, exec, easyeffects
#bind = $mainMod Alt, B, exec, blueman-manager

bind = $mainMod Alt, M, exec, [workspace special:music; silent; tiled] alacritty --class ncmpcpp -e ncmpcpp
# bind = $mainMod Alt, H, exec, alacritty --class htop -e htop
# bind = $mainMod Alt, W, exec, [float] alacritty --class nmtui -e nmtui
# bind = $mainMod Alt, K, exec, alacritty --class khal -e khal interactive
# bind = $mainMod Alt, V, exec, alacritty --class vim -e vim
# bind = $mainMod Shift Alt, N, exec, alacritty --class nw-emacs -e emacsclient -t -a emacs
# bind = $mainMod Alt, E, exec, emacsclient -c -a emacs -e '(dired (getenv "HOME"))'
bind = $mainMod Alt, N, exec, $editor
bind = $mainMod Alt, T, exec, $mail
bind = $mainMod Alt, P, exec, rofi-pass
bind = $mainMod Alt, C, exec, rofi -show calc -modi calc -no-show-match -no-sort
bind = $mainMod Shift, P, exec, rofi-rbw
bind = $mainMod Alt, f, exec, $browser
bind = $mainMod Alt, S, exec, [workspace 10; silent; float] showmethekey-gtk
bind = $mainMod Alt, A, exec, hyprshade toggle

# 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"

# restart waybar
bind = $mainMod Shift, R, exec, killall waybar && waybar &

window

bind = $mainMod, F, fullscreen, 0
bind = $mainMod Shift, F, fullscreen, 1
bind = $mainMod Control, F, fullscreenstate, -1 -1
bind = $mainMod, Space, togglefloating,

# 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

# 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

Mouse

# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow

Media keys

binde = , XF86AudioRaiseVolume, exec, ~/.local/bin/dunst-volume -i 1
# binde = , XF86AudioLowerVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ -1%
binde = , XF86AudioLowerVolume, exec, ~/.local/bin/dunst-volume -d 1
bindl = , XF86AudioMute, exec, ~/.local/bin/dunst-volume -t
# bindl = , XF86AudioMicMute, exec, pactl set-source-mute @DEFAULT_SOURCE@ toggle

bind = , XF86AudioPlay, exec, playerctl play-pause
bind = , XF86AudioNext, exec, playerctl next
bind = , XF86AudioPrev, exec, playerctl previous

# for keyboard with no fn keys
binde = $mainMod, F9, exec, ~/.local/bin/dunst-volume -i 1 # volume up
binde = $mainMod, F8, exec, ~/.local/bin/dunst-volume -d 1 # volume down
bind = $mainMod, F7, exec, ~/.local/bin/dunst-volume -t # volume toggle
binde = $mainMod Shift, F3, exec, ~/.local/bin/dunst-backlight +1% # brightness increase
bind = $mainMod Shift, F2, exec, ~/.local/bin/dunst-backlight 1%- # brightness decrease
bind = $mainMod Control, Up, exec, playerctl play-pause
binde = $mainMod, F11, exec, playerctl play-pause
bind = $mainMod Control, Down, exec, playerctl stop
binde = $mainMod Control, Right, exec, playerctl next
binde = $mainMod, F12, exec, playerctl next
binde = $mainMod Control, Left, exec, playerctl previous
binde = $mainMod, F10, exec, playerctl previous

# binde = , XF86MonBrightnessUp, exec, brightnessctl set +1%
binde = , XF86MonBrightnessUp, exec, ~/.local/bin/dunst-backlight +1%
binde = , XF86MonBrightnessDown, exec, ~/.local/bin/dunst-backlight 1%-
# binde = , XF86MonBrightnessDown, exec, brightnessctl set 1%-

bind = , Print, exec, grim "$(echo ~/Pictures/Screenshots/Screenshot1-$(date +'%Y%m%d_%H%M%S').png)"
bind = Control, Print, exec, grim -g "$(slurp)" - | swappy -f -
bind = Alt, Print, exec, ~/.local/bin/screen-record

bind = $mainMod Shift, S, exec, grim -g "$(slurp)" - | swappy -f -

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

Groups

  • Group management
    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
    
  • Window Resize
    # Resize
    bind = $mainMod, R, submap, resize
    submap = resize
    # using arrow key
    binde = , right, resizeactive, 10 0
    binde = , left, resizeactive, -10 0
    binde = , up, resizeactive, 0 -10
    binde = , down, resizeactive, 0 10
    # using vim key
    binde = , l, resizeactive, 10 0
    binde = , h, resizeactive, -10 0
    binde = , k, resizeactive, 0 -10
    binde = , j, resizeactive, 0 10
    bind = Control, G, submap, reset
    bind = , escape, submap, reset
    submap = reset
    

Hyprland

bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, S, togglesplit, # dwindle
bind = Alt Control Shift, Tab, layoutmsg, swapprev
  • Master layout
    # master
    bind = $mainMod Alt, TAB, layoutmsg, swapwithmaster auto
    bind = $mainMod Alt, H, layoutmsg, orientationleft
    bind = $mainMod Alt, J, layoutmsg, orientationbottom
    bind = $mainMod Alt, K, layoutmsg, orientationtop
    bind = $mainMod Alt, L, layoutmsg, orientationright
    bind = Alt Shift, Tab, layoutmsg, swapnext
    bind = Alt, Tab, cyclenext
    bind = Alt Control, TAB, layoutmsg, cycleprev
    

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

I set the bindings for workspace to have multiple bindings, the first one is to move to the intended workspace, but also to set the wallpaper to the variable set at the variables.conf file.

  • Workspace movement
    # 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
    
    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
    
    # bind = $mainMod, O, toggleopaque
    
    bind = Alt, Tab, alterzorder, top
    bind = Alt Shift, Tab, bringactivetotop,
    bind = Alt Control, TAB, bringactivetotop,
    bind = Alt Control Shift, Tab, bringactivetotop,
    
  • 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 workspace
    # 0 is fn+m (music) in my laptop
    bind = $mainMod Alt, 0, togglespecialworkspace, music
    # 1 is for htop
    bind = $mainMod Alt, 1, togglespecialworkspace, proc
    # 2 is fn+k (khal)
    bind = $mainMod Alt, 2, togglespecialworkspace, khal
    # 3 is for terminal emacsclient
    bind = $mainMod Alt, 3, togglespecialworkspace, emacs
    # 4 is for terminal notmuch (using emacsclient)
    #bind = $mainMod Alt, 4, togglespecialworkspace, mail
    # 5 is for dired
    bind = $mainMod Alt, 5, togglespecialworkspace, dired
    # 6 is for nvim
    bind = $mainMod Alt, 6, togglespecialworkspace, nvim
    # 7 is for org-agenda (emacsclient)
    # bind = $mainMod Alt, 7, togglespecialworkspace, agenda
    # 0 is for showmethekey-gtk
    bind = $mainMod Alt, 9, togglespecialworkspace, keys
    
  • mouse
    # Scroll through existing workspaces with mainMod + scroll
    bind = $mainMod, mouse_down, workspace, e+1
    bind = $mainMod, mouse_up, workspace, e-1
    

~~/.config/hypr/hypr.d/xwayland.conf~

xwayland {
  enabled = true
}

waybar

~/.config/waybar/config

start config

{

General

"layer": "top", // Waybar at top layer
"output": ["eDP-1", "DP-1", "DP-2", "DP-3", "DP-4", "DP-5", "HDMI-A-1"],
"position": "top", // Waybar position (top|bottom|left|right)
"height": 34, // Waybar height (to be removed for auto height)
// "width": 1280, // Waybar width
"spacing": 4, // Gaps between modules (4px)
// Choose the order of the modules

Left Modules

"modules-left": [
  "custom/launcher",
  "hyprland/workspaces",
  "hyprland/submap"
  // "mpris"
  // "custom/media"
],

Center Modules

"modules-center": [
  "hyprland/window"
],

Right Modules

"modules-right": [
  // "mpd",
  // "idle_inhibitor",
  "backlight",
  "pulseaudio",
  // "wireplumber",
  "network",
  "cpu",
  "memory",
  "temperature",
  "keyboard-state",
  // "hyprland/language",
  "battery",
  "custom/pacman",
  "clock#date",
  "clock#time",
  "tray",
  "custom/power"
],

Modules Configuration

  • mpris
    "mpris": {
      "format": "{player_icon} {title}",
      "format-paused": "{status_icon} <i>{title}</i>",
      "player-icons": {
        "default": "▶",
        "mpv": "🎵"
      },
      "status-icons": {
        "paused": "⏸"
      },
    },
    
  • backlight
    "backlight": {
      "format": " {percent}%",
      "interval": 2,
      "on-scroll-up": "brightnessctl set +1%",
      "on-scroll-down": "brightnessctl set 1%-"
    },
    
  • hyprland/workspaces
    "hyprland/workspaces": {
      "num-tags": 6,
      // "format": "{id}: {icon}",
      // "format-icons": {
      //   "1": "",
      //   "2": "",
      //   "3": "󰖟",
      //   "4": "󰺻",
      //   "5": "󰈔",
      //   "6": "󰦑",
      //   "7": "",
      //   "8": "󰑔",
      //   "9": "",
      //   "10": ""
      // },
      "active-only": false
    },
    
  • hyprland/languages
    "hyprland/language": {
      "format": "{}",
      "format-en": "en",
      "keyboard-name": "at-translated-set-2-keyboard"
    },
    
  • hyprland/window
    "hyprland/window": {
      "format": "{title}",
      "rewrite": {
        "(.*) — Mozilla Firefox": "🌎 $1",
        "(.*) - (GNU Emacs at.*)": "$1"
      },
      "max-length": 80,
      "separate-outputs": true
    },
    
  • hyprland/submap
    "hyprland/submap": {
      "format": "{}",
      "max-length": 8,
      "tooltip": false
    },
    
  • keyboard-state
    "keyboard-state": {
      "numlock": false,
      "capslock": true,
      "format": "{name} {icon}",
      "format-icons": {
        "locked": "",
        "unlocked": ""
      }
    },
    
  • mpd
    "mpd": {
      // "format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {volume}% ",
      "format": "  {title} - {artist} {stateIcon} [{elapsedTime:%M:%S}/{totalTime:%M:%S}] {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}[{songPosition}/{queueLength}] [{volume}%]",
      "format-disconnected": "Disconnected ",
      "format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ",
      "unknown-tag": "N/A",
      "interval": 2,
      "consume-icons": {
        "on": " "
      },
      "random-icons": {
        "off": "<span color=\"#f53c3c\"></span> ",
        "on": " "
      },
      "repeat-icons": {
        "on": " "
      },
      "single-icons": {
        "on": "1 "
      },
      "state-icons": {
        "paused": "",
        "playing": ""
      },
      "tooltip-format": "MPD (connected)",
      "tooltip-format-disconnected": "MPD (disconnected)"
    },
    
  • idle_inhibitor
    "idle_inhibitor": {
      "format": "{icon}",
      "format-icons": {
        "activated": "",
        "deactivated": ""
      }
    },
    
  • tray
    "tray": {
      // "icon-size": 21,
      "spacing": 10
    },
    
  • clock
    "clock#date": {
      // "timezone": "America/New_York",
      "format": " {:%Y/%m/%d(%a)}",
      "on-click": "alacritty --class khal -e khal interactive",
      "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"
      // "format-alt": "{:%Y-%m-%d}"
    },
    "clock#time": {
      "interval": 1,
      "format": "{:%H:%M:%S}",
      "tooltip": false
    },
    
  • cpu
    "cpu": {
      "format": "{usage}% ",
      // "format": " {}%",
      "tooltip": true,
      "interval": 15
    },
    
  • memory
    "memory": {
      "interval": 30,
      "format": "{}% "
      // "max-length": 50
    },
    
  • temperature
    "temperature": {
      // "thermal-zone": 2,
      // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input",
      "critical-threshold": 80,
      // "format-critical": "{temperatureC}°C {icon}",
      "format": "{temperatureC}°C {icon}",
      "format-icons": ["", "", ""]
    },
    
  • battery
    "battery": {
      "states": {
        // "good": 95,
        "warning": 30,
        "critical": 15
      },
      "format": " {icon} {capacity}%",
      "format-charging": " {capacity}%",
      "format-plugged": " {capacity}%",
      "format-alt": "{icon} {time}",
      // "format-good": "", // An empty format will hide the module
      // "format-full": "",
      "format-icons": ["", "", "", "", ""]
    },
    "battery#bat2": {
      "bat": "BAT2"
    },
    
  • network
    "network": {
      // "interface": "wlp2*", // (Optional) To force the use of this interface
      "format": "{ifname}",
      "format-wifi": "{essid} ({signalStrength}%) ",
      "format-ethernet": "{ipaddr}/{cidr} ",
      "tooltip-format": "{ifname} via {gwaddr} ",
      "format-linked": "{ifname} (No IP) ",
      "format-disconnected": "Disconnected ⚠",
      "format-alt": "{ifname}: {ipaddr}/{cidr} ({bandwidthUpBits} - {bandwidthDownBits})"
    },
    
  • wireplumber
    "wireplumber": {
      "format": "{icon} {volume}%",
      "format-icons": ["󰕿", "󰖀", "󰕾"],
      "format-muted": "",
      "on-click": "helvum",
      "on-click-right": "pavucontrol",
      "scroll-step": 0.2
    },
    
  • pulseaudio
    "pulseaudio": {
      // "scroll-step": 1, // %, can be a float
      "format": "{volume}% {icon} {format_source}",
      "format-bluetooth": "{volume}% {icon} {format_source}",
      "format-bluetooth-muted": " {icon} {format_source}",
      "format-muted": " {format_source}",
      "format-source": "{volume}% ",
      "format-source-muted": "",
      "format-icons": {
        "headphone": "",
        "hands-free": "",
        "headset": "",
        "phone": "",
        "portable": "",
        "car": "",
        "default": ["", "", ""]
      },
      "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
    },
    
  • custom/pacman
    "custom/pacman": {
      "format": " {} update available",
      "exec": "checkupdates | wc -l",
      "exec-if": "test $(checkupdates | wc -l) -ne 0",
      "interval": 3600,
      "on-click": "checkupdates; pkill -SIGRTMIN+8 waybar"
    },
    
  • custom/launcher
    "custom/launcher":{
      "format": " ",
      "tooltip": false,
      "on-click": "rofi -show drun -theme hyprland-menu",
      "on-click-right": "killall rofi"
    },
    
  • custom/power
    "custom/power":{
      "format": " ",
      "tooltip": false,
      "on-click": "~/.local/bin/rofi-logout hyprland-logout"
    },
    
  • custom/media
    "custom/media": {
      "format": "{icon} {}",
      "return-type": "json",
      "max-length": 40,
      "format-icons": {
        "spotify": "",
        "default": "🎜"
      },
      "escape": true,
      "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder
      // "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name
    }
    

End config

}

~/.config/waybar/style.css

definitions

/* Nord */
@define-color background rgba(46, 52, 64, 1);
@define-color background2 rgba(46, 52, 64, 0.75);
@define-color cyan rgba(136, 192, 208, 1);
@define-color cyan2 rgba(136, 192, 208, 0.6);
@define-color red rgba(191, 97, 106, 1);
@define-color red2 rgba(191, 97, 106, 0.6);
@define-color foreground rgba(216, 222, 233, 1);
@define-color black #161320;
@define-color green rgba(163, 190, 140, 1);
@define-color green2 rgba(163, 190, 140, 0.3);
@define-color yellow rgba(235, 203, 139, 1);
@define-color yellow2 rgba(235, 203, 139, 0.45);
@define-color blue rgba(129, 161, 193, 1);
@define-color blue2 rgba(129, 161, 193, 0.45);
@define-color magenta rgba(180, 142, 173, 1);
@define-color magenta2 rgba(180, 142, 173, 0.5);
@define-color white rgba(229, 233, 240, 1);

@define-color light #D8DEE9;
/*@define-color dark @nord_dark_font;*/
@define-color warning #ebcb8b;
@define-color critical #BF616A;
@define-color mode #434C5E;
/*@define-color workspaces @bg;*/
/*@define-color workspaces @nord_dark_font;*/
/*@define-color workspacesfocused #434C5E;*/
@define-color workspacebutton @white;
@define-color launcher rgba(94, 129, 172, 1);
@define-color tray @workspacesfocused;
@define-color sound #EBCB8B;
@define-color network #5D7096;
@define-color memory #546484;
@define-color cpu rgba(89, 106, 141, 1);
@define-color keyboard rgba(163, 190, 140, 1);
@define-color battery rgba(180, 142, 173, 1);
@define-color temp #4D5C78;
@define-color layout rgba(94, 129, 172, 1);
@define-color wireplumber #88c0d0;
@define-color date rgba(136, 192, 208, 1);
@define-color time rgba(180, 142, 173, 1);
@define-color backlight rgba(67, 76, 94, 1);
@define-color nord_bg rgba(67, 76, 94, 1);
@define-color nord_bg_blue #546484;
@define-color nord_light #D8DEE9;
@define-color nord_light_font #D8DEE9;
@define-color nord_dark_font #434C5E;

global

* {
    /* `otf-font-awesome` is required to be installed for icons */
    border: none;
    border-radius: 10px;
    font-family: FontAwesome, JetBrainsMonoNL Nerd Font Mono;
    font-size: 8px;
    min-height: 10px;
}

keyframes

@keyframes blink {
    to {
        background-color: @red;
        color: @cyan;
    }
}

window

window#waybar {
    /* background-color: @background2; */
    background-color: transparent;
    /* border-bottom: 3px solid @cyan; */
    /* color: @white; */
    /* transition-property: background-color; */
    /* transition-duration: .5s; */
}

window#waybar.hidden {
    opacity: 0.2;
}

window#waybar.empty #window {
    background-color: transparent;
}

#window {
    margin-top: 6px;
    margin-left: 8px;
    padding-left: 10px;
    padding-right: 10px;
    border-radius: 10px;
    transition: none;
    color: @black;
    background-color: @white;
    font-size:14px;
    font-weight: bold;
}

button

button {
    /* Use box-shadow instead of border so the text isn't offset */
    /* box-shadow: inset 0 -3px transparent; */
    /* Avoid rounded borders under each button name */
    border: none;
    border-radius: 0;
}

/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
button:hover {
    background: inherit;
    border-top: 2px solid @red;
}

tooltip

tooltip {
    background: @background;
    border: 1px solid @cyan;
}

tooltip label {
    /* color: @white; */
}

label:focus {
    background-color: @background;
}

modules

  • cpu
    #cpu {
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          margin-bottom: 0px;
          padding-right: 10px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @cyan2;
    }
    
  • memory
    #memory {
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          margin-bottom: 0px;
          padding-right: 10px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @magenta;
    }
    
  • keyboard-state
    #keyboard-state {
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          margin-bottom: 0px;
          padding-right: 10px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @magenta;
    }
    
  • temperature
    #temperature {
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          margin-bottom: 0px;
          padding-right: 10px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @red;
    }
    
  • modules-left
    .modules-left > widget:first-child > #workspaces {
        margin-left: 0;
    }
    
  • modules-right
    .modules-right > widget:last-child > #workspaces {
        margin-right: 0;
    }
    
  • mpris
    #mpris {
        /* padding: 0 4px; */
        /* font-size: 9px; */
        /* color: @warning; */
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          padding-right: 10px;
          margin-bottom: 0px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @blue;
    }
    
  • idle_inhibitor
    #idle_inhibitor {
        color: @blue;
    }
    
    #idle_inhibitor.activated {
        color: @black;
    }
    
  • backlight
    #backlight{
        /* color: @yellow; */
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          padding-right: 10px;
          margin-bottom: 0px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @yellow;
    }
    
  • pulseaudio
    #pulseaudio {
        /* background-color: @magenta2; */
        /* color: @wireplumber; */
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          padding-right: 10px;
          margin-bottom: 0px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @blue;
    }
    
  • wireplumber
    #wireplumber {
        /* background-color: @magenta2; */
        color: @black;
    }
    
  • keyboard-state
    #keyboard-state {
        background: @green;
        color: @black;
    }
    
  • battery
    #battery {
        /* color: @battery; */
        /* background-color: @yellow2; */
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          padding-right: 10px;
          margin-bottom: 0px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @magenta;
    }
    
    #battery.charging, #battery.plugged {
        /* color: @yellow; */
        /* background-color: @background; */
          color: @black;
        background-color: @magenta;
    }
    
    /* #battery.warning:not(.charging) { */
    /*     /\* background: @red; *\/ */
    /*     /\* color: @white; *\/ */
    /*     animation-name: blink; */
    /*     animation-duration: 0.5s; */
    /*     animation-timing-function: steps(12); */
    /*     animation-iteration-count: infinite; */
    /*     animation-direction: alternate; */
    /* } */
    
    #battery.critical:not(.charging) {
        /* background-color: @red; */
        /* color: @white; */
        /* animation-name: blink; */
        /* animation-duration: 0.5s; */
        /* animation-timing-function: linear; */
        /* animation-iteration-count: infinite; */
        /* animation-direction: alternate; */
        background-color: @magenta;
        color: @black;
        animation-name: blink;
        animation-duration: 0.5s;
        animation-timing-function: linear;
        animation-iteration-count: infinite;
        animation-direction: alternate;
    }
    
  • custom/pacman
    #custom-pacman {
        /* color: @black; */
        /* background-color: @green2; */
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          padding-right: 10px;
          margin-bottom: 0px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @yellow;
    }
    
  • clock
    #clock.date {
        /* color: @date; */
        /* background-color: @magenta2; */
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          padding-right: 10px;
          margin-bottom: 0px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @green;
    }
    
    #clock.time {
        /* color: @time; */
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          padding-right: 10px;
          margin-bottom: 0px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @yellow;
    }
    
  • network
    #network {
        /* color: @network; */
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          padding-right: 10px;
          margin-bottom: 0px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @magenta;
    }
    
    #network.wifi {
          color: @black;
        background: @yellow;
    }
    
    #network.ethernet {
          color: @black;
        background: @blue;
    }
    
    #network.linked {
          color: @black;
        background: @green;
    }
    
    #network.disconnected {
        color: @red;
        background: @black;
    }
    
  • custom-launcher
    #custom-launcher {
          font-size: 24px;
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          padding-right: 5px;
          border-radius: 10px;
          transition: none;
        color: @black;
        background: @blue;
    }
    
  • custom-power
    #custom-power {
          font-size: 24px;
          margin-top: 6px;
          margin-left: 8px;
          padding-left: 10px;
          padding-right: 5px;
          border-radius: 10px;
          transition: none;
          color: @black;
          background: @blue;
    }
    

workspaces

#workspaces {
      margin-top: 6px;
    margin-left: 12px;
    font-size: 4px;
    margin-bottom: 0px;
    border-radius: 10px;
    background: @green;
    transition: none;
}

#workspaces button {
    /* color: @nord_light; */
    /* padding: 0 4px; */
    /* color: @workspacebutton; */
    /* font-size: 14px; */
    /* font-weight: bold; */
      transition: none;
      color: @black;
      background: transparent;
      font-size: 16px;
      border-radius: 2px;
}

#workspaces button.occupied {
      transition: none;
      color: @blue;
      background: transparent;
      font-size: 4px;
}

#workspaces button.empty {
    color: @cyan;
}

#workspaces button.active {
    font-weight: bold;
    color: @white;
}

#workspaces button:hover {
      transition: none;
      /* box-shadow: inherit; */
      /* text-shadow: inherit; */
      color: @yellow;
    /* border-color: @red; */
}

#workspaces button.focused {
    /* background-color: @black; */
    /* color: @red; */
    /* border-top: 2px solid @red; */
      color: @green;
    /* border-top: 2px solid @green; */
    /* border-bottom: 2px solid @green; */
}

#workspaces button.focused:hover {
    color: @red;
}

#workspaces button.urgent {
    background-color: @red;
}

mode

#mode {
    color: @black;
}

submap

#submap {
    color: @yellow;
}

tray

#tray {
      margin-top: 6px;
      margin-left: 8px;
      padding-left: 10px;
      padding-right: 10px;
      margin-bottom: 0px;
      border-radius: 10px;
      transition: none;
      color: @white;
      background: @blue;
}

#tray > .passive {
    -gtk-icon-effect: dim;
}

#tray > .needs-attention {
    -gtk-icon-effect: highlight;
    background-color: @red;
}

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
}

Alacritty

~/.config/alacritty/alacritty.toml

[general]
import = ["~/.config/alacritty/themes/nord.toml"]
live_config_reload = true
[window]
dynamic_padding = true
decorations = "None"
padding = { x = 25, y = 25 }
blur = true
#startup_mode = "Fullscreen"
decorations_theme_variant = "Dark"
[scrolling]
history = 100000
multiplier = 2
[font]
normal = { family = "JetBrainsMonoNL Nerd Font Mono", style = "Regular" }
bold = { family = "JetBrainsMonoNL Nerd Font Mono", style = "Bold" }
italic = { family = "JetBrainsMonoNL Nerd Font Mono", style = "Italic" }
bold_italic = { family = "JetBrainsMonoNL Nerd Font Mono", style = "Semibold Italic" }
size = 8
[bell]
animation = "EaseOutCirc"
duration = 1
# command = { program = "canberra-gtk-play", args = ["-i", "bell"] }
[cursor]
style = { shape = "Beam", blinking = "On" }
vi_mode_style = { shape = "Block", blinking = "Off" }
[mouse]
hide_when_typing = true
[selection]
save_to_clipboard = true
# [shell]
# program = "/bin/bash"
# args = ["-l"]
[env]
TERM = "xterm-256color"
[[hints.enabled]]
command = "xdg-open"
hyperlinks = true
post_processing = true
persist = false
mouse.enabled = true
binding = { key = "U", mods = "Control|Shift" }
 regex = "(ipfs:|ipns:|magnet:|mailto:|gemini://|gopher://|https://|http://|news:|file:|git://|ssh:|ftp://)[^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+"

nord theme

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

# Default colors
[colors.primary]
background = '#2E3440'
foreground = '#D8DEE9'

# Normal colors
[colors.normal]
black   = '#3B4252'
red     = '#BF616A'
green   = '#A3BE8C'
yellow  = '#EBCB8B'
blue    = '#81A1C1'
magenta = '#B48EAD'
cyan    = '#88C0D0'
white   = '#E5E9F0'

# Bright colors
[colors.bright]
black   = '#4C566A'
red     = '#BF616A'
green   = '#A3BE8C'
yellow  = '#EBCB8B'
blue    = '#81A1C1'
magenta = '#B48EAD'
cyan    = '#8FBCBB'
white   = '#ECEFF4'

Swappy

Wayland native snapshot editing tools.

 1: [Default]
 2: save_dir=$HOME/Pictures/Screenshots
 3: save_filename_format=swappy-%Y%m%d-%H%M%S.png
 4: show_panel=false
 5: line_size=5
 6: text_size=20
 7: text_font=sans-serif
 8: paint_mode=brush
 9: early_exit=false
10: fill_shape=false

Rofi configuration

hyprland-menu

This is the theme used when running rofi -show drun.

 1: /* -*-css -*- */
 2: @theme "nord"
 3: 
 4: window {
 5:     transparency: "real";
 6:     location: northwest;
 7:     anchor: center;
 8:     width: 25%;
 9:     x-offset: 0%;
10:     y-offset: 0%;
11:     fullscreen: false;
12:     margin: 0px;
13:     padding: 0px;
14: }
15: 
16: listview {
17:     columns: 1;
18:     lines: 6;
19:     spacing: 5px;
20:     cycle: true;
21:     dynamic: true;
22:     scrollbar: false;
23:     layout: vertical;
24:     reverse: false;
25:     fixed-height: true;
26:     fixed-width: true;
27: }
28: 
29: element {
30:     spacing: 10px;
31:     margin: 0px;
32:     padding: 6px;
33:     border: 0px solid;
34:     border-radius: 0px;
35:     cursor: pointer;
36: }
37: 
38: element-icon {
39:     background: transparent;
40:     text-color: inherit;
41:     size: 16px;
42:     cursor: inherit;
43: }
44: 
45: element-text {
46:     background: transparent;
47:     text-color: inherit;
48:     highlight: inherit;
49:     cursor: inherit;
50:     /* vertical-align: 0.5; */
51:     /* horizontal-align: 0.5; */
52: }
53: 
54: textbox {
55:     vertical-align: 0.5;
56:     horizontal-align: 0.0;
57:     highlight: none;
58: }

hyprland-logout

 1: /* -*-css -*- */
 2: @theme "nord"
 3: 
 4: window {
 5:     location: northeast;
 6:     anchor:   center;
 7:     transparency: "screenshot";
 8:     width: 10%;
 9:     padding: 10px;
10:     border:  0px;
11:     border-radius: 6px;
12:     x-offset: -1%;
13:     y-offset: 1%;
14:     spacing: 0;
15:     children: [mainbox];
16: }
17: 
18: listview {
19:     columns: 1;
20:     lines: 4;
21: }

hyprland-clipboard

 1: /* -*-css -*- */
 2: @theme "nord"
 3: 
 4: window {
 5:     location: center;
 6:     anchor: center;
 7:     width: 40%;
 8:     x-offset: 1%;
 9:     y-offset: -2%;
10:     /* padding-right: 25px; */
11: }
12: 
13: listview {
14:     lines: 4;
15:     dynamic: true;
16:     cycle: true;
17:     layout: vertical;
18: }

hyprland-emoji

/* -*-css -*- */
@theme "nord"

window {
    location: southwest;
    anchor: center;
    width: 70%;
    x-offset: 1%;
    y-offset: -2%;
    /* padding-right: 25px; */
}

listview {
    columns: 4;
    lines: 4;
}

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

Date: 2024-03-23 Sat 00:00

Author: Kristian Alexander P

Created: 2025-06-08 Sun 17:02