summaryrefslogtreecommitdiff
path: root/dotfiles/hyprland/.local/bin/set-theme
blob: 338aab9972b7248306acbffa560cd1cde9b944fc (plain)
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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