Personal Hyprland Configuration with Waybar
- Welcome
- Hyprland
- xdg-desktop-portal-hyprland
- Hypridle
- Hyprlock
- Waybar
Welcome
My personal configuration of Hyprland, written as an Org Mode document.
Run the block below with C-c C-c
to tangle code blocks to config file.
(org-mode-restart)
(org-babel-tangle)
Hyprland
Monitors
monitor = name, resolution, position, scale
monitor = , preferred, auto, 1
Variables
$terminal = foot
$fileManager = thunar
$menu = rofi -show combi -run-command "uwsm app -- {cmd}"
$colorPicker = hyprpicker -a
$toggleBar = $HOME/.config/hypr/waybar/scripts/toggleBarService.sh
Autostart
Autostart necessary processes (like notifications daemons, status bars, etc.) Or execute your favorite apps at launch like this:
exec-once = $terminal exec-once = nm-applet & exec-once = waybar & hyprpaper & firefox
If using uwsm
, prefix application startup commands with uwsm app --
:
exec-once = uwsm app -- mycommand --arg1 --arg2 bind = SUPER, E, exec, uwsm app -- pcmanfm-qt.desktop
Background Processes
exec-once = uwsm app -- fumon &
exec-once = uwsm app -- kdeconnectd --replace &
exec-once = uwsm app -- wl-paste --type text --watch cliphist store &
exec-once = uwsm app -- wl-paste --type image --watch cliphist store &
exec-once = uwsm app -- $HOME/.scripts/dunst.sh --on &
Desktop Setup
exec-once = uwsm app -- hyprctl setcursor breeze-hacked-cursor-theme 24 &
exec-once = uwsm app -- hyprpm reload -n &
exec-once = uwsm app -- shikane &
exec-once = uwsm app -- waypaper --restore &
exec-once = uwsm app -- gammastep -x &
exec-once = uwsm app -- wpctl set-volume @DEFAULT_AUDIO_SINK@ 25% &
Applications
exec-once = uwsm app -- blueman-applet &
exec-once = uwsm app -- nm-applet &
exec-once = uwsm app -- kdeconnect-indicator &
exec-once = uwsm app -- udiskie -a -n -s &
exec-once = uwsm app -- nextcloud &
exec-once = uwsm app -- syncthing-gtk &
exec-once = uwsm app -- openrgb &
Environment Variables
uwsm
users should avoid placing environment variables here. Instead, use ~/.config/uwsm/env
for theming, xcursor, nvidia and toolkit variables, and ~.config/uwsm/env-hyprland
for HYPR*
and AQ_*
variables. The format is export KEY=VAL
.
export XCURSOR_SIZE=24
See uwsm readme for additional information.
Permissions
ecosystem { enforce_permissions = true } permission = /usr/(bin|local/bin)/grim, screencopy, allow permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow
Look and Feel
General
- Hyprland Wiki - Configuring - Variables - General
- Hyprland Wiki - Configuring - Variables - Variable Types
- Hyprland Wiki - Configuring - Tearing
general {
border_size = 2
no_border_on_floating = false
gaps_in = 20
gaps_out = 30
gaps_workspaces = 0
col.active_border = rgba(bd93f9ff) rgba(8be9fdff) 45deg
col.inactive_border = rgba(282a36ff)
layout = master
resize_on_border = false
allow_tearing = false
}
Decoration
decoration {
rounding = 10
rounding_power = 4.0
active_opacity = 1.0
inactive_opacity = 1.0
fullscreen_opacity = 1.0
dim_inactive = false
blur {
enabled = true
size = 5
passes = 3
ignore_opacity = true
new_optimizations = true
xray = true
noise = 0.0117
contrast = 0.8916
brightness = 1.0
vibrancy = 0.1696
vibrancy_darkness = 0.0
special = false
popups = false
input_methods = false
}
shadow {
enabled = true
range = 4
render_power = 3
color = rgba(1a1a1aee)
scale = 1.0
}
}
Animations
animation = NAME, ONOFF, SPEED, CURVE [,STYLE]
ONOFF
can be either 0 or 1, 0 to disable, 1 to enable. note: if it's 0, you can omit further args.SPEED
is the amount of ds (1ds = 100ms) the animation will takeCURVE
is the bezier curve name, see curvesSTYLE
(optional) is the animation style
The animations are a tree. If an animation is unset, it will inherit its parent's values. See the animation tree.
animation = workspaces, 1, 8, default animation = windows, 1, 10, myepiccurve, slide animation = fade, 0
animations {
enabled = true
first_launch_animation = true
bezier = easeOutQuint,0.23,1,0.32,1
bezier = easeInOutCubic,0.65,0.05,0.36,1
bezier = linear,0,0,1,1
bezier = almostLinear,0.5,0.5,0.75,1.0
bezier = quick,0.15,0,0.1,1
animation = global, 1, 10, default
animation = border, 1, 5.39, easeOutQuint
animation = windows, 1, 4.79, easeOutQuint
animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
animation = windowsOut, 1, 1.49, linear, popin 87%
animation = fadeIn, 1, 1.73, almostLinear
animation = fadeOut, 1, 1.46, almostLinear
animation = fade, 1, 3.03, quick
animation = layers, 1, 3.81, easeOutQuint
animation = layersIn, 1, 4, easeOutQuint, fade
animation = layersOut, 1, 1.5, linear, fade
animation = fadeLayersIn, 1, 1.79, almostLinear
animation = fadeLayersOut, 1, 1.39, almostLinear
animation = workspaces, 1, 1.94, almostLinear, fade
animation = workspacesIn, 1, 1.21, almostLinear, fade
animation = workspacesOut, 1, 1.94, almostLinear, fade
}
Dwindle Layout
dwindle {
pseudotile = true # Master switch for pseudotiling. See keybinding section to enable
preserve_split = true # You probably want this
}
Master Layout
master {
allow_small_split = false
special_scale_factor = 1.0
mfact = 0.5
new_status = master
new_on_top = true
new_on_active = none
orientation = left
inherit_fullscreen = true
smart_resizing = true
drop_at_cursor = true
always_keep_position = false
}
Miscellaneous
misc {
disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :(
disable_splash_rendering = false
force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
vfr = true
vrr = 3
mouse_move_enables_dpms = true
key_press_enables_dpms = true
}
Input
Keyboard and Mouse
input {
kb_layout = us
kb_variant =
kb_model =
kb_options =
kb_rules =
numlock_by_default = true
accel_profile = flat
sensitivity = 0.0
follow_mouse = 1
scroll_method = 2fg
touchpad {
disable_while_typing = false
natural_scroll = true
scroll_factor = 0.5
tap-to-click = true
}
}
Gestures
gestures {
workspace_swipe = true
workspace_swipe_fingers = 3
workspace_swipe_min_fingers = true
}
Device
device { name = epic-mouse-v1 sensitivity = -0.5 }
Keybindings
bind = MODS, key, dispatcher, params
l -> locked, will also work when an input inhibitor (e.g. a lockscreen) is active. r -> release, will trigger on release of a key. c -> click, will trigger on release of a key or button as long as the mouse cursor stays inside binds:drag_threshold. g -> drag, will trigger on release of a key or button as long as the mouse cursor moves outside binds:drag_threshold. o -> longPress, will trigger on long press of a key. e -> repeat, will repeat when held. n -> non-consuming, key/mouse events will be passed to the active window in addition to triggering the dispatcher. m -> mouse, see below. t -> transparent, cannot be shadowed by other binds. i -> ignore mods, will ignore modifiers. s -> separate, will arbitrarily combine keys between each mod/key, see [Keysym combos](#keysym-combos) above. d -> has description, will allow you to write a description for your bind. p -> bypasses the app's requests to inhibit keybinds.
Binds
binds {
pass_mouse_when_bound = false
workspace_back_and_forth = false
allow_workspace_cycles = false
workspace_center_on = 1
focus_preferred_method = 0
movefocus_cycles_fullscreen = false
window_direction_monitor_fallback = true
}
Mod Key
$mainMod = SUPER # Sets "Windows" key as main modifier
Session Control
bind = $mainMod SHIFT, Q, exec, loginctl terminate-user ""
Launch Programs
bind = $mainMod SHIFT, Return, exec, uwsm app -- $terminal
bind = $mainMod, E, exec, uwsm app -- $fileManager
bind = $mainMod, P, exec, uwsm app -- $menu
bind = $mainMod, G, exec, uwsm app -- $colorPicker
bind = $mainMod, B, exec, uwsm app -- $toggleBar
bind = $mainMod CTRL, P, exec, uwsm app -- $HOME/.scripts/control-center.sh --rofi
bind = $mainMod CTRL, C, exec, uwsm app -- cliphist list | rofi -dmenu | cliphist decode | wl-copy
bind = $mainMod CTRL, D, exec, uwsm app -- $HOME/.scripts/brightness.sh --rofi
bind = $mainMod CTRL, V, exec, uwsm app -- $HOME/.scripts/pactl.sh --rofi
bind = $mainMod CTRL, M, exec, uwsm app -- $HOME/.scripts/playerctl.sh --rofi
bind = $mainMod CTRL, N, exec, uwsm app -- $HOME/.scripts/dunst.sh --rofi
bind = $mainMod CTRL, Q, exec, uwsm app -- $HOME/.scripts/session.sh --rofi
Control Windows / Layout
General
bind = $mainMod SHIFT, C, killactive
bind = $mainMod CTRL SHIFT, C, forcekillactive
bind = $mainMod SHIFT, F, fullscreenstate, 0 3
bind = $mainMod CTRL SHIFT, F, fullscreen
bind = $mainMod, F, togglefloating
Dwindle Layout
bind = $mainMod, D, pseudo
bind = $mainMod, S, togglesplit
Master Layout
bind = $mainMod, Return, layoutmsg, swapwithmaster auto
Move Focus
Move focus with mainMod + vim keys
bind = $mainMod, H, movefocus, l
bind = $mainMod, L, movefocus, r
bind = $mainMod, K, movefocus, u
bind = $mainMod, J, movefocus, d
Switch Workspaces
Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, split-workspace, 1
bind = $mainMod, 2, split-workspace, 2
bind = $mainMod, 3, split-workspace, 3
bind = $mainMod, 4, split-workspace, 4
bind = $mainMod, 5, split-workspace, 5
bind = $mainMod, 6, split-workspace, 6
bind = $mainMod, 7, split-workspace, 7
bind = $mainMod, 8, split-workspace, 8
bind = $mainMod, 9, split-workspace, 9
bind = $mainMod, 0, split-workspace, 10
Switch between most recent workspace
bind = $mainMod, Tab, split-workspace, previous_per_monitor
Move Windows to Workspace
Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mainMod SHIFT, 1, split-movetoworkspace, 1
bind = $mainMod SHIFT, 2, split-movetoworkspace, 2
bind = $mainMod SHIFT, 3, split-movetoworkspace, 3
bind = $mainMod SHIFT, 4, split-movetoworkspace, 4
bind = $mainMod SHIFT, 5, split-movetoworkspace, 5
bind = $mainMod SHIFT, 6, split-movetoworkspace, 6
bind = $mainMod SHIFT, 7, split-movetoworkspace, 7
bind = $mainMod SHIFT, 8, split-movetoworkspace, 8
bind = $mainMod SHIFT, 9, split-movetoworkspace, 9
bind = $mainMod SHIFT, 0, split-movetoworkspace, 10
Special Workspace
Example special workspace (scratchpad)
bind = $mainMod, S, togglespecialworkspace, magic bind = $mainMod SHIFT, S, split-movetoworkspace, special:magic
Workspace Scroll
Scroll through existing workspaces with mainMod + scroll
bind = $mainMod, mouse_down, split-workspace, e+1
bind = $mainMod, mouse_up, split-workspace, e-1
Move / Resize Windows
Move windows with mainMod + SHIFT + vim keys
bind = $mainMod SHIFT, H, movewindow, l
bind = $mainMod SHIFT, L, movewindow, r
bind = $mainMod SHIFT, K, movewindow, u
bind = $mainMod SHIFT, J, movewindow, d
Move windows to monitors with mainMod + SHIFT + <>
bind = $mainMod SHIFT, period, movewindow, mon:+1
bind = $mainMod SHIFT, comma, movewindow, mon:-1
Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
Multimedia Keys
Screenshot
bind = , print, exec, uwsm app -- grim -g "$(slurp)" - | swappy -f -
Volume Controls
bindel = , XF86AudioRaiseVolume, exec, uwsm app -- $HOME/.scripts/pactl.sh --raise
bindel = , XF86AudioLowerVolume, exec, uwsm app -- $HOME/.scripts/pactl.sh --lower
bindel = , XF86AudioMute, exec, uwsm app -- $HOME/.scripts/pactl.sh --mute
Brightness Controls
bindel = , XF86MonBrightnessUp, exec, uwsm app -- $HOME/.scripts/brightness.sh --raise
bindel = , XF86MonBrightnessDown, exec, uwsm app -- $HOME/.scripts/brightness.sh --lower
Media Controls
bindl = , XF86AudioNext, exec, uwsm app -- $HOME/.scripts/playerctl.sh --next
bindl = , XF86AudioPause, exec, uwsm app -- $HOME/.scripts/playerctl.sh --play-pause
bindl = , XF86AudioPlay, exec, uwsm app -- $HOME/.scripts/playerctl.sh --play-pause
bindl = , XF86AudioPrev, exec, uwsm app -- $HOME/.scripts/playerctl.sh --prev
Windows and Workspaces
Window Rules
Example windowrule
windowrule = float,class:^(kitty)$,title:^(kitty)$
Ignore maximize requests from apps. You'll probably like this.
windowrule = suppressevent maximize, class:.*
Fix some dragging issues with XWayland
windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
Smart Gaps
Example config for enabling smart gaps
workspace = w[tv1], gapsout:0, gapsin:0 workspace = f[1], gapsout:0, gapsin:0 windowrule = bordersize 0, floating:0, onworkspace:w[tv1] windowrule = rounding 0, floating:0, onworkspace:w[tv1] windowrule = bordersize 0, floating:0, onworkspace:f[1] windowrule = rounding 0, floating:0, onworkspace:f[1]
Graphics
XWayland
xwayland {
enabled = true
use_nearest_neighbor = true
force_zero_scaling = false
create_abstract_socket = false
}
OpenGL
opengl {
nvidia_anti_flicker = true
}
Render
render {
direct_scanout = 2
expand_undersized_textures = true
xp_mode = false
ctm_animation = 2
cm_fs_passthrough = 2
cm_enabled = true
}
Ecosystem
ecosystem {
no_update_news = true
no_donation_nag = true
}
Plugins
hyprEasymotion
Keybindings
Enable easymotion navigation
bind = $mainMod, z, easymotion, action:hyprctl dispatch focuswindow address:{}
Appearance
Configure appearance of easymotion navigation indicators
plugin {
easymotion {
#font size of the text
textsize=100
#color of the text, takes standard hyprland color format
textcolor=rgba(50fa7bff)
#background color of the label box. alpha is respected
bgcolor=rgba(282a36ff)
#enable blur. The bgcolor alpha must be at least semi-transparent.
blur=0
#Set blur alpha value. Blur must be enabled (float value)
blurA=1.0
#Set xray. Blur must be enabled
xray=0
#font to use for the label. This is passed directly to the pango font description
textfont=Sans
#padding around the text (inside the label box) size in pixels, adjusted for
#monitor scaling. This is the same format as hyprland's gapsin/gapsout workspace layout rule
#example: textpadding=2 5 5 2 (spaces not commas)
textpadding=20 20 20 20
#size of the border around the label box. A border size of zero disables border rendering.
bordersize=2
#color of the border. takes the same format as hyprland's border (so it can be a gradient)
bordercolor=rgba(50fa7bff)
#rounded corners? Same as hyprland's 'decoration:rounding' config
rounding=1
#what to do if a window is fullscreen
#none: nothing. (easymotion label won't be displayed on that window)
#toggle: take the window out of fullscreen entirely.
#maximize: convert the window to maximized.
#windows are restored to fullscreen after easymotion is exited/selected
fullscreen_action=toggle
#which keys to use for labeling windows
motionkeys=abcdefghijklmnopqrstuvwxyz1234567890
#if a monitor has a focused special workspace, only put easymotion labels on the windows in the special workspace
only_special = true
}
}
Split Monitor Workspaces
plugin {
split-monitor-workspaces {
# How many workspaces to bind to the monitor
count = 10
# Keep current workspaces focused on plugin init / reload
keep_focused = true
# Enable notifications
enable_notifications = false
# Enable management of persistent workspaces.
# This means the plugin will at initialization create $count
# workspaces on each monitor and make them persistent
enable_persistent_workspaces = false
}
}
xdg-desktop-portal-hyprland
Screencopy
screencopy {
max_fps = 0
allow_token_by_default = false
}
Hypridle
General
general {
lock_cmd = pgrep 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 to turn on the display
ignore_dbus_inhibit = false
ignore_systemd_inhibit = false
inhibit_sleep = 2
}
Listeners
Lock screen after 10 minutes
listener {
timeout = 600
on-timeout = loginctl lock-session
}
Sleep after 30 minutes
listener {
timeout = 1800
on-timeout = systemctl suspend
}
Hyprlock
General
general {
hide_cursor = true
grace = 0
ignore_empty_input = false
immediate_render = true
text_trim = true
fractional_scaling = 2
screencopy_mode = 0
fail_timeout = 2000
}
Authentication
auth {
pam {
enabled = true
module = hyprlock
}
}
Animations
animations {
enabled = false
}
Widgets
Background
background {
monitor =
path = ~/Data/NextCloud/Wallpapers/Desktop/Solar_System.png
color = rgba(282a36ff)
}
Input Field
input-field {
monitor =
size = 20%, 5%
outline_thickness = 2
dots_size = 0.2
dots_spacing = 0.35
dots_center = true
dots_rounding = -1
outer_color = rgba(8be9fdff) rgba(bd93f9ff) 45deg
inner_color = rgba(282a36ff)
font_color = rgba(f8f8f2ff)
font_family = Noto Sans
fade_on_empty = true
fade_timeout = 2000
check_color = rgba(f1fa8cff)
fail_color = rgba(ff5555ff)
halign = center
valign = center
}
Date
label {
monitor =
text = cmd[update:1000] date +"%A, %B %d"
color = rgba(bd93f9ff)
font_size = 22
font_family = JetBrains Mono
position = 0, 300
halign = center
valign = center
}
Time
label {
monitor =
text = cmd[update:1000] date +"%-I:%M %p"
color = rgba(8be9fdff)
font_size = 95
font_family = JetBrains Mono Extrabold
position = 0, 200
halign = center
valign = center
}
Waybar
Start Configuration
// -*- mode: jsonc -*-
{
Bar
Configuration
"layer": "top", // Waybar at top layer
// "output": "",
"position": "top", // Waybar position (top|bottom|left|right)
// "height": 25, // Waybar height (to be removed for auto height)
// "width": 1280, // Waybar width
"spacing": 4, // Gaps between modules (4px)
"mode": "dock",
"start_hidden": false,
"fixed-center": true,
"reload_style_on_change": true,
"modules-left": [
"group/power-menu",
"hyprland/workspaces",
"hyprland/window",
"hyprland/submap",
],
"modules-center": [
"tray",
],
"modules-right": [
"group/media-playing",
"pulseaudio",
"idle_inhibitor",
"custom/system76-power",
"cpu",
"memory",
"disk",
"battery",
"clock",
"group/dunst",
],
"group/power-menu": {
"orientation": "inherit",
"modules": [
"custom/power-menu-launcher",
"custom/power-menu-shutdown",
"custom/power-menu-reboot",
"custom/power-menu-sleep",
"custom/power-menu-lock",
"custom/power-menu-logout",
],
"drawer": {
"transition-duration": 500,
"transition-left-to-right": true,
"click-to-reveal": false,
},
},
"group/media-playing": {
"orientation": "inherit",
"modules": [
"custom/media-playing-source",
"custom/media-playing-prev",
"custom/media-playing-play-pause",
"custom/media-playing-next",
],
},
"group/dunst": {
"orientation": "inherit",
"modules": [
"custom/dunst-status",
"custom/dunst-history-view",
"custom/dunst-clear",
"custom/dunst-history-clear",
],
"drawer": {
"transition-duration": 500,
"transition-left-to-right": true,
"click-to-reveal": false,
},
},
Styling
window#waybar {
background: transparent;
}
#window {
padding: 0px 0px;
color: transparent;
background: transparent;
}
widget {
background: #282a36;
border-radius: 25px;
}
label.module {
padding: 0px 10px;
}
button {
border-radius: 0px;
padding: 0px 0px;
}
.module,button {
font-size: 15px;
font-family: Ubuntu Nerd Font;
}
Modules
Battery
Configuration
"battery": {
"interval": 60,
"format": "{icon} {capacity}%",
"format-icons": ["", "", "", "", "", "", "", "", "", "", ""],
"tooltip": true,
"tooltip-format": "\t{timeTo}\n\t{power} W\n\t{cycles}\n\t{health}%",
},
Styling
#battery {
background: transparent;
color: #ff79c6;
}
CPU
Configuration
"cpu": {
"interval": 5,
"format": " {usage}%",
"tooltip": true,
"on-click-right": "uwsm app -- foot btop",
},
Styling
#cpu {
background: transparent;
color: #ffb86c;
}
Clock
Configuration
"clock": {
"interval": 60,
"format": " {:%I:%M %p}",
"tooltip": true,
"tooltip-format": "<tt><small>{calendar}</small></tt>",
"calendar": {
"mode" : "month",
"mode-mon-col" : 3,
"weeks-pos" : "left",
"on-scroll" : 1,
"format": {
"months": "<span color='#50fa7b'><b>{}</b></span>",
"days": "<span color='#f8f8f2'><b>{}</b></span>",
"weeks": "<span color='#8be9fd'><b>W{}</b></span>",
"weekdays": "<span color='#f1fa8c'><b>{}</b></span>",
"today": "<span color='#bd93f9'><b><u>{}</u></b></span>"
},
},
"actions": {
"on-click": "mode",
"on-click-right": "shift_reset",
"on-scroll-up": "shift_up",
"on-scroll-down": "shift_down",
},
},
Styling
#clock {
background: transparent;
color: #bd93f9;
}
Dunst
Configuration
"custom/dunst-status": {
"exec": "uwsm app -- $HOME/.config/hypr/waybar/scripts/dunst.sh",
"restart-interval": 1,
"on-click": "uwsm app -- $HOME/.scripts/dunst.sh --dnd",
"on-click-right": "uwsm app -- $HOME/.scripts/dunst.sh --rofi",
"tooltip": true,
"tooltip-format": "Toggle Do Not Disturb",
},
"custom/dunst-clear": {
"format": "",
"on-click": "uwsm app -- $HOME/.scripts/dunst.sh --close-all",
"tooltip": true,
"tooltip-format": "Close Open Notifications",
},
"custom/dunst-history-view": {
"format": "",
"on-click": "uwsm app -- $HOME/.scripts/dunst.sh --history",
"tooltip": true,
"tooltip-format": "View Notification History",
},
"custom/dunst-history-clear": {
"format": "",
"on-click": "uwsm app -- $HOME/.scripts/dunst.sh --history-clear",
"tooltip": true,
"tooltip-format": "Clear Notification History",
},
Styling
box#dunst {
padding: 0px 10px;
}
#custom-dunst-status {
background: transparent;
color: #50fa7b;
padding: 0px 5px;
}
#custom-dunst-clear {
background: transparent;
color: #50fa7b;
padding: 0px 5px;
}
#custom-dunst-history-view {
background: transparent;
color: #50fa7b;
padding: 0px 5px;
}
#custom-dunst-history-clear {
background: transparent;
color: #50fa7b;
padding: 0px 5px;
}
Script
isPaused=$(dunstctl is-paused)
notificationCount=$(dunstctl count history)
if [[ "$isPaused" == "true" ]]; then
echo " $notificationCount"
else
echo " $notificationCount"
fi
Disk
Configuration
"disk": {
"interval": 60,
"format": " {percentage_used}%",
"tooltip": true,
"tooltip-format": "Used: {used} ({percentage_used}%)\nFree: {free} ({percentage_free}%)\nTotal: {total}",
"on-click-right": "uwsm app -- qdirstat",
},
Styling
#disk {
background: transparent;
color: #f1fa8c;
}
Hyprland
Configuration
"hyprland/workspaces": {
"active-only": false,
"all-outputs": false,
"format": "{icon}",
"format-icons": {
"1": " ₁",
"2": " ₂",
"3": " ₃",
"4": " ₄",
"5": " ₅",
"6": " ₆",
"7": " ₇",
"8": " ₈",
"9": " ₉",
"10": " ₁₀",
"11": " ₁",
"12": " ₂",
"13": " ₃",
"14": " ₄",
"15": " ₅",
"16": " ₆",
"17": " ₇",
"18": " ₈",
"19": " ₉",
"20": " ₁₀",
"21": " ₁",
"22": " ₂",
"23": " ₃",
"24": " ₄",
"25": " ₅",
"26": " ₆",
"27": " ₇",
"28": " ₈",
"29": " ₉",
"30": " ₁₀",
"31": " ₁",
"32": " ₂",
"33": " ₃",
"34": " ₄",
"35": " ₅",
"36": " ₆",
"37": " ₇",
"38": " ₈",
"39": " ₉",
"40": " ₁₀",
"41": " ₁",
"42": " ₂",
"43": " ₃",
"44": " ₄",
"45": " ₅",
"46": " ₆",
"47": " ₇",
"48": " ₈",
"49": " ₉",
"50": " ₁₀",
},
"show-special": true,
"special-visible-only": true,
"move-to-monitor": false,
},
"hyprland/window": {
"format": "{title}",
"rewrite": {
"": "",
},
"separate-outputs": true,
"icon": true,
"icon-size": 21,
},
"hyprland/submap": {
"format": " {}",
"always-on": false,
"default-submap": "",
},
Styling
#workspaces {
padding: 0px 10px;
}
#workspaces button {
background: transparent;
color: #f1fa8c;
padding: 0px 5px;
}
#workspaces button.empty {
color: #44475a;
}
#workspaces button.active {
box-shadow: inset 0 -3px #bd93f9;
}
#workspaces button.urgent {
color: #ff5555;
}
#window {
background: transparent;
color: #f8f8f2;
padding: 0px 10px;
}
#submap {
background: transparent;
color: #50fa7b;
padding: 0px 10px;
}
Idle Inhibitor
Configuration
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
"activated": " on",
"deactivated": " off",
},
"tooltip": true,
"tooltip-format-activated": "Idle Inhibitor: {status}",
"tooltip-format-deactivated": "Idle Inhibitor: {status}",
"start-activated": true,
},
Styling
#idle_inhibitor.activated {
background: transparent;
color: #f1fa8c;
}
#idle_inhibitor.deactivated {
background: transparent;
color: #44475a;
}
Memory
Configuration
"memory": {
"interval": 5,
"format": " {percentage}%",
"tooltip": true,
"tooltip-format": "RAM:\n\tUsed: {used} GiB ({percentage}%)\n\tFree: {avail} GiB\n\tTotal: {total} GiB\nSwap:\n\tUsed: {swapUsed} GiB ({swapPercentage}%)\n\tFree: {swapAvail} GiB\n\tTotal: {swapTotal} GiB",
"on-click-right": "uwsm app -- foot btop",
},
Styling
#memory {
background: transparent;
color: #8be9fd;
}
Playerctl
Configuration
"custom/media-playing-source": {
"exec": "uwsm app -- $HOME/.config/hypr/waybar/scripts/get-media-playing.sh",
"return-type": "json",
"restart-interval": 1,
"on-click": "uwsm app -- $HOME/.scripts/playerctl.sh --change",
"tooltip": true,
},
"custom/media-playing-prev": {
"format": "",
"on-click": "uwsm app -- $HOME/.scripts/playerctl.sh --prev",
"tooltip": false,
},
"custom/media-playing-play-pause": {
"exec": "uwsm app -- $HOME/.config/hypr/waybar/scripts/get-media-status-icon.sh",
"restart-interval": 1,
"on-click": "uwsm app -- $HOME/.scripts/playerctl.sh --play-pause",
"tooltip": false,
},
"custom/media-playing-next": {
"format": "",
"on-click": "uwsm app -- $HOME/.scripts/playerctl.sh --next",
"tooltip": false,
},
Styling
box#media-playing {
padding: 0px 10px;
}
#custom-media-playing-source {
background: transparent;
color: #ff5555;
padding: 0px 5px;
}
#custom-media-playing-prev {
background: transparent;
color: #ff5555;
padding: 0px 5px;
}
#custom-media-playing-play-pause {
background: transparent;
color: #ff5555;
padding: 0px 5px;
}
#custom-media-playing-next {
background: transparent;
color: #ff5555;
padding: 0px 5px;
}
Script
mediaStatus=$(playerctl --player=playerctld metadata 2>&1)
if [[ "$mediaStatus" == "No player could handle this command" ]]; then
echo ""
else
trackid=$(playerctl --player=playerctld metadata --format '{{ mpris:trackid }}')
title=$(playerctl --player=playerctld metadata --format '{{ xesam:title }}')
if grep -q -i "netflix" <<< "$title"; then
echo ""
elif grep -q -i "hulu" <<< "$title"; then
echo ""
elif grep -q -i "prime video" <<< "$title"; then
echo ""
elif grep -q -i "youtube tv" <<< "$title"; then
echo ""
elif grep -q -i "chromium" <<< "$trackid"; then
echo ""
elif grep -q -i "vlc" <<< "$trackid"; then
echo ""
elif grep -q -i "spotify" <<< "$trackid"; then
echo ""
else
echo ""
fi
fi
mediaStatus=$(`dirname $0`/get-media-status.sh)
if [[ "$mediaStatus" == "N/A" ]]; then
echo ""
else
if [[ "$mediaStatus" == "Playing" ]]; then
echo ""
elif [[ "$mediaStatus" == "Paused" ]]; then
echo ""
fi
fi
mediaStatus=$(playerctl --player=playerctld metadata 2>&1)
if [[ "$mediaStatus" == "No player could handle this command" ]]; then
echo "N/A"
else
status=$(playerctl --player=playerctld metadata --format '{{ status }}')
echo $status
fi
mediaSourceIcon=$(`dirname $0`/get-media-source-icon.sh)
mediaStatus=$(playerctl --player=playerctld metadata 2>&1)
if [[ "$mediaStatus" == "No player could handle this command" ]]; then
artist="N/A"
title="N/A"
album="N/A"
status="N/A"
else
artist=$(playerctl --player=playerctld metadata --format '{{ xesam:artist }}')
title=$(playerctl --player=playerctld metadata --format '{{ xesam:title }}')
album=$(playerctl --player=playerctld metadata --format '{{ xesam:album }}')
status=$(playerctl --player=playerctld metadata --format '{{ status }}')
if [[ $artist == "" ]]; then
artist="N/A"
fi
if [[ $title == "" ]]; then
title="N/A"
fi
if [[ $album == "" ]]; then
album="N/A"
fi
if [[ $status == "" ]]; then
status="N/A"
fi
fi
echo '{"text":"'$mediaSourceIcon'","tooltip":"\t'${title//'"'/'\"'}'\r\t'${artist//'"'/'\"'}'\r\t'${album//'"'/'\"'}'\r\t'${status//'"'/'\"'}'"}'
Power Menu
Configuration
"custom/power-menu-launcher": {
"format": "",
"on-click": "rofi -show combi -run-command 'uwsm app -- {cmd}'",
"on-click-right": "uwsm app -- $HOME/.scripts/control-center.sh --rofi",
"tooltip": true,
"tooltip-format": "Application Launcher",
},
"custom/power-menu-shutdown": {
"format": "",
"on-click": "uwsm app -- $HOME/.scripts/session.sh --shutdown",
"tooltip": true,
"tooltip-format": "Shutdown",
},
"custom/power-menu-reboot": {
"format": "",
"on-click": "uwsm app -- $HOME/.scripts/session.sh --reboot",
"tooltip": true,
"tooltip-format": "Reboot",
},
"custom/power-menu-sleep": {
"format": "⏾",
"on-click": "uwsm app -- $HOME/.scripts/session.sh --sleep",
"tooltip": true,
"tooltip-format": "Sleep",
},
"custom/power-menu-lock": {
"format": "",
"on-click": "uwsm app -- $HOME/.scripts/session.sh --lock",
"tooltip": true,
"tooltip-format": "Lock",
},
"custom/power-menu-logout": {
"format": "",
"on-click": "uwsm app -- $HOME/.scripts/session.sh --logout",
"tooltip": true,
"tooltip-format": "Logout",
},
Styling
box#power-menu {
padding: 0px 10px;
}
#custom-power-menu-launcher {
background: transparent;
color: #8be9fd;
padding: 0px 5px;
}
#custom-power-menu-shutdown {
background: transparent;
color: #ff5555;
padding: 0px 5px;
}
#custom-power-menu-reboot {
background: transparent;
color: #50fa7b;
padding: 0px 5px;
}
#custom-power-menu-sleep {
background: transparent;
color: #f1fa8c;
padding: 0px 5px;
}
#custom-power-menu-lock {
background: transparent;
color: #ff79c6;
padding: 0px 5px;
}
#custom-power-menu-logout {
background: transparent;
color: #ffb86c;
padding: 0px 5px;
}
Pulseaudio
Configuration
"pulseaudio": {
"interval": 5,
"format": "{icon} {volume}%",
"format-bluetooth": "{icon} {volume}%",
"format-muted": " muted",
"format-icons": {
"hdmi": "",
"headset": "",
"speaker": "",
"headphone": "",
"car": "",
"hifi": "",
"default": "",
},
"scroll-step": 5,
"on-click": "uwsm app -- $HOME/.scripts/pactl.sh --mute",
"on-click-right": "uwsm app -- $HOME/.scripts/pactl.sh --mixer",
"tooltip": true,
"tooltip-format": "{desc}",
"scroll-step": 0.25,
},
Styling
#pulseaudio {
background: transparent;
color: #ff79c6;
}
System76 Power
Configuration
"custom/system76-power": {
"exec": "uwsm app -- $HOME/.config/hypr/waybar/scripts/system76-power.sh",
"return-type": "json",
"restart-interval": 60,
"on-click-right": "uwsm app -- $HOME/.scripts/cpu-gpu.sh --rofi",
"tooltip": true,
},
Styling
#custom-system76-power {
background: transparent;
color: #50fa7b;
}
Script
profile="$(sudo system76-power profile | sed -z '$ s/\n$//' | tr '\n' '\r')"
graphics="$(sudo system76-power graphics)"
graphicsPower="$(sudo system76-power graphics power)"
chargeThresholds="$(sudo system76-power charge-thresholds | sed -z '$ s/\n$//' | tr '\n' '\r')"
echo '{"text":" '$graphics'","tooltip":"\t'$graphics'\r\t'$graphicsPower'\r\r Profile\r'$profile'\r\r Charge Thresholds\r'$chargeThresholds'"}'
Tray
Configuration
"tray": {
"icon-size": 21,
"show-passive-items": true,
"spacing": 4,
"reverse-direction": false,
},
Styling
#tray {
background: transparent;
padding: 0px 10px;
}
End Configuration
}
Toggle Script
if systemctl --user is-active waybar.service; then
systemctl --user stop waybar.service
else
systemctl --user start waybar.service
fi