@kecan0406/ttheme 1.0.46 → 1.0.48

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.46",
2
+ "version": "1.0.48",
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.46",
3
+ "version": "1.0.48",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "ttheme": "bin/ttheme.js"
@@ -29,18 +29,6 @@ __tt_bg_refresh() { : }
29
29
 
30
30
  __tt_bg_aligns() { (( ! ${TTHEME_TERMINALS[(Ie)iterm2]} )) }
31
31
 
32
- __tt_b64() {
33
- local t=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ out="" i n
34
- local -a b=("$@")
35
- for (( i = 1; i <= ${#b}; i += 3 )); do
36
- n=$(( (b[i] << 16) | (${b[i+1]:-0} << 8) | ${b[i+2]:-0} ))
37
- out+=${t:$(( (n >> 18) & 63 )):1}${t:$(( (n >> 12) & 63 )):1}
38
- if (( i + 1 <= ${#b} )); then out+=${t:$(( (n >> 6) & 63 )):1}; else out+='='; fi
39
- if (( i + 2 <= ${#b} )); then out+=${t:$(( n & 63 )):1}; else out+='='; fi
40
- done
41
- REPLY=$out
42
- }
43
-
44
32
  __tt_bg_frame() {
45
33
  local -i iw=$1 ih=$2 W=$3 H=$4 s=$5 ax=$(( ($6 - 1) % 3 )) ay=$(( ($6 - 1) / 3 )) f=${8:--1} wide dw dh ox oy
46
34
  wide=$(( W * ih >= H * iw ))
@@ -155,11 +143,22 @@ __tt_bg_label() {
155
143
  }
156
144
 
157
145
  __tt_bg_dim() {
158
- local img=$1
159
- local -a d
146
+ setopt localoptions nomultibyte
147
+ local img=$1 fd hdr="" c
148
+ local -a d=()
149
+ local -i i n
160
150
  [[ -n $img && -r $img ]] || return 1
161
151
  if [[ -z ${bgdim[$img]} ]]; then
162
- d=($(od -An -N24 -tu1 -- $img 2>/dev/null))
152
+ if { exec {fd}<$img } 2>/dev/null; then
153
+ sysread -s 24 -i $fd hdr
154
+ exec {fd}<&-
155
+ fi
156
+ for (( i = 1; i <= ${#hdr}; i++ )); do
157
+ c=${hdr[i]}
158
+ n=$(( #c ))
159
+ (( n < 0 )) && (( n += 256 ))
160
+ d+=($n)
161
+ done
163
162
  if (( ${#d} == 24 && d[1] == 137 && d[2] == 80 && d[3] == 78 && d[4] == 71 )); then
164
163
  bgdim[$img]="$(( (d[17] << 24) | (d[18] << 16) | (d[19] << 8) | d[20] )) $(( (d[21] << 24) | (d[22] << 16) | (d[23] << 8) | d[24] ))"
165
164
  else
@@ -266,12 +265,12 @@ __tt_pv_bg_show() {
266
265
  local -a p=(${=TTHEME_PALETTE[$name]}) wh at
267
266
  local -i cols=$(( pw + 2 * bgmx )) rows=$(( ph + 2 * bgmy ))
268
267
  (( ${#p} >= 20 )) || return 0
269
- (( $2 )) && { bgsent=(); bgshown="" bganchor=0 }
268
+ (( $2 )) && { __tt_bg_forget; bgshown="" bganchor=0 }
270
269
  bgname=$name
271
270
  __tt_bg_load $name
272
271
  if (( ! bgrel )) && [[ $name == "$bginc" && "${bgsize[$name]} ${bgpos[$name]} ${bgop[$name]} ${bgoff[$name]}" == "${bgload[$name]}" ]]; then
273
272
  printf '\e_Ga=d,d=i,i=1,q=2\e\\\e_Ga=d,d=i,i=2,q=2\e\\'
274
- [[ -n $bgshown ]] && printf '\e_Ga=d,d=i,i=%d,q=2\e\\' $bgshown
273
+ [[ -n $bgshown ]] && printf '\e_Ga=d,d=i,i=%d,p=%d,q=2\e\\' $bgshown $bgshown
275
274
  bgshown=""
276
275
  return 0
277
276
  fi
@@ -305,20 +304,41 @@ __tt_pv_bg_show() {
305
304
  __tt_bg_crop $img $wh[1] $wh[2] $at[6] $at[8] && id=${REPLY% *} at[6]=${REPLY##* }
306
305
  fi
307
306
  fi
308
- [[ -n $bgshown && $bgshown != "$id" ]] && printf '\e_Ga=d,d=i,i=%d,q=2\e\\' $bgshown
307
+ [[ -n $bgshown && $bgshown != "$id" ]] && printf '\e_Ga=d,d=i,i=%d,p=%d,q=2\e\\' $bgshown $bgshown
309
308
  bgshown=$id
310
309
  [[ -n $id ]] || return 0
311
310
  __tt_bg_at $id -1073741826 $(( at[1] - 1 )) $(( at[2] - 1 )) $at[3] $at[4] $at[5] $at[6] $at[7] $at[8]
312
311
  }
313
312
 
314
313
  __tt_bg_send() {
315
- if [[ -z ${bgsent[$1]} ]]; then
316
- bgsent[$1]=$(( ${#bgsent} + 3 ))
317
- printf '\e_Ga=t,t=f,f=100,i=%d,q=2;%s\e\\' ${bgsent[$1]} "$(print -rn -- $1 | base64 | tr -d '\n')"
314
+ local -i cost=0
315
+ if [[ -n ${bgsent[$1]} ]]; then
316
+ bgorder=("${(@)bgorder:#${(b)1}}" "$1")
317
+ else
318
+ __tt_bg_dim "$1" && cost=$(( ${bgdim[$1]% *} * ${bgdim[$1]#* } * 4 ))
319
+ bgsent[$1]=$(( ++bgnext + 2 )) bgcost[$1]=$cost
320
+ (( bgbytes += cost ))
321
+ bgorder+=("$1")
322
+ __tt_b64s "$1"
323
+ printf '\e_Ga=t,t=f,f=100,i=%d,q=2;%s\e\\' ${bgsent[$1]} "$REPLY"
324
+ while (( ${#bgorder} > 1 && bgbytes > 134217728 )); do
325
+ printf '\e_Ga=d,d=I,i=%d,q=2\e\\' ${bgsent[$bgorder[1]]}
326
+ (( bgbytes -= bgcost[$bgorder[1]] ))
327
+ unset "bgsent[$bgorder[1]]" "bgcost[$bgorder[1]]"
328
+ shift bgorder
329
+ done
318
330
  fi
319
331
  REPLY=${bgsent[$1]}
320
332
  }
321
333
 
334
+ __tt_bg_forget() {
335
+ local id
336
+ for id in $bgsent; do
337
+ printf '\e_Ga=d,d=I,i=%d,q=2\e\\' $id
338
+ done
339
+ bgsent=() bgcost=() bgorder=() bgbytes=0
340
+ }
341
+
322
342
  __tt_pv_bg_fs() {
323
343
  local name=$1
324
344
  local -a wh fwh
@@ -406,6 +426,7 @@ __tt_pv_bg_findable() {
406
426
  __tt_pv_bg_find() {
407
427
  local name=$1 err var
408
428
  local -i rc
429
+ [[ $applied == "$painted" ]] || { __tt_apply "$applied" && painted=$applied }
409
430
  __tt_pv_bg_close
410
431
  err=$(__tt_cli find $name 2>&1 >/dev/tty)
411
432
  rc=$?
@@ -414,7 +435,7 @@ __tt_pv_bg_find() {
414
435
  done
415
436
  [[ -r $TTHEME_CONFIG ]] && source $TTHEME_CONFIG
416
437
  err=${${err//$'\n'/ }## #}
417
- resized=1 bgname="" bgshown="" bgsent=() bgdim=()
438
+ resized=1 bgname="" bgshown="" bgdim=()
418
439
  if (( rc == 1 )); then
419
440
  msg=${err:-"find failed for $name"} msgt=300
420
441
  fi
@@ -444,7 +465,7 @@ __tt_pv_bg_image() {
444
465
  err=$(__tt_cli image $name $act 2>&1)
445
466
  rc=$?
446
467
  err=${${err//$'\n'/ }## #}
447
- resized=1 bgname="" bgshown="" bgsent=() bgdim=()
468
+ resized=1 bgname="" bgshown="" bgdim=()
448
469
  unset "bgsrc[$name]"
449
470
  __tt_bg_load $name
450
471
  bgload[$name]="" bgedit[$name]=1
@@ -513,7 +534,7 @@ __tt_pv_bg_panel() {
513
534
  }
514
535
 
515
536
  __tt_pv_bg_close() {
516
- (( bgcw )) && printf '\e_Ga=d,d=A,q=2\e\\'
537
+ (( bgcw )) && { printf '\e_Ga=d,d=A,q=2\e\\'; __tt_bg_forget }
517
538
  [[ -z $bgcut ]] || { rm -rf -- $bgcut; bgcut="" }
518
539
  }
519
540
 
@@ -19,6 +19,7 @@ __tt_osc_apply() {
19
19
  out+=$'\e]10;'$p[2]$'\e\\\e]12;'$p[3]$'\e\\\e]17;'$p[4]$'\e\\'
20
20
  for i in {0..15}; do out+=$'\e]4;'$i';'$p[i+5]$'\e\\'; done
21
21
  __tt_out "$out"
22
+ export TTHEME_PAINTED=1
22
23
  (( TTHEME_TMUX )) && tmux set -q @ttheme_bg "$p[1]" 2>/dev/null
23
24
  __tt_worn "$1"
24
25
  return 0
@@ -26,6 +27,7 @@ __tt_osc_apply() {
26
27
 
27
28
  __tt_osc_reset() {
28
29
  __tt_out $'\e]104\e\\\e]110\e\\\e]111\e\\\e]112\e\\\e]117\e\\'
30
+ unset TTHEME_PAINTED
29
31
  (( TTHEME_TMUX )) && tmux set -qu @ttheme_bg 2>/dev/null
30
32
  __tt_worn ""
31
33
  return 0
@@ -43,6 +45,8 @@ __tt_repaint() {
43
45
 
44
46
  __tt_apply() { __tt_osc_apply "$@" }
45
47
 
48
+ __tt_pv_paint() { __tt_apply "$1" && painted=$1 }
49
+
46
50
  __tt_shown() { return 1 }
47
51
 
48
52
  __tt_unshown() { : }
@@ -78,25 +82,54 @@ __tt_pv_bg_save() { : }
78
82
  zmodload zsh/system
79
83
 
80
84
  typeset -g TTHEME_TYPED=""
85
+ typeset -gi TTHEME_RAW=0
86
+
87
+ __tt_b64() {
88
+ local t=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ out="" i n
89
+ local -a b=("$@")
90
+ for (( i = 1; i <= ${#b}; i += 3 )); do
91
+ n=$(( (b[i] << 16) | (${b[i+1]:-0} << 8) | ${b[i+2]:-0} ))
92
+ out+=${t:$(( (n >> 18) & 63 )):1}${t:$(( (n >> 12) & 63 )):1}
93
+ if (( i + 1 <= ${#b} )); then out+=${t:$(( (n >> 6) & 63 )):1}; else out+='='; fi
94
+ if (( i + 2 <= ${#b} )); then out+=${t:$(( n & 63 )):1}; else out+='='; fi
95
+ done
96
+ REPLY=$out
97
+ }
98
+
99
+ __tt_b64s() {
100
+ setopt localoptions nomultibyte
101
+ local s=$1 c
102
+ local -a b=()
103
+ local -i i n
104
+ for (( i = 1; i <= ${#s}; i++ )); do
105
+ c=${s[i]}
106
+ n=$(( #c ))
107
+ (( n < 0 )) && (( n += 256 ))
108
+ b+=($n)
109
+ done
110
+ __tt_b64 $b
111
+ }
81
112
 
82
113
  __tt_ask() {
83
114
  setopt localoptions extendedglob
84
- local fd saved buf="" chunk seqs=$'\e[]_P][^\a\e]#(\a|\e\\\\)|\e\\[[0-?]#[ -/]#[@-~]|\e[^][_P]'
115
+ local fd saved="" buf="" chunk seqs=$'\e[]_P][^\a\e]#(\a|\e\\\\)|\e\\[[0-?]#[ -/]#[@-~]|\e[^][_P]'
85
116
  local -a match mbegin mend
86
117
  REPLY=""
87
118
  { exec {fd}<>/dev/tty } 2>/dev/null || return 1
88
- saved=$(stty -g <&$fd 2>/dev/null && stty raw -echo min 0 time 3 <&$fd 2>/dev/null)
89
- if [[ -z $saved ]]; then
90
- exec {fd}>&-
91
- return 1
119
+ if (( ! TTHEME_RAW )) && ! zle; then
120
+ saved=$(stty -g <&$fd 2>/dev/null && stty raw -echo <&$fd 2>/dev/null)
121
+ if [[ -z $saved ]]; then
122
+ exec {fd}>&-
123
+ return 1
124
+ fi
92
125
  fi
93
126
  printf '%s\e[5n' "$1" >&$fd
94
- while sysread -i $fd -s 4096 chunk 2>/dev/null; do
127
+ while sysread -t 0.3 -i $fd -s 4096 chunk 2>/dev/null; do
95
128
  buf+=$chunk
96
129
  [[ $buf == *$'\e[0n'* ]] && break
97
130
  (( ${#buf} < 16384 )) || break
98
131
  done
99
- stty "$saved" <&$fd 2>/dev/null
132
+ [[ -n $saved ]] && stty "$saved" <&$fd 2>/dev/null
100
133
  exec {fd}>&-
101
134
  while [[ $buf == (#b)([^$'\e']#)(${~seqs})(*) ]]; do
102
135
  TTHEME_TYPED+=$match[1] REPLY+=$match[2] buf=$match[-1]
@@ -111,7 +144,14 @@ __tt_typed() {
111
144
  TTHEME_TYPED=
112
145
  }
113
146
 
114
- __tt_start_bg() { __tt_query_bg }
147
+ __tt_hear() { __tt_query_bg }
148
+
149
+ __tt_heard() { : }
150
+
151
+ __tt_start_bg() {
152
+ REPLY=${TTHEME_HEARD%% *}
153
+ [[ -n $REPLY ]]
154
+ }
115
155
 
116
156
  __tt_query_bg() {
117
157
  local resp
@@ -7,6 +7,17 @@ fi
7
7
 
8
8
  __tt_keepable() { return 0 }
9
9
 
10
+ __tt_pv_paint() {
11
+ local -a p=(${=1})
12
+ if (( ${#p} < 20 )); then
13
+ __tt_out $'\e]110\e\\\e]111\e\\'
14
+ elif [[ $p[1] == - ]]; then
15
+ __tt_out $'\e]111\e\\\e]10;'$p[2]$'\e\\'
16
+ else
17
+ __tt_out $'\e]11;'$p[1]$'\e\\\e]10;'$p[2]$'\e\\'
18
+ fi
19
+ }
20
+
10
21
  __tt_bg_shown() {
11
22
  REPLY=""
12
23
  (( TTHEME_TMUX )) && REPLY=$(tmux show -qv @ttheme_shown 2>/dev/null)
@@ -67,6 +78,6 @@ __tt_bg_crop() {
67
78
  sips -c $h $iw --cropOffset 1 1 $bgcut/pad.png --out $band >/dev/null 2>&1 || return 1
68
79
  fi
69
80
  fi
70
- printf '\e_Ga=t,t=f,f=100,i=999997,q=2;%s\e\\' "$(print -rn -- $band | base64 | tr -d '\n')"
71
- REPLY="999997 0"
81
+ __tt_bg_send $band
82
+ REPLY="$REPLY 0"
72
83
  }
@@ -4,7 +4,11 @@ typeset -g TTHEME_KITTY_SHOWN=""
4
4
 
5
5
  __tt_keepable() { (( ${TTHEME_TERMINALS[(Ie)kitty]} )) }
6
6
 
7
- __tt_kitty_var() { __tt_out $'\e]1337;SetUserVar='$1'='"$(print -rn -- $2 | base64)"$'\a' }
7
+ __tt_kitty_var() {
8
+ local REPLY
9
+ __tt_b64s "$2"
10
+ __tt_out $'\e]1337;SetUserVar='$1'='$REPLY$'\a'
11
+ }
8
12
 
9
13
  __tt_shown() {
10
14
  [[ $2 != force && $TTHEME_KITTY_SHOWN == $1 ]] && return 1
@@ -1,12 +1,13 @@
1
1
  typeset -g TTHEME_TERMINAL_BASE=""
2
2
 
3
- __tt_terminal_base() {
4
- local REPLY resp q=$'\e]11;?\e\\\e]10;?\e\\\e]12;?\e\\\e]17;?\e\\' e v i
3
+ __tt_hear() {
4
+ local resp q=$'\e]11;?\e\\\e]10;?\e\\\e]12;?\e\\\e]17;?\e\\' e v i
5
5
  local -a p
6
6
  local -A got
7
7
  for i in {0..15}; do q+=$'\e]4;'$i$';?\e\\'; done
8
8
  __tt_ask $q || return 1
9
9
  resp=$REPLY
10
+ REPLY=""
10
11
  for e in ${(ps:\e]:)resp}; do
11
12
  [[ $e == *';rgb:'* ]] || continue
12
13
  p=(${(s:/:)${${e#*rgb:}%%[^0-9A-Fa-f/]*}})
@@ -14,17 +15,16 @@ __tt_terminal_base() {
14
15
  done
15
16
  v="$got[11] $got[10] $got[12] ${got[17]:-$got[11]}"
16
17
  for i in {0..15}; do v+=" ${got[4;$i]}"; done
17
- (( ${#${=v}} == 20 )) && TTHEME_TERMINAL_BASE=$v
18
+ (( ${#${=v}} == 20 )) || return 1
19
+ REPLY=$v
18
20
  }
19
21
 
20
- __tt_start_bg() {
21
- REPLY=${TTHEME_TERMINAL_BASE%% *}
22
- [[ -n $REPLY ]]
23
- }
22
+ __tt_heard() { TTHEME_TERMINAL_BASE=$1 }
24
23
 
25
24
  __tt_osc_reset() {
26
25
  [[ -n $TTHEME_TERMINAL_BASE ]] && __tt_osc_apply "$TTHEME_TERMINAL_BASE"
26
+ unset TTHEME_PAINTED
27
27
  return 0
28
28
  }
29
29
 
30
- [[ -o interactive && -t 1 ]] && __tt_terminal_base
30
+ [[ -o interactive && -t 1 ]] && __tt_listen
@@ -2,7 +2,11 @@ typeset -g TTHEME_WEZTERM_SHOWN=""
2
2
 
3
3
  __tt_keepable() { (( ${TTHEME_TERMINALS[(Ie)wezterm]} )) }
4
4
 
5
- __tt_wezterm_show() { printf '\e]1337;SetUserVar=ttheme_shown=%s\a' "$(print -rn -- $1 | base64)" }
5
+ __tt_wezterm_show() {
6
+ local REPLY
7
+ __tt_b64s "$1"
8
+ printf '\e]1337;SetUserVar=ttheme_shown=%s\a' "$REPLY"
9
+ }
6
10
 
7
11
  __tt_shown() {
8
12
  [[ $2 != force && $TTHEME_WEZTERM_SHOWN == $1 ]] && return 1