@kecan0406/ttheme 1.0.30 → 1.0.31

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.31",
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.31",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "ttheme": "bin/ttheme.js"
@@ -236,7 +236,7 @@ __tt_pv_bg_open() {
236
236
  bgcw=0 bgch=0 bginc="" bgrel=0 bgmx=0 bgmy=0 bganchor=0
237
237
  local REPLY
238
238
  __tt_bg_shown && bginc=$REPLY
239
- __tt_bg_cells
239
+ (( TTHEME_TMUX )) || __tt_bg_cells
240
240
  }
241
241
 
242
242
  __tt_pv_bg_show() {
@@ -1,25 +1,48 @@
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\\\e]4'
20
+ for i in {0..15}; do out+=";$i;$p[i+5]"; done
21
+ __tt_out "$out"$'\e\\'
22
+ (( TTHEME_TMUX )) && tmux set -q @ttheme_bg "$p[1]" 2>/dev/null
23
+ return 0
24
+ }
11
25
 
12
- local osc4="" i
13
- for i in {0..15}; do osc4+=";$i;$p[i+5]"; done
14
- printf '\033]4%s\033\\' "$osc4"
26
+ __tt_osc_reset() {
27
+ __tt_out $'\e]104\e\\\e]110\e\\\e]111\e\\\e]112\e\\\e]117\e\\'
28
+ (( TTHEME_TMUX )) && tmux set -qu @ttheme_bg 2>/dev/null
29
+ return 0
15
30
  }
16
31
 
17
- __tt_osc_reset() { printf '\033]104\033\\\033]110\033\\\033]111\033\\\033]112\033\\\033]117\033\\' }
32
+ __tt_repaint() {
33
+ if [[ -n $TTHEME_SPEC ]]; then
34
+ __tt_apply "$TTHEME_SPEC"
35
+ else
36
+ __tt_osc_reset
37
+ fi
38
+ }
18
39
 
19
40
  __tt_apply() { __tt_osc_apply "$@" }
20
41
 
21
42
  __tt_shown() { return 1 }
22
43
 
44
+ __tt_unshown() { : }
45
+
23
46
  __tt_keepable() { return 1 }
24
47
 
25
48
  __tt_pv_bg_open() { : }
@@ -47,6 +70,11 @@ __tt_pv_bg_save() { : }
47
70
  __tt_query_bg() {
48
71
  local saved resp="" c fd
49
72
  REPLY=""
73
+ if (( TTHEME_TMUX )); then
74
+ REPLY=$(tmux show -qv @ttheme_bg 2>/dev/null)
75
+ [[ $REPLY == \#* ]] && return 0
76
+ REPLY=""
77
+ fi
50
78
  exec {fd}<>/dev/tty 2>/dev/null || return 1
51
79
 
52
80
  saved=$(stty -g <&$fd 2>/dev/null)
@@ -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
@@ -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 @@
1
+ __tt_keepable() { (( ${TTHEME_TERMINALS[(Ie)windows-terminal]} )) }
package/shell/ttheme.zsh CHANGED
@@ -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() { : }
@@ -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 ]] || (( TTHEME_TMUX )); then
1576
1619
  add-zsh-hook precmd __tt_precmd
1577
1620
  add-zsh-hook preexec __tt_preexec
1578
1621
  __tt_bind_focus