summaryrefslogtreecommitdiff
path: root/dotfiles/hyprland
diff options
context:
space:
mode:
Diffstat (limited to 'dotfiles/hyprland')
-rw-r--r--dotfiles/hyprland/.config/foot/foot.ini38
-rw-r--r--dotfiles/hyprland/.config/fuzzel/fuzzel.ini31
-rw-r--r--dotfiles/hyprland/.config/hypr/hyprland.conf188
-rw-r--r--dotfiles/hyprland/.config/hypr/hyprlock.conf78
-rw-r--r--dotfiles/hyprland/.config/themes/dupre/Xresources105
-rw-r--r--dotfiles/hyprland/.config/themes/dupre/dunstrc72
-rw-r--r--dotfiles/hyprland/.config/themes/dupre/foot.ini38
-rw-r--r--dotfiles/hyprland/.config/themes/dupre/fuzzel.ini31
-rw-r--r--dotfiles/hyprland/.config/themes/dupre/hyprland.conf7
-rw-r--r--dotfiles/hyprland/.config/themes/dupre/hyprlock.conf94
-rw-r--r--dotfiles/hyprland/.config/themes/dupre/waybar.css111
-rw-r--r--dotfiles/hyprland/.config/themes/hudson/Xresources105
-rw-r--r--dotfiles/hyprland/.config/themes/hudson/dunstrc72
-rw-r--r--dotfiles/hyprland/.config/themes/hudson/foot.ini38
-rw-r--r--dotfiles/hyprland/.config/themes/hudson/fuzzel.ini31
-rw-r--r--dotfiles/hyprland/.config/themes/hudson/hyprland.conf7
-rw-r--r--dotfiles/hyprland/.config/themes/hudson/hyprlock.conf94
-rw-r--r--dotfiles/hyprland/.config/themes/hudson/waybar.css111
-rw-r--r--dotfiles/hyprland/.config/waybar/config116
-rw-r--r--dotfiles/hyprland/.config/waybar/style.css97
-rw-r--r--dotfiles/hyprland/.gnupg/gpg-agent.conf18
-rwxr-xr-xdotfiles/hyprland/.local/bin/cycle-layout29
-rwxr-xr-xdotfiles/hyprland/.local/bin/layout-navigate59
-rwxr-xr-xdotfiles/hyprland/.local/bin/pinentry-fuzzel107
-rwxr-xr-xdotfiles/hyprland/.local/bin/set-theme124
-rwxr-xr-xdotfiles/hyprland/.local/bin/toggle-scratchpad29
-rwxr-xr-xdotfiles/hyprland/.local/bin/waybar-layout36
-rwxr-xr-xdotfiles/hyprland/.local/bin/waybar-netspeed67
28 files changed, 1778 insertions, 155 deletions
diff --git a/dotfiles/hyprland/.config/foot/foot.ini b/dotfiles/hyprland/.config/foot/foot.ini
new file mode 100644
index 0000000..a96778c
--- /dev/null
+++ b/dotfiles/hyprland/.config/foot/foot.ini
@@ -0,0 +1,38 @@
+# foot terminal configuration
+# Minimal config matching DWM color scheme
+
+[main]
+term=xterm-256color
+font=Berkeley Mono:size=14
+pad=8x8
+
+[scrollback]
+lines=10000
+
+[colors]
+# DWM-inspired colors: gray1=#222222, gray2=#444444, gray3=#bbbbbb, gray4=#eeeeee, cyan=#daa520
+background=222222
+foreground=eeeeee
+
+# Regular colors (0-7)
+regular0=222222 # black
+regular1=cc6666 # red
+regular2=b5bd68 # green
+regular3=f0c674 # yellow
+regular4=81a2be # blue
+regular5=b294bb # magenta
+regular6=8abeb7 # cyan
+regular7=c5c8c6 # white
+
+# Bright colors (8-15)
+bright0=444444 # bright black
+bright1=d54e53 # bright red
+bright2=b9ca4a # bright green
+bright3=e7c547 # bright yellow
+bright4=7aa6da # bright blue
+bright5=c397d8 # bright magenta
+bright6=70c0b1 # bright cyan
+bright7=eeeeee # bright white
+
+# Cursor: background foreground (golden on dark)
+cursor=222222 daa520
diff --git a/dotfiles/hyprland/.config/fuzzel/fuzzel.ini b/dotfiles/hyprland/.config/fuzzel/fuzzel.ini
new file mode 100644
index 0000000..ce46448
--- /dev/null
+++ b/dotfiles/hyprland/.config/fuzzel/fuzzel.ini
@@ -0,0 +1,31 @@
+# Fuzzel config - matching waybar DWM-inspired theme
+# Colors from waybar: bg=#222222, cpu=#bbbbbb, clock=#eeeeee, accent=#daa520
+
+[main]
+font=BerkeleyMono Nerd Font:size=14
+prompt=Search:
+icon-theme=hicolor
+icons-enabled=yes
+width=30
+lines=12
+horizontal-pad=20
+vertical-pad=12
+inner-pad=8
+layer=overlay
+exit-on-keyboard-focus-loss=yes
+
+[colors]
+# Format: RRGGBBAA
+background=222222f0
+text=eeeeeeff
+selection=daa520ff
+selection-text=222222ff
+border=daa520ff
+match=daa520ff
+prompt=bbbbbbff
+placeholder=888888ff
+input=eeeeeeff
+
+[border]
+width=2
+radius=16
diff --git a/dotfiles/hyprland/.config/hypr/hyprland.conf b/dotfiles/hyprland/.config/hypr/hyprland.conf
index ce45088..a63a535 100644
--- a/dotfiles/hyprland/.config/hypr/hyprland.conf
+++ b/dotfiles/hyprland/.config/hypr/hyprland.conf
@@ -10,12 +10,12 @@ monitor=,preferred,auto,auto
# ============================================================================
# Startup Applications
# ============================================================================
+exec-once = hyprpm reload
exec-once = waybar
exec-once = swww-daemon && sleep 1 && swww img ~/pictures/wallpaper/dark-lion.jpg
exec-once = dunst
exec-once = hypridle
exec-once = gammastep
-exec-once = nm-applet
exec-once = blueman-applet
exec-once = /usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh
exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
@@ -39,8 +39,8 @@ env = _JAVA_AWT_WM_NONREPARENTING,1
# DWM colors: gray1=#222222, gray2=#444444, gray3=#bbbbbb, gray4=#eeeeee, cyan=#daa520
general {
- gaps_in = 5
- gaps_out = 10
+ gaps_in = 25
+ gaps_out = 30
border_size = 3
col.active_border = rgba(daa520ff)
col.inactive_border = rgba(444444ff)
@@ -49,7 +49,7 @@ general {
}
decoration {
- rounding = 0
+ rounding = 10
blur {
enabled = false
}
@@ -65,6 +65,7 @@ animations {
animation = windowsOut, 1, 3, default, popin 80%
animation = fade, 1, 3, default
animation = workspaces, 1, 3, default
+ animation = specialWorkspace, 1, 3, default, slidevert
}
# ============================================================================
@@ -86,7 +87,7 @@ dwindle {
input {
kb_layout = us
kb_options = ctrl:nocaps
- follow_mouse = 1
+ follow_mouse = 0
touchpad {
natural_scroll = true
}
@@ -108,15 +109,15 @@ xwayland {
}
# ============================================================================
-# Window Rules
+# Window Rules (Hyprland 0.53+ syntax: match:CONDITION, RULE)
# ============================================================================
# Floating windows (from DWM rules)
-windowrulev2 = float, class:^(Gimp)$
-windowrulev2 = float, class:^(caffeine)$
-windowrulev2 = float, class:^(blueman-services)$
-windowrulev2 = float, class:^(Blueman-manager)$
-windowrulev2 = float, class:^(qalculate-gtk)$
-windowrulev2 = float, title:^(Event Tester)$
+windowrule = match:class ^(Gimp)$, float on
+windowrule = match:class ^(caffeine)$, float on
+windowrule = match:class ^(blueman-services)$, float on
+windowrule = match:class ^(Blueman-manager)$, float on
+windowrule = match:class ^(qalculate-gtk)$, float on
+windowrule = match:title ^(Event Tester)$, float on
# ============================================================================
# Key Bindings
@@ -124,36 +125,43 @@ windowrulev2 = float, title:^(Event Tester)$
$mod = SUPER
# Terminal and core apps (from DWM)
-bind = $mod, T, exec, st
+bind = $mod, T, exec, foot
bind = $mod, E, exec, emacsclient -c -a "" || emacs
bind = $mod, W, exec, $BROWSER
-bind = $mod, P, exec, wofi --show drun
+bind = $mod, P, exec, fuzzel
# From sxhkdrc
-bind = $mod, SPACE, exec, wofi --show drun
-bind = $mod SHIFT, S, exec, wofi --show ssh
+bind = $mod, SPACE, exec, fuzzel
bind = $mod SHIFT, W, exec, $ALTBROWSER
bind = CTRL ALT, W, exec, tor-browser
bind = CTRL ALT, F, exec, thunar
bind = $mod, V, exec, virtualbox
bind = $mod SHIFT, L, exec, calibre
bind = $mod SHIFT, R, exec, shortwave
+bind = $mod SHIFT, P, exec, waypaper
+
+# Theme switching
+bind = $mod, Y, exec, set-theme --toggle
+bind = $mod SHIFT, Y, exec, set-theme --pick
# Window management (from DWM)
-bind = $mod, J, layoutmsg, cyclenext
-bind = $mod, K, layoutmsg, cycleprev
-bind = $mod SHIFT, J, layoutmsg, swapnext
-bind = $mod SHIFT, K, layoutmsg, swapprev
-bind = $mod, H, resizeactive, -50 0
-bind = $mod, L, resizeactive, 50 0
-bind = $mod, RETURN, layoutmsg, swapwithmaster
+# Layout-aware navigation (works across master, scrolling, hy3)
+bind = $mod, J, exec, layout-navigate next
+bind = $mod, K, exec, layout-navigate prev
+bind = $mod SHIFT, J, exec, layout-navigate next move
+bind = $mod SHIFT, K, exec, layout-navigate prev move
+bind = $mod, H, splitratio, -0.05
+bind = $mod, L, splitratio, +0.05
+bind = $mod, RETURN, layoutmsg, swapwithmaster master
bind = $mod, G, centerwindow
bind = $mod, TAB, workspace, previous
bind = $mod SHIFT, C, killactive
-# Layouts (from DWM)
-bind = $mod SHIFT, M, exec, hyprctl keyword general:layout master
-bind = $mod SHIFT, T, exec, hyprctl keyword general:layout master
+# Layouts: master -> tab group (monocle) -> scrolling -> floating
+# Click waybar layout icon to cycle, or use direct keybindings:
+bind = $mod SHIFT, T, exec, hyprctl keyword general:layout master && hyprctl keyword master:orientation left
+bind = $mod SHIFT, M, exec, hyprctl keyword general:layout hy3 && hyprctl dispatch hy3:changegroup tab
+bind = $mod SHIFT, S, exec, hyprctl keyword general:layout scrolling
bind = $mod SHIFT, F, togglefloating
bind = $mod SHIFT, SPACE, togglefloating
@@ -161,10 +169,17 @@ bind = $mod SHIFT, SPACE, togglefloating
bind = $mod, I, layoutmsg, addmaster
bind = $mod, D, layoutmsg, removemaster
+# Focus mode (xtra-dispatchers plugin)
+# O = "Only this window" / "bring back Others" / "close Others"
+bind = $mod, O, exec, hyprctl dispatch plugin:xtd:throwunfocused 10
+bind = $mod SHIFT, O, exec, hyprctl dispatch plugin:xtd:bringallfrom 10
+bind = $mod CTRL, O, exec, hyprctl dispatch plugin:xtd:closeunfocused
+
# Gaps (from DWM)
-bind = $mod, MINUS, exec, hyprctl keyword general:gaps_out $(( $(hyprctl getoption general:gaps_out -j | jq '.int') - 5 ))
-bind = $mod, EQUAL, exec, hyprctl keyword general:gaps_out $(( $(hyprctl getoption general:gaps_out -j | jq '.int') + 5 ))
-bind = $mod SHIFT, EQUAL, exec, hyprctl keyword general:gaps_out 10
+bind = $mod, MINUS, exec, hyprctl keyword general:gaps_out $(( $(hyprctl getoption general:gaps_out -j | jq -r '.custom' | cut -d' ' -f1) - 5 )) && hyprctl keyword general:gaps_in $(( $(hyprctl getoption general:gaps_in -j | jq -r '.custom' | cut -d' ' -f1) - 5 ))
+bind = $mod, EQUAL, exec, hyprctl keyword general:gaps_out $(( $(hyprctl getoption general:gaps_out -j | jq -r '.custom' | cut -d' ' -f1) + 5 )) && hyprctl keyword general:gaps_in $(( $(hyprctl getoption general:gaps_in -j | jq -r '.custom' | cut -d' ' -f1) + 5 ))
+bind = $mod SHIFT, EQUAL, exec, hyprctl keyword general:gaps_out 30 && hyprctl keyword general:gaps_in 25
+bind = $mod SHIFT, MINUS, exec, hyprctl keyword general:gaps_out 0 && hyprctl keyword general:gaps_in 0
# Toggle bar
bind = $mod, B, exec, killall -SIGUSR1 waybar
@@ -185,16 +200,16 @@ bind = $mod, 9, workspace, 9
bind = $mod, 0, workspace, 10
# Move window to workspace (from DWM tag)
-bind = $mod SHIFT, 1, movetoworkspace, 1
-bind = $mod SHIFT, 2, movetoworkspace, 2
-bind = $mod SHIFT, 3, movetoworkspace, 3
-bind = $mod SHIFT, 4, movetoworkspace, 4
-bind = $mod SHIFT, 5, movetoworkspace, 5
-bind = $mod SHIFT, 6, movetoworkspace, 6
-bind = $mod SHIFT, 7, movetoworkspace, 7
-bind = $mod SHIFT, 8, movetoworkspace, 8
-bind = $mod SHIFT, 9, movetoworkspace, 9
-bind = $mod SHIFT, 0, movetoworkspace, 10
+bind = $mod SHIFT, 1, movetoworkspacesilent, 1
+bind = $mod SHIFT, 2, movetoworkspacesilent, 2
+bind = $mod SHIFT, 3, movetoworkspacesilent, 3
+bind = $mod SHIFT, 4, movetoworkspacesilent, 4
+bind = $mod SHIFT, 5, movetoworkspacesilent, 5
+bind = $mod SHIFT, 6, movetoworkspacesilent, 6
+bind = $mod SHIFT, 7, movetoworkspacesilent, 7
+bind = $mod SHIFT, 8, movetoworkspacesilent, 8
+bind = $mod SHIFT, 9, movetoworkspacesilent, 9
+bind = $mod SHIFT, 0, movetoworkspacesilent, 10
# Monitor focus (from DWM focusmon)
bind = $mod, COMMA, focusmonitor, -1
@@ -202,54 +217,69 @@ bind = $mod, PERIOD, focusmonitor, +1
bind = $mod SHIFT, COMMA, movewindow, mon:-1
bind = $mod SHIFT, PERIOD, movewindow, mon:+1
+# ============================================================================
# Scratchpads (from DWM togglescratch)
-# Audio mixer (was MODKEY+a -> spaudio/pulsemixer)
+# ============================================================================
+# Using on-created-empty workspace rules - app launches on first toggle,
+# subsequent toggles just show/hide the workspace
+
+# Workspace rules (auto-launch apps when workspace first accessed)
+workspace = special:term, on-created-empty:foot --app-id foot-term tmux
+workspace = special:audio, on-created-empty:foot --app-id foot-audio pulsemixer
+workspace = special:monitor, on-created-empty:foot --app-id foot-monitor gotop
+workspace = special:music, on-created-empty:foot --app-id foot-music ncmpcpp
+workspace = special:files, on-created-empty:foot --app-id foot-files ranger
+workspace = special:htop, on-created-empty:foot --app-id foot-htop htop
+workspace = special:network, on-created-empty:foot --app-id foot-network nmtui
+
+# Keybindings (single bind per scratchpad - just toggle visibility)
+bind = $mod SHIFT, RETURN, togglespecialworkspace, term
bind = $mod, A, togglespecialworkspace, audio
-bind = $mod, A, exec, [workspace special:audio] pgrep -x pulsemixer || st -n spaudio -e pulsemixer
-windowrulev2 = float, class:^(st)$, title:^(spaudio)$
-windowrulev2 = size 60% 60%, class:^(st)$, title:^(spaudio)$
-windowrulev2 = center, class:^(st)$, title:^(spaudio)$
-windowrulev2 = workspace special:audio, class:^(st)$, title:^(spaudio)$
-
-# System monitor (was MODKEY+m -> spmon/gotop)
bind = $mod, M, togglespecialworkspace, monitor
-bind = $mod, M, exec, [workspace special:monitor] pgrep -x gotop || st -n spmon -e gotop
-windowrulev2 = float, class:^(st)$, title:^(spmon)$
-windowrulev2 = size 60% 60%, class:^(st)$, title:^(spmon)$
-windowrulev2 = workspace special:monitor, class:^(st)$, title:^(spmon)$
-
-# Music player (was MODKEY+slash -> spmp/ncmpcpp)
bind = $mod, SLASH, togglespecialworkspace, music
-bind = $mod, SLASH, exec, [workspace special:music] pgrep -x ncmpcpp || st -n spmp -e ncmpcpp
-windowrulev2 = float, class:^(st)$, title:^(spmp)$
-windowrulev2 = size 60% 60%, class:^(st)$, title:^(spmp)$
-windowrulev2 = workspace special:music, class:^(st)$, title:^(spmp)$
-
-# Terminal scratchpad (was MODKEY+Shift+Return -> spterm/tmux)
-bind = $mod SHIFT, RETURN, togglespecialworkspace, term
-bind = $mod SHIFT, RETURN, exec, [workspace special:term] pgrep -f "st.*spterm" || st -n spterm -e tmux
-windowrulev2 = float, class:^(st)$, title:^(spterm)$
-windowrulev2 = size 60% 60%, class:^(st)$, title:^(spterm)$
-windowrulev2 = workspace special:term, class:^(st)$, title:^(spterm)$
-
-# File manager (was MODKEY+f -> spfm/ranger)
bind = $mod, F, togglespecialworkspace, files
-bind = $mod, F, exec, [workspace special:files] pgrep -x ranger || st -n spfm -e ranger
-windowrulev2 = float, class:^(st)$, title:^(spfm)$
-windowrulev2 = size 60% 60%, class:^(st)$, title:^(spfm)$
-windowrulev2 = workspace special:files, class:^(st)$, title:^(spfm)$
+bind = $mod SHIFT, H, togglespecialworkspace, htop
-# Calculator (was MODKEY+x or MODKEY+c -> qalculate)
+# Window rules (using app-id/class matching, Hyprland 0.53+ syntax)
+# Terminal scratchpad
+windowrule = match:class ^(foot-term)$, float on
+windowrule = match:class ^(foot-term)$, size (monitor_w*0.6) (monitor_h*0.6)
+windowrule = match:class ^(foot-term)$, center on
+
+# Audio mixer
+windowrule = match:class ^(foot-audio)$, float on
+windowrule = match:class ^(foot-audio)$, size (monitor_w*0.6) (monitor_h*0.6)
+windowrule = match:class ^(foot-audio)$, center on
+
+# System monitor
+windowrule = match:class ^(foot-monitor)$, float on
+windowrule = match:class ^(foot-monitor)$, size (monitor_w*0.6) (monitor_h*0.6)
+windowrule = match:class ^(foot-monitor)$, center on
+
+# Music player
+windowrule = match:class ^(foot-music)$, float on
+windowrule = match:class ^(foot-music)$, size (monitor_w*0.6) (monitor_h*0.6)
+windowrule = match:class ^(foot-music)$, center on
+
+# File manager
+windowrule = match:class ^(foot-files)$, float on
+windowrule = match:class ^(foot-files)$, size (monitor_w*0.6) (monitor_h*0.6)
+windowrule = match:class ^(foot-files)$, center on
+
+# Htop
+windowrule = match:class ^(foot-htop)$, float on
+windowrule = match:class ^(foot-htop)$, size (monitor_w*0.6) (monitor_h*0.6)
+windowrule = match:class ^(foot-htop)$, center on
+
+# Network manager
+windowrule = match:class ^(foot-network)$, float on
+windowrule = match:class ^(foot-network)$, size (monitor_w*0.6) (monitor_h*0.6)
+windowrule = match:class ^(foot-network)$, center on
+
+# Calculator (not a scratchpad, just launches app)
bind = $mod, X, exec, qalculate-gtk
bind = $mod, C, exec, qalculate-gtk
-# Htop (was MODKEY+Shift+h -> sptop/htop)
-bind = $mod SHIFT, H, togglespecialworkspace, htop
-bind = $mod SHIFT, H, exec, [workspace special:htop] pgrep -x htop || st -n sptop -e htop
-windowrulev2 = float, class:^(st)$, title:^(sptop)$
-windowrulev2 = size 60% 60%, class:^(st)$, title:^(sptop)$
-windowrulev2 = workspace special:htop, class:^(st)$, title:^(sptop)$
-
# Media/hardware keys
bindel = , XF86AudioRaiseVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ +5%
bindel = , XF86AudioLowerVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ -5%
@@ -277,7 +307,7 @@ bind = $mod, ESCAPE, exec, hyprlock
bind = $mod, F9, exec, toggle-touchpad
# Exit/session (from DWM)
-bind = $mod SHIFT, Q, exec, wofi --show dmenu --prompt "Exit?" -D dmenu/exit="0" < /dev/null && hyprctl dispatch exit
+bind = $mod SHIFT, Q, exec, printf "Exit\nCancel" | fuzzel --dmenu --prompt "Exit Hyprland? " | grep -q "Exit" && hyprctl dispatch exit
bind = $mod SHIFT, BACKSPACE, exit
bind = $mod SHIFT, ESCAPE, exec, hyprctl reload
diff --git a/dotfiles/hyprland/.config/hypr/hyprlock.conf b/dotfiles/hyprland/.config/hypr/hyprlock.conf
index b4dcfb8..4f1c5df 100644
--- a/dotfiles/hyprland/.config/hypr/hyprlock.conf
+++ b/dotfiles/hyprland/.config/hypr/hyprlock.conf
@@ -1,5 +1,6 @@
# Hyprlock configuration
# Matching DWM colors: gray1=#222222, accent=#daa520
+# Using percentages for proportional sizing across monitors
general {
disable_loading_bar = false
@@ -20,22 +21,65 @@ background {
vibrancy_darkness = 0.0
}
+# Clock (top)
+label {
+ monitor =
+ text = $TIME12
+ text_align = center
+ color = rgb(bbbbbb)
+ font_size = 64
+ font_family = BerkeleyMono Nerd Font
+ position = 0, 15%
+ halign = center
+ valign = center
+}
+
+# Profile image
+image {
+ monitor =
+ path = ~/pictures/devilman.jpg
+ size = 120
+ rounding = -1
+ border_size = 3
+ border_color = rgb(daa520)
+ position = 0, 0%
+ halign = center
+ valign = center
+ shadow_passes = 2
+ shadow_size = 3
+ shadow_color = rgba(0, 0, 0, 0.5)
+}
+
+# Username
+label {
+ monitor =
+ text = $USER
+ text_align = center
+ color = rgb(daa520)
+ font_size = 36
+ font_family = BerkeleyMono Nerd Font
+ position = 0, -7%
+ halign = center
+ valign = center
+}
+
+# Password input (no outline)
input-field {
monitor =
- size = 300, 50
- outline_thickness = 3
+ size = 20%, 4%
+ outline_thickness = 0
dots_size = 0.33
dots_spacing = 0.15
dots_center = true
dots_rounding = -1
- outer_color = rgb(444444)
+ outer_color = rgb(222222)
inner_color = rgb(222222)
font_color = rgb(bbbbbb)
fade_on_empty = true
fade_timeout = 1000
placeholder_text = <i>Password...</i>
hide_input = false
- rounding = 0
+ rounding = 8
check_color = rgb(daa520)
fail_color = rgb(d9534f)
fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i>
@@ -45,31 +89,7 @@ input-field {
bothlock_color = -1
invert_numlock = false
swap_font_color = false
- position = 0, -20
- halign = center
- valign = center
-}
-
-label {
- monitor =
- text = $TIME
- text_align = center
- color = rgb(bbbbbb)
- font_size = 64
- font_family = FiraCode Nerd Font Mono
- position = 0, 80
- halign = center
- valign = center
-}
-
-label {
- monitor =
- text = $USER
- text_align = center
- color = rgb(daa520)
- font_size = 20
- font_family = FiraCode Nerd Font Mono
- position = 0, -80
+ position = 0, -12%
halign = center
valign = center
}
diff --git a/dotfiles/hyprland/.config/themes/dupre/Xresources b/dotfiles/hyprland/.config/themes/dupre/Xresources
new file mode 100644
index 0000000..d149a72
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/dupre/Xresources
@@ -0,0 +1,105 @@
+!! X Resources - Dupre theme
+!! Warm, earthy colors from dupre-theme.el
+!! For X11 applications (st, xterm, etc.) and Emacs
+
+!! X Font Settings
+Xft.dpi: 109
+Xcursor.size: 32
+Xcursor.theme: Vimix-white-cursors
+Xft.autohint: 0
+Xft.lcdfilter: lcddefault
+Xft.hintstyle: hintfull
+Xft.hinting: 1
+Xft.antialias: 1
+Xft.rgba: rgb
+
+!! Emacs
+Emacs*toolBar: 0
+
+!! ============================================================================
+!! Dupre Theme Colors
+!! ============================================================================
+
+#define dupre_fg #f0fef0
+#define dupre_bg #151311
+#define dupre_black #252321
+#define dupre_red #d47c59
+#define dupre_green #a4ac64
+#define dupre_yellow #d7af5f
+#define dupre_blue #67809c
+#define dupre_magenta #b294bb
+#define dupre_cyan #8a9496
+#define dupre_white #d0cbc0
+#define dupre_br_black #474544
+#define dupre_br_red #edb08f
+#define dupre_br_green #ccc768
+#define dupre_br_yellow #ffd75f
+#define dupre_br_blue #b2c3cc
+#define dupre_br_magenta #c397d8
+#define dupre_br_cyan #acb0b3
+#define dupre_br_white #f0fef0
+
+!! Active theme aliases
+#define theme_fg dupre_fg
+#define theme_bg dupre_bg
+#define theme_black dupre_black
+#define theme_red dupre_red
+#define theme_green dupre_green
+#define theme_yellow dupre_yellow
+#define theme_blue dupre_blue
+#define theme_magenta dupre_magenta
+#define theme_cyan dupre_cyan
+#define theme_white dupre_white
+#define theme_br_black dupre_br_black
+#define theme_br_red dupre_br_red
+#define theme_br_green dupre_br_green
+#define theme_br_yellow dupre_br_yellow
+#define theme_br_blue dupre_br_blue
+#define theme_br_magenta dupre_br_magenta
+#define theme_br_cyan dupre_br_cyan
+#define theme_br_white dupre_br_white
+
+!! ============================================================================
+
+!! ST (suckless terminal) settings
+st.font: BerkeleyMono Nerd Font:size=12
+st.background: theme_bg
+st.foreground: theme_fg
+st.color0: theme_black
+st.color1: theme_red
+st.color2: theme_green
+st.color3: theme_yellow
+st.color4: theme_blue
+st.color5: theme_magenta
+st.color6: theme_cyan
+st.color7: theme_white
+st.color8: theme_br_black
+st.color9: theme_br_red
+st.color10: theme_br_green
+st.color11: theme_br_yellow
+st.color12: theme_br_blue
+st.color13: theme_br_magenta
+st.color14: theme_br_cyan
+st.color15: theme_br_white
+
+!! XTerm settings
+XTerm*faceName: BerkeleyMono Nerd Font:size=12
+XTerm*selectToClipboard: true
+XTerm*background: theme_bg
+XTerm*foreground: theme_fg
+XTerm*color0: theme_black
+XTerm*color1: theme_red
+XTerm*color2: theme_green
+XTerm*color3: theme_yellow
+XTerm*color4: theme_blue
+XTerm*color5: theme_magenta
+XTerm*color6: theme_cyan
+XTerm*color7: theme_white
+XTerm*color8: theme_br_black
+XTerm*color9: theme_br_red
+XTerm*color10: theme_br_green
+XTerm*color11: theme_br_yellow
+XTerm*color12: theme_br_blue
+XTerm*color13: theme_br_magenta
+XTerm*color14: theme_br_cyan
+XTerm*color15: theme_br_white
diff --git a/dotfiles/hyprland/.config/themes/dupre/dunstrc b/dotfiles/hyprland/.config/themes/dupre/dunstrc
new file mode 100644
index 0000000..104df28
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/dupre/dunstrc
@@ -0,0 +1,72 @@
+# Dunst config - Dupre theme
+# Warm, earthy colors from dupre-theme.el
+
+[global]
+# Display
+follow = mouse
+width = 350
+height = (0, 300)
+origin = top-right
+offset = (35, 35)
+indicate_hidden = yes
+notification_limit = 5
+gap_size = 12
+padding = 12
+horizontal_padding = 20
+frame_width = 2
+sort = no
+corner_radius = 10
+
+# Progress bar
+progress_bar_frame_width = 0
+progress_bar_corner_radius = 3
+
+# Colors - Dupre theme
+foreground = "#f0fef0"
+frame_color = "#d7af5f"
+highlight = "#d7af5f, #ccc768"
+
+# Text
+font = BerkeleyMono Nerd Font 11
+markup = full
+format = "<small>%a</small>\n<b>%s</b>\n%b"
+alignment = left
+vertical_alignment = center
+show_age_threshold = -1
+hide_duplicate_count = false
+
+# Icon
+icon_position = left
+min_icon_size = 54
+max_icon_size = 80
+icon_corner_radius = 4
+
+# Misc/Advanced
+dmenu = fuzzel --dmenu --prompt 'Open with'
+
+# Mouse
+mouse_left_click = close_current
+mouse_middle_click = do_action, close_current
+mouse_right_click = close_all
+
+[urgency_low]
+background = "#151311f0"
+timeout = 3
+
+[urgency_normal]
+background = "#151311f0"
+timeout = 8
+
+[urgency_critical]
+background = "#7c2a09f0"
+frame_color = "#d47c59"
+highlight = "#ff2a00"
+foreground = "#f0fef0"
+timeout = 0
+
+[fullscreen_delay_everything]
+fullscreen = delay
+
+[fullscreen_show_critical]
+msg_urgency = critical
+fullscreen = show
diff --git a/dotfiles/hyprland/.config/themes/dupre/foot.ini b/dotfiles/hyprland/.config/themes/dupre/foot.ini
new file mode 100644
index 0000000..8837f92
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/dupre/foot.ini
@@ -0,0 +1,38 @@
+# foot terminal configuration - Dupre theme
+# Warm, earthy colors from dupre-theme.el
+
+[main]
+term=xterm-256color
+font=Berkeley Mono:size=14
+pad=8x8
+
+[scrollback]
+lines=10000
+
+[colors]
+# Dupre theme colors (from Emacs dupre-theme.el)
+background=151311
+foreground=f0fef0
+
+# Regular colors (0-7) - dupre palette
+regular0=252321 # black (dupre-bg+1)
+regular1=d47c59 # red (dupre-red)
+regular2=a4ac64 # green (dupre-green)
+regular3=d7af5f # yellow (dupre-yellow)
+regular4=67809c # blue (dupre-blue)
+regular5=b294bb # magenta
+regular6=8a9496 # cyan (dupre-steel)
+regular7=d0cbc0 # white (dupre-gray+2)
+
+# Bright colors (8-15)
+bright0=474544 # bright black (dupre-bg+2)
+bright1=edb08f # bright red (dupre-red+1)
+bright2=ccc768 # bright green (dupre-green+1)
+bright3=ffd75f # bright yellow (dupre-yellow+1)
+bright4=b2c3cc # bright blue (dupre-blue+1)
+bright5=c397d8 # bright magenta
+bright6=acb0b3 # bright cyan (dupre-steel+1)
+bright7=f0fef0 # bright white (dupre-fg)
+
+# Cursor: muted gold on dark
+cursor=151311 d7af5f
diff --git a/dotfiles/hyprland/.config/themes/dupre/fuzzel.ini b/dotfiles/hyprland/.config/themes/dupre/fuzzel.ini
new file mode 100644
index 0000000..64711b8
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/dupre/fuzzel.ini
@@ -0,0 +1,31 @@
+# Fuzzel config - Dupre theme
+# Warm, earthy colors from dupre-theme.el
+
+[main]
+font=BerkeleyMono Nerd Font:size=14
+prompt=Search:
+icon-theme=hicolor
+icons-enabled=yes
+width=30
+lines=12
+horizontal-pad=20
+vertical-pad=12
+inner-pad=8
+layer=overlay
+exit-on-keyboard-focus-loss=yes
+
+[colors]
+# Format: RRGGBBAA
+background=151311f0
+text=f0fef0ff
+selection=d7af5fff
+selection-text=151311ff
+border=d7af5fff
+match=d7af5fff
+prompt=969385ff
+placeholder=6c6a60ff
+input=f0fef0ff
+
+[border]
+width=2
+radius=16
diff --git a/dotfiles/hyprland/.config/themes/dupre/hyprland.conf b/dotfiles/hyprland/.config/themes/dupre/hyprland.conf
new file mode 100644
index 0000000..b9313ff
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/dupre/hyprland.conf
@@ -0,0 +1,7 @@
+# Hyprland colors - Dupre theme
+# Warm, earthy colors from dupre-theme.el
+
+general {
+ col.active_border = rgba(d7af5fff)
+ col.inactive_border = rgba(474544ff)
+}
diff --git a/dotfiles/hyprland/.config/themes/dupre/hyprlock.conf b/dotfiles/hyprland/.config/themes/dupre/hyprlock.conf
new file mode 100644
index 0000000..fd85651
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/dupre/hyprlock.conf
@@ -0,0 +1,94 @@
+# Hyprlock configuration - Dupre theme
+# Warm, earthy colors from dupre-theme.el
+
+general {
+ disable_loading_bar = false
+ hide_cursor = true
+ grace = 0
+ no_fade_in = false
+}
+
+background {
+ monitor =
+ path = screenshot
+ blur_passes = 3
+ blur_size = 8
+ noise = 0.0117
+ contrast = 0.8916
+ brightness = 0.8172
+ vibrancy = 0.1696
+ vibrancy_darkness = 0.0
+}
+
+# Clock (top)
+label {
+ monitor =
+ text = $TIME12
+ text_align = center
+ color = rgb(969385)
+ font_size = 64
+ font_family = BerkeleyMono Nerd Font
+ position = 0, 15%
+ halign = center
+ valign = center
+}
+
+# Profile image
+image {
+ monitor =
+ path = ~/pictures/devilman.jpg
+ size = 120
+ rounding = -1
+ border_size = 3
+ border_color = rgb(d7af5f)
+ position = 0, 0%
+ halign = center
+ valign = center
+ shadow_passes = 2
+ shadow_size = 3
+ shadow_color = rgba(0, 0, 0, 0.5)
+}
+
+# Username
+label {
+ monitor =
+ text = $USER
+ text_align = center
+ color = rgb(d7af5f)
+ font_size = 36
+ font_family = BerkeleyMono Nerd Font
+ position = 0, -7%
+ halign = center
+ valign = center
+}
+
+# Password input
+input-field {
+ monitor =
+ size = 20%, 4%
+ outline_thickness = 0
+ dots_size = 0.33
+ dots_spacing = 0.15
+ dots_center = true
+ dots_rounding = -1
+ outer_color = rgb(151311)
+ inner_color = rgb(151311)
+ font_color = rgb(969385)
+ fade_on_empty = true
+ fade_timeout = 1000
+ placeholder_text = <i>Password...</i>
+ hide_input = false
+ rounding = 8
+ check_color = rgb(d7af5f)
+ fail_color = rgb(d47c59)
+ fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i>
+ fail_transition = 300
+ capslock_color = rgb(ccc768)
+ numlock_color = -1
+ bothlock_color = -1
+ invert_numlock = false
+ swap_font_color = false
+ position = 0, -12%
+ halign = center
+ valign = center
+}
diff --git a/dotfiles/hyprland/.config/themes/dupre/waybar.css b/dotfiles/hyprland/.config/themes/dupre/waybar.css
new file mode 100644
index 0000000..4bd0052
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/dupre/waybar.css
@@ -0,0 +1,111 @@
+/* Waybar style - Dupre theme */
+/* Warm, earthy colors from dupre-theme.el */
+
+* {
+ border: none;
+ border-radius: 0;
+ font-size: 14px;
+ min-height: 0;
+ font-family: "BerkeleyMono Nerd Font", "Berkeley Mono", monospace;
+}
+
+window#waybar {
+ background: transparent;
+}
+
+#workspaces {
+ padding: 0.2rem;
+}
+
+#workspaces button {
+ padding: 0.5rem;
+ margin: 0.2rem;
+ background-color: transparent;
+ color: #969385;
+ border-radius: 1rem;
+ transition: all 0.3s ease;
+}
+
+#workspaces button.active {
+ background: #d7af5f;
+ color: #151311;
+ border-radius: 1rem;
+}
+
+#workspaces button.urgent {
+ background-color: rgba(212, 124, 89, 0.4);
+}
+
+.modules-right, .modules-left {
+ background-color: #151311;
+ border-radius: 1rem;
+ padding: 0.2rem 0.6rem;
+ margin: 0.3rem;
+ border: 0.095rem solid #d7af5f;
+ box-shadow: 0rem 0.2rem 0.4rem rgba(0,0,0,0.5);
+}
+
+#cpu,
+#temperature,
+#memory,
+#disk,
+#custom-netspeed,
+#battery,
+#wireplumber,
+#tray,
+#clock,
+#custom-layout,
+#window {
+ padding: 0.4rem;
+ margin: 0.3rem;
+ color: #969385;
+ background-color: transparent;
+ border-radius: 1rem;
+}
+
+#sysmonitor {
+ margin: 0.3rem;
+ background-color: transparent;
+ border-radius: 1rem;
+}
+
+#cpu:hover,
+#temperature:hover,
+#memory:hover,
+#disk:hover,
+#custom-netspeed:hover,
+#wireplumber:hover,
+#sysmonitor:hover,
+#custom-layout:hover {
+ background-color: #474544;
+ border-radius: 1rem;
+}
+
+#clock {
+ color: #f0fef0;
+}
+
+#wireplumber {
+ color: #969385;
+}
+
+#wireplumber.muted {
+ color: #58574e;
+}
+
+#battery.warning {
+ color: #d7af5f;
+}
+
+#battery.critical {
+ color: #d47c59;
+}
+
+#tray > .passive {
+ -gtk-icon-effect: dim;
+}
+
+#tray > .needs-attention {
+ -gtk-icon-effect: highlight;
+ background-color: #d7af5f;
+}
diff --git a/dotfiles/hyprland/.config/themes/hudson/Xresources b/dotfiles/hyprland/.config/themes/hudson/Xresources
new file mode 100644
index 0000000..00be166
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/hudson/Xresources
@@ -0,0 +1,105 @@
+!! X Resources - Hudson theme
+!! Tomorrow Night + Goldenrod accent
+!! For X11 applications (st, xterm, etc.) and Emacs
+
+!! X Font Settings
+Xft.dpi: 109
+Xft.autohint: 0
+Xft.lcdfilter: lcddefault
+Xft.hintstyle: hintfull
+Xft.hinting: 1
+Xft.antialias: 1
+Xft.rgba: rgb
+Xcursor.size: 32
+Xcursor.theme: Vimix-white-cursors
+
+!! Emacs
+Emacs*toolBar: 0
+
+!! ============================================================================
+!! Hudson Theme Colors (Tomorrow Night + Goldenrod)
+!! ============================================================================
+
+#define hudson_fg #eeeeee
+#define hudson_bg #222222
+#define hudson_black #222222
+#define hudson_red #cc6666
+#define hudson_green #b5bd68
+#define hudson_yellow #f0c674
+#define hudson_blue #81a2be
+#define hudson_magenta #b294bb
+#define hudson_cyan #8abeb7
+#define hudson_white #c5c8c6
+#define hudson_br_black #444444
+#define hudson_br_red #d54e53
+#define hudson_br_green #b9ca4a
+#define hudson_br_yellow #e0b040
+#define hudson_br_blue #7aa6da
+#define hudson_br_magenta #c397d8
+#define hudson_br_cyan #70c0b1
+#define hudson_br_white #eeeeee
+
+!! Active theme aliases
+#define theme_fg hudson_fg
+#define theme_bg hudson_bg
+#define theme_black hudson_black
+#define theme_red hudson_red
+#define theme_green hudson_green
+#define theme_yellow hudson_yellow
+#define theme_blue hudson_blue
+#define theme_magenta hudson_magenta
+#define theme_cyan hudson_cyan
+#define theme_white hudson_white
+#define theme_br_black hudson_br_black
+#define theme_br_red hudson_br_red
+#define theme_br_green hudson_br_green
+#define theme_br_yellow hudson_br_yellow
+#define theme_br_blue hudson_br_blue
+#define theme_br_magenta hudson_br_magenta
+#define theme_br_cyan hudson_br_cyan
+#define theme_br_white hudson_br_white
+
+!! ============================================================================
+
+!! ST (suckless terminal) settings
+st.font: BerkeleyMono Nerd Font:size=12
+st.background: theme_bg
+st.foreground: theme_fg
+st.color0: theme_black
+st.color1: theme_red
+st.color2: theme_green
+st.color3: theme_yellow
+st.color4: theme_blue
+st.color5: theme_magenta
+st.color6: theme_cyan
+st.color7: theme_white
+st.color8: theme_br_black
+st.color9: theme_br_red
+st.color10: theme_br_green
+st.color11: theme_br_yellow
+st.color12: theme_br_blue
+st.color13: theme_br_magenta
+st.color14: theme_br_cyan
+st.color15: theme_br_white
+
+!! XTerm settings
+XTerm*faceName: BerkeleyMono Nerd Font:size=12
+XTerm*selectToClipboard: true
+XTerm*background: theme_bg
+XTerm*foreground: theme_fg
+XTerm*color0: theme_black
+XTerm*color1: theme_red
+XTerm*color2: theme_green
+XTerm*color3: theme_yellow
+XTerm*color4: theme_blue
+XTerm*color5: theme_magenta
+XTerm*color6: theme_cyan
+XTerm*color7: theme_white
+XTerm*color8: theme_br_black
+XTerm*color9: theme_br_red
+XTerm*color10: theme_br_green
+XTerm*color11: theme_br_yellow
+XTerm*color12: theme_br_blue
+XTerm*color13: theme_br_magenta
+XTerm*color14: theme_br_cyan
+XTerm*color15: theme_br_white
diff --git a/dotfiles/hyprland/.config/themes/hudson/dunstrc b/dotfiles/hyprland/.config/themes/hudson/dunstrc
new file mode 100644
index 0000000..0c84133
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/hudson/dunstrc
@@ -0,0 +1,72 @@
+# Dunst config - Hudson theme
+# Tomorrow Night + Goldenrod accent
+
+[global]
+# Display
+follow = mouse
+width = 350
+height = (0, 300)
+origin = top-right
+offset = (35, 35)
+indicate_hidden = yes
+notification_limit = 5
+gap_size = 12
+padding = 12
+horizontal_padding = 20
+frame_width = 2
+sort = no
+corner_radius = 10
+
+# Progress bar
+progress_bar_frame_width = 0
+progress_bar_corner_radius = 3
+
+# Colors - Hudson theme
+foreground = "#eeeeee"
+frame_color = "#daa520"
+highlight = "#daa520, #f0c674"
+
+# Text
+font = BerkeleyMono Nerd Font 11
+markup = full
+format = "<small>%a</small>\n<b>%s</b>\n%b"
+alignment = left
+vertical_alignment = center
+show_age_threshold = -1
+hide_duplicate_count = false
+
+# Icon
+icon_position = left
+min_icon_size = 54
+max_icon_size = 80
+icon_corner_radius = 4
+
+# Misc/Advanced
+dmenu = fuzzel --dmenu --prompt 'Open with'
+
+# Mouse
+mouse_left_click = close_current
+mouse_middle_click = do_action, close_current
+mouse_right_click = close_all
+
+[urgency_low]
+background = "#222222f0"
+timeout = 3
+
+[urgency_normal]
+background = "#222222f0"
+timeout = 8
+
+[urgency_critical]
+background = "#cc6666f0"
+frame_color = "#d54e53"
+highlight = "#ff2a00"
+foreground = "#eeeeee"
+timeout = 0
+
+[fullscreen_delay_everything]
+fullscreen = delay
+
+[fullscreen_show_critical]
+msg_urgency = critical
+fullscreen = show
diff --git a/dotfiles/hyprland/.config/themes/hudson/foot.ini b/dotfiles/hyprland/.config/themes/hudson/foot.ini
new file mode 100644
index 0000000..39dcc5e
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/hudson/foot.ini
@@ -0,0 +1,38 @@
+# foot terminal configuration - Hudson theme
+# Tomorrow Night + Goldenrod accent
+
+[main]
+term=xterm-256color
+font=Berkeley Mono:size=14
+pad=8x8
+
+[scrollback]
+lines=10000
+
+[colors]
+# Hudson theme - Tomorrow Night + Goldenrod accent
+background=222222
+foreground=eeeeee
+
+# Regular colors (0-7)
+regular0=222222 # black
+regular1=cc6666 # red
+regular2=b5bd68 # green
+regular3=f0c674 # yellow
+regular4=81a2be # blue
+regular5=b294bb # magenta
+regular6=8abeb7 # cyan
+regular7=c5c8c6 # white
+
+# Bright colors (8-15)
+bright0=444444 # bright black
+bright1=d54e53 # bright red
+bright2=b9ca4a # bright green
+bright3=e0b040 # bright yellow (adjusted for gold)
+bright4=7aa6da # bright blue
+bright5=c397d8 # bright magenta
+bright6=70c0b1 # bright cyan
+bright7=eeeeee # bright white
+
+# Cursor: goldenrod on dark
+cursor=222222 daa520
diff --git a/dotfiles/hyprland/.config/themes/hudson/fuzzel.ini b/dotfiles/hyprland/.config/themes/hudson/fuzzel.ini
new file mode 100644
index 0000000..975004c
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/hudson/fuzzel.ini
@@ -0,0 +1,31 @@
+# Fuzzel config - Hudson theme
+# Tomorrow Night + Goldenrod accent
+
+[main]
+font=BerkeleyMono Nerd Font:size=14
+prompt=Search:
+icon-theme=hicolor
+icons-enabled=yes
+width=30
+lines=12
+horizontal-pad=20
+vertical-pad=12
+inner-pad=8
+layer=overlay
+exit-on-keyboard-focus-loss=yes
+
+[colors]
+# Format: RRGGBBAA
+background=222222f0
+text=eeeeeeff
+selection=daa520ff
+selection-text=222222ff
+border=daa520ff
+match=daa520ff
+prompt=bbbbbbff
+placeholder=888888ff
+input=eeeeeeff
+
+[border]
+width=2
+radius=16
diff --git a/dotfiles/hyprland/.config/themes/hudson/hyprland.conf b/dotfiles/hyprland/.config/themes/hudson/hyprland.conf
new file mode 100644
index 0000000..37694da
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/hudson/hyprland.conf
@@ -0,0 +1,7 @@
+# Hyprland colors - Hudson theme
+# Tomorrow Night + Goldenrod accent
+
+general {
+ col.active_border = rgba(daa520ff)
+ col.inactive_border = rgba(444444ff)
+}
diff --git a/dotfiles/hyprland/.config/themes/hudson/hyprlock.conf b/dotfiles/hyprland/.config/themes/hudson/hyprlock.conf
new file mode 100644
index 0000000..f9c08bb
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/hudson/hyprlock.conf
@@ -0,0 +1,94 @@
+# Hyprlock configuration - Hudson theme
+# Tomorrow Night + Goldenrod accent
+
+general {
+ disable_loading_bar = false
+ hide_cursor = true
+ grace = 0
+ no_fade_in = false
+}
+
+background {
+ monitor =
+ path = screenshot
+ blur_passes = 3
+ blur_size = 8
+ noise = 0.0117
+ contrast = 0.8916
+ brightness = 0.8172
+ vibrancy = 0.1696
+ vibrancy_darkness = 0.0
+}
+
+# Clock (top)
+label {
+ monitor =
+ text = $TIME12
+ text_align = center
+ color = rgb(bbbbbb)
+ font_size = 64
+ font_family = BerkeleyMono Nerd Font
+ position = 0, 15%
+ halign = center
+ valign = center
+}
+
+# Profile image
+image {
+ monitor =
+ path = ~/pictures/devilman.jpg
+ size = 120
+ rounding = -1
+ border_size = 3
+ border_color = rgb(daa520)
+ position = 0, 0%
+ halign = center
+ valign = center
+ shadow_passes = 2
+ shadow_size = 3
+ shadow_color = rgba(0, 0, 0, 0.5)
+}
+
+# Username
+label {
+ monitor =
+ text = $USER
+ text_align = center
+ color = rgb(daa520)
+ font_size = 36
+ font_family = BerkeleyMono Nerd Font
+ position = 0, -7%
+ halign = center
+ valign = center
+}
+
+# Password input
+input-field {
+ monitor =
+ size = 20%, 4%
+ outline_thickness = 0
+ dots_size = 0.33
+ dots_spacing = 0.15
+ dots_center = true
+ dots_rounding = -1
+ outer_color = rgb(222222)
+ inner_color = rgb(222222)
+ font_color = rgb(bbbbbb)
+ fade_on_empty = true
+ fade_timeout = 1000
+ placeholder_text = <i>Password...</i>
+ hide_input = false
+ rounding = 8
+ check_color = rgb(daa520)
+ fail_color = rgb(d54e53)
+ fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i>
+ fail_transition = 300
+ capslock_color = rgb(e0b040)
+ numlock_color = -1
+ bothlock_color = -1
+ invert_numlock = false
+ swap_font_color = false
+ position = 0, -12%
+ halign = center
+ valign = center
+}
diff --git a/dotfiles/hyprland/.config/themes/hudson/waybar.css b/dotfiles/hyprland/.config/themes/hudson/waybar.css
new file mode 100644
index 0000000..f9d2e4f
--- /dev/null
+++ b/dotfiles/hyprland/.config/themes/hudson/waybar.css
@@ -0,0 +1,111 @@
+/* Waybar style - Hudson theme */
+/* Tomorrow Night + Goldenrod accent */
+
+* {
+ border: none;
+ border-radius: 0;
+ font-size: 14px;
+ min-height: 0;
+ font-family: "BerkeleyMono Nerd Font", "Berkeley Mono", monospace;
+}
+
+window#waybar {
+ background: transparent;
+}
+
+#workspaces {
+ padding: 0.2rem;
+}
+
+#workspaces button {
+ padding: 0.5rem;
+ margin: 0.2rem;
+ background-color: transparent;
+ color: #bbbbbb;
+ border-radius: 1rem;
+ transition: all 0.3s ease;
+}
+
+#workspaces button.active {
+ background: #daa520;
+ color: #222222;
+ border-radius: 1rem;
+}
+
+#workspaces button.urgent {
+ background-color: rgba(255, 88, 88, 0.4);
+}
+
+.modules-right, .modules-left {
+ background-color: #222222;
+ border-radius: 1rem;
+ padding: 0.2rem 0.6rem;
+ margin: 0.3rem;
+ border: 0.095rem solid #daa520;
+ box-shadow: 0rem 0.2rem 0.4rem rgba(0,0,0,0.5);
+}
+
+#cpu,
+#temperature,
+#memory,
+#disk,
+#custom-netspeed,
+#battery,
+#wireplumber,
+#tray,
+#clock,
+#custom-layout,
+#window {
+ padding: 0.4rem;
+ margin: 0.3rem;
+ color: #bbbbbb;
+ background-color: transparent;
+ border-radius: 1rem;
+}
+
+#sysmonitor {
+ margin: 0.3rem;
+ background-color: transparent;
+ border-radius: 1rem;
+}
+
+#cpu:hover,
+#temperature:hover,
+#memory:hover,
+#disk:hover,
+#custom-netspeed:hover,
+#wireplumber:hover,
+#sysmonitor:hover,
+#custom-layout:hover {
+ background-color: #444444;
+ border-radius: 1rem;
+}
+
+#clock {
+ color: #eeeeee;
+}
+
+#wireplumber {
+ color: #bbbbbb;
+}
+
+#wireplumber.muted {
+ color: #666666;
+}
+
+#battery.warning {
+ color: #daa520;
+}
+
+#battery.critical {
+ color: #ff5858;
+}
+
+#tray > .passive {
+ -gtk-icon-effect: dim;
+}
+
+#tray > .needs-attention {
+ -gtk-icon-effect: highlight;
+ background-color: #daa520;
+}
diff --git a/dotfiles/hyprland/.config/waybar/config b/dotfiles/hyprland/.config/waybar/config
index 3b3a90f..c7cc0a7 100644
--- a/dotfiles/hyprland/.config/waybar/config
+++ b/dotfiles/hyprland/.config/waybar/config
@@ -3,48 +3,124 @@
"position": "top",
"height": 30,
"spacing": 4,
+ "margin-top": 6,
+ "margin-left": 10,
+ "margin-right": 10,
- "modules-left": ["hyprland/workspaces"],
- "modules-center": ["hyprland/window"],
- "modules-right": ["tray", "battery", "disk", "clock"],
+ "modules-left": [
+ "hyprland/workspaces",
+ "custom/layout",
+ "hyprland/window"
+ ],
+ "modules-center": [],
+ "modules-right": [
+ "group/sysmonitor",
+ "custom/netspeed",
+ "wireplumber",
+ "tray",
+ "clock"
+ ],
+
+ "group/sysmonitor": {
+ "orientation": "horizontal",
+ "modules": [
+ "cpu",
+ "temperature",
+ "memory",
+ "disk",
+ "battery"
+ ]
+ },
"hyprland/workspaces": {
+ "disable-scroll": true,
+ "all-outputs": true,
"format": "{name}",
- "on-click": "activate",
"sort-by-number": true
},
+ "custom/layout": {
+ "exec": "waybar-layout",
+ "return-type": "json",
+ "interval": 1,
+ "on-click": "cycle-layout"
+ },
+
"hyprland/window": {
- "format": "{}",
- "max-length": 50
+ "max-length": 50,
+ "separate-outputs": true
},
- "tray": {
- "spacing": 10
+ "cpu": {
+ "interval": 10,
+ "format": "<span size='large'>󰍛</span> {}%",
+ "on-click": "toggle-scratchpad monitor"
+ },
+
+ "temperature": {
+ "interval": 10,
+ "hwmon-path-abs": "/sys/devices/pci0000:00/0000:00:18.3/hwmon",
+ "input-filename": "temp1_input",
+ "critical-threshold": 80,
+ "format": "<span size='large'>󰔏</span> {temperatureC}°C",
+ "format-critical": "<span size='large'>󰸁</span> {temperatureC}°C",
+ "on-click": "toggle-scratchpad monitor"
+ },
+
+ "memory": {
+ "interval": 30,
+ "format": "<span size='large'>󰘚</span> {}%",
+ "on-click": "toggle-scratchpad monitor"
+ },
+
+ "disk": {
+ "interval": 30,
+ "format": "<span size='large'>󰆼</span> {percentage_used}%",
+ "path": "/",
+ "on-click": "toggle-scratchpad monitor"
+ },
+
+ "custom/netspeed": {
+ "exec": "waybar-netspeed",
+ "return-type": "json",
+ "interval": 2,
+ "on-click": "toggle-scratchpad network"
},
"battery": {
- "bat": "BAT0",
"interval": 30,
"states": {
"warning": 30,
"critical": 15
},
- "format": "󱊣 {capacity}% {icon}",
- "format-charging": "󱊣 {capacity}% ",
- "format-plugged": "󱊣 {capacity}% ",
- "format-icons": ["", "", "", "", ""]
+ "format": "<span size='large'>{icon}</span> {capacity}%",
+ "format-charging": "<span size='large'>󰂄</span> {capacity}%",
+ "format-plugged": "<span size='large'>󰚥</span> {capacity}%",
+ "format-icons": ["󰂎", "󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"],
+ "tooltip-format": "{timeTo}"
},
- "disk": {
- "interval": 30,
- "format": " {used}/{total}",
- "path": "/"
+ "tray": {
+ "icon-size": 22,
+ "spacing": 10
},
"clock": {
- "interval": 30,
- "format": " {:%a %B %d} 󰥔 {:%I:%M %p %Z}",
- "tooltip-format": "<tt>{calendar}</tt>"
+ "format": "{:%a, %b %d %Y %I:%M %p %Z}",
+ "tooltip-format": "<small>{calendar}</small>",
+ "calendar": {
+ "format": {
+ "today": "<span color='#daa520'><b><u>{}</u></b></span>"
+ }
+ }
+ },
+
+ "wireplumber": {
+ "format": "<span size='large'>󰕾</span> {volume}%",
+ "format-muted": "<span size='large'>󰝟</span> Muted",
+ "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
+ "on-click-right": "toggle-scratchpad audio",
+ "on-scroll-up": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+",
+ "on-scroll-down": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
}
}
diff --git a/dotfiles/hyprland/.config/waybar/style.css b/dotfiles/hyprland/.config/waybar/style.css
index 9411b46..6b760a2 100644
--- a/dotfiles/hyprland/.config/waybar/style.css
+++ b/dotfiles/hyprland/.config/waybar/style.css
@@ -1,61 +1,104 @@
-/* Waybar style - matching DWM colors */
-/* gray1=#222222, gray2=#444444, gray3=#bbbbbb, gray4=#eeeeee, accent=#daa520 */
+/* Waybar style - Hyprland-Rice inspired with DWM colors */
+/* Based on: github.com/CtrlLuzzio/Hyprland-Rice */
* {
- font-family: "FiraCode Nerd Font Mono", monospace;
- font-size: 12px;
border: none;
border-radius: 0;
+ font-size: 14px;
min-height: 0;
+ font-family: "BerkeleyMono Nerd Font", "Berkeley Mono", monospace;
}
window#waybar {
- background-color: #222222;
- color: #bbbbbb;
+ background: transparent;
}
-#workspaces button {
- padding: 0 8px;
- color: #bbbbbb;
- background-color: transparent;
+#workspaces {
+ padding: 0.2rem;
}
-#workspaces button:hover {
- background-color: #444444;
+#workspaces button {
+ padding: 0.5rem;
+ margin: 0.2rem;
+ background-color: transparent;
+ color: #bbbbbb;
+ border-radius: 1rem;
+ transition: all 0.3s ease;
}
#workspaces button.active {
- color: #eeeeee;
- background-color: #daa520;
+ background: #daa520;
+ color: #222222;
+ border-radius: 1rem;
}
#workspaces button.urgent {
- background-color: #900000;
+ background-color: rgba(255, 88, 88, 0.4);
+}
+
+.modules-right, .modules-left {
+ background-color: #222222;
+ border-radius: 1rem;
+ padding: 0.2rem 0.6rem;
+ margin: 0.3rem;
+ border: 0.095rem solid #daa520;
+ box-shadow: 0rem 0.2rem 0.4rem rgba(0,0,0,0.5);
}
+#cpu,
+#temperature,
+#memory,
+#disk,
+#custom-netspeed,
+#battery,
+#wireplumber,
+#tray,
+#clock,
+#custom-layout,
#window {
+ padding: 0.4rem;
+ margin: 0.3rem;
color: #bbbbbb;
- padding: 0 10px;
+ background-color: transparent;
+ border-radius: 1rem;
}
-#clock,
-#battery,
-#disk,
-#tray {
- padding: 0 10px;
+#sysmonitor {
+ margin: 0.3rem;
+ background-color: transparent;
+ border-radius: 1rem;
+}
+
+#cpu:hover,
+#temperature:hover,
+#memory:hover,
+#disk:hover,
+#custom-netspeed:hover,
+#wireplumber:hover,
+#sysmonitor:hover,
+#custom-layout:hover {
+ background-color: #444444;
+ border-radius: 1rem;
+}
+
+#clock {
+ color: #eeeeee;
+}
+
+#wireplumber {
color: #bbbbbb;
}
-#battery.charging {
- color: #daa520;
+#wireplumber.muted {
+ color: #666666;
}
-#battery.warning:not(.charging) {
- color: #f0ad4e;
+#battery.warning {
+ color: #daa520;
}
-#battery.critical:not(.charging) {
- color: #d9534f;
+#battery.critical {
+ color: #ff5858;
}
#tray > .passive {
diff --git a/dotfiles/hyprland/.gnupg/gpg-agent.conf b/dotfiles/hyprland/.gnupg/gpg-agent.conf
new file mode 100644
index 0000000..068f889
--- /dev/null
+++ b/dotfiles/hyprland/.gnupg/gpg-agent.conf
@@ -0,0 +1,18 @@
+# Pinentry configuration (Wayland/Hyprland)
+pinentry-program ~/.local/bin/pinentry-fuzzel
+pinentry-timeout 10
+allow-loopback-pinentry
+
+# Cache passphrases for entire login session (400 days)
+default-cache-ttl 34560000
+max-cache-ttl 34560000
+
+# Enable SSH support (use gpg-agent for SSH keys too)
+enable-ssh-support
+
+# Prevent external programs from clearing cache
+no-allow-external-cache
+
+# Keep running even when no connections
+keep-display
+keep-tty
diff --git a/dotfiles/hyprland/.local/bin/cycle-layout b/dotfiles/hyprland/.local/bin/cycle-layout
new file mode 100755
index 0000000..ebfd2e0
--- /dev/null
+++ b/dotfiles/hyprland/.local/bin/cycle-layout
@@ -0,0 +1,29 @@
+#!/bin/sh
+# Cycle through Hyprland layouts
+# Cycle: master -> hy3 (tab/monocle) -> scrolling -> floating -> master
+
+LAYOUT=$(hyprctl getoption general:layout -j | jq -r '.str')
+FLOATING=$(hyprctl activewindow -j 2>/dev/null | jq -r '.floating // false')
+
+# Check if we're in "all floating" mode by checking layout
+case "$LAYOUT" in
+ master)
+ hyprctl keyword general:layout hy3
+ # Create tab group for monocle behavior
+ hyprctl dispatch hy3:changegroup tab
+ ;;
+ hy3)
+ hyprctl keyword general:layout scrolling
+ ;;
+ scrolling)
+ # Switch to master but float all windows
+ hyprctl keyword general:layout master
+ hyprctl dispatch workspaceopt allfloat
+ ;;
+ *)
+ # Return to master tiled
+ hyprctl dispatch workspaceopt allfloat
+ hyprctl keyword general:layout master
+ hyprctl keyword master:orientation left
+ ;;
+esac
diff --git a/dotfiles/hyprland/.local/bin/layout-navigate b/dotfiles/hyprland/.local/bin/layout-navigate
new file mode 100755
index 0000000..4fc02c2
--- /dev/null
+++ b/dotfiles/hyprland/.local/bin/layout-navigate
@@ -0,0 +1,59 @@
+#!/bin/sh
+# Layout-aware navigation for Hyprland
+# Usage: layout-navigate <direction> [move]
+# direction: next|prev
+# move: if present, move window instead of focus
+
+DIR="$1"
+MOVE="$2"
+LAYOUT=$(hyprctl getoption general:layout -j | jq -r '.str')
+
+case "$LAYOUT" in
+ scrolling)
+ # Swap directions: J (next) goes left, K (prev) goes right
+ if [ "$MOVE" = "move" ]; then
+ if [ "$DIR" = "next" ]; then
+ hyprctl dispatch layoutmsg movewindowto l
+ else
+ hyprctl dispatch layoutmsg movewindowto r
+ fi
+ else
+ if [ "$DIR" = "next" ]; then
+ hyprctl dispatch layoutmsg focus l
+ else
+ hyprctl dispatch layoutmsg focus r
+ fi
+ fi
+ ;;
+ hy3)
+ if [ "$MOVE" = "move" ]; then
+ if [ "$DIR" = "next" ]; then
+ hyprctl dispatch hy3:movewindow r
+ else
+ hyprctl dispatch hy3:movewindow l
+ fi
+ else
+ if [ "$DIR" = "next" ]; then
+ hyprctl dispatch hy3:movefocus r
+ else
+ hyprctl dispatch hy3:movefocus l
+ fi
+ fi
+ ;;
+ *)
+ # master, dwindle, etc.
+ if [ "$MOVE" = "move" ]; then
+ if [ "$DIR" = "next" ]; then
+ hyprctl dispatch layoutmsg swapnext
+ else
+ hyprctl dispatch layoutmsg swapprev
+ fi
+ else
+ if [ "$DIR" = "next" ]; then
+ hyprctl dispatch layoutmsg cyclenext
+ else
+ hyprctl dispatch layoutmsg cycleprev
+ fi
+ fi
+ ;;
+esac
diff --git a/dotfiles/hyprland/.local/bin/pinentry-fuzzel b/dotfiles/hyprland/.local/bin/pinentry-fuzzel
new file mode 100755
index 0000000..4cbe6b7
--- /dev/null
+++ b/dotfiles/hyprland/.local/bin/pinentry-fuzzel
@@ -0,0 +1,107 @@
+#!/bin/sh
+
+ENABLE_LOGGING="TRUE"
+logger() {
+ if [ "$ENABLE_LOGGING" == "TRUE" ]; then
+ /usr/bin/logger -t "${0} [$]" "$@";
+ fi
+}
+
+# Decode URL-encoded characters (%0A = newline, %20 = space, etc.)
+decode() {
+ printf '%b' "$(echo "$1" | sed 's/%\([0-9A-Fa-f][0-9A-Fa-f]\)/\\x\1/g')"
+}
+
+# Base command and misc variables
+DESC=""
+PROMPT=""
+COUNTFILE="/tmp/pinentry-fuzzel-count-$$"
+
+# Check if this is a repeat prompt (within 5 seconds of last)
+LASTFILE="/tmp/pinentry-fuzzel-last"
+NOW=$(date +%s)
+if [ -f "$LASTFILE" ]; then
+ LAST=$(cat "$LASTFILE")
+ if [ $((NOW - LAST)) -lt 5 ]; then
+ REPEAT=1
+ else
+ REPEAT=0
+ fi
+else
+ REPEAT=0
+fi
+echo "$NOW" > "$LASTFILE"
+
+echo "OK Please go ahead"
+while read cmd rest; do
+ logger "RAW=< ${cmd} ${rest} >"
+ logger "cmd=<${cmd}> rest=<${rest}>"
+
+ case $cmd in
+ GETINFO)
+ case "$rest" in
+ flavor)
+ echo "D fuzzel"
+ echo "OK"
+ ;;
+ version)
+ echo "D 0.1"
+ echo "OK"
+ ;;
+ ttyinfo)
+ echo "D - - -"
+ echo "OK"
+ ;;
+ pid)
+ echo "D $$"
+ echo "OK"
+ ;;
+ esac
+ ;;
+
+ SETDESC)
+ DESC=$(decode "$rest")
+ echo "OK"
+ ;;
+
+ SETERROR)
+ logger "ERROR $rest"
+ # Silently acknowledge errors (e.g., empty passphrase on escape)
+ echo "OK"
+ ;;
+
+ SETPROMPT)
+ PROMPT=$(decode "$rest")
+ # Remove trailing colon if present (we add our own)
+ PROMPT="${PROMPT%:}"
+ echo "OK"
+ ;;
+
+ GETPIN | getpin)
+ if [ "$REPEAT" -eq 0 ]; then
+ LABEL="password: "
+ else
+ LABEL="reenter: "
+ fi
+ PASS=$(fuzzel --prompt "$LABEL" --width 25 --lines 0 --cache /dev/null --password --dmenu)
+ if [ -z "$PASS" ]; then
+ # User cancelled - return error to GPG
+ rm -f "$LASTFILE"
+ echo "ERR 83886179 Operation cancelled"
+ else
+ echo "D $PASS"
+ echo "OK"
+ fi
+ ;;
+
+ BYE|bye)
+ echo "OK closing connection"
+ logger "EXITING"
+ exit 0
+ ;;
+
+ *)
+ echo "OK"
+ ;;
+ esac
+done
diff --git a/dotfiles/hyprland/.local/bin/set-theme b/dotfiles/hyprland/.local/bin/set-theme
new file mode 100755
index 0000000..338aab9
--- /dev/null
+++ b/dotfiles/hyprland/.local/bin/set-theme
@@ -0,0 +1,124 @@
+#!/bin/sh
+# Theme switcher for Hyprland desktop
+# Usage: set-theme <theme-name>
+# set-theme --toggle
+# set-theme --current
+# Available themes: dupre, hudson
+
+THEME_DIR="$HOME/.config/themes"
+CURRENT_FILE="$HOME/.config/current-theme"
+
+# Get current theme
+get_current() {
+ if [ -f "$CURRENT_FILE" ]; then
+ cat "$CURRENT_FILE"
+ else
+ echo "hudson" # default
+ fi
+}
+
+# List available themes
+list_themes() {
+ for dir in "$THEME_DIR"/*/; do
+ basename "$dir"
+ done
+}
+
+# Apply a theme
+apply_theme() {
+ theme="$1"
+
+ if [ ! -d "$THEME_DIR/$theme" ]; then
+ echo "Error: Theme '$theme' not found in $THEME_DIR"
+ echo "Available themes: $(list_themes | tr '\n' ' ')"
+ exit 1
+ fi
+
+ echo "Applying theme: $theme"
+
+ # Copy configs that don't support sourcing
+ cp "$THEME_DIR/$theme/foot.ini" "$HOME/.config/foot/foot.ini"
+ cp "$THEME_DIR/$theme/fuzzel.ini" "$HOME/.config/fuzzel/fuzzel.ini"
+ cp "$THEME_DIR/$theme/waybar.css" "$HOME/.config/waybar/style.css"
+ cp "$THEME_DIR/$theme/dunstrc" "$HOME/.config/dunst/dunstrc"
+ cp "$THEME_DIR/$theme/hyprlock.conf" "$HOME/.config/hypr/hyprlock.conf"
+ cp "$THEME_DIR/$theme/Xresources" "$HOME/.Xresources"
+
+ # Apply Xresources (for X11 apps and Emacs)
+ xrdb -merge "$HOME/.Xresources" 2>/dev/null
+
+ # Apply Hyprland colors directly via hyprctl
+ case "$theme" in
+ dupre)
+ hyprctl keyword general:col.active_border "rgba(d7af5fff)"
+ hyprctl keyword general:col.inactive_border "rgba(474544ff)"
+ ;;
+ hudson)
+ hyprctl keyword general:col.active_border "rgba(daa520ff)"
+ hyprctl keyword general:col.inactive_border "rgba(444444ff)"
+ ;;
+ esac
+
+ # Save current theme
+ echo "$theme" > "$CURRENT_FILE"
+
+ # Reload applications
+ killall -SIGUSR2 waybar 2>/dev/null
+ pkill dunst && dunst &
+
+ # Notify user
+ notify-send "Theme" "Switched to $theme" -t 2000
+
+ echo "Theme '$theme' applied. Open new terminals to see changes."
+}
+
+# Toggle between themes
+toggle_theme() {
+ current=$(get_current)
+ case "$current" in
+ dupre) apply_theme "hudson" ;;
+ hudson) apply_theme "dupre" ;;
+ *) apply_theme "dupre" ;;
+ esac
+}
+
+# Show picker with fuzzel
+pick_theme() {
+ themes=$(list_themes)
+ current=$(get_current)
+ selected=$(echo "$themes" | fuzzel --dmenu --prompt "Theme (current: $current): ")
+ if [ -n "$selected" ]; then
+ apply_theme "$selected"
+ fi
+}
+
+# Main
+case "$1" in
+ --toggle|-t)
+ toggle_theme
+ ;;
+ --current|-c)
+ get_current
+ ;;
+ --list|-l)
+ list_themes
+ ;;
+ --pick|-p)
+ pick_theme
+ ;;
+ --help|-h)
+ echo "Usage: set-theme <theme-name>"
+ echo " set-theme --toggle Toggle between themes"
+ echo " set-theme --current Show current theme"
+ echo " set-theme --list List available themes"
+ echo " set-theme --pick Pick theme with fuzzel"
+ echo ""
+ echo "Available themes: $(list_themes | tr '\n' ' ')"
+ ;;
+ "")
+ pick_theme
+ ;;
+ *)
+ apply_theme "$1"
+ ;;
+esac
diff --git a/dotfiles/hyprland/.local/bin/toggle-scratchpad b/dotfiles/hyprland/.local/bin/toggle-scratchpad
new file mode 100755
index 0000000..bb10ef7
--- /dev/null
+++ b/dotfiles/hyprland/.local/bin/toggle-scratchpad
@@ -0,0 +1,29 @@
+#!/bin/sh
+# Toggle a special workspace from waybar click
+# Tracks state to handle focus-loss auto-close issue
+# Usage: toggle-scratchpad <name>
+
+NAME="$1"
+if [ -z "$NAME" ]; then
+ echo "Usage: toggle-scratchpad <name>"
+ exit 1
+fi
+
+STATEFILE="/tmp/scratchpad-$NAME-open"
+NOW=$(date +%s)
+
+# If state file exists and recent, scratchpad was open and just closed by focus loss
+# Don't reopen it - user intended to close
+if [ -f "$STATEFILE" ]; then
+ LAST=$(cat "$STATEFILE")
+ AGE=$((NOW - LAST))
+ rm -f "$STATEFILE"
+ if [ "$AGE" -lt 2 ]; then
+ # Was just open, user clicked to close - don't reopen
+ exit 0
+ fi
+fi
+
+# Opening the scratchpad - mark timestamp
+echo "$NOW" > "$STATEFILE"
+hyprctl dispatch togglespecialworkspace "$NAME"
diff --git a/dotfiles/hyprland/.local/bin/waybar-layout b/dotfiles/hyprland/.local/bin/waybar-layout
new file mode 100755
index 0000000..6c45877
--- /dev/null
+++ b/dotfiles/hyprland/.local/bin/waybar-layout
@@ -0,0 +1,36 @@
+#!/bin/sh
+# Hyprland layout indicator for waybar
+# Shows current layout with nerd font icons
+# Layouts: master -> tab group (monocle) -> scrolling -> floating
+
+# Get current layout
+LAYOUT=$(hyprctl getoption general:layout -j | jq -r '.str')
+
+# Check if workspace has allfloat enabled
+ALLFLOAT=$(hyprctl activeworkspace -j | jq -r '.hasfullscreenwindow')
+
+# Check if active window is floating
+FLOATING=$(hyprctl activewindow -j 2>/dev/null | jq -r '.floating // false')
+
+# Check workspace rules for allfloat
+WSRULES=$(hyprctl activeworkspace -j | jq -r '.rules // []')
+
+# Determine icon and tooltip
+if [ "$LAYOUT" = "master" ] && echo "$WSRULES" | grep -q "allfloat"; then
+ ICON="󰖲"
+ TOOLTIP="Floating"
+elif [ "$LAYOUT" = "scrolling" ]; then
+ ICON="󰯍"
+ TOOLTIP="Scrolling"
+elif [ "$LAYOUT" = "hy3" ]; then
+ ICON="󰖯"
+ TOOLTIP="Tab Group (Monocle)"
+elif [ "$LAYOUT" = "master" ]; then
+ ICON="󰕰"
+ TOOLTIP="Master"
+else
+ ICON="󰕰"
+ TOOLTIP="$LAYOUT"
+fi
+
+echo "{\"text\": \"<span size='large'>$ICON</span>\", \"tooltip\": \"$TOOLTIP\"}"
diff --git a/dotfiles/hyprland/.local/bin/waybar-netspeed b/dotfiles/hyprland/.local/bin/waybar-netspeed
new file mode 100755
index 0000000..97e8e5e
--- /dev/null
+++ b/dotfiles/hyprland/.local/bin/waybar-netspeed
@@ -0,0 +1,67 @@
+#!/bin/sh
+# Network status indicator for waybar
+# Shows: WiFi icon (signal strength) + SSID, or Ethernet icon + interface
+# Tooltip: upload/download speeds
+
+INTERFACE=$(ip route | awk '/default/ {print $5; exit}')
+
+if [ -z "$INTERFACE" ]; then
+ echo '{"text": "󰤭 Disconnected", "tooltip": "No network connection", "class": "disconnected"}'
+ exit 0
+fi
+
+# Measure network speed (requires 1 second delay)
+RX1=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
+TX1=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
+sleep 1
+RX2=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
+TX2=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
+
+RX_RATE=$((RX2 - RX1))
+TX_RATE=$((TX2 - TX1))
+
+format_speed() {
+ local bytes=$1
+ if [ $bytes -ge 1073741824 ]; then
+ printf "%.2f GB/s" $(echo "scale=2; $bytes / 1073741824" | bc)
+ elif [ $bytes -ge 1048576 ]; then
+ printf "%.2f MB/s" $(echo "scale=2; $bytes / 1048576" | bc)
+ elif [ $bytes -ge 1024 ]; then
+ printf "%.2f KB/s" $(echo "scale=2; $bytes / 1024" | bc)
+ else
+ printf "%d B/s" $bytes
+ fi
+}
+
+UP=$(format_speed $TX_RATE)
+DOWN=$(format_speed $RX_RATE)
+
+# Determine connection type and get appropriate icon/label
+if [ -d "/sys/class/net/$INTERFACE/wireless" ]; then
+ # WiFi connection
+ LABEL=$(iwgetid -r 2>/dev/null || echo "WiFi")
+
+ # Get signal strength in percentage
+ SIGNAL=$(awk 'NR==3 {print int($3 * 100 / 70)}' /proc/net/wireless 2>/dev/null)
+
+ # Select icon based on signal strength
+ if [ -z "$SIGNAL" ] || [ "$SIGNAL" -le 0 ]; then
+ ICON="󰤯" # No signal
+ elif [ "$SIGNAL" -le 25 ]; then
+ ICON="󰤟" # Weak
+ elif [ "$SIGNAL" -le 50 ]; then
+ ICON="󰤢" # Fair
+ elif [ "$SIGNAL" -le 75 ]; then
+ ICON="󰤥" # Good
+ else
+ ICON="󰤨" # Excellent
+ fi
+else
+ # Ethernet connection
+ ICON="󰈀"
+ LABEL="$INTERFACE"
+fi
+
+TOOLTIP="Up: $UP\nDown: $DOWN"
+
+echo "{\"text\": \"<span size='large'>$ICON</span> $LABEL\", \"tooltip\": \"$TOOLTIP\", \"class\": \"connected\"}"