@kecan0406/ttheme 1.0.30 → 1.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.30",
2
+ "version": "1.0.32",
3
3
  "gate": [
4
4
  {
5
5
  "rule": "foreground",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kecan0406/ttheme",
3
- "version": "1.0.30",
3
+ "version": "1.0.32",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "ttheme": "bin/ttheme.js"
@@ -11,10 +11,13 @@ __tt_ghostty_shown() {
11
11
  __tt_bg_saved() {
12
12
  local REPLY
13
13
  (( ${TTHEME_TERMINALS[(Ie)iterm2]} )) && __tt_cli image $1 tuned
14
+ __tt_bg_refresh "$@"
14
15
  __tt_ghostty_shown && (( ${@[(Ie)$REPLY]} )) && __tt_reload
15
16
  return 0
16
17
  }
17
18
 
19
+ __tt_bg_refresh() { : }
20
+
18
21
  __tt_bg_aligns() { (( ! ${TTHEME_TERMINALS[(Ie)iterm2]} )) }
19
22
 
20
23
  __tt_b64() {
@@ -236,7 +239,7 @@ __tt_pv_bg_open() {
236
239
  bgcw=0 bgch=0 bginc="" bgrel=0 bgmx=0 bgmy=0 bganchor=0
237
240
  local REPLY
238
241
  __tt_bg_shown && bginc=$REPLY
239
- __tt_bg_cells
242
+ (( TTHEME_TMUX )) || __tt_bg_cells
240
243
  }
241
244
 
242
245
  __tt_pv_bg_show() {
@@ -1,25 +1,54 @@
1
+ __tt_out() {
2
+ if (( TTHEME_TMUX )); then
3
+ printf '\ePtmux;%s\e\\' "${1//$'\e'/$'\e\e'}"
4
+ else
5
+ printf '%s' "$1"
6
+ fi
7
+ }
8
+
1
9
  __tt_osc_apply() {
2
10
  local -a p=(${=1})
3
11
  (( ${#p} >= 20 )) || return 1
12
+ local out i
4
13
 
5
14
  if [[ $p[1] == - ]]; then
6
- printf '\033]111\033\\'
15
+ out=$'\e]111\e\\'
7
16
  else
8
- printf '\033]11;%s\033\\' "$p[1]"
17
+ out=$'\e]11;'$p[1]$'\e\\'
9
18
  fi
10
- printf '\033]10;%s\033\\\033]12;%s\033\\\033]17;%s\033\\' "$p[2]" "$p[3]" "$p[4]"
19
+ out+=$'\e]10;'$p[2]$'\e\\\e]12;'$p[3]$'\e\\\e]17;'$p[4]$'\e\\'
20
+ for i in {0..15}; do out+=$'\e]4;'$i';'$p[i+5]$'\e\\'; done
21
+ __tt_out "$out"
22
+ (( TTHEME_TMUX )) && tmux set -q @ttheme_bg "$p[1]" 2>/dev/null
23
+ __tt_worn "$1"
24
+ return 0
25
+ }
11
26
 
12
- local osc4="" i
13
- for i in {0..15}; do osc4+=";$i;$p[i+5]"; done
14
- printf '\033]4%s\033\\' "$osc4"
27
+ __tt_osc_reset() {
28
+ __tt_out $'\e]104\e\\\e]110\e\\\e]111\e\\\e]112\e\\\e]117\e\\'
29
+ (( TTHEME_TMUX )) && tmux set -qu @ttheme_bg 2>/dev/null
30
+ __tt_worn ""
31
+ return 0
15
32
  }
16
33
 
17
- __tt_osc_reset() { printf '\033]104\033\\\033]110\033\\\033]111\033\\\033]112\033\\\033]117\033\\' }
34
+ __tt_repaint() {
35
+ if [[ -n $TTHEME_SPEC ]]; then
36
+ __tt_apply "$TTHEME_SPEC"
37
+ else
38
+ __tt_osc_reset
39
+ fi
40
+ }
18
41
 
19
42
  __tt_apply() { __tt_osc_apply "$@" }
20
43
 
21
44
  __tt_shown() { return 1 }
22
45
 
46
+ __tt_unshown() { : }
47
+
48
+ __tt_reloaded() { : }
49
+
50
+ __tt_worn() { : }
51
+
23
52
  __tt_keepable() { return 1 }
24
53
 
25
54
  __tt_pv_bg_open() { : }
@@ -47,6 +76,11 @@ __tt_pv_bg_save() { : }
47
76
  __tt_query_bg() {
48
77
  local saved resp="" c fd
49
78
  REPLY=""
79
+ if (( TTHEME_TMUX )); then
80
+ REPLY=$(tmux show -qv @ttheme_bg 2>/dev/null)
81
+ [[ $REPLY == \#* ]] && return 0
82
+ REPLY=""
83
+ fi
50
84
  exec {fd}<>/dev/tty 2>/dev/null || return 1
51
85
 
52
86
  saved=$(stty -g <&$fd 2>/dev/null)
@@ -0,0 +1 @@
1
+ __tt_keepable() { (( ${TTHEME_TERMINALS[(Ie)alacritty]} )) }
@@ -8,7 +8,9 @@ fi
8
8
  __tt_keepable() { return 0 }
9
9
 
10
10
  __tt_bg_shown() {
11
- REPLY=$TTHEME_ITERM_SHOWN
11
+ REPLY=""
12
+ (( TTHEME_TMUX )) && REPLY=$(tmux show -qv @ttheme_shown 2>/dev/null)
13
+ [[ -n $REPLY ]] || REPLY=$TTHEME_ITERM_SHOWN
12
14
  [[ $REPLY == default ]] && REPLY=$TTHEME_STARTUP
13
15
  [[ -n $REPLY ]]
14
16
  }
@@ -18,13 +20,24 @@ __tt_shown() {
18
20
  __tt_bg_shown
19
21
  was=$REPLY
20
22
  [[ $2 != force && $was == $1 ]] && return 1
21
- [[ -r $dir/$1.conf || ( -n $was && -r $dir/$was.conf ) ]] || return 1
23
+ [[ -r $dir/$1.conf || ( -n $was && -r $dir/$was.conf ) ]] || (( TTHEME_MUXED )) || return 1
22
24
  (( ${TTHEME_ORDER[(Ie)$1]} )) || return 1
23
- printf '\e]1337;SetProfile=ttheme · %s\a' $1
25
+ __tt_out $'\e]1337;SetProfile=ttheme · '$1$'\a'
24
26
  TTHEME_ITERM_SHOWN=$1
27
+ (( TTHEME_TMUX )) && tmux set -q @ttheme_shown $1 2>/dev/null
25
28
  return 1
26
29
  }
27
30
 
31
+ __tt_unshown() {
32
+ local want=${TTHEME_STARTUP:+default} was=$TTHEME_ITERM_SHOWN
33
+ (( TTHEME_TMUX )) && was=$(tmux show -qv @ttheme_shown 2>/dev/null)
34
+ [[ $1 != force && $was == "$want" ]] && return 0
35
+ __tt_out $'\e]1337;SetProfile=\a'
36
+ TTHEME_ITERM_SHOWN=$want
37
+ (( TTHEME_TMUX )) && tmux set -q @ttheme_shown "$want" 2>/dev/null
38
+ return 0
39
+ }
40
+
28
41
  __tt_bg_cells() {
29
42
  local fd saved resp="" c
30
43
  local -a p
@@ -1,31 +1,54 @@
1
- if (( $+commands[kitten] )); then
2
- __tt_kitty() { kitten @ "$@" }
3
- elif (( $+commands[kitty] )); then
4
- __tt_kitty() { kitty @ "$@" }
5
- else
6
- __tt_kitty() { return 1 }
7
- fi
8
-
9
- __tt_kitty_args() {
10
- local -a p=(${=1})
11
- (( ${#p} >= 20 )) || return 1
12
- reply=(
13
- foreground=$p[2]
14
- background=$p[1]
15
- cursor=$p[3]
16
- cursor_text_color=$p[1]
17
- selection_background=$p[4]
18
- selection_foreground=$p[2]
19
- )
20
- local i
21
- for i in {0..15}; do reply+=("color$i=$p[i+5]"); done
1
+ source $TTHEME_HOME/adapters/_bg.zsh
2
+
3
+ typeset -g TTHEME_KITTY_SHOWN=""
4
+
5
+ __tt_keepable() { (( ${TTHEME_TERMINALS[(Ie)kitty]} )) }
6
+
7
+ __tt_kitty_var() { __tt_out $'\e]1337;SetUserVar='$1'='"$(print -rn -- $2 | base64)"$'\a' }
8
+
9
+ __tt_shown() {
10
+ [[ $2 != force && $TTHEME_KITTY_SHOWN == $1 ]] && return 1
11
+ TTHEME_KITTY_SHOWN=$1
12
+ __tt_kitty_var ttheme_shown $1
13
+ return 1
14
+ }
15
+
16
+ __tt_unshown() {
17
+ TTHEME_KITTY_SHOWN=""
18
+ __tt_kitty_var ttheme_shown ""
22
19
  }
23
20
 
24
- __tt_apply() {
25
- local -a reply
26
- if [[ ${1%% *} != - ]] && __tt_kitty_args "$1"; then
27
- __tt_kitty set-colors -- "${reply[@]}" 2>/dev/null && return 0
28
- fi
21
+ __tt_worn() {
22
+ local REPLY=""
23
+ [[ -n $1 ]] && __tt_name_of "$1"
24
+ [[ -n ${TTHEME_PALETTE[$REPLY]} ]] || REPLY=""
25
+ __tt_kitty_var ttheme_worn $REPLY
26
+ }
27
+
28
+ __tt_reloaded() { [[ -n $TTHEME_STARTUP ]] && __tt_kitty_var ttheme_startup $TTHEME_STARTUP }
29
+
30
+ __tt_bg_shown() { REPLY=$TTHEME_KITTY_SHOWN }
31
+
32
+ __tt_bg_refresh() { (( ${@[(Ie)$TTHEME_KITTY_SHOWN]} )) && __tt_kitty_var ttheme_shown $TTHEME_KITTY_SHOWN }
33
+
34
+ __tt_bg_cells() {
35
+ local fd saved resp="" c
36
+ exec {fd}<>/dev/tty 2>/dev/null || return 0
37
+ saved=$(stty -g <&$fd 2>/dev/null)
38
+ stty raw -echo min 0 time 3 <&$fd 2>/dev/null
39
+ printf '\e[16t' >&$fd
40
+ while IFS= read -r -s -k 1 -t 1 -u $fd c 2>/dev/null; do
41
+ resp+=$c
42
+ [[ $resp == *'[6;'<1->';'<1->t ]] && break
43
+ done
44
+ stty "$saved" <&$fd 2>/dev/null
45
+ exec {fd}>&-
46
+ [[ $resp == *'[6;'<1->';'<1->t ]] || return 0
47
+ resp=${${resp##*\[6;}%t}
48
+ bgch=${resp%;*} bgcw=${resp#*;}
49
+ }
29
50
 
30
- __tt_osc_apply "$1"
51
+ __tt_bg_crop() {
52
+ __tt_bg_send $1
53
+ REPLY="$REPLY $4"
31
54
  }
@@ -0,0 +1,35 @@
1
+ typeset -g TTHEME_TERMINAL_BASE=""
2
+
3
+ __tt_terminal_base() {
4
+ local fd saved resp="" c q=$'\e]11;?\e\\\e]10;?\e\\\e]12;?\e\\\e]17;?\e\\' e v i
5
+ local -a p
6
+ local -A got
7
+ for i in {0..15}; do q+=$'\e]4;'$i$';?\e\\'; done
8
+ exec {fd}<>/dev/tty 2>/dev/null || return 1
9
+ saved=$(stty -g <&$fd 2>/dev/null)
10
+ [[ -n $saved ]] || { exec {fd}>&-; return 1 }
11
+ stty raw -echo min 0 time 3 <&$fd 2>/dev/null
12
+ printf '%s\e[5n' $q >&$fd
13
+ while IFS= read -r -k 1 -u $fd c 2>/dev/null; do
14
+ resp+=$c
15
+ [[ $resp == *$'\e[0n' ]] && break
16
+ (( ${#resp} < 2048 )) || break
17
+ done
18
+ stty "$saved" <&$fd 2>/dev/null
19
+ exec {fd}>&-
20
+ for e in ${(ps:\e]:)resp}; do
21
+ [[ $e == *';rgb:'* ]] || continue
22
+ p=(${(s:/:)${${e#*rgb:}%%[^0-9A-Fa-f/]*}})
23
+ (( ${#p} >= 3 )) && got[${e%%;rgb:*}]="#${(L)p[1][1,2]}${(L)p[2][1,2]}${(L)p[3][1,2]}"
24
+ done
25
+ v="$got[11] $got[10] $got[12] ${got[17]:-$got[11]}"
26
+ for i in {0..15}; do v+=" ${got[4;$i]}"; done
27
+ (( ${#${=v}} == 20 )) && TTHEME_TERMINAL_BASE=$v
28
+ }
29
+
30
+ __tt_osc_reset() {
31
+ [[ -n $TTHEME_TERMINAL_BASE ]] && __tt_osc_apply "$TTHEME_TERMINAL_BASE"
32
+ return 0
33
+ }
34
+
35
+ [[ -o interactive && -t 1 ]] && __tt_terminal_base
@@ -0,0 +1,19 @@
1
+ typeset -g TTHEME_WEZTERM_SHOWN=""
2
+
3
+ __tt_keepable() { (( ${TTHEME_TERMINALS[(Ie)wezterm]} )) }
4
+
5
+ __tt_wezterm_show() { printf '\e]1337;SetUserVar=ttheme_shown=%s\a' "$(print -rn -- $1 | base64)" }
6
+
7
+ __tt_shown() {
8
+ [[ $2 != force && $TTHEME_WEZTERM_SHOWN == $1 ]] && return 1
9
+ TTHEME_WEZTERM_SHOWN=$1
10
+ __tt_wezterm_show $1
11
+ return 1
12
+ }
13
+
14
+ __tt_pv_bg_show() {
15
+ bgname=$1
16
+ __tt_wezterm_show $1
17
+ }
18
+
19
+ __tt_pv_bg_close() { [[ -z $TTHEME_WEZTERM_SHOWN ]] || __tt_wezterm_show $TTHEME_WEZTERM_SHOWN }
@@ -0,0 +1,3 @@
1
+ __tt_keepable() { (( ${TTHEME_TERMINALS[(Ie)windows-terminal]} )) }
2
+
3
+ __tt_reloaded() { __tt_repaint }
package/shell/ttheme.zsh CHANGED
@@ -13,7 +13,7 @@ __tt_palettes_load() {
13
13
  __tt_fresh() {
14
14
  local -a at
15
15
  zstat -F %s.%N -A at +mtime -- $TTHEME_HOME/palettes.zsh 2>/dev/null || return 0
16
- [[ $at[1] == "$TTHEME_PALETTES_AT" ]] || __tt_palettes_load
16
+ [[ $at[1] == "$TTHEME_PALETTES_AT" ]] || { __tt_palettes_load && __tt_reloaded }
17
17
  }
18
18
 
19
19
  if [[ -r $TTHEME_HOME/palettes.zsh ]]; then
@@ -62,7 +62,9 @@ __tt_pins_load
62
62
 
63
63
  typeset -g TTHEME_STATE_DIR=${XDG_STATE_HOME:-$HOME/.local/state}/ttheme
64
64
 
65
- if [[ -n $GHOSTTY_RESOURCES_DIR || $TERM_PROGRAM == ghostty ]]; then
65
+ if [[ $TERM_PROGRAM == WarpTerminal ]]; then
66
+ typeset -g TTHEME_ADAPTER=warp
67
+ elif [[ -n $GHOSTTY_RESOURCES_DIR || $TERM_PROGRAM == ghostty ]]; then
66
68
  typeset -g TTHEME_ADAPTER=ghostty
67
69
  elif [[ -n $KITTY_WINDOW_ID ]]; then
68
70
  typeset -g TTHEME_ADAPTER=kitty
@@ -72,32 +74,43 @@ elif [[ -n $ALACRITTY_WINDOW_ID ]]; then
72
74
  typeset -g TTHEME_ADAPTER=alacritty
73
75
  elif [[ -n $ITERM_SESSION_ID || $TERM_PROGRAM == iTerm.app ]]; then
74
76
  typeset -g TTHEME_ADAPTER=iterm2
77
+ elif [[ $TERM_PROGRAM == Apple_Terminal ]]; then
78
+ typeset -g TTHEME_ADAPTER=terminal-app
79
+ elif [[ -n $WT_SESSION && -z $TERM_PROGRAM ]]; then
80
+ typeset -g TTHEME_ADAPTER=windows-terminal
75
81
  elif [[ $TERM == foot* ]]; then
76
82
  typeset -g TTHEME_ADAPTER=foot
77
83
  else
78
84
  typeset -g TTHEME_ADAPTER=unknown
79
85
  fi
80
86
 
81
- typeset -g TTHEME_GHOSTTY_PID=""
87
+ typeset -g TTHEME_GHOSTTY_PID="" TTHEME_TMUX=0 TTHEME_MUXED=0
82
88
 
83
89
  __tt_reload() {
84
90
  (( ${TTHEME_TERMINALS[(Ie)ghostty]} )) || return 0
85
- local pid=$PPID ppid comm
86
- if [[ -z $TTHEME_GHOSTTY_PID ]]; then
87
- TTHEME_GHOSTTY_PID=0
91
+ local pid=$PPID ppid comm owner=$TTHEME_GHOSTTY_PID
92
+ (( TTHEME_TMUX )) && { pid=$(tmux display -p '#{client_pid}' 2>/dev/null) owner="" }
93
+ if [[ -z $owner ]]; then
94
+ owner=0
88
95
  while (( pid > 1 )); do
89
96
  read -r ppid comm <<< "$(ps -o ppid=,comm= -p $pid)"
90
97
  if [[ ${comm:t} == ghostty ]]; then
91
- TTHEME_GHOSTTY_PID=$pid
98
+ owner=$pid
92
99
  break
93
100
  fi
94
101
  pid=$ppid
95
102
  done
103
+ (( TTHEME_TMUX )) || TTHEME_GHOSTTY_PID=$owner
96
104
  fi
97
- (( TTHEME_GHOSTTY_PID )) && kill -USR2 $TTHEME_GHOSTTY_PID 2>/dev/null && return
105
+ (( owner )) && kill -USR2 $owner 2>/dev/null && return
98
106
  pkill -USR2 -x ghostty 2>/dev/null
99
107
  }
100
108
 
109
+ __tt_tmux() {
110
+ [[ $(tmux if -t "$TMUX_PANE" -F '#{==:#{allow-passthrough},off}' 'set -p allow-passthrough on' \; set -sq focus-events on \; display -p '#{client_control_mode}' 2>/dev/null) == 1 ]] && return 0
111
+ TTHEME_TMUX=1 TTHEME_SPEC=
112
+ }
113
+
101
114
  source $TTHEME_HOME/adapters/_osc.zsh
102
115
  [[ -r $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh ]] &&
103
116
  source $TTHEME_HOME/adapters/$TTHEME_ADAPTER.zsh
@@ -105,7 +118,7 @@ source $TTHEME_HOME/adapters/_osc.zsh
105
118
  __tt_active() {
106
119
  [[ -o interactive ]] || return 1
107
120
  (( ${#TTHEME_PALETTE} )) || return 1
108
- [[ $TTHEME_ADAPTER != unknown || -n $TTHEME_FORCE ]]
121
+ [[ $TTHEME_ADAPTER != (unknown|warp) || -n $TTHEME_FORCE ]]
109
122
  }
110
123
 
111
124
  __tt_empty() {
@@ -209,9 +222,30 @@ __tt_precmd() {
209
222
 
210
223
  __tt_preexec() { printf '\e[?1004l' }
211
224
 
225
+ __tt_rewear() {
226
+ local REPLY
227
+ __tt_repaint
228
+ [[ -n $TTHEME_SPEC ]] || { __tt_unshown $1; return 0 }
229
+ __tt_name_of "$TTHEME_SPEC"
230
+ [[ -n ${TTHEME_PALETTE[$REPLY]} ]] || return 0
231
+ __tt_shown "$REPLY" $1 && __tt_reload
232
+ }
233
+
212
234
  __tt_focus() {
213
235
  __tt_fresh
214
- __tt_sync
236
+ if (( TTHEME_TMUX )); then
237
+ __tt_rewear
238
+ else
239
+ __tt_sync
240
+ fi
241
+ }
242
+
243
+ __tt_mux() { [[ ${${(z)3}[1]:t} == tmux ]] && TTHEME_MUXED=1 }
244
+
245
+ __tt_unmux() {
246
+ (( TTHEME_MUXED )) || return 0
247
+ __tt_rewear force
248
+ TTHEME_MUXED=0
215
249
  }
216
250
 
217
251
  __tt_blur() { : }
@@ -380,7 +414,7 @@ __tt_catalog() {
380
414
  [[ $1 == list ]] && return 0
381
415
  [[ -r $TTHEME_HOME/palettes.zsh ]] || return 0
382
416
  was="$TTHEME_STARTUP ${TTHEME_PALETTE[$TTHEME_STARTUP]}"
383
- __tt_palettes_load
417
+ __tt_palettes_load && __tt_reloaded
384
418
  [[ "$TTHEME_STARTUP ${TTHEME_PALETTE[$TTHEME_STARTUP]}" == "$was" ]] || __tt_reload
385
419
  }
386
420
 
@@ -792,7 +826,7 @@ __tt_pv_help() {
792
826
  )
793
827
  if (( bgcw )); then
794
828
  hk+=("tune bg" "" "" "" "")
795
- hv+=("tab · finds one on the boorus if none" "↑↓ field ←→ step ⇧←→ ×10 1-9 place" "space hides · = default · f adds one" "enter keeps · esc undoes" ", . other saved images · D removes this one")
829
+ hv+=("tab · finds one on the boorus, or takes your own, if none" "↑↓ field ←→ step ⇧←→ ×10 1-9 place" "space hides · = default · f adds one from the boorus or your own" "enter keeps · esc undoes" ", . other saved images · D removes this one")
796
830
  fi
797
831
  hk+=(config "")
798
832
  hv+=("alt-c · ↑↓ setting ←→ value" "enter saves · esc undoes")
@@ -1506,6 +1540,10 @@ __tt_preview() {
1506
1540
  }
1507
1541
 
1508
1542
  ttheme() {
1543
+ if [[ $TTHEME_ADAPTER == warp && $1 != (-h|--help|help|browse|list|add|remove|update|config|default) ]]; then
1544
+ print -u2 "ttheme: Warp wears one theme app-wide and paints no tab background of its own — \`ttheme default <palette>\` puts one on every Warp window"
1545
+ return 1
1546
+ fi
1509
1547
  if (( ! $# )); then
1510
1548
  (( ${#TTHEME_PALETTE} )) || { __tt_empty; return }
1511
1549
  __tt_menu
@@ -1552,6 +1590,7 @@ if (( $+functions[compdef] )); then
1552
1590
  fi
1553
1591
 
1554
1592
  if __tt_active; then
1593
+ [[ -n $TMUX ]] && __tt_tmux
1555
1594
  () {
1556
1595
  local REPLY k
1557
1596
  if [[ -n $TTHEME_SPEC ]]; then
@@ -1572,7 +1611,11 @@ if __tt_active; then
1572
1611
  autoload -Uz add-zsh-hook
1573
1612
  add-zsh-hook chpwd __tt_chpwd
1574
1613
  add-zsh-hook precmd __tt_fresh
1575
- if [[ $TTHEME_ADAPTER == ghostty ]]; then
1614
+ if (( ! TTHEME_TMUX )); then
1615
+ add-zsh-hook preexec __tt_mux
1616
+ add-zsh-hook precmd __tt_unmux
1617
+ fi
1618
+ if [[ $TTHEME_ADAPTER == (ghostty|kitty|windows-terminal) ]] || (( TTHEME_TMUX )); then
1576
1619
  add-zsh-hook precmd __tt_precmd
1577
1620
  add-zsh-hook preexec __tt_preexec
1578
1621
  __tt_bind_focus