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