aboutsummaryrefslogtreecommitdiffstats
path: root/config/hypr/scripts/Ghostty_themes.sh
blob: a69f246eecd67335b7f5c6eba06db0afcef4d03d (plain) (blame)
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
#!/usr/bin/env bash
# ==================================================
#  KoolDots (2026)
#  Project URL: https://github.com/LinuxBeginnings
#  License: GNU GPLv3
#  SPDX-License-Identifier: GPL-3.0-or-later
# ==================================================
# Ghostty theme selector

config_file="$HOME/.config/ghostty/config"
iDIR="$HOME/.config/swaync/images"
rofi_theme_primary="$HOME/.config/rofi/config-ghostty-theme.rasi"
rofi_theme_fallback="$HOME/.config/rofi/config-edit.rasi"

notify_user() {
  local icon="$1"
  local title="$2"
  local body="$3"
  if [[ -n "$icon" && -f "$icon" ]]; then
    notify-send -u low -i "$icon" "$title" "$body"
  else
    notify-send -u low "$title" "$body"
  fi
}

if [[ ! -f "$config_file" ]]; then
  notify_user "$iDIR/error.png" "Ghostty Theme" "Config not found: $config_file"
  exit 1
fi

rofi_config_args=()
if [[ -f "$rofi_theme_primary" ]]; then
  rofi_config_args=(-config "$rofi_theme_primary")
elif [[ -f "$rofi_theme_fallback" ]]; then
  rofi_config_args=(-config "$rofi_theme_fallback")
fi

current_theme=$(
  awk -F'=' '/^[[:space:]]*theme[[:space:]]*=/ {
    val=$2
    sub(/^[[:space:]]+/, "", val)
    sub(/[[:space:]]+$/, "", val)
    gsub(/^"|"$/, "", val)
    print val
    exit
  }' "$config_file"
)

mapfile -t available_theme_names < <(
  awk -F'=' '/^[[:space:]]*#[[:space:]]*theme[[:space:]]*=/ {
    val=$2
    sub(/^[[:space:]]+/, "", val)
    sub(/[[:space:]]+$/, "", val)
    gsub(/^"|"$/, "", val)
    print val
  }' "$config_file"
)

if [[ ${#available_theme_names[@]} -eq 0 ]]; then
  notify_user "$iDIR/error.png" "Ghostty Theme" "No commented themes found in $config_file"
  exit 1
fi

menu_entries=()
if [[ -n "$current_theme" ]]; then
  menu_entries+=("Current: $current_theme")
fi
for t in "${available_theme_names[@]}"; do
  menu_entries+=("$t")
done

choice=$(
  printf "%s\n" "${menu_entries[@]}" |
    rofi -i -dmenu -p "Ghostty Theme" "${rofi_config_args[@]}" -mesg "Select a theme to apply"
)

[[ -z "$choice" ]] && exit 0

if [[ "$choice" == "Current: "* ]]; then
  exit 0
fi

selected_theme="$choice"

if [[ -n "$current_theme" && "$selected_theme" == "$current_theme" ]]; then
  exit 0
fi

format_theme_value() {
  if [[ "$1" =~ [[:space:]] ]]; then
    printf "\"%s\"" "$1"
  else
    printf "%s" "$1"
  fi
}

selected_formatted=$(format_theme_value "$selected_theme")

tmp_file=$(mktemp)
awk -v selected="$selected_theme" -v selected_formatted="$selected_formatted" '
function trim(s) { sub(/^[[:space:]]+/, "", s); sub(/[[:space:]]+$/, "", s); return s }
function strip_quotes(s) { gsub(/^"|"$/, "", s); return s }
{
  line=$0
  if ($0 ~ /^[[:space:]]*theme[[:space:]]*=/) {
    sub(/^[[:space:]]*theme[[:space:]]*=/, "#theme =", line)
    print line
    next
  }
  if ($0 ~ /^[[:space:]]*#[[:space:]]*theme[[:space:]]*=/) {
    val=$0
    sub(/^[[:space:]]*#[[:space:]]*theme[[:space:]]*=[[:space:]]*/, "", val)
    val=trim(val)
    val=strip_quotes(val)
    if (val == selected) {
      print "theme = " selected_formatted
      next
    }
  }
  print $0
}' "$config_file" > "$tmp_file"

mv "$tmp_file" "$config_file"

pkill -SIGUSR2 ghostty >/dev/null 2>&1 || true

notify_user "$iDIR/ja.png" "Ghostty Theme Applied" "$selected_theme"

exit 0
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage