summaryrefslogtreecommitdiff
path: root/dotfiles/hyprland/.local/bin/set-theme
blob: e95b27b9ef2db7a0cd8ad761105042697d057ccb (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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/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)
            # 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.inactive "rgba(d0cbc0ff)"
            hyprctl keyword plugin:hy3:tabs:col.inactive.text "rgba(d0cbc0ff)"
            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.inactive "rgba(c5c8c6ff)"
            hyprctl keyword plugin:hy3:tabs:col.inactive.text "rgba(c5c8c6ff)"
            hyprctl keyword plugin:hy3:tabs:col.urgent "rgba(cc6666ff)"
            hyprctl keyword plugin:hy3:tabs:col.locked "rgba(8abeb7ff)"
            ;;
    esac

    # Save current theme
    echo "$theme" > "$CURRENT_FILE"

    # Set default wallpaper
    swww img ~/pictures/wallpaper/trondheim-norway.jpg 2>/dev/null

    # 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