summaryrefslogtreecommitdiff
path: root/dotfiles/hyprland
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-02-06 10:14:33 -0600
committerCraig Jennings <c@cjennings.net>2026-02-06 10:14:33 -0600
commitbc436988442c2d7e5b405f3670f43e33dfebdbbd (patch)
tree0c26b8b8a7947fec4f2df6491ef7bab9b9af9957 /dotfiles/hyprland
parent32d08f9cbef94bd777b72c4e96a58a88c35dcfdf (diff)
feat(hyprland): waybar scratchpad toggles, remove hy3, fix cursor warp
Waybar modules now toggle pyprland scratchpads on click: sysmonitor group opens btop, netspeed opens nmtui, pulseaudio opens pulsemixer. Consolidated pyprland config to canonical ~/.config/pypr/config.toml. Removed hy3 plugin from all configs and scripts (disabled since crash). Added $mod+N for network scratchpad. Set cursor:no_warps to prevent cursor jumping to window center on focus change.
Diffstat (limited to 'dotfiles/hyprland')
-rw-r--r--dotfiles/hyprland/.config/hypr/hyprland.conf33
-rw-r--r--dotfiles/hyprland/.config/pypr/config.toml7
-rw-r--r--dotfiles/hyprland/.config/waybar/config14
-rwxr-xr-xdotfiles/hyprland/.local/bin/cycle-layout7
-rwxr-xr-xdotfiles/hyprland/.local/bin/hyprland-plugins-setup16
-rwxr-xr-xdotfiles/hyprland/.local/bin/layout-navigate15
-rwxr-xr-xdotfiles/hyprland/.local/bin/set-theme24
-rwxr-xr-xdotfiles/hyprland/.local/bin/toggle-scratchpad40
-rwxr-xr-xdotfiles/hyprland/.local/bin/waybar-layout5
9 files changed, 24 insertions, 137 deletions
diff --git a/dotfiles/hyprland/.config/hypr/hyprland.conf b/dotfiles/hyprland/.config/hypr/hyprland.conf
index 3abf43f..d79738d 100644
--- a/dotfiles/hyprland/.config/hypr/hyprland.conf
+++ b/dotfiles/hyprland/.config/hypr/hyprland.conf
@@ -11,7 +11,7 @@ monitor=,preferred,auto,auto
# Startup Applications
# ============================================================================
# Portal and D-Bus setup FIRST (other apps depend on these)
-exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
+exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP HYPRLAND_INSTANCE_SIGNATURE
exec-once = systemctl --user start xdg-desktop-portal-hyprland xdg-desktop-portal
# Core services
@@ -99,6 +99,10 @@ dwindle {
# ============================================================================
# Input
# ============================================================================
+cursor {
+ no_warps = true
+}
+
input {
kb_layout = us
kb_options = ctrl:nocaps
@@ -132,27 +136,6 @@ xwayland {
}
# ============================================================================
-# Plugins
-# ============================================================================
-plugin {
- hy3 {
- tabs {
- col.active = rgba(444444ff)
- col.active.text = rgba(bbbbbbff)
- col.active.border = rgba(daa520ff)
- col.focused = rgba(444444ff)
- col.focused.text = rgba(bbbbbbff)
- col.focused.border = rgba(daa520ff)
- col.inactive = rgba(333333ff)
- col.inactive.text = rgba(888888ff)
- col.inactive.border = rgba(333333ff)
- col.urgent = rgba(cc6666ff)
- col.locked = rgba(8abeb7ff)
- }
- }
-}
-
-# ============================================================================
# Window Rules (Hyprland 0.53+ syntax: match:CONDITION, RULE)
# ============================================================================
# Floating windows (from DWM rules)
@@ -187,7 +170,7 @@ bind = $mod, Y, exec, set-theme --toggle
bind = $mod SHIFT, Y, exec, set-theme --pick
# Window management (from DWM)
-# Layout-aware navigation (works across master, scrolling, hy3)
+# Layout-aware navigation (works across master, scrolling)
bind = $mod, J, exec, layout-navigate next
bind = $mod, K, exec, layout-navigate prev
bind = $mod SHIFT, J, exec, layout-navigate next move
@@ -199,10 +182,9 @@ bind = $mod, G, centerwindow
bind = $mod, TAB, workspace, previous
bind = $mod SHIFT, C, killactive
-# Layouts: master -> tab group (monocle) -> scrolling -> floating
+# Layouts: master -> 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
@@ -268,6 +250,7 @@ bind = $mod SHIFT, RETURN, exec, pypr toggle term
bind = $mod, I, exec, pypr toggle term2
bind = $mod, A, exec, pypr toggle audio
bind = $mod, M, exec, pypr toggle monitor
+bind = $mod, N, exec, pypr toggle network
bind = $mod, SLASH, exec, pypr toggle music
# Magnify (zoom)
diff --git a/dotfiles/hyprland/.config/pypr/config.toml b/dotfiles/hyprland/.config/pypr/config.toml
index e496cd9..9db048f 100644
--- a/dotfiles/hyprland/.config/pypr/config.toml
+++ b/dotfiles/hyprland/.config/pypr/config.toml
@@ -53,3 +53,10 @@ class = "foot-music"
size = "60% 60%"
position = "20% 20%"
animation = "fromBottom"
+
+[scratchpads.network]
+command = "foot --app-id foot-network nmtui"
+class = "foot-network"
+size = "60% 60%"
+position = "20% 20%"
+animation = "fromBottom"
diff --git a/dotfiles/hyprland/.config/waybar/config b/dotfiles/hyprland/.config/waybar/config
index 7853326..422096f 100644
--- a/dotfiles/hyprland/.config/waybar/config
+++ b/dotfiles/hyprland/.config/waybar/config
@@ -55,7 +55,7 @@
"cpu": {
"interval": 10,
"format": "<span size='large'>󰍛</span> {}%",
- "on-click": "toggle-scratchpad monitor"
+ "on-click": "pypr toggle monitor"
},
"temperature": {
@@ -66,13 +66,13 @@
"critical-threshold": 80,
"format": "<span size='large'>󰔏</span> {temperatureC}°C",
"format-critical": "<span size='large'>󰸁</span> {temperatureC}°C",
- "on-click": "toggle-scratchpad monitor"
+ "on-click": "pypr toggle monitor"
},
"memory": {
"interval": 30,
"format": "<span size='large'>󰘚</span> {}%",
- "on-click": "toggle-scratchpad monitor"
+ "on-click": "pypr toggle monitor"
},
"custom/disk": {
@@ -80,14 +80,14 @@
"return-type": "json",
"interval": 30,
"format": "<span size='large'>󰆼</span> {}",
- "on-click": "toggle-scratchpad monitor"
+ "on-click": "pypr toggle monitor"
},
"custom/netspeed": {
"exec": "waybar-netspeed",
"return-type": "json",
"interval": 2,
- "on-click": "toggle-scratchpad network"
+ "on-click": "pypr toggle network"
},
"battery": {
@@ -105,7 +105,7 @@
"tray": {
"icon-size": 22,
- "spacing": 10
+ "spacing": 4
},
"clock": {
@@ -123,7 +123,7 @@
"format-muted": "<span size='large'>󰝟</span> Muted",
"format-icons": {"default": ["󰕿", "󰖀", "󰕾"]},
"on-click": "pactl set-sink-mute @DEFAULT_SINK@ toggle",
- "on-click-right": "toggle-scratchpad audio",
+ "on-click-right": "pypr toggle audio",
"on-scroll-up": "pactl set-sink-volume @DEFAULT_SINK@ +5%",
"on-scroll-down": "pactl set-sink-volume @DEFAULT_SINK@ -5%"
},
diff --git a/dotfiles/hyprland/.local/bin/cycle-layout b/dotfiles/hyprland/.local/bin/cycle-layout
index ebfd2e0..a632142 100755
--- a/dotfiles/hyprland/.local/bin/cycle-layout
+++ b/dotfiles/hyprland/.local/bin/cycle-layout
@@ -1,6 +1,6 @@
#!/bin/sh
# Cycle through Hyprland layouts
-# Cycle: master -> hy3 (tab/monocle) -> scrolling -> floating -> master
+# Cycle: master -> scrolling -> floating -> master
LAYOUT=$(hyprctl getoption general:layout -j | jq -r '.str')
FLOATING=$(hyprctl activewindow -j 2>/dev/null | jq -r '.floating // false')
@@ -8,11 +8,6 @@ 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)
diff --git a/dotfiles/hyprland/.local/bin/hyprland-plugins-setup b/dotfiles/hyprland/.local/bin/hyprland-plugins-setup
index f0181c8..e780cb7 100755
--- a/dotfiles/hyprland/.local/bin/hyprland-plugins-setup
+++ b/dotfiles/hyprland/.local/bin/hyprland-plugins-setup
@@ -37,22 +37,6 @@ for plugin in hyprscrolling xtra-dispatchers; do
fi
done
-# Add hy3 repository
-log "Adding hy3 repository..."
-if hyprpm add https://github.com/outfoxxed/hy3 2>&1 | tee -a "$LOGFILE"; then
- log "hy3 repository added"
-else
- log "Failed to add hy3 repository"
-fi
-
-# Enable hy3
-log "Enabling hy3..."
-if hyprpm enable hy3 2>&1 | tee -a "$LOGFILE"; then
- log "hy3 enabled"
-else
- log "Failed to enable hy3"
-fi
-
# Reload plugins into Hyprland
log "Reloading plugins..."
hyprpm reload 2>&1 | tee -a "$LOGFILE"
diff --git a/dotfiles/hyprland/.local/bin/layout-navigate b/dotfiles/hyprland/.local/bin/layout-navigate
index 4fc02c2..085df22 100755
--- a/dotfiles/hyprland/.local/bin/layout-navigate
+++ b/dotfiles/hyprland/.local/bin/layout-navigate
@@ -25,21 +25,6 @@ case "$LAYOUT" in
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
diff --git a/dotfiles/hyprland/.local/bin/set-theme b/dotfiles/hyprland/.local/bin/set-theme
index 9bbcbd4..075e47b 100755
--- a/dotfiles/hyprland/.local/bin/set-theme
+++ b/dotfiles/hyprland/.local/bin/set-theme
@@ -53,35 +53,11 @@ apply_theme() {
# Window borders
hyprctl keyword general:col.active_border "rgba(d7af5fff)"
hyprctl keyword general:col.inactive_border "rgba(474544ff)"
- # hy3 tab bar (monocle mode)
- hyprctl keyword plugin:hy3:tabs:col.active "rgba(474544ff)"
- hyprctl keyword plugin:hy3:tabs:col.active.text "rgba(969385ff)"
- hyprctl keyword plugin:hy3:tabs:col.active.border "rgba(d7af5fff)"
- hyprctl keyword plugin:hy3:tabs:col.focused "rgba(474544ff)"
- hyprctl keyword plugin:hy3:tabs:col.focused.text "rgba(969385ff)"
- hyprctl keyword plugin:hy3:tabs:col.focused.border "rgba(d7af5fff)"
- hyprctl keyword plugin:hy3:tabs:col.inactive "rgba(2a2725ff)"
- hyprctl keyword plugin:hy3:tabs:col.inactive.text "rgba(6c6a60ff)"
- hyprctl keyword plugin:hy3:tabs:col.inactive.border "rgba(2a2725ff)"
- hyprctl keyword plugin:hy3:tabs:col.urgent "rgba(d47c59ff)"
- hyprctl keyword plugin:hy3:tabs:col.locked "rgba(8a9496ff)"
;;
hudson)
# Window borders
hyprctl keyword general:col.active_border "rgba(daa520ff)"
hyprctl keyword general:col.inactive_border "rgba(444444ff)"
- # hy3 tab bar (monocle mode)
- hyprctl keyword plugin:hy3:tabs:col.active "rgba(444444ff)"
- hyprctl keyword plugin:hy3:tabs:col.active.text "rgba(bbbbbbff)"
- hyprctl keyword plugin:hy3:tabs:col.active.border "rgba(daa520ff)"
- hyprctl keyword plugin:hy3:tabs:col.focused "rgba(444444ff)"
- hyprctl keyword plugin:hy3:tabs:col.focused.text "rgba(bbbbbbff)"
- hyprctl keyword plugin:hy3:tabs:col.focused.border "rgba(daa520ff)"
- hyprctl keyword plugin:hy3:tabs:col.inactive "rgba(333333ff)"
- hyprctl keyword plugin:hy3:tabs:col.inactive.text "rgba(888888ff)"
- hyprctl keyword plugin:hy3:tabs:col.inactive.border "rgba(333333ff)"
- hyprctl keyword plugin:hy3:tabs:col.urgent "rgba(cc6666ff)"
- hyprctl keyword plugin:hy3:tabs:col.locked "rgba(8abeb7ff)"
;;
esac
diff --git a/dotfiles/hyprland/.local/bin/toggle-scratchpad b/dotfiles/hyprland/.local/bin/toggle-scratchpad
deleted file mode 100755
index b3da6b4..0000000
--- a/dotfiles/hyprland/.local/bin/toggle-scratchpad
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/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
-
-# Auto-detect current Hyprland socket if env var is stale
-if ! hyprctl version >/dev/null 2>&1; then
- # Find the most recent Hyprland instance with a socket
- for dir in /run/user/"$(id -u)"/hypr/*/; do
- if [ -S "${dir}.socket.sock" ]; then
- export HYPRLAND_INSTANCE_SIGNATURE="$(basename "$dir")"
- break
- fi
- done
-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
index 62470aa..1750eff 100755
--- a/dotfiles/hyprland/.local/bin/waybar-layout
+++ b/dotfiles/hyprland/.local/bin/waybar-layout
@@ -1,7 +1,7 @@
#!/bin/sh
# Hyprland layout indicator for waybar
# Shows current layout with nerd font icons
-# Layouts: master -> tab group (monocle) -> scrolling -> floating
+# Layouts: master -> scrolling -> floating
# Check if hyprctl is reachable
if ! hyprctl version >/dev/null 2>&1; then
@@ -22,9 +22,6 @@ if [ "$LAYOUT" = "master" ] && echo "$WSRULES" | grep -q "allfloat"; then
elif [ "$LAYOUT" = "scrolling" ]; then
ICON="󰯍"
TOOLTIP="Scrolling"
-elif [ "$LAYOUT" = "hy3" ]; then
- ICON="󰖯"
- TOOLTIP="Tab Group (Monocle)"
elif [ "$LAYOUT" = "master" ]; then
ICON="󰕰"
TOOLTIP="Master"