@kecan0406/ttheme 1.0.0 → 1.0.1

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.0",
2
+ "version": "1.0.1",
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.0",
3
+ "version": "1.0.1",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "ttheme": "bin/ttheme.js"
@@ -0,0 +1,521 @@
1
+ typeset -ga TTHEME_BG_POSITIONS=(top-left top-center top-right center-left center center-right bottom-left bottom-center bottom-right)
2
+
3
+ __tt_ghostty_shown() {
4
+ local f=${TTHEME_CONFIG:h}/backgrounds/shown.conf
5
+ REPLY=""
6
+ [[ -r $f ]] || return 1
7
+ REPLY=${${"$(<$f)"}##*\?}
8
+ REPLY=${REPLY%.conf}
9
+ }
10
+
11
+ __tt_bg_saved() {
12
+ local REPLY
13
+ (( ${TTHEME_TERMINALS[(Ie)iterm2]} )) && __tt_cli image $1 tuned
14
+ __tt_ghostty_shown && (( ${@[(Ie)$REPLY]} )) && __tt_reload
15
+ return 0
16
+ }
17
+
18
+ __tt_bg_aligns() { (( ! ${TTHEME_TERMINALS[(Ie)iterm2]} )) }
19
+
20
+ __tt_b64() {
21
+ local t=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ out="" i n
22
+ local -a b=("$@")
23
+ for (( i = 1; i <= ${#b}; i += 3 )); do
24
+ n=$(( (b[i] << 16) | (${b[i+1]:-0} << 8) | ${b[i+2]:-0} ))
25
+ out+=${t:$(( (n >> 18) & 63 )):1}${t:$(( (n >> 12) & 63 )):1}
26
+ if (( i + 1 <= ${#b} )); then out+=${t:$(( (n >> 6) & 63 )):1}; else out+='='; fi
27
+ if (( i + 2 <= ${#b} )); then out+=${t:$(( n & 63 )):1}; else out+='='; fi
28
+ done
29
+ REPLY=$out
30
+ }
31
+
32
+ __tt_bg_frame() {
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
34
+ wide=$(( W * ih >= H * iw ))
35
+ [[ $7 == contain ]] && wide=$(( ! wide ))
36
+ if (( wide )); then
37
+ dw=$(( s * W / 100 )) dh=$(( s * W * ih / (100 * iw) ))
38
+ else
39
+ dh=$(( s * H / 100 )) dw=$(( s * H * iw / (100 * ih) ))
40
+ fi
41
+ ox=$(( ax * (W - dw) / 2 )) oy=$(( ay * (H - dh) / 2 ))
42
+ if (( f >= 0 )); then
43
+ (( dw > W )) && ox=$(( (W - dw) / 2 ))
44
+ if (( dh > H )); then
45
+ oy=$(( H / 2 - f * dh / 100 ))
46
+ (( oy > 0 )) && oy=0
47
+ (( oy < H - dh )) && oy=$(( H - dh ))
48
+ fi
49
+ fi
50
+ REPLY="$dw $dh $ox $oy"
51
+ }
52
+
53
+ __tt_bg_place() {
54
+ local -i cw=$5 ch=$6 W=$(( $3 * $5 )) H=$(( $4 * $6 )) dw dh sx sy c0 c1 r0 r1
55
+ local -a fr
56
+ __tt_bg_frame $1 $2 $W $H $7 $8 $9 ${10:--1}
57
+ fr=(${=REPLY})
58
+ dw=$fr[1] dh=$fr[2] sx=$fr[3] sy=$fr[4]
59
+ c0=$(( ((sx > 0 ? sx : 0) + cw - 1) / cw )) c1=$(( (sx + dw < W ? sx + dw : W) / cw ))
60
+ r0=$(( ((sy > 0 ? sy : 0) + ch - 1) / ch )) r1=$(( (sy + dh < H ? sy + dh : H) / ch ))
61
+ (( c1 > c0 && r1 > r0 )) || return 1
62
+ REPLY="$(( c0 + 1 )) $(( r0 + 1 )) $(( c1 - c0 )) $(( r1 - r0 )) $(( (c0 * cw - sx) * $1 / dw )) $(( (r0 * ch - sy) * $2 / dh )) $(( (c1 - c0) * cw * $1 / dw )) $(( (r1 - r0) * ch * $2 / dh ))"
63
+ }
64
+
65
+ __tt_bg_at() {
66
+ local src=""
67
+ (( $# > 6 )) && src=",x=$7,y=$8,w=$9,h=${10}"
68
+ if (( bgrel )); then
69
+ printf '\e_Ga=p,i=%d,p=%d,P=999999,Q=999999,H=%d,V=%d,c=%d,r=%d%s,C=1,z=%d,q=2\e\\' $1 $1 $(( $3 - bgmx )) $(( $4 - bgmy )) $5 $6 "$src" $2
70
+ else
71
+ printf '\e[%d;%dH\e_Ga=p,i=%d,p=%d,c=%d,r=%d%s,C=1,z=%d,q=2\e\\' $(( $4 + 1 )) $(( $3 + 1 )) $1 $1 $5 $6 "$src" $2
72
+ fi
73
+ }
74
+
75
+ __tt_bg_path() {
76
+ local p=${${1#\"}%\"}
77
+ p=${p/#\~\//$HOME/}
78
+ [[ -z $p || $p == /* ]] || p=${TTHEME_CONFIG:h}/backgrounds/$p
79
+ REPLY=$p
80
+ }
81
+
82
+ __tt_bg_load() {
83
+ local name=$1 dir=${TTHEME_CONFIG:h}/backgrounds img="" fit=contain op=1 pos=center f line stem="" size=100 REPLY
84
+ local -i at=5
85
+ local -a fills
86
+ (( ${+bgsrc[$name]} )) && return 0
87
+ bgfrom[$name]=""
88
+ for f in $dir/$name.conf $dir/$name.tune.conf; do
89
+ if [[ -r $f ]]; then
90
+ for line in "${(@f)$(<$f)}"; do
91
+ case $line in
92
+ '# from '*) [[ $f == *.tune.conf ]] || bgfrom[$name]=${(j: :)${${=line#\# from }[1,2]}} ;;
93
+ 'background-image = '*|'background-image='*) img=${${line#*=}# } ;;
94
+ 'background-image-fit = '*|'background-image-fit='*) fit=${${line#*=}# } ;;
95
+ 'background-image-opacity = '*|'background-image-opacity='*) op=${${line#*=}# } ;;
96
+ 'background-image-position = '*|'background-image-position='*) pos=${${line#*=}# } ;;
97
+ esac
98
+ done
99
+ fi
100
+ [[ $op == <->(|.<->) ]] || op=1
101
+ [[ $pos == center-center ]] && pos=center
102
+ at=${TTHEME_BG_POSITIONS[(Ie)$pos]}
103
+ (( at )) || at=5
104
+ __tt_bg_path "$img"
105
+ size=100 stem=""
106
+ case $REPLY in
107
+ *@fill-<0-100>.png) stem=${REPLY%@fill-*} size=fill ;;
108
+ *@<20-999>-*-<->x<->.png|*@<20-99>-*.png) stem=${REPLY%@*} size=${${REPLY##*@}%%-*} ;;
109
+ *.png) stem=${REPLY%.png}; [[ $fit == cover ]] && size=fill ;;
110
+ esac
111
+ [[ $f == *.tune.conf ]] || bgdef[$name]="$size $at $op" bgbase[$name]=$REPLY
112
+ done
113
+ bgsize[$name]=$size bgpos[$name]=$at bgop[$name]=$op bgoff[$name]=0 bgshot[$name]="" bgshotkey[$name]="" bgfocus[$name]=50
114
+ [[ -e $dir/$name.off.conf ]] && bgoff[$name]=1
115
+ bgload[$name]="$size $at $op ${bgoff[$name]}"
116
+ [[ $REPLY == *@<20-999>-*-<->x<->.png ]] && bgshot[$name]=$REPLY bgshotkey[$name]="$size $at"
117
+ if [[ -n $stem ]]; then
118
+ bgsrc[$name]=$stem.png bgfill[$name]=$stem.png
119
+ fills=($stem@fill-<0-100>.png(N))
120
+ (( ${#fills} )) && bgfill[$name]=$fills[1] bgfocus[$name]=${${fills[1]##*@fill-}%.png}
121
+ else
122
+ bgsrc[$name]=$REPLY bgfill[$name]=$REPLY
123
+ fi
124
+ }
125
+
126
+ __tt_bg_image() {
127
+ REPLY=${bgsrc[$1]}
128
+ [[ ${bgsize[$1]} == fill ]] && REPLY=${bgfill[$1]}
129
+ }
130
+
131
+ __tt_bg_label() {
132
+ local size=${bgsize[$1]}
133
+ [[ $size == fill ]] || size+=%
134
+ REPLY="$size · ${TTHEME_BG_POSITIONS[${bgpos[$1]}]} · ${bgop[$1]}"
135
+ }
136
+
137
+ __tt_bg_dim() {
138
+ local img=$1
139
+ local -a d
140
+ [[ -n $img && -r $img ]] || return 1
141
+ if [[ -z ${bgdim[$img]} ]]; then
142
+ d=($(od -An -N24 -tu1 -- $img 2>/dev/null))
143
+ if (( ${#d} == 24 && d[1] == 137 && d[2] == 80 && d[3] == 78 && d[4] == 71 )); then
144
+ bgdim[$img]="$(( (d[17] << 24) | (d[18] << 16) | (d[19] << 8) | d[20] )) $(( (d[21] << 24) | (d[22] << 16) | (d[23] << 8) | d[24] ))"
145
+ else
146
+ bgdim[$img]=-
147
+ fi
148
+ fi
149
+ [[ ${bgdim[$img]} != - ]]
150
+ }
151
+
152
+ __tt_bg_bake() {
153
+ local src=$1 out=$2 tmp
154
+ local -i W=$3 H=$4 dw=$5 dh=$6 ox=$7 oy=$8 vx vy vw vh px py rc
155
+ vx=$(( ox < 0 ? -ox : 0 )) vy=$(( oy < 0 ? -oy : 0 ))
156
+ vw=$(( (dw < W - ox ? dw : W - ox) - vx )) vh=$(( (dh < H - oy ? dh : H - oy) - vy ))
157
+ px=$(( ox > 0 ? ox : 0 )) py=$(( oy > 0 ? oy : 0 ))
158
+ (( vw > 0 && vh > 0 )) || return 1
159
+ tmp=$(mktemp -d) || return 1
160
+ sips -z $dh $dw $src --out $tmp/a.png >/dev/null 2>&1 &&
161
+ sips -p $(( dh + 2 )) $(( dw + 2 )) $tmp/a.png --out $tmp/b.png >/dev/null 2>&1 &&
162
+ sips -c $vh $vw --cropOffset $(( vy + 1 )) $(( vx + 1 )) $tmp/b.png --out $tmp/c.png >/dev/null 2>&1 &&
163
+ sips -p $(( 2 * H - vh + 2 )) $(( 2 * W - vw + 2 )) $tmp/c.png --out $tmp/d.png >/dev/null 2>&1 &&
164
+ sips -c $H $W --cropOffset $(( H - vh + 1 - py )) $(( W - vw + 1 - px )) $tmp/d.png --out $tmp/e.png >/dev/null 2>&1 &&
165
+ mv -f $tmp/e.png $out
166
+ rc=$?
167
+ rm -rf $tmp
168
+ return $rc
169
+ }
170
+
171
+ __tt_bg_include() {
172
+ local conf=${TTHEME_CONFIG:h}/backgrounds/$1.conf line
173
+ local -a lines=() add=()
174
+ [[ -r $conf ]] && lines=("${(@f)$(<$conf)}")
175
+ for line in "config-file = ?$1.tune.conf" "config-file = ?$1.off.conf"; do
176
+ (( ${lines[(Ie)$line]} )) || add+=("$line")
177
+ done
178
+ (( ${#add} )) || return 0
179
+ mkdir -p ${conf:h} && print -rl -- "${lines[@]}" "${add[@]}" > $conf
180
+ }
181
+
182
+ __tt_bg_write() {
183
+ local name=$1 dir=${TTHEME_CONFIG:h}/backgrounds src=${bgsrc[$1]} size=${bgsize[$1]} shape img="" fit=contain f REPLY
184
+ local pos=${TTHEME_BG_POSITIONS[${bgpos[$1]}]}
185
+ local -i W=$(( (pw + 2 * bgmx) * bgcw )) H=$(( (ph + 2 * bgmy) * bgch ))
186
+ local -a wh fr
187
+ [[ -r $dir/$name.conf ]] || return 0
188
+ __tt_bg_include $name || return 1
189
+ if [[ "$size ${bgpos[$1]} ${bgop[$1]}" == "${bgdef[$1]}" ]]; then
190
+ rm -f -- $dir/$name.tune.conf
191
+ else
192
+ shape=$size
193
+ [[ $size == <20-100> && $pos != center ]] && ! __tt_bg_aligns && shape=window
194
+ case $shape in
195
+ fill) img=${bgfill[$1]} fit=cover ;;
196
+ 100) img=$src ;;
197
+ <20-99>)
198
+ __tt_bg_dim "$src" || return 1
199
+ wh=(${=bgdim[$src]})
200
+ img=${src%.png}@$size-$pos.png
201
+ __tt_bg_frame $wh[1] $wh[2] $wh[1] $wh[2] $size ${bgpos[$1]} contain
202
+ fr=(${=REPLY})
203
+ [[ $img -nt $src ]] || __tt_bg_bake "$src" "$img" $wh[1] $wh[2] $fr || return 1
204
+ ;;
205
+ *)
206
+ fit=cover
207
+ if [[ "$size ${bgpos[$1]}" == "${bgshotkey[$1]}" && -r ${bgshot[$1]} ]]; then
208
+ img=${bgshot[$1]}
209
+ else
210
+ __tt_bg_dim "$src" && (( W && H )) || return 1
211
+ wh=(${=bgdim[$src]})
212
+ img=${src%.png}@$size-$pos-${W}x$H.png
213
+ __tt_bg_frame $wh[1] $wh[2] $W $H $size ${bgpos[$1]} contain ${bgfocus[$1]}
214
+ fr=(${=REPLY})
215
+ [[ $img -nt $src ]] || __tt_bg_bake "$src" "$img" $W $H $fr || return 1
216
+ fi
217
+ ;;
218
+ esac
219
+ __tt_tilde "$img"
220
+ print -rl -- "background-image = $REPLY" "background-image-fit = $fit" "background-image-position = $pos" "background-image-opacity = ${bgop[$1]}" > $dir/$name.tune.conf || return 1
221
+ fi
222
+ if (( bgoff[$1] )); then
223
+ print -r -- "background-image =" > $dir/$name.off.conf || return 1
224
+ else
225
+ rm -f -- $dir/$name.off.conf
226
+ fi
227
+ if [[ $src == /*.png ]]; then
228
+ for f in ${src%.png}@<20-999>-*.png(N); do
229
+ [[ $f == "$img" || $f == "${bgbase[$1]}" ]] || rm -f -- $f
230
+ done
231
+ fi
232
+ return 0
233
+ }
234
+
235
+ __tt_pv_bg_open() {
236
+ bgcw=0 bgch=0 bginc="" bgrel=0 bgmx=0 bgmy=0 bganchor=0
237
+ local REPLY
238
+ __tt_bg_shown && bginc=$REPLY
239
+ __tt_bg_cells
240
+ }
241
+
242
+ __tt_pv_bg_show() {
243
+ (( bgcw )) || return 0
244
+ local name=$1 img="" op size fit=contain focus=-1 REPLY
245
+ local -a p=(${=TTHEME_PALETTE[$name]}) wh at
246
+ local -i cols=$(( pw + 2 * bgmx )) rows=$(( ph + 2 * bgmy ))
247
+ (( ${#p} >= 20 )) || return 0
248
+ (( $2 )) && { bgsent=(); bgshown="" bganchor=0 }
249
+ bgname=$name
250
+ __tt_bg_load $name
251
+ if (( ! bgrel )) && [[ $name == "$bginc" && "${bgsize[$name]} ${bgpos[$name]} ${bgop[$name]} ${bgoff[$name]}" == "${bgload[$name]}" ]]; then
252
+ printf '\e_Ga=d,d=i,i=1,q=2\e\\\e_Ga=d,d=i,i=2,q=2\e\\'
253
+ [[ -n $bgshown ]] && printf '\e_Ga=d,d=i,i=%d,q=2\e\\' $bgshown
254
+ bgshown=""
255
+ return 0
256
+ fi
257
+ op=${bgop[$name]} size=${bgsize[$name]}
258
+ if [[ $size == fill ]]; then
259
+ img=${bgfill[$name]} size=100 fit=cover
260
+ elif [[ "$size ${bgpos[$name]}" == "${bgshotkey[$name]}" && -r ${bgshot[$name]} ]]; then
261
+ img=${bgshot[$name]} size=100 fit=cover
262
+ else
263
+ img=${bgsrc[$name]} focus=${bgfocus[$name]}
264
+ fi
265
+ (( bgoff[$name] )) && img=""
266
+ local bg=${p[1]#\#}
267
+ local -i r=$(( 16#${bg:0:2} )) g=$(( 16#${bg:2:2} )) b=$(( 16#${bg:4:2} )) a=$(( (1.0 - op) * 255 + 0.5 ))
268
+ (( a < 0 )) && a=0
269
+ if (( bgrel && ! bganchor )); then
270
+ printf '\e_Ga=t,f=32,s=1,v=1,i=999999,q=2;AAAAAA==\e\\\e[H\e_Ga=p,i=999999,p=999999,c=1,r=1,C=1,z=-1073741828,q=2\e\\'
271
+ bganchor=1
272
+ fi
273
+ __tt_b64 $r $g $b
274
+ printf '\e_Ga=t,f=24,s=1,v=1,i=1,q=2;%s\e\\' "$REPLY"
275
+ __tt_bg_at 1 -1073741827 0 0 $cols $rows
276
+ __tt_b64 $r $g $b $a
277
+ printf '\e_Ga=t,f=32,s=1,v=1,i=2,q=2;%s\e\\' "$REPLY"
278
+ __tt_bg_at 2 -1073741825 0 0 $cols $rows
279
+ local id=""
280
+ if __tt_bg_dim "$img"; then
281
+ wh=(${=bgdim[$img]})
282
+ if __tt_bg_place $wh[1] $wh[2] $cols $rows $bgcw $bgch $size ${bgpos[$name]} $fit $focus; then
283
+ at=(${=REPLY})
284
+ __tt_bg_crop $img $wh[1] $wh[2] $at[6] $at[8] && id=${REPLY% *} at[6]=${REPLY##* }
285
+ fi
286
+ fi
287
+ [[ -n $bgshown && $bgshown != "$id" ]] && printf '\e_Ga=d,d=i,i=%d,q=2\e\\' $bgshown
288
+ bgshown=$id
289
+ [[ -n $id ]] || return 0
290
+ __tt_bg_at $id -1073741826 $(( at[1] - 1 )) $(( at[2] - 1 )) $at[3] $at[4] $at[5] $at[6] $at[7] $at[8]
291
+ }
292
+
293
+ __tt_bg_send() {
294
+ if [[ -z ${bgsent[$1]} ]]; then
295
+ bgsent[$1]=$(( ${#bgsent} + 3 ))
296
+ printf '\e_Ga=t,t=f,f=100,i=%d,q=2;%s\e\\' ${bgsent[$1]} "$(print -rn -- $1 | base64 | tr -d '\n')"
297
+ fi
298
+ REPLY=${bgsent[$1]}
299
+ }
300
+
301
+ __tt_pv_bg_fs() {
302
+ local name=$1
303
+ local -a wh fwh
304
+ local -i W=$(( (pw + 2 * bgmx) * bgcw )) H=$(( (ph + 2 * bgmy) * bgch )) kw kh
305
+ REPLY=0
306
+ (( W && H )) || return 1
307
+ __tt_bg_dim "${bgsrc[$name]}" && __tt_bg_dim "${bgfill[$name]}" || return 1
308
+ wh=(${=bgdim[${bgsrc[$name]}]}) fwh=(${=bgdim[${bgfill[$name]}]})
309
+ kw=$(( wh[1] < wh[2] * fwh[1] / fwh[2] ? wh[1] : wh[2] * fwh[1] / fwh[2] ))
310
+ kh=$(( kw * fwh[2] / fwh[1] ))
311
+ REPLY=$(( 100 * (W * kh > H * kw ? W * kh : H * kw) * wh[1] * wh[2] / (kw * kh * (W * wh[2] < H * wh[1] ? W * wh[2] : H * wh[1])) ))
312
+ }
313
+
314
+ __tt_pv_bg_adjust() {
315
+ (( bgcw )) && [[ -n $tune ]] || return 0
316
+ local name=$tune REPLY
317
+ __tt_bg_load $name
318
+ __tt_bg_image $name
319
+ __tt_bg_dim "$REPLY" || return 0
320
+ local size=${bgsize[$name]} op=${bgop[$name]}
321
+ local -i n=${2:-0} at=${bgpos[$name]} off=${bgoff[$name]} o=$(( ${bgop[$name]} * 100 + 0.5 )) m fs=0 bake=$+commands[sips]
322
+ local -a def=(${=bgdef[$name]})
323
+ __tt_pv_bg_fs $name && fs=$REPLY
324
+ case $1 in
325
+ on) off=$(( ! off )) ;;
326
+ def) size=$def[1] at=$def[2] op=$def[3] off=0 ;;
327
+ *)
328
+ (( off )) && return 0
329
+ case $1 in
330
+ size)
331
+ if (( n < 0 )); then
332
+ if [[ $size == fill ]]; then
333
+ (( fs )) || return 0
334
+ size=$(( bake && fs > 100 ? fs : 100 ))
335
+ n=$(( n + 1 ))
336
+ fi
337
+ if (( bake && n )); then
338
+ size=$(( size + n ))
339
+ (( size < 20 )) && size=20
340
+ fi
341
+ elif [[ $size != fill ]]; then
342
+ if (( ! bake || size + n > fs )); then
343
+ size=fill
344
+ else
345
+ size=$(( size + n ))
346
+ fi
347
+ fi
348
+ ;;
349
+ pos) at=$(( ((at - 1 + n) % 9 + 9) % 9 + 1 )) ;;
350
+ at) at=$n ;;
351
+ op)
352
+ m=$(( o + n ))
353
+ (( m < 0 )) && m=0
354
+ (( m > 100 )) && m=100
355
+ (( m != o )) && printf -v op '%d.%02d' $(( m / 100 )) $(( m % 100 ))
356
+ ;;
357
+ esac
358
+ ;;
359
+ esac
360
+ [[ $size == ${bgsize[$name]} && $at == ${bgpos[$name]} && $op == ${bgop[$name]} && $off == ${bgoff[$name]} ]] && return 0
361
+ if [[ $size != ${bgsize[$name]} ]]; then
362
+ osd=$size osdt=100
363
+ [[ $size == fill ]] || osd+=%
364
+ fi
365
+ bgsize[$name]=$size bgpos[$name]=$at bgop[$name]=$op bgoff[$name]=$off bgname=""
366
+ }
367
+
368
+ __tt_pv_bg_state() {
369
+ REPLY=""
370
+ (( bgcw )) || return 1
371
+ __tt_bg_load $1
372
+ __tt_bg_image $1
373
+ __tt_bg_dim "$REPLY" || { REPLY=""; return 1 }
374
+ if (( bgoff[$1] )); then
375
+ REPLY=off
376
+ else
377
+ __tt_bg_label $1
378
+ fi
379
+ }
380
+
381
+ __tt_pv_bg_findable() {
382
+ (( bgcw ))
383
+ }
384
+
385
+ __tt_pv_bg_find() {
386
+ local name=$1 err
387
+ local -i rc
388
+ __tt_pv_bg_close
389
+ err=$(__tt_cli find $name 2>&1 >/dev/tty)
390
+ rc=$?
391
+ err=${${err//$'\n'/ }## #}
392
+ resized=1 bgname="" bgshown="" bgsent=() bgdim=()
393
+ if (( rc == 1 )); then
394
+ msg=${err:-"find failed for $name"} msgt=300
395
+ fi
396
+ (( rc == 0 )) || return 1
397
+ unset "bgsrc[$name]"
398
+ __tt_bg_load $name
399
+ bgload[$name]="" bgedit[$name]=1
400
+ msg=${err:-"background · $name"} msgt=200
401
+ return 0
402
+ }
403
+
404
+ __tt_pv_bg_images() {
405
+ local -a shelf=(${TTHEME_CONFIG:h}/backgrounds/shelf/$1/*(N/))
406
+ REPLY=$(( ${#shelf} + 1 ))
407
+ }
408
+
409
+ __tt_pv_bg_image() {
410
+ local name=$tune act=$1 err REPLY
411
+ local -i rc
412
+ if [[ $act != drop ]]; then
413
+ __tt_pv_bg_images $name
414
+ (( REPLY > 1 )) || { msg="$name has one image" msgt=200; return 0 }
415
+ [[ "${bgsize[$name]} ${bgpos[$name]} ${bgop[$name]} ${bgoff[$name]}" == "$tsnap" ]] || __tt_bg_write $name
416
+ fi
417
+ bgname="" tune=""
418
+ __tt_pv_bg_close
419
+ err=$(__tt_cli image $name $act 2>&1)
420
+ rc=$?
421
+ err=${${err//$'\n'/ }## #}
422
+ resized=1 bgname="" bgshown="" bgsent=() bgdim=()
423
+ unset "bgsrc[$name]"
424
+ __tt_bg_load $name
425
+ bgload[$name]="" bgedit[$name]=1
426
+ msg=${err:-"background · $name"} msgt=$(( rc ? 300 : 200 ))
427
+ [[ -r ${TTHEME_CONFIG:h}/backgrounds/$name.conf ]] || return 0
428
+ tune=$name tf=1 tsnap="${bgsize[$name]} ${bgpos[$name]} ${bgop[$name]} ${bgoff[$name]}"
429
+ }
430
+
431
+ __tt_pv_bg_panel() {
432
+ local name=$1 z=$'\e[0m' b=$'\e[1m' d=$'\e[2m' c=$ac val sty REPLY
433
+ local -a labs=(size position opacity) at=(0 3 6)
434
+ local -i r0=$2 col=$3 end=$4 off=${bgoff[$1]} T=$(( $4 - $3 - 19 )) lo=100 hi=100 k i r knob pos=${bgpos[$1]} o
435
+ (( color )) || z= b= d= c=
436
+ (( T < 8 )) && T=8
437
+ (( $+commands[sips] )) && lo=20
438
+ __tt_pv_bg_fs $name && (( REPLY > hi )) && hi=$REPLY
439
+ for k in 1 2 3; do
440
+ r=$(( r0 + at[k] ))
441
+ sty=$d
442
+ (( tf == k && ! off )) && sty=$b
443
+ out+=$'\e['$r';'$col'H'
444
+ if (( tf == k && ! off )); then
445
+ out+=$c"▶"$z" "
446
+ else
447
+ out+=" "
448
+ fi
449
+ out+=$sty$labs[k]$z
450
+ if (( k == 2 )); then
451
+ for (( i = 1; i <= 9; i++ )); do
452
+ out+=$'\e['$(( r0 + 2 + (i - 1) / 3 ))';'$(( col + 12 + (i - 1) % 3 * 3 ))'H'
453
+ if (( ! color )); then
454
+ if (( i == pos )); then out+="#"; else out+="."; fi
455
+ elif (( i == pos && ! off )); then
456
+ out+=$b$c"■"$z
457
+ elif (( i == pos )); then
458
+ out+=$d"■"$z
459
+ else
460
+ out+=$d"·"$z
461
+ fi
462
+ done
463
+ val=${TTHEME_BG_POSITIONS[pos]}
464
+ else
465
+ if (( k == 1 )); then
466
+ if [[ ${bgsize[$name]} == fill ]]; then
467
+ knob=$(( T - 1 )) val=FILL
468
+ else
469
+ knob=$(( (${bgsize[$name]} - lo) * (T - 1) / (hi - lo + 1) )) val=${bgsize[$name]}%
470
+ fi
471
+ else
472
+ o=$(( ${bgop[$name]} * 100 + 0.5 ))
473
+ knob=$(( o * (T - 1) / 100 )) val=${bgop[$name]}
474
+ fi
475
+ (( knob < 0 )) && knob=0
476
+ (( knob > T - 1 )) && knob=$(( T - 1 ))
477
+ out+=$'\e['$r';'$(( col + 12 ))'H'
478
+ if (( ! color )); then
479
+ out+=${(l:knob::=:)}"O"${(l:$(( T - 1 - knob ))::-:)}
480
+ elif (( off )); then
481
+ out+=$d${(l:knob::━:)}"●"${(l:$(( T - 1 - knob ))::─:)}$z
482
+ else
483
+ out+=$c${(l:knob::━:)}$b"●"$z$d${(l:$(( T - 1 - knob ))::─:)}$z
484
+ fi
485
+ fi
486
+ out+=$'\e['$r';'$(( end - ${#val} + 1 ))'H'$sty$val$z
487
+ done
488
+ }
489
+
490
+ __tt_pv_bg_close() {
491
+ (( bgcw )) && printf '\e_Ga=d,d=A,q=2\e\\'
492
+ [[ -z $bgcut ]] || { rm -rf -- $bgcut; bgcut="" }
493
+ }
494
+
495
+ __tt_pv_bg_save() {
496
+ local name msg REPLY
497
+ local -a saved=()
498
+ (( ${#bgedit} )) || return 0
499
+ for name in ${(ok)bgedit}; do
500
+ if ! __tt_bg_write $name; then
501
+ print -u2 "ttheme: could not save the background of $name"
502
+ continue
503
+ fi
504
+ saved+=($name)
505
+ if [[ ! -r ${TTHEME_CONFIG:h}/backgrounds/$name.conf ]]; then
506
+ msg="background · $name none"
507
+ elif (( bgoff[$name] )); then
508
+ msg="background · $name off"
509
+ else
510
+ __tt_bg_label $name
511
+ msg="background · $name $REPLY"
512
+ fi
513
+ if __tt_color; then
514
+ printf '\033[2m%s\033[0m\n' "$msg"
515
+ else
516
+ print -r -- "$msg"
517
+ fi
518
+ done
519
+ (( ${#saved} )) && __tt_bg_saved $saved
520
+ return 0
521
+ }
@@ -20,6 +20,8 @@ __tt_apply() { __tt_osc_apply "$@" }
20
20
 
21
21
  __tt_shown() { return 1 }
22
22
 
23
+ __tt_keepable() { return 1 }
24
+
23
25
  __tt_pv_bg_open() { : }
24
26
 
25
27
  __tt_pv_bg_show() { : }