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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#!/usr/bin/env bash
# ==================================================
# KoolDots (2026)
# Project URL: https://github.com/LinuxBeginnings
# License: GNU GPLv3
# SPDX-License-Identifier: GPL-3.0-or-later
# ==================================================
# Smooth border cycling effect using Wallust palette or full rainbow
# Possible values: "wallust_random", "rainbow", "gradient_flow"
EFFECT_TYPE="gradient_flow"
WALLUST_COLORS_SOURCE="$HOME/.config/hypr/wallust/wallust-hyprland.conf"
WALLUST_COLORS=()
# ---------- LOAD WALLUST COLORS ----------
if [[ "$EFFECT_TYPE" == "wallust_random" || "$EFFECT_TYPE" == "gradient_flow" ]]; then
# Accept either hex (0xffRRGGBB) or rgb(r,g,b) and normalize to 0xffRRGGBB
mapfile -t WALLUST_COLORS < <(
grep -E '^\$color[0-9]+' "$WALLUST_COLORS_SOURCE" | awk '
function hex2(s){ return (length(s)==6 ? "0xff"s : ""); }
function rgb2(r,g,b){ return sprintf("0xff%02x%02x%02x", r, g, b); }
{
if (match($0, /0x([0-9a-fA-F]{8})/, m)) { print "0x" m[1]; next }
if (match($0, /#([0-9a-fA-F]{6})/, m)) { print hex2(m[1]); next }
if (match($0, /rgb\(([0-9]+),[ ]*([0-9]+),[ ]*([0-9]+)\)/, m)) {
print rgb2(m[1], m[2], m[3]); next
}
}'
)
if (( ${#WALLUST_COLORS[@]} == 0 )); then
# If wallust colors can't be loaded, fall back to random_hex
EFFECT_TYPE="rainbow"
fi
fi
# ---------- RANDOM WALLUST COLORS ----------
function wallust_random() {
echo "${WALLUST_COLORS[RANDOM % ${#WALLUST_COLORS[@]}]}"
}
# ---------- RAINBOW COLORS ----------
function random_hex() {
echo "0xff$(openssl rand -hex 3)"
}
# ---------- FLOW MODE ----------
BASE_COLOR="${WALLUST_COLORS[10]}"
GRAD1_COLOR="${WALLUST_COLORS[14]}"
GRAD2_COLOR="${WALLUST_COLORS[13]}"
GLOW_COLOR="${WALLUST_COLORS[15]}"
MAX_POS=10
GLOW_POS=0
function gradient_flow_color() {
local pos=$1
local d=$(( pos - GLOW_POS ))
# wrap distance (-9..9)
if (( d > MAX_POS/2 )); then d=$((d - MAX_POS)); fi
if (( d < -MAX_POS/2 )); then d=$((d + MAX_POS)); fi
case "${d#-}" in
0) echo "$GLOW_COLOR" ;;
1) echo "$GRAD1_COLOR" ;;
2) echo "$GRAD2_COLOR" ;;
*) echo "$BASE_COLOR" ;;
esac
if (( pos == MAX_POS - 1 )); then
GLOW_POS=$(( (GLOW_POS + 1) % MAX_POS ))
fi
}
# ---------- Main function ----------
function get_color() {
if [[ "$EFFECT_TYPE" == "wallust_random" && ${#WALLUST_COLORS[@]} -gt 0 ]]; then
wallust_random
elif [[ "$EFFECT_TYPE" == "gradient_flow" && ${#WALLUST_COLORS[@]} -ge 16 ]]; then
gradient_flow_color "$1"
else
random_hex
fi
}
# border effect for ACTIVE window
hyprctl keyword general:col.active_border $(get_color 0) $(get_color 1) $(get_color 2) $(get_color 3) $(get_color 4) $(get_color 5) $(get_color 6) $(get_color 7) $(get_color 8) $(get_color 9) 270deg
# border effect for INACTIVE windows
#hyprctl keyword general:col.inactive_border $(get_color 0) $(get_color 1) $(get_color 2) $(get_color 3) $(get_color 4) $(get_color 5) $(get_color 6) $(get_color 7) $(get_color 8) $(get_color 9) 270deg
|