@kecan0406/ttheme 1.2.8 → 1.2.10

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.
@@ -0,0 +1,2255 @@
1
+ __tt_pv_norm() { REPLY=${(L)1//[^[:alnum:]]/} }
2
+
3
+ __tt_pv_seek() {
4
+ local t part key REPLY
5
+ for t in ${(k)TTHEME_PALETTE}; do
6
+ key=""
7
+ for part in "$t" "${TTHEME_GROUP[$t]:-Other}" "${TTHEME_NATIVE[$t]}" "${TTHEME_CATALOG[$t]}" "${(@s:|:)TTHEME_NATIVE_NAMES[$t]}" "${TTHEME_CHARACTER[$t]}" "${(@s:|:)TTHEME_ALIASES[$t]}"; do
8
+ [[ -n $part ]] || continue
9
+ __tt_pv_norm "$part"
10
+ key+="|$REPLY"
11
+ done
12
+ pvseek[$t]=$key
13
+ done
14
+ }
15
+
16
+ __tt_pv_alias() {
17
+ REPLY=""
18
+ [[ -n $nflt && -n $2 ]] || return 0
19
+ local main
20
+ __tt_pv_norm "$1"
21
+ main=$REPLY
22
+ __tt_pv_norm "$2"
23
+ [[ $main != *$nflt* && $REPLY == *$nflt* ]] && REPLY=$2 || REPLY=""
24
+ return 0
25
+ }
26
+
27
+ __tt_pv_rows() {
28
+ rtype=() rval=() rcnt=()
29
+ local g t c ruled="" nflt="" REPLY
30
+ local -a ts cs loose inside
31
+ if [[ -n $flt ]]; then
32
+ (( ${#pvseek} )) || __tt_pv_seek
33
+ __tt_pv_norm "$flt"
34
+ nflt=$REPLY
35
+ fi
36
+ for g in $groups; do
37
+ ts=()
38
+ for t in ${=gthemes[$g]}; do
39
+ [[ -z $flt || ${pvseek[$t]} == *$nflt* ]] && ts+=($t)
40
+ done
41
+ [[ -n $flt ]] && (( ! ${#ts} )) && continue
42
+ if [[ $g == *@* && -z $ruled ]]; then
43
+ ruled=1
44
+ (( ${#rtype} )) && { rtype+=(rule); rval+=(''); rcnt+=(0) }
45
+ fi
46
+ rtype+=(hdr); rval+=($g); rcnt+=(${#ts})
47
+ [[ -n $flt || -n ${exp[$g]} ]] || continue
48
+ cs=() loose=()
49
+ for t in $ts; do
50
+ c=${TTHEME_CATALOG[$t]}
51
+ if [[ -n $c && $g == *@* ]]; then
52
+ (( ${cs[(Ie)$c]} )) || cs+=($c)
53
+ else
54
+ loose+=($t)
55
+ fi
56
+ done
57
+ for c in $cs; do
58
+ inside=()
59
+ for t in $ts; do
60
+ [[ ${TTHEME_CATALOG[$t]} == "$c" ]] && inside+=($t)
61
+ done
62
+ rtype+=(cat); rval+=("$g/$c"); rcnt+=(${#inside})
63
+ if [[ -n $flt || -n ${exp[$g/$c]} ]]; then
64
+ for t in $inside; do rtype+=(thm); rval+=($t); rcnt+=(0); done
65
+ fi
66
+ done
67
+ for t in $loose; do rtype+=(thm); rval+=($t); rcnt+=(0); done
68
+ done
69
+ }
70
+
71
+ __tt_pv_at() {
72
+ local i
73
+ for (( i = 1; i <= ${#rval}; i++ )); do
74
+ [[ ${rtype[i]} == (hdr|cat) && ${rval[i]} == "$1" ]] && { cur=$i; return 0 }
75
+ done
76
+ return 0
77
+ }
78
+
79
+ __tt_pv_first() {
80
+ local name=$1 i
81
+ cur=1 top=1
82
+ if [[ -n $name ]]; then
83
+ for (( i = 1; i <= ${#rval}; i++ )); do
84
+ [[ ${rtype[i]} == thm && ${rval[i]} == $name ]] && { cur=$i; return 0 }
85
+ done
86
+ fi
87
+ for (( i = 1; i <= ${#rtype}; i++ )); do
88
+ [[ ${rtype[i]} == thm ]] && { cur=$i; return 0 }
89
+ done
90
+ return 0
91
+ }
92
+
93
+ __tt_pv_goto() {
94
+ local name=$1 i g=${TTHEME_GROUP[$1]:-Other} c=${TTHEME_CATALOG[$1]}
95
+ exp[$g]=1
96
+ [[ -n $c && $g == *@* ]] && exp[$g/$c]=1
97
+ __tt_pv_rows
98
+ for (( i = 1; i <= ${#rval}; i++ )); do
99
+ [[ ${rtype[i]} == thm && ${rval[i]} == $name ]] && { cur=$i; return 0 }
100
+ done
101
+ cur=1
102
+ }
103
+
104
+ __tt_pv_shows() {
105
+ REPLY=${bgview[$1]:-$1}
106
+ [[ -n $tune && $1 == "$tune" ]] && REPLY=$tpick
107
+ return 0
108
+ }
109
+
110
+ __tt_pv_focus() {
111
+ if (( te )); then
112
+ __tt_pv_shows $tename
113
+ if (( ! resized )) && [[ $REPLY != "$bgname" || "${tespec%% *} ${teframe[11]}" != "$telook" ]]; then
114
+ __tt_pv_bg_show "$REPLY"
115
+ telook="${tespec%% *} ${teframe[11]}"
116
+ fi
117
+ return 0
118
+ fi
119
+ [[ ${rtype[cur]} == thm ]] || return 0
120
+ __tt_pv_shows ${rval[cur]}
121
+ (( resized )) || [[ $REPLY == "$bgname" ]] || __tt_pv_bg_show "$REPLY"
122
+ local spec=${TTHEME_PALETTE[${rval[cur]}]}
123
+ [[ $spec == "$applied" ]] && return 0
124
+ __tt_pv_paint "$spec"
125
+ applied=$spec
126
+ }
127
+
128
+ __tt_pv_toggle() {
129
+ [[ -n $flt ]] && return 0
130
+ local g=${rval[cur]}
131
+ if [[ -n ${exp[$g]} ]]; then
132
+ exp[$g]=""
133
+ else
134
+ exp[$g]=1
135
+ fi
136
+ __tt_pv_rows
137
+ }
138
+
139
+ __tt_pv_left() {
140
+ [[ -n $flt ]] && return 0
141
+ if [[ ${rtype[cur]} == (hdr|cat) ]]; then
142
+ if [[ -n ${exp[${rval[cur]}]} ]]; then
143
+ __tt_pv_toggle
144
+ elif [[ ${rtype[cur]} == cat ]]; then
145
+ __tt_pv_at ${rval[cur]%%/*}
146
+ fi
147
+ return 0
148
+ fi
149
+ local g=${TTHEME_GROUP[${rval[cur]}]:-Other} c=${TTHEME_CATALOG[${rval[cur]}]}
150
+ [[ -n $c && $g == *@* ]] && g=$g/$c
151
+ exp[$g]=""
152
+ __tt_pv_rows
153
+ __tt_pv_at $g
154
+ }
155
+
156
+ typeset -gA TTHEME_GLYPHS=(
157
+ 0 111101101101111 1 010110010010111 2 111001111100111 3 111001111001111 4 101101111001001
158
+ 5 111100111001111 6 111100111101111 7 111001001001001 8 111101111101111 9 111101111001111
159
+ '%' 101001010100101 F 111100110100100 I 111010010010111 L 100100100100111
160
+ )
161
+
162
+ __tt_pv_osd() {
163
+ local text=${(U)osd} bits line oc=$'\e[1m' blank
164
+ local -i s=2 n=${#text} w r c k i top left
165
+ (( n * 16 + 4 <= pw && ph >= 14 )) || s=1
166
+ w=$(( n * 8 * s - 2 * s + 4 ))
167
+ top=$(( (ph - 5 * s) / 2 )) left=$(( (pw - w) / 2 + 1 ))
168
+ (( top < 2 )) && top=2
169
+ (( left < 1 )) && left=1
170
+ if (( color )) && [[ ${rtype[cur]} == thm ]]; then
171
+ local -a fp=(${=TTHEME_PALETTE[${rval[cur]}]})
172
+ local fc=${fp[3]#\#}
173
+ printf -v oc '\e[1;38;2;%d;%d;%dm' $((16#${fc:0:2})) $((16#${fc:2:2})) $((16#${fc:4:2}))
174
+ fi
175
+ blank=${(l:w:: :)}
176
+ out+=$'\e['$(( top - 1 ))';'${left}H$blank
177
+ for (( r = 0; r < 5; r++ )); do
178
+ line=" "
179
+ for (( k = 1; k <= n; k++ )); do
180
+ bits=${TTHEME_GLYPHS[${text[k]}]}
181
+ for (( c = 1; c <= 3; c++ )); do
182
+ if [[ ${bits[r * 3 + c]} == 1 ]]; then
183
+ line+=${(l:2*s::█:)}
184
+ else
185
+ line+=${(l:2*s:: :)}
186
+ fi
187
+ done
188
+ (( k < n )) && line+=${(l:2*s:: :)}
189
+ done
190
+ line+=" "
191
+ for (( i = 0; i < s; i++ )); do
192
+ out+=$'\e['$(( top + r * s + i ))';'${left}H$oc$line$'\e[0m'
193
+ done
194
+ done
195
+ out+=$'\e['$(( top + 5 * s ))';'${left}H$blank
196
+ }
197
+
198
+ __tt_pv_lw() {
199
+ local -i lw=$(( pw - 2 < 48 ? pw - 2 : 48 )) l=$(( pw * 3 / 10 )) sw=$(( pw * 45 / 100 ))
200
+ (( l < 38 )) && l=38
201
+ (( l > 56 )) && l=56
202
+ (( sw > 64 )) && sw=64
203
+ if (( te && sw < 50 )); then
204
+ sw=50
205
+ (( pw - l - 6 < sw )) && l=$(( pw - sw - 6 ))
206
+ (( l < 30 )) && l=30
207
+ fi
208
+ (( sw > pw - l - 6 )) && sw=$(( pw - l - 6 ))
209
+ if (( color && sw >= 32 )); then
210
+ lw=$l
211
+ else
212
+ sw=0
213
+ fi
214
+ reply=($lw $sw)
215
+ }
216
+
217
+ __tt_pv_hl() {
218
+ local t=$1 lt=${(L)1} pre
219
+ REPLY=$t
220
+ (( color )) && [[ -n $flt && $lt == *$flt* ]] || return 0
221
+ pre=${lt%%$flt*}
222
+ REPLY=${t[1,${#pre}]}$'\e[1;4m'$ac${t[${#pre}+1,${#pre}+${#flt}]}$'\e[22;24;39m'$2${t[${#pre}+${#flt}+1,-1]}
223
+ }
224
+
225
+ __tt_pv_fit() {
226
+ local extra=$1
227
+ REPLY=""
228
+ [[ -n $extra ]] || return 0
229
+ while [[ -n $extra ]] && (( ${(m)#extra} + 3 > w )); do
230
+ extra=${extra[1,-2]}
231
+ done
232
+ [[ -n $extra ]] || return 0
233
+ (( w -= ${(m)#extra} + 2 ))
234
+ REPLY=" "$d$extra$r
235
+ }
236
+
237
+ __tt_pv_row() {
238
+ local t=${rval[$1]} b=$'\e[1m' d=$'\e[2m' r=$'\e[22;24;39m' z=$'\e[0m' on="" gut=" " base="" lead=$'\e[2m' mark=" " name arrow=▸ ind=" " hl extra part
239
+ local -i w
240
+ (( color )) || b= d= r= z= lead=
241
+ if (( $1 == cur )); then
242
+ gut=$ac"▌"$r" "
243
+ (( color )) && on=$sb
244
+ fi
245
+ if [[ ${rtype[$1]} == rule ]]; then
246
+ name='── Markets '
247
+ REPLY=" "$d$name${(l:lw - 4 - ${#name}::─:)}$z
248
+ return 0
249
+ fi
250
+ if [[ ${rtype[$1]} == hdr ]]; then
251
+ [[ -n $flt || -n ${exp[$t]} ]] && arrow=▾
252
+ name=$t
253
+ (( ${(m)#name} > lw - 10 )) && name="${name[1,lw-11]}…"
254
+ base=$b
255
+ if (( color )) && [[ $t == "$ag" ]]; then
256
+ base+=$ac lead=$ac
257
+ elif (( $1 == cur )); then
258
+ lead=""
259
+ fi
260
+ __tt_pv_hl "$name" "$base"
261
+ hl=$REPLY
262
+ w=$(( lw - 6 - ${(m)#name} - ${#rcnt[$1]} ))
263
+ __tt_pv_alias "$t" "${TTHEME_NATIVE[${${=gthemes[$t]}[1]}]}"
264
+ __tt_pv_fit "$REPLY"
265
+ extra=$REPLY
266
+ (( w < 1 )) && w=1
267
+ REPLY=$gut$on" "$lead$arrow$r" "$base$hl$r$extra${(l:w:: :)}$d${rcnt[$1]}$r" "$z
268
+ return 0
269
+ fi
270
+ if [[ ${rtype[$1]} == cat ]]; then
271
+ [[ -n $flt || -n ${exp[$t]} ]] && arrow=▾
272
+ name=${t#*/}
273
+ (( ${(m)#name} > lw - 12 )) && name="${name[1,lw-13]}…"
274
+ base=$b
275
+ if (( color )) && [[ $t == "$acat" ]]; then
276
+ base+=$ac lead=$ac
277
+ elif (( $1 == cur )); then
278
+ lead=""
279
+ fi
280
+ __tt_pv_hl "$name" "$base"
281
+ w=$(( lw - 8 - ${(m)#name} - ${#rcnt[$1]} ))
282
+ (( w < 1 )) && w=1
283
+ REPLY=$gut$on" "$lead$arrow$r" "$base$REPLY$r${(l:w:: :)}$d${rcnt[$1]}$r" "$z
284
+ return 0
285
+ fi
286
+ if (( $1 == cur )); then
287
+ mark=$ac"■"$r base=$b
288
+ elif [[ -n $cdot && $t == "$cn" ]]; then
289
+ mark=$cdot
290
+ fi
291
+ name=${t##*/}
292
+ [[ -n ${TTHEME_CATALOG[$t]} && ${TTHEME_GROUP[$t]} == *@* ]] && ind=" "
293
+ __tt_pv_hl "$name" "$base"
294
+ hl=$REPLY
295
+ extra=""
296
+ for part in "${(@s:|:)TTHEME_NATIVE_NAMES[$t]}" "${TTHEME_CHARACTER[$t]}" "${(@s:|:)TTHEME_ALIASES[$t]}"; do
297
+ __tt_pv_alias "$name" "$part"
298
+ [[ -n $REPLY ]] && { extra=$REPLY; break }
299
+ done
300
+ if (( color )); then
301
+ [[ -n ${tstrip[$t]} ]] || __tt_pv_strip $t
302
+ w=$(( lw - 16 - ${#ind} - ${#name} ))
303
+ __tt_pv_fit "$extra"
304
+ (( w < 1 )) && w=1
305
+ REPLY=$gut$on"$ind$mark $base$hl$r$REPLY${(l:w:: :)}${tstrip[$t]} "$z
306
+ else
307
+ REPLY="$gut$ind$mark $hl${extra:+ $extra}"
308
+ fi
309
+ }
310
+
311
+ __tt_pv_bg_title() {
312
+ local by=${bgby[$tpick]} ref=${bgfrom[$tpick]} url=${bgurl[$tpick]} mark="" sgr=""
313
+ local -i room=$1
314
+ [[ -n $ref && $url == http(s|)://* ]] && __tt_links && mark="⧉ "
315
+ REPLY=Background${by:+ · $by}${ref:+ · $mark$ref}$2
316
+ (( ${#REPLY} > room )) && REPLY=Background${by:+ · $by}
317
+ (( ${#REPLY} > room )) && REPLY=Background
318
+ [[ -n $mark && $REPLY == *"$mark$ref"* ]] || return 0
319
+ (( color )) && [[ -n ${TTHEME_SITE_ANSI[${ref%% *}]} ]] && sgr=$'\e[3'${TTHEME_SITE_ANSI[${ref%% *}]}m
320
+ REPLY=${REPLY/"$mark$ref"/$sgr⧉${sgr:+$'\e[39m'} $'\e]8;;'$url$'\e\\'$ref$'\e]8;;\e\\'}
321
+ return 0
322
+ }
323
+
324
+ __tt_pv_bar() {
325
+ local z=$'\e[0m' d=$'\e[2m' on=$'\e[7;1m'$ac line=" " title hint="tab next"
326
+ local -i i at=${TTHEME_HUB_TABS[(Ie)preview]} len=${#TTHEME_HUB_TITLES}
327
+ (( color )) || z= d= on=
328
+ [[ ${rtype[cur]} == thm ]] && hint="⇧tab switch"
329
+ for title in $TTHEME_HUB_TITLES; do
330
+ (( len += ${#title} + 2 ))
331
+ done
332
+ local -i zc=2
333
+ for (( i = 1; i <= ${#TTHEME_HUB_TITLES}; i++ )); do
334
+ title=${TTHEME_HUB_TITLES[i]}
335
+ (( i > 1 )) && { line+=" "; (( zc++ )) }
336
+ pvz+=("1 $zc $(( zc + ${(m)#title} + 1 )) hub $i")
337
+ (( zc += ${(m)#title} + 2 ))
338
+ if (( i != at )); then
339
+ line+=$d" $title "$z
340
+ elif (( color )); then
341
+ line+=$on" $title "$z
342
+ else
343
+ line+="[$title]"
344
+ fi
345
+ done
346
+ (( len + ${#hint} + 2 <= $1 )) && line+=" "$d$hint$z
347
+ REPLY=$line
348
+ }
349
+
350
+ __tt_pv_head() {
351
+ local b=$'\e[1m' d=$'\e[2m' z=$'\e[0m' right=$6
352
+ (( color )) || b= d= z=
353
+ out+=$'\e['$1';'$2'H'$b$ac$4$z
354
+ [[ -n $5 ]] && out+=" "$d$5$z
355
+ [[ -n $right ]] && out+=$'\e['$(( $3 - ${(m)#right} + 1 ))'G'$d$right$z
356
+ return 0
357
+ }
358
+
359
+ __tt_pv_foot() {
360
+ setopt localoptions extendedglob
361
+ local b=$'\e[1m' d=$'\e[2m' z=$'\e[0m' y=$'\e[33m' on=$'\e[7;1m'$ac badge="" lead="" note="" right="" text line plain hex tb=EDIT
362
+ local -a kk=() kl=() seg=()
363
+ local -i end=$1 i lwid rwid room
364
+ (( color )) || b= d= z= y= on=
365
+ if (( color )) && [[ -n $applied && $applied != "$painted" ]]; then
366
+ hex=${${=applied}[8]#\#}
367
+ printf -v y '\e[38;2;%d;%d;%dm' $((16#${hex:0:2})) $((16#${hex:2:2})) $((16#${hex:4:2}))
368
+ fi
369
+ if (( help )); then
370
+ badge=HELP right=$b"? esc"$z$d" close"$z
371
+ elif [[ -n $pick ]]; then
372
+ badge='PREVIEW (APPLY)' lead="$pick →"
373
+ (( te )) && badge="$tb (APPLY)"
374
+ for (( i = 1; i <= ${#plabel}; i++ )); do
375
+ if (( i != pk )); then
376
+ lead+=" "$d${plabel[i]}$z
377
+ elif (( color )); then
378
+ lead+=" "$on${plabel[i]}$z
379
+ else
380
+ lead+=" [${${plabel[i]# }% }]"
381
+ fi
382
+ done
383
+ if [[ $mode == pin ]]; then
384
+ badge='PREVIEW (PIN)'
385
+ (( te )) && badge="$tb (PIN)"
386
+ __tt_pin_where "${pkeys[pk]}"
387
+ note=$REPLY
388
+ elif (( pk == 2 )); then
389
+ note="Until this tab closes"
390
+ else
391
+ note="New tabs · the default palette"
392
+ fi
393
+ kk=(enter) kl=(confirm)
394
+ right=$b"esc"$z$d" back"$z
395
+ elif (( te && tfocus == 0 )); then
396
+ badge=$tb
397
+ kk=("${(@ps:\x1e:)teframe[6]}") kl=("${(@ps:\x1e:)teframe[7]}")
398
+ i=${kk[(Ie)esc]}
399
+ (( i )) && kk[i]=() kl[i]=()
400
+ right=$b"esc"$z$d" cancel"$z
401
+ if [[ $temode == list ]]; then
402
+ kk=("${kk[1]}" s "${(@)kk[2,-1]}" ⇧enter) kl=("${kl[1]}" save "${(@)kl[2,-1]}" apply)
403
+ elif [[ $temode == tune ]]; then
404
+ badge="$tb (TUNE)" right=$b"esc"$z$d" undo"$z
405
+ elif [[ $temode == type ]]; then
406
+ badge="$tb (TYPE)" right=$b"esc"$z$d" back"$z
407
+ elif [[ $temode == compare ]]; then
408
+ badge="$tb (BEFORE)" right=$b"esc"$z$d" back"$z
409
+ fi
410
+ elif (( te && tfocus == 2 )); then
411
+ badge=$tb kk=(enter ↑↓ s) kl=(apply move save)
412
+ right=$b"esc"$z$d" cancel"$z
413
+ elif (( te )); then
414
+ badge=$tb
415
+ kk=(↑↓ ←→ s) kl=(field step save)
416
+ if [[ -n $tune ]] && (( tf == 5 )); then
417
+ __tt_pv_bg_images $tune
418
+ kl[2]="image ×$REPLY"
419
+ (( REPLY > 1 )) || { kk[2]=() kl[2]=() }
420
+ __tt_pv_bg_findable $tune && { kk+=(f); kl+=(find) }
421
+ kk+=(D) kl+=(remove)
422
+ elif [[ -n $tune ]]; then
423
+ __tt_pv_bg_findable $tune && { kk+=(f); kl+=(find) }
424
+ if (( tf == 2 )); then
425
+ kl[2]=move kk+=(1-9 '=' +) kl+=(place reset "reset all")
426
+ elif (( tf == 4 )); then
427
+ kl[2]=switch kk+=(+) kl+=("reset all")
428
+ else
429
+ kk+=('=' + ⇧←→) kl+=(reset "reset all" ×10)
430
+ fi
431
+ (( bgoff[$tpick] )) && { kk+=(space); kl+=(show) } || { kk+=(c space); kl+=(colors hide) }
432
+ __tt_pv_bg_images $tune
433
+ (( REPLY > 1 )) && { kk+=(', .' D); kl+=("image ×$REPLY" remove) }
434
+ else
435
+ kk=(enter ↑↓ s) kl=(find move save)
436
+ fi
437
+ kk+=(⇧enter) kl+=(apply)
438
+ right=$b"esc"$z$d" cancel"$z
439
+ elif (( conf )); then
440
+ badge=CONFIG kk=(↑↓ ←→ enter) kl=(setting value save)
441
+ right=$b"esc"$z$d" undo"$z
442
+ else
443
+ badge=PREVIEW
444
+ [[ -n $flt ]] && badge='PREVIEW (FILTER)'
445
+ if (( ! ${#rval} )); then
446
+ kk=(bksp) kl=(edit)
447
+ elif [[ ${rtype[cur]} == (hdr|cat) ]]; then
448
+ if [[ -z $flt && -n ${exp[${rval[cur]}]} ]]; then
449
+ kk=(←) kl=(close)
450
+ elif [[ -z $flt ]]; then
451
+ kk=(→) kl=(open)
452
+ fi
453
+ else
454
+ kk=(enter tab) kl=(apply edit)
455
+ (( split )) && { kk+=(⇧←→); kl+=(example) }
456
+ [[ -n $flt ]] && { kk+=(bksp); kl+=(edit) }
457
+ fi
458
+ kk+=('?') kl+=(keys)
459
+ if [[ -n $flt ]]; then
460
+ right=$b"esc"$z$d" clear filter"$z
461
+ else
462
+ right=$b"esc"$z$d" restore"$z
463
+ [[ -n $cdot ]] && right+=" $cdot$z $cn"
464
+ fi
465
+ fi
466
+ if (( msgt > 0 )) && [[ -z $pick ]]; then
467
+ text=$msg
468
+ room=$(( end - (${#badge} ? ${#badge} + 4 : 0) ))
469
+ if (( ${(m)#text} > room )); then
470
+ while [[ -n $text ]] && (( ${(m)#text} > room - 1 )); do text=${text[1,-2]}; done
471
+ text+=…
472
+ fi
473
+ lead=$y$text$z note="" kk=() kl=()
474
+ fi
475
+ while :; do
476
+ seg=()
477
+ [[ -n $lead ]] && seg+=("$lead")
478
+ [[ -n $note ]] && seg+=("$d$note$z")
479
+ for (( i = 1; i <= ${#kk}; i++ )); do
480
+ seg+=("$b${kk[i]}$z$d ${kl[i]}$z")
481
+ done
482
+ line=${(j: :)seg}
483
+ if [[ -n $badge ]]; then
484
+ if (( color )); then
485
+ line=$'\e[7;1m'$ac" $badge "$z" "$line
486
+ else
487
+ line="[$badge] $line"
488
+ fi
489
+ fi
490
+ plain=${line//$'\e'\[[0-9;]##m/}
491
+ lwid=${(m)#plain}
492
+ plain=${right//$'\e'\[[0-9;]##m/}
493
+ rwid=${(m)#plain}
494
+ (( lwid <= end && (! rwid || lwid + 3 + rwid <= end) )) && break
495
+ if [[ -n $note ]]; then
496
+ note=""
497
+ elif (( ${#kk} > 2 )); then
498
+ kk[-2]=() kl[-2]=()
499
+ elif [[ -n $right ]]; then
500
+ right=""
501
+ elif (( ${#kk} > 1 )); then
502
+ kk[-2]=() kl[-2]=()
503
+ else
504
+ break
505
+ fi
506
+ done
507
+ out+=$line$'\e[K'
508
+ [[ -n $right ]] && out+=$'\e['$(( end - rwid + 1 ))'G'$right
509
+ local -i zc=1 zw
510
+ [[ -n $badge ]] && (( zc += ${(m)#badge} + (color ? 4 : 3) ))
511
+ if [[ -n $lead ]]; then
512
+ if [[ -n $pick ]]; then
513
+ zw=$(( zc + ${(m)#pick} + 2 ))
514
+ for (( i = 1; i <= ${#plabel}; i++ )); do
515
+ pvz+=("$ph $(( zw + 1 )) $(( zw + ${(m)#plabel[i]} )) pick $i")
516
+ (( zw += ${(m)#plabel[i]} + 1 ))
517
+ done
518
+ fi
519
+ plain=${lead//$'\e'\[[0-9;]##m/}
520
+ (( zc += ${(m)#plain} + 3 ))
521
+ fi
522
+ [[ -n $note ]] && (( zc += ${(m)#note} + 3 ))
523
+ for (( i = 1; i <= ${#kk}; i++ )); do
524
+ zw=$(( ${(m)#kk[i]} + 1 + ${(m)#kl[i]} ))
525
+ pvz+=("$ph $zc $(( zc + zw - 1 )) key ${kk[i]}")
526
+ (( zc += zw + 3 ))
527
+ done
528
+ if [[ -n $right ]]; then
529
+ plain=${right//$'\e'\[[0-9;]##m/}
530
+ pvz+=("$ph $(( end - rwid + 1 )) $end key ${plain%% *}")
531
+ fi
532
+ return 0
533
+ }
534
+
535
+ __tt_pv_help() {
536
+ local back="the tab" z=$'\e[0m' b=$'\e[1m' blank
537
+ [[ -n ${TTHEME_PALETTE[$cn]} ]] && back=$cn
538
+ local -a hk=() hv=()
539
+ if (( te )); then
540
+ hk=(Move Image "" "" "" Palette "" "" "" "" "" Apply Save Cancel)
541
+ hv=(
542
+ "↑↓ j k the image, the palette, then Apply · home end"
543
+ "Images ←→ , . pick one · D removes it · f finds one"
544
+ "enter on the empty frame · finds the first one"
545
+ "←→ step ⇧←→ ×10 1-9 place · = resets · + all"
546
+ "space hides · c colors"
547
+ "←→ normal or bright · enter tab tune it · # a color"
548
+ "tuning: ↑↓ L C H ◐ · ◐ home the floor · a scope"
549
+ "g relations · n N the next and last miss"
550
+ "r resets a slot · R all · space the colors before"
551
+ "c copies · v pastes · = bright follows normal"
552
+ "f moves the colors the gate misses · u undo"
553
+ "enter on Apply, or ⇧enter anywhere · saves, asks where"
554
+ "s · keeps the picture and the palette"
555
+ "esc · back to the list, dropping what changed since s"
556
+ )
557
+ else
558
+ hk=(Move Series Filter "" Example Apply Edit)
559
+ hv=(
560
+ "↑↓ home end pgup pgdn"
561
+ "←→ · enter or space on a series"
562
+ "Any text · bksp · ctrl-u clears"
563
+ "Names and titles, in Japanese too"
564
+ "⇧←→ ${(Lj:, :)TTHEME_SCENES}"
565
+ "enter applies · esc restores $back"
566
+ "tab → ctrl+e · its colors and picture"
567
+ )
568
+ hk+=(Config "")
569
+ hv+=("alt-c · ↑↓ setting ←→ value" "enter saves · esc undoes")
570
+ (( hub )) && { hk+=(Screens); hv+=("shift+tab · tab on a series") }
571
+ fi
572
+ hk+=(Close)
573
+ hv+=("? esc")
574
+ (( color )) || z= b=
575
+ local -i i r x y w hh
576
+ if (( split && sw >= 48 )); then
577
+ for (( i = 1; i <= ${#hk}; i++ )); do
578
+ r=$(( i + 3 ))
579
+ (( r < ph )) || break
580
+ out+=$'\e['$r';'$sc'H'$b${hk[i]}$z$'\e['$r';'$(( sc + 10 ))'H'${hv[i][1,se-sc-9]}
581
+ done
582
+ return 0
583
+ fi
584
+ w=$(( pw - 2 < 58 ? pw - 2 : 58 )) hh=$(( ${#hk} + 4 ))
585
+ (( te )) && w=$(( pw - 2 < 76 ? pw - 2 : 76 ))
586
+ x=$(( (pw - w) / 2 + 1 )) y=$(( (ph - hh) / 2 ))
587
+ (( y < 4 )) && y=4
588
+ blank=${(l:w:: :)}
589
+ out+=$'\e['$y';'$x'H'"╭─ Help ${(l:$(( w - 9 ))::─:)}╮"
590
+ for (( r = y + 1; r < y + hh - 1; r++ )); do
591
+ out+=$'\e['$r';'$x'H'$blank$'\e['$r';'$x'H│'$'\e['$r';'$(( x + w - 1 ))'H│'
592
+ done
593
+ for (( i = 1; i <= ${#hk}; i++ )); do
594
+ r=$(( y + 1 + i ))
595
+ out+=$'\e['$r';'$(( x + 3 ))'H'$b${hk[i]}$z$'\e['$r';'$(( x + 13 ))'H'${hv[i][1,w-16]}
596
+ done
597
+ out+=$'\e['$(( y + hh - 1 ))';'$x'H'"╰${(l:$(( w - 2 ))::─:)}╯"
598
+ }
599
+
600
+ __tt_pv_specimen() {
601
+ local -a sp=(${=applied}) lines parts
602
+ (( ${#sp} >= 20 )) || return 0
603
+ local z=$'\e[0m' d=$'\e[2m' cell hex fore line text piece role tabs="" built="" key="$applied|$painted|$scene|$sw|$sc|$ph"
604
+ local -A rs=(p "" d $'\e[2m' b $'\e[1m')
605
+ local -i i r=6 cw=4 k n=${#TTHEME_SCENES} at
606
+ (( n )) || return 0
607
+ if [[ $key == "$pvscene" ]]; then
608
+ out+=$pvscenes
609
+ return 0
610
+ fi
611
+ at=$(( (scene % n + n) % n + 1 ))
612
+ if [[ $applied == "$painted" ]]; then
613
+ for (( i = 0; i < 16; i++ )); do
614
+ k=$(( i < 8 ? 30 + i : 82 + i ))
615
+ rs[$i]=$'\e['$k'm' rs[B$i]=$'\e[1;'$k'm' rs[K$i]=$'\e[30;'$(( k + 10 ))'m'
616
+ done
617
+ else
618
+ fore=${sp[5]#\#}
619
+ for (( i = 0; i < 16; i++ )); do
620
+ hex=${sp[i+5]#\#}
621
+ printf -v cell '\e[38;2;%d;%d;%dm' $((16#${hex:0:2})) $((16#${hex:2:2})) $((16#${hex:4:2}))
622
+ rs[$i]=$cell
623
+ printf -v cell '\e[38;2;%d;%d;%d;48;2;%d;%d;%dm' $((16#${fore:0:2})) $((16#${fore:2:2})) $((16#${fore:4:2})) \
624
+ $((16#${hex:0:2})) $((16#${hex:2:2})) $((16#${hex:4:2}))
625
+ rs[K$i]=$cell
626
+ hex=${sp[(i < 8 ? i + 13 : i + 5)]#\#}
627
+ printf -v cell '\e[1;38;2;%d;%d;%dm' $((16#${hex:0:2})) $((16#${hex:2:2})) $((16#${hex:4:2}))
628
+ rs[B$i]=$cell
629
+ done
630
+ fi
631
+ printf -v cell '\e[48;2;%d;%d;%dm' $((16#${sp[4]:1:2})) $((16#${sp[4]:3:2})) $((16#${sp[4]:5:2}))
632
+ rs[s]=$cell
633
+ printf -v cell '\e[48;2;%d;%d;%dm' $((16#${sp[3]:1:2})) $((16#${sp[3]:3:2})) $((16#${sp[3]:5:2}))
634
+ rs[c]=$cell
635
+ if (( ${#${(j: :)TTHEME_SCENES}} <= sw )); then
636
+ for (( k = 1; k <= n; k++ )); do
637
+ (( k > 1 )) && tabs+=" "
638
+ if (( k == at )); then
639
+ tabs+=$'\e[1m'$ac$TTHEME_SCENES[k]$z
640
+ else
641
+ tabs+=$d$TTHEME_SCENES[k]$z
642
+ fi
643
+ done
644
+ else
645
+ tabs=$'\e[1m'$ac$TTHEME_SCENES[at]$z" "$d"$at/$n"$z
646
+ fi
647
+ built+=$'\e[2;'$sc'H'$tabs
648
+ (( sw < 44 )) && cw=3
649
+ (( sw >= 56 )) && cw=$(( (sw + 1) / 8 - 1 ))
650
+ (( cw > 7 )) && cw=7
651
+ line=""
652
+ for (( i = 0; i < 8; i++ )); do
653
+ fore=${sp[i+5]#\#} hex=${sp[i+13]#\#}
654
+ printf -v cell '\e[38;2;%d;%d;%d;48;2;%d;%d;%dm%s\e[0m ' \
655
+ $((16#${fore:0:2})) $((16#${fore:2:2})) $((16#${fore:4:2})) \
656
+ $((16#${hex:0:2})) $((16#${hex:2:2})) $((16#${hex:4:2})) "${(l:cw::▀:)}"
657
+ line+=$cell
658
+ done
659
+ built+=$'\e[4;'$sc'H'$line
660
+ lines=("${(@P)${:-TTHEME_SCENE_$at}}")
661
+ for line in "${lines[@]}"; do
662
+ [[ $line == «w»* ]] && (( sw < 44 )) && continue
663
+ [[ $line == «n»* ]] && (( sw >= 44 )) && continue
664
+ (( r < ph )) || break
665
+ parts=("${(@s:«:)line}")
666
+ text=$parts[1]
667
+ for piece in "${(@)parts[2,-1]}"; do
668
+ role=${piece%%»*}
669
+ [[ $role == [wn] ]] && role=p
670
+ text+=$z${rs[${role:-p}]}${piece#*»}
671
+ done
672
+ built+=$'\e['$r';'$sc'H'$text$z
673
+ (( ++r ))
674
+ done
675
+ pvscene=$key pvscenes=$built
676
+ out+=$built
677
+ }
678
+
679
+ __tt_pv_tune() {
680
+ local -a fields=(size pos op)
681
+ local -i n=1
682
+ local name
683
+ case $key in
684
+ $'\x03') return 1 ;;
685
+ up) tf=$(( tf > 1 ? tf - 1 : 4 )) ;;
686
+ down) tf=$(( tf < 4 ? tf + 1 : 1 )) ;;
687
+ c) (( bgoff[$tpick] )) || __tt_pv_bg_recolor ;;
688
+ left|right|sleft|sright)
689
+ if (( tf == 4 )); then
690
+ (( bgoff[$tpick] )) || __tt_pv_bg_recolor
691
+ return 0
692
+ fi
693
+ [[ $key == *left ]] && n=-1
694
+ [[ $key == s* ]] && (( tf != 2 )) && n=$(( n * 10 ))
695
+ __tt_pv_bg_adjust ${fields[tf]} $n
696
+ ;;
697
+ [1-9])
698
+ tf=2
699
+ __tt_pv_bg_adjust at $key
700
+ ;;
701
+ ' ') __tt_pv_bg_adjust on ;;
702
+ '=') (( tf == 4 )) || __tt_pv_bg_adjust def $tf ;;
703
+ '+') __tt_pv_bg_adjust def ;;
704
+ ',') __tt_pv_bg_pick -1 ;;
705
+ '.') __tt_pv_bg_pick 1 ;;
706
+ D) __tt_pv_bg_drop ;;
707
+ esac
708
+ return 0
709
+ }
710
+
711
+ __tt_pv_tune_stage() {
712
+ local img was=${bgview[$tune]:-$tune}
713
+ local -i changed=0
714
+ for img in ${(k)tsnaps}; do
715
+ [[ "${bgsize[$img]} ${bgpos[$img]} ${bgop[$img]} ${bgoff[$img]}" == "${tsnaps[$img]}" ]] && continue
716
+ bgedit[$img]=1 changed=1
717
+ done
718
+ if [[ $tpick != "$was" ]]; then
719
+ changed=1
720
+ if [[ $tpick == "$tune" ]]; then
721
+ unset "bgview[$tune]" "bgswap[$tune]"
722
+ else
723
+ bgview[$tune]=$tpick bgswap[$tune]=${tpick##*:}
724
+ fi
725
+ fi
726
+ (( changed )) && msg="Kept · saved when preview closes" msgt=200
727
+ tune="" tpick="" tsnaps=() bgname=""
728
+ }
729
+
730
+ __tt_pv_tune_keep() {
731
+ __tt_pv_bg_strip_off
732
+ __tt_pv_tune_stage
733
+ }
734
+
735
+ __tt_pv_untune() {
736
+ local img
737
+ local -a s
738
+ for img in ${(k)tsnaps}; do
739
+ s=(${=tsnaps[$img]})
740
+ bgsize[$img]=$s[1] bgpos[$img]=$s[2] bgop[$img]=$s[3] bgoff[$img]=$s[4]
741
+ done
742
+ __tt_pv_bg_strip_off
743
+ tune="" tpick="" tsnaps=() bgname=""
744
+ }
745
+
746
+ __tt_pv_regroup() {
747
+ local ty=${rtype[cur]} v=${rval[cur]} i
748
+ __tt_pv_group
749
+ __tt_pv_rows
750
+ for (( i = 1; i <= ${#rval}; i++ )); do
751
+ [[ ${rtype[i]} == "$ty" && ${rval[i]} == "$v" ]] && { cur=$i; return 0 }
752
+ done
753
+ cur=1
754
+ }
755
+
756
+ __tt_pv_conf() {
757
+ case $key in
758
+ $'\x03') return 1 ;;
759
+ up|k) cf=$(( cf > 1 ? cf - 1 : ${#cvars} )) ;;
760
+ down|j) cf=$(( cf < ${#cvars} ? cf + 1 : 1 )) ;;
761
+ left|sleft) __tt_pv_conf_step -1 ;;
762
+ right|sright) __tt_pv_conf_step 1 ;;
763
+ $'\r'|$'\n') __tt_pv_conf_save ;;
764
+ esc) __tt_pv_unconf ;;
765
+ '?') help=1 ;;
766
+ esac
767
+ return 0
768
+ }
769
+
770
+ __tt_pv_conf_step() {
771
+ local var=${cvars[cf]}
772
+ local -a ch=(${=cchoice[cf]})
773
+ local -i i=${ch[(Ie)${(P)var}]}
774
+ (( i += $1 ))
775
+ (( i >= 1 && i <= ${#ch} )) || return 0
776
+ __tt_pv_conf_put $var ${ch[i]}
777
+ }
778
+
779
+ __tt_pv_conf_put() {
780
+ [[ ${(P)1} == "$2" ]] && return 0
781
+ typeset -g "$1=$2"
782
+ case $1 in
783
+ TTHEME_SORT) __tt_pv_regroup ;;
784
+ TTHEME_FX) [[ -n $flt ]] || { __tt_pv_roll; gstep=8 } ;;
785
+ TTHEME_TAB_PALETTE) __tt_pv_canpick ;;
786
+ TTHEME_MOUSE) __tt_pv_pointer ;;
787
+ esac
788
+ }
789
+
790
+ __tt_pv_pointer() {
791
+ if [[ $1 == off || $TTHEME_MOUSE == off ]]; then
792
+ [[ -n $pvmouse ]] && printf '\e[?1006l\e[?1002l\e[?1000l'
793
+ pvmouse="" mzone=""
794
+ else
795
+ pvmouse=$'\e[?1000h\e[?1002h\e[?1006h'
796
+ printf %s "$pvmouse"
797
+ fi
798
+ }
799
+
800
+ __tt_pv_unconf() {
801
+ local -i i
802
+ for (( i = 1; i <= ${#cvars}; i++ )); do
803
+ __tt_pv_conf_put ${cvars[i]} "${csnap[i]}"
804
+ done
805
+ conf=0
806
+ }
807
+
808
+ __tt_pv_conf_save() {
809
+ local var REPLY
810
+ local -a pairs=()
811
+ local -i i
812
+ for (( i = 1; i <= ${#cvars}; i++ )); do
813
+ var=${cvars[i]}
814
+ [[ ${(P)var} == "${csnap[i]}" ]] || pairs+=($var "${(P)var}")
815
+ done
816
+ if (( ! ${#pairs} )); then
817
+ conf=0
818
+ return 0
819
+ fi
820
+ __tt_tilde "$TTHEME_CONFIG"
821
+ if __tt_config_write "${pairs[@]}"; then
822
+ conf=0 msg="Saved · $REPLY" msgt=200
823
+ (( ${pairs[(Ie)TTHEME_BG_BLUR]} )) && __tt_pv_redraw
824
+ else
825
+ __tt_pv_unconf
826
+ msg="Could not write $REPLY" msgt=200
827
+ fi
828
+ }
829
+
830
+ __tt_pv_redraw() {
831
+ local name out
832
+ if (( $+functions[__tt_bg_write] )); then
833
+ for name in ${(k)bgedit}; do
834
+ __tt_bg_write $name
835
+ done
836
+ fi
837
+ bgedit=()
838
+ msg="Drawing the background pictures again" msgt=300
839
+ printf '\e[?2026h'
840
+ __tt_pv_draw
841
+ out=$(__tt_cli redraw 2>&1)
842
+ bgsrc=() resized=1 bgname="" bgshown="" bgdim=()
843
+ __tt_reload
844
+ (( $+functions[__tt_bg_refresh] )) && __tt_bg_refresh $TTHEME_ORDER
845
+ msg=${${out//$'\n'/ }:-"Saved · no background pictures to draw"} msgt=300
846
+ }
847
+
848
+ __tt_pv_conf_panel() {
849
+ local z=$'\e[0m' b=$'\e[1m' d=$'\e[2m' c=$ac on=$'\e[7;1m'$ac var v note
850
+ local -a ch sh
851
+ local -i r0=$1 col=$2 end=$3 k i j fit=1
852
+ (( color )) || z= b= d= c= on=
853
+ for (( k = 1; k <= ${#cvars}; k++ )); do
854
+ sh=(${=cshow[k]})
855
+ (( 13 + ${#${(j: :)sh}} + 2 * ${#sh} > end - col + 1 )) && fit=0
856
+ done
857
+ for (( k = 1; k <= ${#cvars}; k++ )); do
858
+ var=${cvars[k]} ch=(${=cchoice[k]}) sh=(${=cshow[k]})
859
+ i=${ch[(Ie)${(P)var}]}
860
+ out+=$'\e['$(( r0 + k - 1 ))';'$col'H'
861
+ pvz+=("$(( r0 + k - 1 )) $col $end conf $k")
862
+ if (( k == cf )); then
863
+ out+=$c"▶"$z" "$b
864
+ else
865
+ out+=" "$d
866
+ fi
867
+ out+=${(r:11:)clabel[k]}$z
868
+ if (( ! fit )); then
869
+ v=${(P)var}
870
+ (( i )) && v=${sh[i]}
871
+ if (( k == cf )); then
872
+ out+=$c"‹ "$z$b$v$z$c" ›"$z
873
+ pvz+=("$(( r0 + k - 1 )) $(( col + 13 )) $(( col + 14 )) confs $k -1")
874
+ pvz+=("$(( r0 + k - 1 )) $(( col + 15 + ${(m)#v} )) $(( col + 17 + ${(m)#v} )) confs $k 1")
875
+ else
876
+ out+=" "$v
877
+ fi
878
+ continue
879
+ fi
880
+ local -i zc=$(( col + 13 ))
881
+ for (( j = 1; j <= ${#sh}; j++ )); do
882
+ (( j > 1 )) && (( zc++ ))
883
+ pvz+=("$(( r0 + k - 1 )) $zc $(( zc + ${(m)#sh[j]} + 1 )) confv $k $j")
884
+ (( zc += ${(m)#sh[j]} + 2 ))
885
+ (( j > 1 )) && out+=" "
886
+ if (( j != i )); then
887
+ out+=$d" ${sh[j]} "$z
888
+ elif (( ! color )); then
889
+ out+="[${sh[j]}]"
890
+ elif (( k == cf )); then
891
+ out+=$on" ${sh[j]} "$z
892
+ else
893
+ out+=" ${sh[j]} "
894
+ fi
895
+ done
896
+ done
897
+ var=${cvars[cf]}
898
+ note=${cnote[$var:${(P)var}]}
899
+ [[ -n $note ]] && out+=$'\e['$(( r0 + ${#cvars} + 1 ))';'$col'H'$d${note[1,end-col+1]}$z
900
+ return 0
901
+ }
902
+
903
+ __tt_pv_flush() {
904
+ local REPLY
905
+ print -rn -- "$out"
906
+ if (( wiped )); then
907
+ local bn=$bgname
908
+ if [[ ${rtype[cur]} == thm ]]; then
909
+ __tt_pv_shows ${rval[cur]}
910
+ bn=$REPLY
911
+ fi
912
+ [[ -n $bn ]] && __tt_pv_bg_show "$bn" 1
913
+ fi
914
+ if [[ -n $bgstrip ]]; then
915
+ __tt_pv_bg_strip ${=bgstrip}
916
+ elif (( ${#bgthumb} )); then
917
+ __tt_pv_bg_strip_off
918
+ fi
919
+ printf '\e[1;%dH\e[?2026l' $(( 4 + ${(m)#flt} ))
920
+ }
921
+
922
+ __tt_pv_reach() {
923
+ local key=${pkeys[pk]} base top k home=${HOME:a} here=${PWD:a} htip="" d=$'\e[2m' z=$'\e[0m' REPLY
924
+ local -A own=() below=() parent=() mark=() tstrip=()
925
+ local -a roots=() lp=() lpw=() ll=() lat=() lpal=() lnote=() lflag=() reply was=()
926
+ local -A TTHEME_PINS=("${(@kv)TTHEME_PINS}")
927
+ local -i room=$2
928
+ (( color )) || d= z=
929
+ (( room < 2 )) && room=2
930
+ if [[ $key == ssh:* ]]; then
931
+ __tt_pin_scope "$key"
932
+ [[ -n ${TTHEME_PINS[$key]} && $TTHEME_PINS[$key] != "$pick" ]] && was+=("${TTHEME_PINS[$key]} · $REPLY")
933
+ TTHEME_PINS[$key]=$pick
934
+ mark[$key]=new
935
+ __tt_map_ssh
936
+ else
937
+ __tt_pin_base "$key"
938
+ base=$REPLY
939
+ for k in ${(k)TTHEME_PINS}; do
940
+ [[ $k == /* ]] || continue
941
+ __tt_pin_base "$k"
942
+ [[ $REPLY == "$base" ]] || continue
943
+ if [[ $k != "$key" || $TTHEME_PINS[$k] != "$pick" ]]; then
944
+ __tt_pin_scope "$k"
945
+ was+=("${TTHEME_PINS[$k]} · $REPLY")
946
+ fi
947
+ unset "TTHEME_PINS[$k]"
948
+ done
949
+ TTHEME_PINS[$key]=$pick
950
+ top=$base
951
+ [[ $base != / ]] && __tt_pin_cover "${base:h}" && __tt_pin_base "$REPLY" && top=$REPLY
952
+ mark[$base]=new
953
+ __tt_map_build "$top"
954
+ fi
955
+ __tt_map_fit $1
956
+ (( ${#reply} > room )) && reply=("${(@)reply[1,room-1]}" " …")
957
+ reach=("${reply[@]}")
958
+ [[ $key == /* || ${#was} -gt 0 ]] && reach+=("")
959
+ __tt_pin_where "$key"
960
+ base=$REPLY
961
+ for k in $was; do
962
+ __tt_clip "${d}Replaces ${k% · *} on $base · ${k##* · }$z" $1
963
+ reach+=("$REPLY")
964
+ done
965
+ __tt_pin_scope "$key"
966
+ __tt_clip "→ $base · $REPLY" $(( $1 - ${(m)#pick} - 2 ))
967
+ rsub=$REPLY
968
+ [[ $key == /* ]] || return 0
969
+ __tt_here_fit "Then here" $1
970
+ reach+=("${reply[@]}")
971
+ }
972
+
973
+ __tt_pv_draw() {
974
+ local out line cnt ex ag="" acat="" ac="" sb="" dd="" zz="" state=on src="" nflt="" rsub="" REPLY
975
+ local -i lw sw split sc se=$(( pw - 2 )) h k i N=${#rval} mt=${#TTHEME_ORDER} wiped=0
976
+ local -a held
977
+ bgstrip=""
978
+ if [[ -n $flt ]]; then
979
+ __tt_pv_norm "$flt"
980
+ nflt=$REPLY
981
+ fi
982
+ if (( te )) && [[ -n $tespec && $tespec != "$applied" ]]; then
983
+ __tt_pv_paint "$tespec"
984
+ applied=$tespec
985
+ fi
986
+ __tt_pv_lw
987
+ lw=$reply[1] sw=$reply[2]
988
+ split=$(( sw > 0 )) sc=$(( pw - 1 - sw ))
989
+ h=$(( ph - 5 ))
990
+ (( conf && ! split )) && h=$(( ph - 6 - ${#cvars} ))
991
+ reach=()
992
+ if [[ -n $pick && $mode == pin ]]; then
993
+ if (( split )); then
994
+ __tt_pv_reach $sw $(( ph - 6 ))
995
+ else
996
+ __tt_pv_reach $se $(( ph - 13 ))
997
+ h=$(( ph - 6 - ${#reach} ))
998
+ fi
999
+ fi
1000
+ (( h < 1 )) && h=1
1001
+ (( cur < top )) && top=$cur
1002
+ (( cur >= top + h )) && top=$(( cur - h + 1 ))
1003
+ (( top < 1 )) && top=1
1004
+ (( N > h && top > N - h + 1 )) && top=$(( N - h + 1 ))
1005
+ if (( color )); then
1006
+ dd=$'\e[2m' zz=$'\e[0m'
1007
+ if [[ -n $applied ]]; then
1008
+ local -a ap=(${=applied})
1009
+ local acx=${ap[3]#\#} sbx=${ap[4]#\#}
1010
+ printf -v ac '\e[38;2;%d;%d;%dm' $((16#${acx:0:2})) $((16#${acx:2:2})) $((16#${acx:4:2}))
1011
+ printf -v sb '\e[48;2;%d;%d;%dm' $((16#${sbx:0:2})) $((16#${sbx:2:2})) $((16#${sbx:4:2}))
1012
+ fi
1013
+ if [[ ${rtype[cur]} == thm ]]; then
1014
+ ag=${TTHEME_GROUP[${rval[cur]}]:-Other}
1015
+ [[ -n ${TTHEME_CATALOG[${rval[cur]}]} ]] && acat=$ag/${TTHEME_CATALOG[${rval[cur]}]}
1016
+ fi
1017
+ fi
1018
+ if [[ -n $flt ]]; then
1019
+ local -a mm=(${(M)rtype:#thm})
1020
+ mt=${#mm}
1021
+ fi
1022
+ cnt="$mt/${#TTHEME_ORDER}"
1023
+ out=$'\e[H'
1024
+ if (( resized )); then
1025
+ out+=$'\e[K\e[2H\e[J\e[H'
1026
+ (( bgcw )) && { __tt_bg_wipe; out+=$REPLY }
1027
+ resized=0 wiped=1
1028
+ fi
1029
+ [[ $1 == hint ]] && (( ! wiped )) || pvz=()
1030
+ if (( pw < 40 || ph < 12 )); then
1031
+ line="ttheme preview"
1032
+ (( color )) && line=$'\e[1m'$ac$line$'\e[0m'
1033
+ out+=$line$'\e[K\n'"Needs 40×12 — now ${pw}×${ph}"$'\e[K\n'
1034
+ line="esc quits"
1035
+ (( color )) && line=$'\e[2m'$line$'\e[0m'
1036
+ out+=$line$'\e[K\e[J'
1037
+ __tt_pv_flush
1038
+ return 0
1039
+ fi
1040
+ if (( te && ! split )); then
1041
+ __tt_pv_te_draw
1042
+ return 0
1043
+ fi
1044
+ if [[ -n $flt ]]; then
1045
+ if (( color )); then
1046
+ line=" "$'\e[1m'$flt$zz$ac$'\e[7m \e[0m'
1047
+ else
1048
+ line=" ${flt}_"
1049
+ fi
1050
+ else
1051
+ ex="$expal | $exgrp"
1052
+ (( ${#ex} > lw - 19 - ${#cnt} )) && ex="${ex[1,lw-20-${#cnt}]}…"
1053
+ if (( gstep > 0 )); then
1054
+ local gkeep=$(( ${#ex} * (8 - gstep) / 8 ))
1055
+ if [[ $TTHEME_FX == (decode|glitch) ]]; then
1056
+ local gpool='▓▒░#*+=<>?/-_' gstill=' ' gout="" gi
1057
+ [[ $TTHEME_FX == decode ]] && gpool='abcdefghijklmnopqrstuvwxyz' gstill='[^[:alnum:]]'
1058
+ for (( gi = 1; gi <= ${#ex}; gi++ )); do
1059
+ if (( gi + (gi * 7 + gseed) % 3 <= gkeep )) || [[ ${ex[gi]} == $~gstill ]]; then
1060
+ gout+=${ex[gi]}
1061
+ else
1062
+ gout+=${gpool[RANDOM % ${#gpool} + 1]}
1063
+ fi
1064
+ done
1065
+ ex=$gout
1066
+ else
1067
+ ex="${ex[1,gkeep]}▏"
1068
+ fi
1069
+ fi
1070
+ line=" "$dd"Search… e.g. $ex"$zz
1071
+ fi
1072
+ local tail=$'\e['$(( lw - ${#cnt} ))'G'$dd$cnt$zz
1073
+ [[ -n $flt ]] && tail=$'\e['$(( lw - ${#cnt} ))'G'$cnt
1074
+ if [[ $1 == hint ]] && (( ! wiped )); then
1075
+ print -rn -- $'\e['$(( 1 + hub ))$'H\e[0m\e['$lw'X'$line$tail
1076
+ printf '\e[%d;%dH\e[?2026l' $(( 1 + hub )) $(( 4 + ${(m)#flt} ))
1077
+ return 0
1078
+ fi
1079
+ if (( hub )); then
1080
+ __tt_pv_bar $(( split ? sc - 2 : pw - 1 ))
1081
+ out+=$REPLY$'\e[K\n'$line$'\e[K'$tail$'\n'
1082
+ else
1083
+ out+=$line$'\e[K'$tail$'\n\e[K\n'
1084
+ fi
1085
+ if (( N > h && top > 1 )); then
1086
+ out+=" "$dd"…"$zz
1087
+ pvz+=("3 1 $lw more -1")
1088
+ fi
1089
+ out+=$'\e[K\n'
1090
+ for (( k = 0; k < ph - 4; k++ )); do
1091
+ i=$(( top + k ))
1092
+ line=""
1093
+ if (( k < h )); then
1094
+ if (( ! N )); then
1095
+ (( k == 0 )) && line=" ${dd}No palettes match '$flt'$zz"
1096
+ elif (( i <= N )); then
1097
+ __tt_pv_row $i
1098
+ line=$REPLY
1099
+ pvz+=("$(( 4 + k )) 1 $lw row $i")
1100
+ case ${rtype[i]} in
1101
+ hdr) pvz+=("$(( 4 + k )) 3 5 fold $i") ;;
1102
+ cat) pvz+=("$(( 4 + k )) 5 7 fold $i") ;;
1103
+ esac
1104
+ fi
1105
+ elif (( k == h && N > h && top + h <= N )); then
1106
+ line=" "$dd"…"$zz
1107
+ pvz+=("$(( 4 + k )) 1 $lw more 1")
1108
+ fi
1109
+ out+=$line$'\e[K\n'
1110
+ done
1111
+ __tt_pv_foot $(( split ? se : pw ))
1112
+ if (( split )); then
1113
+ if (( help && sw >= 48 )); then
1114
+ __tt_pv_head 1 $sc $se Help
1115
+ __tt_pv_help
1116
+ elif (( ${#reach} )); then
1117
+ __tt_pv_head 1 $sc $se "$pick" "$rsub"
1118
+ for (( k = 1; k <= ${#reach} && k + 2 < ph; k++ )); do
1119
+ out+=$'\e['$(( k + 2 ))';'$sc'H'${reach[k]}
1120
+ done
1121
+ elif (( conf )); then
1122
+ __tt_tilde "$TTHEME_CONFIG"
1123
+ src=$REPLY
1124
+ (( 8 + ${#src} > sw )) && src=""
1125
+ __tt_pv_head 1 $sc $se Config "" "$src"
1126
+ __tt_pv_conf_panel 4 $sc $se
1127
+ elif (( te )); then
1128
+ __tt_pv_te_head $sc $se
1129
+ __tt_pv_te_panel $sc $se 3 $(( ph - 1 ))
1130
+ else
1131
+ [[ -n $an ]] && src=${TTHEME_SRC[$an]}
1132
+ (( ${#an} + 2 + ${#src} > sw )) && src=""
1133
+ __tt_pv_head 1 $sc $se ${an:-custom} "" "$src"
1134
+ __tt_pv_specimen
1135
+ fi
1136
+ (( help && sw < 48 )) && __tt_pv_help
1137
+ else
1138
+ if (( ${#reach} )); then
1139
+ __tt_pv_head $(( ph - 1 - ${#reach} )) 1 $se "$pick" "$rsub"
1140
+ for (( k = 1; k <= ${#reach}; k++ )); do
1141
+ out+=$'\e['$(( ph - 1 - ${#reach} + k ))';1H'${reach[k]}
1142
+ done
1143
+ elif (( conf )); then
1144
+ __tt_pv_head $(( ph - 2 - ${#cvars} )) 1 $lw Config
1145
+ __tt_pv_conf_panel $(( ph - 1 - ${#cvars} )) 1 $lw
1146
+ fi
1147
+ (( help )) && __tt_pv_help
1148
+ fi
1149
+ (( osdt > 0 )) && __tt_pv_osd
1150
+ __tt_pv_flush
1151
+ }
1152
+
1153
+ __tt_pv_group() {
1154
+ local k g
1155
+ groups=() gthemes=()
1156
+ __tt_order
1157
+ for k in $reply; do
1158
+ g=${TTHEME_GROUP[$k]:-Other}
1159
+ [[ -n ${gthemes[$g]} ]] || groups+=($g)
1160
+ gthemes[$g]+=" $k"
1161
+ done
1162
+ }
1163
+
1164
+ __tt_pv_canpick() {
1165
+ canpick=0
1166
+ if [[ $mode == pin ]]; then
1167
+ canpick=1
1168
+ elif __tt_keepable && [[ $TTHEME_TAB_PALETTE == off ]]; then
1169
+ canpick=1
1170
+ fi
1171
+ }
1172
+
1173
+ __tt_pv_strip() {
1174
+ local hex cell=""
1175
+ local -a sw=(${=TTHEME_SWATCH[$1]})
1176
+ local -i j
1177
+ for (( j = 1; j <= 6; j++ )); do
1178
+ hex=${sw[j]#\#}
1179
+ (( j > 1 )) && cell+=" "
1180
+ if [[ -n $hex ]]; then
1181
+ cell+=$'\e[38;2;'$((16#${hex:0:2}))';'$((16#${hex:2:2}))';'$((16#${hex:4:2}))'m■'
1182
+ else
1183
+ cell+=" "
1184
+ fi
1185
+ done
1186
+ tstrip[$1]=$cell$'\e[39m'
1187
+ }
1188
+
1189
+ __tt_pv_init() {
1190
+ local lo
1191
+ local -a tp
1192
+ __tt_pv_group
1193
+ [[ -n $orig ]] && __tt_name_of "$orig" && cn=$REPLY
1194
+ [[ -n ${TTHEME_PALETTE[$cn]} ]] || return 0
1195
+ cdot="◆"
1196
+ (( color )) || return 0
1197
+ tp=(${=TTHEME_PALETTE[$cn]})
1198
+ lo=${tp[3]#\#}
1199
+ printf -v cdot '\e[38;2;%d;%d;%dm◆\e[39m' $((16#${lo:0:2})) $((16#${lo:2:2})) $((16#${lo:4:2}))
1200
+ }
1201
+
1202
+ __tt_pv_roll() {
1203
+ expal=${TTHEME_ORDER[RANDOM % ${#TTHEME_ORDER} + 1]}
1204
+ exgrp=${groups[RANDOM % ${#groups} + 1]}
1205
+ gseed=$RANDOM
1206
+ exnext=$(( SECONDS + 3 ))
1207
+ }
1208
+
1209
+ __tt_pv_size() {
1210
+ local sz=$(stty size 2>/dev/null)
1211
+ [[ $sz == <1->" "<1-> ]] || return 1
1212
+ [[ $sz == "$ph $pw" ]] && return 1
1213
+ ph=${sz%% *} pw=${sz##* } resized=1
1214
+ return 0
1215
+ }
1216
+
1217
+ __tt_pv_getch() {
1218
+ if (( $# )); then
1219
+ read -sk 1 -t $1 2>/dev/null
1220
+ return
1221
+ fi
1222
+ local -F t=0.2 at
1223
+ local -i quick=0
1224
+ (( gstep )) && t=0.06
1225
+ while :; do
1226
+ at=$EPOCHREALTIME
1227
+ read -sk 1 -t $t 2>/dev/null && return 0
1228
+ if (( EPOCHREALTIME - at < t / 4 )); then
1229
+ (( ++quick >= 5 )) && { pvgone=1; return 1 }
1230
+ else
1231
+ quick=0
1232
+ fi
1233
+ [[ -t 0 ]] || return 1
1234
+ __tt_pv_size && return 1
1235
+ if (( osdt > 0 )); then
1236
+ (( osdt -= gstep ? 6 : 20 ))
1237
+ (( osdt > 0 )) || return 1
1238
+ fi
1239
+ if (( msgt > 0 )); then
1240
+ (( msgt -= gstep ? 6 : 20 ))
1241
+ (( msgt > 0 )) || return 1
1242
+ fi
1243
+ (( gstep )) && { gstep=$(( gstep - 1 )); tick=1; return 1 }
1244
+ (( ! te && SECONDS >= exnext )) && { __tt_pv_roll; gstep=8; tick=1; return 1 }
1245
+ done
1246
+ }
1247
+
1248
+ __tt_pv_read() {
1249
+ key=""
1250
+ if (( $# )); then
1251
+ __tt_pv_getch 0 || return 1
1252
+ else
1253
+ __tt_pv_getch || return 1
1254
+ fi
1255
+ key=$REPLY
1256
+ [[ $key == ç ]] && key=altc
1257
+ [[ $key == $'\e' ]] || return 0
1258
+ local seq=""
1259
+ if ! __tt_pv_getch 0.05; then
1260
+ key=esc
1261
+ return 0
1262
+ fi
1263
+ if [[ $REPLY != '[' && $REPLY != O ]]; then
1264
+ key=nop
1265
+ [[ $REPLY == c ]] && key=altc
1266
+ return 0
1267
+ fi
1268
+ while __tt_pv_getch 0.05; do
1269
+ seq+=$REPLY
1270
+ [[ $REPLY == [A-Za-z~] ]] && break
1271
+ done
1272
+ case $seq in
1273
+ A) key=up ;;
1274
+ B) key=down ;;
1275
+ C) key=right ;;
1276
+ D) key=left ;;
1277
+ H|"1~"|"7~") key=home ;;
1278
+ F|"4~"|"8~") key=end ;;
1279
+ "5~") key=pgup ;;
1280
+ "6~") key=pgdn ;;
1281
+ "1;2C") key=sright ;;
1282
+ "1;2D") key=sleft ;;
1283
+ "27;2;13~"|"13;2u") key=senter ;;
1284
+ Z) key=stab ;;
1285
+ '<'<->';'<->';'<->[Mm]) __tt_pv_sgr $seq ;;
1286
+ M) __tt_pv_x10 ;;
1287
+ *) key=nop ;;
1288
+ esac
1289
+ }
1290
+
1291
+ __tt_pv_sgr() {
1292
+ local -a p=(${(s:;:)${${1#<}%[Mm]}})
1293
+ local -i b=$p[1]
1294
+ key=mouse mrow=$p[3] mcol=$p[2] mwheel=0
1295
+ if (( b & 128 || mrow < 1 || mcol < 1 )); then
1296
+ key=nop
1297
+ elif (( b & 64 )); then
1298
+ mact=wheel mwheel=$(( b & 1 ? 1 : -1 ))
1299
+ (( b & 2 || mwheel == mlwheel )) && key=nop
1300
+ mlwheel=$mwheel
1301
+ elif (( b & 32 )); then
1302
+ mact=drag
1303
+ (( b & 3 )) && key=nop
1304
+ elif [[ $1 == *m ]] || (( (b & 3) == 3 )); then
1305
+ mact=release
1306
+ elif (( b & 3 )); then
1307
+ key=nop
1308
+ else
1309
+ mact=press
1310
+ if (( mrow == mlrow && mcol - mlcol <= 1 && mlcol - mcol <= 1 && EPOCHREALTIME - mlast <= 0.5 )); then
1311
+ (( ++mclick ))
1312
+ else
1313
+ mclick=1
1314
+ fi
1315
+ mlast=$EPOCHREALTIME mlrow=$mrow mlcol=$mcol
1316
+ fi
1317
+ return 0
1318
+ }
1319
+
1320
+ __tt_pv_x10() {
1321
+ local a b c
1322
+ key=nop
1323
+ __tt_pv_getch 0.05 && a=$REPLY || return 0
1324
+ __tt_pv_getch 0.05 && b=$REPLY || return 0
1325
+ __tt_pv_getch 0.05 && c=$REPLY || return 0
1326
+ (( #a < 128 && #b > 32 && #b < 128 && #c > 32 && #c < 128 )) || return 0
1327
+ __tt_pv_sgr "<$(( #a - 32 ));$(( #b - 32 ));$(( #c - 32 ))M"
1328
+ }
1329
+
1330
+ __tt_pv_spot() {
1331
+ local z
1332
+ local -a f
1333
+ for z in "${(@Oa)pvz}"; do
1334
+ f=(${=z})
1335
+ (( f[1] == $1 && $2 >= f[2] && $2 <= f[3] )) || continue
1336
+ REPLY=$z
1337
+ return 0
1338
+ done
1339
+ REPLY=""
1340
+ return 1
1341
+ }
1342
+
1343
+ __tt_pv_word() {
1344
+ case $1 in
1345
+ enter) REPLY=$'\r' ;;
1346
+ esc) REPLY=esc ;;
1347
+ tab) REPLY=$'\t' ;;
1348
+ bksp) REPLY=$'\x7f' ;;
1349
+ space) REPLY=' ' ;;
1350
+ ⇧enter) REPLY=senter ;;
1351
+ ←) REPLY=left ;;
1352
+ →) REPLY=right ;;
1353
+ '?'|'#'|[a-zA-Z]|'='|'+') REPLY=$1 ;;
1354
+ *) REPLY="" ;;
1355
+ esac
1356
+ [[ -n $REPLY ]]
1357
+ }
1358
+
1359
+ __tt_pv_mouse() {
1360
+ local REPLY
1361
+ local -a z
1362
+ if [[ $mact == wheel ]]; then
1363
+ __tt_pv_wheel
1364
+ return
1365
+ fi
1366
+ if [[ $mact == press ]]; then
1367
+ if (( help )); then
1368
+ help=0 mzone=""
1369
+ return 0
1370
+ fi
1371
+ __tt_pv_spot $mrow $mcol
1372
+ mzone=$REPLY
1373
+ fi
1374
+ z=(${=mzone})
1375
+ (( ${#z} )) || return 0
1376
+ [[ $mact == release ]] && mzone=""
1377
+ if [[ $z[4] == tone ]]; then
1378
+ __tt_pv_te_mouse $z
1379
+ return
1380
+ fi
1381
+ case $mact in
1382
+ press) __tt_pv_press $z ;;
1383
+ drag) [[ $z[4] == track ]] && __tt_pv_bg_track $z[5] $(( mcol - z[2] )) $(( z[3] - z[2] )) ;;
1384
+ release) (( mrow == z[1] && mcol >= z[2] && mcol <= z[3] )) && __tt_pv_release $z ;;
1385
+ esac
1386
+ }
1387
+
1388
+ __tt_pv_free() {
1389
+ (( ! conf && ! te && ! help )) && [[ -z $pick && -z $tune ]]
1390
+ }
1391
+
1392
+ __tt_pv_press() {
1393
+ case $4 in
1394
+ row|fold) __tt_pv_free && [[ ${rtype[$5]} != rule ]] && cur=$5 ;;
1395
+ pick) pk=$5 ;;
1396
+ conf) cf=$5 ;;
1397
+ teimg) (( tfocus == 1 )) || __tt_te_to_image ;;
1398
+ tefield|track|place|colors)
1399
+ (( tfocus == 1 )) || __tt_te_to_image
1400
+ case $4 in
1401
+ place) tf=2 ;;
1402
+ colors) tf=4 ;;
1403
+ *) tf=$5 ;;
1404
+ esac
1405
+ [[ $4 == track ]] && __tt_pv_bg_track $5 $(( mcol - $2 )) $(( $3 - $2 ))
1406
+ ;;
1407
+ esac
1408
+ return 0
1409
+ }
1410
+
1411
+ __tt_pv_release() {
1412
+ case $4 in
1413
+ key)
1414
+ __tt_pv_word $5 || return 0
1415
+ key=$REPLY
1416
+ __tt_pv_handle
1417
+ return
1418
+ ;;
1419
+ row|pick)
1420
+ (( mclick == 2 )) || return 0
1421
+ if [[ $4 == row ]]; then
1422
+ __tt_pv_free || return 0
1423
+ else
1424
+ [[ -n $pick ]] || return 0
1425
+ fi
1426
+ key=$'\r'
1427
+ __tt_pv_handle
1428
+ return
1429
+ ;;
1430
+ fold) __tt_pv_free && [[ ${rtype[cur]} == (hdr|cat) ]] && __tt_pv_toggle ;;
1431
+ more)
1432
+ __tt_pv_free || return 0
1433
+ key=pgdn
1434
+ (( $5 < 0 )) && key=pgup
1435
+ __tt_pv_handle
1436
+ return
1437
+ ;;
1438
+ hub)
1439
+ local -i at=${TTHEME_HUB_TABS[(Ie)preview]}
1440
+ __tt_pv_free && (( $5 != at )) || return 0
1441
+ __tt_pv_screen $(( $5 - at )) || return 1
1442
+ ;;
1443
+ confv)
1444
+ cf=$5
1445
+ local -a ch=(${=cchoice[$5]})
1446
+ __tt_pv_conf_put ${cvars[$5]} ${ch[$6]}
1447
+ ;;
1448
+ confs)
1449
+ cf=$5
1450
+ __tt_pv_conf_step $6
1451
+ ;;
1452
+ tefind) __tt_te_find ;;
1453
+ teapply) __tt_te_apply || return 1 ;;
1454
+ place) __tt_pv_bg_adjust at $5 ;;
1455
+ colors)
1456
+ __tt_bg_coloring $tpick
1457
+ [[ $5 == "$REPLY" ]] || __tt_pv_bg_recolor
1458
+ ;;
1459
+ esac
1460
+ return 0
1461
+ }
1462
+
1463
+ __tt_pv_te_mouse() {
1464
+ local -i li=$(( $5 + mrow - $1 )) ci=$(( mcol - $2 ))
1465
+ if [[ $mact == press ]] && (( tfocus != 0 )); then
1466
+ tfocus=0
1467
+ __tt_te_ask "focus 1" || return 0
1468
+ fi
1469
+ (( li < 0 )) && li=0
1470
+ (( ci < 0 )) && ci=0
1471
+ __tt_te_ask "mouse $mact $li $ci $mclick" || { __tt_te_close; return 0 }
1472
+ __tt_te_act
1473
+ }
1474
+
1475
+ __tt_pv_bg_track() {
1476
+ local -i x=$2 w=$3
1477
+ (( x < 0 )) && x=0
1478
+ (( x > w )) && x=$w
1479
+ (( w > 0 )) || return 0
1480
+ if (( $1 == 3 )); then
1481
+ __tt_pv_bg_adjust opto $(( (x * 100 + w / 2) / w ))
1482
+ else
1483
+ __tt_pv_bg_adjust sizeat $(( x * 1000 / w ))
1484
+ fi
1485
+ }
1486
+
1487
+ __tt_pv_wheel() {
1488
+ local -i i
1489
+ if (( help )); then
1490
+ return 0
1491
+ elif (( conf )); then
1492
+ (( cf += mwheel ))
1493
+ (( cf < 1 )) && cf=1
1494
+ (( cf > ${#cvars} )) && cf=${#cvars}
1495
+ elif (( te )); then
1496
+ if (( tfocus == 0 )); then
1497
+ __tt_te_ask "mouse wheel 0 0 $mwheel"
1498
+ else
1499
+ key=down
1500
+ (( mwheel < 0 )) && key=up
1501
+ __tt_pv_te
1502
+ return
1503
+ fi
1504
+ elif [[ -z $pick && -z $tune ]] && (( ${#rval} )); then
1505
+ i=$(( cur + mwheel ))
1506
+ [[ ${rtype[i]} == rule ]] && (( i += mwheel ))
1507
+ (( i >= 1 && i <= ${#rval} )) && cur=$i
1508
+ fi
1509
+ return 0
1510
+ }
1511
+
1512
+ __tt_pv_pick() {
1513
+ case $key in
1514
+ $'\x03') return 1 ;;
1515
+ esc) pick="" ;;
1516
+ left|stab) pk=$(( (pk + ${#plabel} - 2) % ${#plabel} + 1 )) ;;
1517
+ right|$'\t') pk=$(( pk % ${#plabel} + 1 )) ;;
1518
+ $'\r'|$'\n'|senter)
1519
+ sel=$pick picked=$pk
1520
+ return 1
1521
+ ;;
1522
+ esac
1523
+ return 0
1524
+ }
1525
+
1526
+ __tt_pv_screen() {
1527
+ local err
1528
+ local -i at=${TTHEME_HUB_TABS[(Ie)preview]} n=${#TTHEME_HUB_TABS} rc
1529
+ local -i to=$(( (at - 1 + $1 + n) % n + 1 ))
1530
+ __tt_pv_bg_close
1531
+ __tt_pv_leave
1532
+ while (( to != at )); do
1533
+ hubwas="$TTHEME_STARTUP ${TTHEME_PALETTE[$TTHEME_STARTUP]}"
1534
+ err=$(TTHEME_HUB=${TTHEME_HUB_TABS[to]} __tt_cli ${TTHEME_HUB_TABS[to]} 2>&1 >/dev/tty)
1535
+ rc=$?
1536
+ if (( rc == TTHEME_HUB_CLOSED )); then
1537
+ hubleft=1
1538
+ return 1
1539
+ elif (( rc > TTHEME_HUB_SWITCH && rc <= TTHEME_HUB_SWITCH + n )); then
1540
+ to=$(( rc - TTHEME_HUB_SWITCH ))
1541
+ else
1542
+ err=${${err//$'\n'/ }## #}
1543
+ msg=${err:-"${TTHEME_HUB_TITLES[to]} failed"} msgt=300
1544
+ to=$at
1545
+ fi
1546
+ done
1547
+ printf '\e[?2026h\e[?25l%s' "$pvmouse"
1548
+ if [[ -n $applied ]]; then
1549
+ __tt_pv_paint "$applied"
1550
+ else
1551
+ __tt_osc_reset
1552
+ painted=""
1553
+ fi
1554
+ resized=1 bgname="" bgshown="" bgdim=()
1555
+ return 0
1556
+ }
1557
+
1558
+ __tt_te_stop() {
1559
+ setopt localoptions nomonitor nonotify
1560
+ (( TE_IN )) && { print -r -u $TE_IN -- quit 2>/dev/null; exec {TE_IN}>&- }
1561
+ (( TE_OUT )) && exec {TE_OUT}<&-
1562
+ TE_IN=0 TE_OUT=0
1563
+ (( TE_PID )) && { kill $TE_PID 2>/dev/null; wait $TE_PID 2>/dev/null }
1564
+ TE_PID=0
1565
+ return 0
1566
+ }
1567
+
1568
+ __tt_te_ask() {
1569
+ local line
1570
+ (( TE_IN && TE_OUT )) || return 1
1571
+ print -r -u $TE_IN -- "$1" 2>/dev/null || { __tt_te_stop; return 1 }
1572
+ if ! IFS= read -r -u $TE_OUT -t 5 line 2>/dev/null; then
1573
+ __tt_te_stop
1574
+ msg="The palette panel stopped" msgt=300
1575
+ return 1
1576
+ fi
1577
+ teframe=("${(@ps:\x1f:)line}")
1578
+ temode=${teframe[3]:-list}
1579
+ tedirty=${teframe[4]:-0}
1580
+ [[ ${teframe[1]} == error ]] && { msg=${teframe[8]:-"Could not save the tone"} msgt=300 }
1581
+ [[ -n ${teframe[5]} ]] && tespec=${teframe[5]}
1582
+ return 0
1583
+ }
1584
+
1585
+ __tt_te_unsaved_image() {
1586
+ local img
1587
+ for img in ${(k)tsnaps}; do
1588
+ [[ "${bgsize[$img]} ${bgpos[$img]} ${bgop[$img]} ${bgoff[$img]}" == "${tsnaps[$img]}" ]] || return 0
1589
+ done
1590
+ [[ -n $tune && $tpick != "${bgview[$tune]:-$tune}" ]] && return 0
1591
+ return 1
1592
+ }
1593
+
1594
+ __tt_te_unsaved() {
1595
+ (( tedirty )) && return 0
1596
+ __tt_te_unsaved_image
1597
+ }
1598
+
1599
+ __tt_te_save_image() {
1600
+ __tt_te_unsaved_image || return 0
1601
+ __tt_pv_tune_keep
1602
+ __tt_pv_bg_save > /dev/null 2>&1
1603
+ bgedit=() bgswap=() bgview=()
1604
+ __tt_pv_bg_reset $tename
1605
+ bgload[$tename]=""
1606
+ __tt_pv_tune_open $tename
1607
+ }
1608
+
1609
+ __tt_te_open() {
1610
+ local name=$1
1611
+ local -i rfd wfd
1612
+ setopt localoptions nomonitor nonotify
1613
+ coproc __tt_cli tone $name 2>/dev/null
1614
+ exec {rfd}<&p {wfd}>&p
1615
+ TE_OUT=$rfd TE_IN=$wfd TE_PID=$!
1616
+ tename=$name tfocus=0 tespec="" tesz="" teframe=() tedirty=0 temode=list tetop=0 msgt=0 teshown="" telook=""
1617
+ if ! __tt_te_ask "focus 1"; then
1618
+ msg="Could not start the palette panel for $name" msgt=300
1619
+ __tt_te_stop
1620
+ return 0
1621
+ fi
1622
+ te=1
1623
+ (( bgcw )) && __tt_pv_bg_state $name && __tt_pv_tune_open $name
1624
+ __tt_te_image && __tt_te_to_image 1
1625
+ resized=1
1626
+ return 0
1627
+ }
1628
+
1629
+ __tt_te_close() {
1630
+ [[ -n $tune ]] && __tt_pv_untune
1631
+ __tt_te_stop
1632
+ te=0 tfocus=0 tename="" tespec="" tesz="" teframe=() tetop=0 help=0 pick="" teshown="" telook=""
1633
+ resized=1 bgname=""
1634
+ return 0
1635
+ }
1636
+
1637
+ __tt_te_save() {
1638
+ __tt_te_save_image
1639
+ if (( tedirty )); then
1640
+ __tt_te_ask save || return 1
1641
+ if [[ ${teframe[1]} == saved ]]; then
1642
+ __tt_palettes_load && __tt_reloaded
1643
+ __tt_reload
1644
+ applied=${TTHEME_PALETTE[$tename]:-$applied}
1645
+ tespec=$applied
1646
+ else
1647
+ return 1
1648
+ fi
1649
+ fi
1650
+ msg="Saved" msgt=200
1651
+ return 0
1652
+ }
1653
+
1654
+ __tt_te_apply() {
1655
+ if __tt_te_unsaved; then
1656
+ __tt_te_save || return 0
1657
+ fi
1658
+ if (( canpick )); then
1659
+ pick=$tename pk=$pkdef
1660
+ return 0
1661
+ fi
1662
+ sel=$tename
1663
+ return 1
1664
+ }
1665
+
1666
+ __tt_te_image() {
1667
+ [[ -n $tune ]] || __tt_pv_bg_findable $tename
1668
+ }
1669
+
1670
+ __tt_te_to_image() {
1671
+ tfocus=1 tf=5
1672
+ [[ $1 == last && -n $tune ]] && tf=3
1673
+ __tt_te_ask "focus 0"
1674
+ }
1675
+
1676
+ __tt_te_to_palette() {
1677
+ tfocus=0
1678
+ __tt_te_ask "focus 1" && __tt_te_ask "key $1"
1679
+ }
1680
+
1681
+ __tt_te_to_apply() {
1682
+ tfocus=2
1683
+ __tt_te_ask "focus 0"
1684
+ }
1685
+
1686
+ __tt_te_to_top() {
1687
+ if __tt_te_image; then
1688
+ __tt_te_to_image first
1689
+ else
1690
+ __tt_te_to_palette home
1691
+ fi
1692
+ }
1693
+
1694
+ __tt_te_find() {
1695
+ local name=$tename
1696
+ __tt_pv_bg_findable $name || return 0
1697
+ __tt_te_save_image
1698
+ __tt_pv_untune
1699
+ __tt_pv_bg_find $name
1700
+ __tt_pv_bg_state $name && __tt_pv_tune_open $name
1701
+ tf=5
1702
+ return 0
1703
+ }
1704
+
1705
+ __tt_te_key() {
1706
+ local m
1707
+ if [[ $temode == list ]]; then
1708
+ case $key in
1709
+ home) __tt_te_to_top; return 0 ;;
1710
+ end) __tt_te_to_apply; return 0 ;;
1711
+ esac
1712
+ fi
1713
+ case $key in
1714
+ up|down|left|right|home|end|pgup|pgdn|esc) m="key $key" ;;
1715
+ sleft) m="key shift-left" ;;
1716
+ sright) m="key shift-right" ;;
1717
+ stab) m="key shift-tab" ;;
1718
+ $'\t') m="key tab" ;;
1719
+ $'\r'|$'\n') m="key enter" ;;
1720
+ $'\x7f'|$'\x08') m="key backspace" ;;
1721
+ $'\x03') m="key ctrl-c" ;;
1722
+ nop|altc) return 0 ;;
1723
+ *)
1724
+ (( ${#key} == 1 )) || return 0
1725
+ m="ch $(( #key ))"
1726
+ ;;
1727
+ esac
1728
+ __tt_te_ask "$m" || { __tt_te_close; return 0 }
1729
+ __tt_te_act
1730
+ }
1731
+
1732
+ __tt_te_act() {
1733
+ case ${teframe[2]} in
1734
+ save) __tt_te_save ;;
1735
+ cancel) __tt_te_close ;;
1736
+ below) __tt_te_to_apply ;;
1737
+ above)
1738
+ if __tt_te_image; then
1739
+ __tt_te_to_image last
1740
+ else
1741
+ __tt_te_to_apply
1742
+ fi
1743
+ ;;
1744
+ esac
1745
+ return 0
1746
+ }
1747
+
1748
+ __tt_pv_te_image() {
1749
+ local -a order=(5)
1750
+ local -i i
1751
+ [[ -n $tune ]] && order=(5 4 1 2 3)
1752
+ i=${order[(Ie)$tf]}
1753
+ (( i )) || { tf=5; i=1 }
1754
+ case $key in
1755
+ s) __tt_te_save ;;
1756
+ esc) __tt_te_close ;;
1757
+ up|k)
1758
+ if (( i > 1 )); then
1759
+ tf=${order[i-1]}
1760
+ else
1761
+ __tt_te_to_apply
1762
+ fi
1763
+ ;;
1764
+ down|j)
1765
+ if (( i < ${#order} )); then
1766
+ tf=${order[i+1]}
1767
+ else
1768
+ __tt_te_to_palette home
1769
+ fi
1770
+ ;;
1771
+ home) tf=5 ;;
1772
+ end) __tt_te_to_apply ;;
1773
+ $'\r'|$'\n') [[ -n $tune ]] || __tt_te_find ;;
1774
+ f) __tt_te_find ;;
1775
+ left|right|sleft|sright)
1776
+ if (( tf == 5 )); then
1777
+ if [[ -z $tune ]]; then
1778
+ :
1779
+ elif [[ $key == *left ]]; then
1780
+ __tt_pv_bg_pick -1
1781
+ else
1782
+ __tt_pv_bg_pick 1
1783
+ fi
1784
+ elif [[ -n $tune ]]; then
1785
+ __tt_pv_tune
1786
+ fi
1787
+ ;;
1788
+ '=') [[ -n $tune ]] && (( tf != 5 )) && __tt_pv_tune ;;
1789
+ *) [[ -n $tune ]] && __tt_pv_tune ;;
1790
+ esac
1791
+ [[ -n $tune ]] || tf=5
1792
+ return 0
1793
+ }
1794
+
1795
+ __tt_te_button() {
1796
+ case $key in
1797
+ $'\r'|$'\n') __tt_te_apply; return $? ;;
1798
+ s) __tt_te_save ;;
1799
+ esc) __tt_te_close ;;
1800
+ up|k) __tt_te_to_palette end ;;
1801
+ down|j|home) __tt_te_to_top ;;
1802
+ esac
1803
+ return 0
1804
+ }
1805
+
1806
+ __tt_pv_te() {
1807
+ case $key in
1808
+ $'\x03') return 1 ;;
1809
+ $'\x05') return 0 ;;
1810
+ senter) __tt_te_apply; return $? ;;
1811
+ '?') help=1; return 0 ;;
1812
+ esac
1813
+ case $tfocus in
1814
+ 0) __tt_te_key ;;
1815
+ 1) __tt_pv_te_image ;;
1816
+ *) __tt_te_button ;;
1817
+ esac
1818
+ return $?
1819
+ }
1820
+
1821
+ __tt_pv_te_head() {
1822
+ local z=$'\e[0m' d=$'\e[2m' b=$'\e[1m' y=$'\e[33m' line REPLY
1823
+ local -i col=$1 end=$2 room=$(( $2 - $1 + 1 ))
1824
+ (( color )) || z= d= b= y=
1825
+ __tt_te_unsaved && (( room -= 11 ))
1826
+ line=$b$ac"◆"$z" "$b$tename$z
1827
+ [[ -n ${TTHEME_GROUP[$tename]} ]] && line+=" "$d"· ${TTHEME_GROUP[$tename]}"$z
1828
+ __tt_clip "$line" $room
1829
+ out+=$'\e[1;'$col'H'$REPLY$z
1830
+ __tt_te_unsaved && out+=$'\e[1;'$(( end - 8 ))'H'$y"●"$z" "$d"unsaved"$z
1831
+ return 0
1832
+ }
1833
+
1834
+ __tt_pv_te_tile() {
1835
+ local z=$'\e[0m' d=$'\e[2m' b=$'\e[1m' sty top side bot
1836
+ local -i y=$1 col=$2 r tc=10
1837
+ (( color )) || z= d= b=
1838
+ if (( tfocus == 1 && tf == 5 )); then
1839
+ sty=$b$ac top="┏${(l:tc::━:)}┓" side="┃" bot="┗${(l:tc::━:)}┛"
1840
+ else
1841
+ sty=$d top="╭${(l:tc::─:)}╮" side="│" bot="╰${(l:tc::─:)}╯"
1842
+ fi
1843
+ out+=$'\e['$y';'$col'H'$sty$top$z
1844
+ for (( r = 1; r <= 3; r++ )); do
1845
+ out+=$'\e['$(( y + r ))';'$col'H'$sty$side${(l:tc::░:)}$side$z
1846
+ done
1847
+ out+=$'\e['$(( y + 4 ))';'$col'H'$sty$bot$z$'\e['$(( y + 2 ))';'$(( col + tc + 4 ))'H'
1848
+ if (( tfocus == 1 && tf == 5 )); then
1849
+ out+=$b"enter"$z$d" finds one"$z
1850
+ else
1851
+ out+=$d"enter finds one"$z
1852
+ fi
1853
+ return 0
1854
+ }
1855
+
1856
+ __tt_pv_te_ghost() {
1857
+ local z=$'\e[0m' d=$'\e[2m'
1858
+ local -i r0=$1 col=$2 T=$(( $3 - $2 - 21 )) i
1859
+ (( color )) || z= d=
1860
+ (( T < 8 )) && T=8
1861
+ out+=$'\e['$r0';'$col'H '$d"Colors"$'\e['$r0';'$(( col + 12 ))'H'" tone original "$z
1862
+ out+=$'\e['$(( r0 + 1 ))';'$col'H '$d"Size"$'\e['$(( r0 + 1 ))';'$(( col + 12 ))'H'${(l:T::─:)}$z
1863
+ for (( i = 1; i <= 9; i++ )); do
1864
+ out+=$'\e['$(( r0 + 3 + (i - 1) / 3 ))';'$(( col + 12 + (i - 1) % 3 * 3 ))'H'$d"·"$z
1865
+ done
1866
+ out+=$'\e['$(( r0 + 4 ))';'$col'H '$d"Position"$z
1867
+ out+=$'\e['$(( r0 + 7 ))';'$col'H '$d"Opacity"$'\e['$(( r0 + 7 ))';'$(( col + 12 ))'H'${(l:T::─:)}$z
1868
+ return 0
1869
+ }
1870
+
1871
+ __tt_pv_te_panel() {
1872
+ local z=$'\e[0m' d=$'\e[2m' b=$'\e[1m' tt st note REPLY
1873
+ local -a held
1874
+ local -i col=$1 end=$2 r0=$3 r1=$4 R W T I=3 V at i n y tfs=$tf
1875
+ (( color )) || z= d= b=
1876
+ R=$(( r1 - r0 + 1 )) W=$(( end - col + 1 ))
1877
+ [[ -n $tune ]] || __tt_pv_bg_findable $tename && I=17
1878
+ T=$(( R - I - 3 ))
1879
+ (( T > 26 )) && T=26
1880
+ (( T < 21 )) && T=15
1881
+ if [[ "$W $T" != "$tesz" ]]; then
1882
+ tesz="$W $T"
1883
+ __tt_te_ask "size $W $T"
1884
+ fi
1885
+ V=$(( I + T + 3 ))
1886
+ if (( V <= R || tfocus == 1 )); then
1887
+ tetop=0
1888
+ elif (( tfocus == 2 )); then
1889
+ tetop=$(( V - R ))
1890
+ else
1891
+ at=$(( I + 1 + ${teframe[9]:-2} ))
1892
+ (( at - 2 < tetop )) && tetop=$(( at > 2 ? at - 2 : 0 ))
1893
+ (( at > tetop + R )) && tetop=$(( at - R ))
1894
+ (( tetop > V - R )) && tetop=$(( V - R ))
1895
+ fi
1896
+ if (( tetop == 0 && I <= R )); then
1897
+ y=$r0
1898
+ tt=$d
1899
+ (( tfocus == 1 )) && tt=$b$ac
1900
+ out+=$'\e['$y';'$(( col + 2 ))'H'$tt"Image"$z
1901
+ pvz+=("$y $col $end teimg")
1902
+ if [[ -n $tune ]]; then
1903
+ (( bgoff[$tpick] )) && st=off || st=on
1904
+ [[ ${teframe[10]} == 1 ]] && ! __tt_bg_tints && st="recolors on save $st"
1905
+ __tt_pv_bg_title $(( W - 12 - ${#st} ))
1906
+ out+=" "$d$REPLY$z$'\e['$y';'$(( end - ${#st} + 1 ))'H'$d$st$z
1907
+ fi
1908
+ if (( I == 17 )); then
1909
+ held=() n=0 note="0/0"
1910
+ if [[ -n $tune ]]; then
1911
+ held=(${=bgpics[$tune]})
1912
+ n=${held[(Ie)${${tpick#$tune}#:}]}
1913
+ (( n )) || n=${held[(Ie)${bgact[$tune]}]}
1914
+ (( n )) || n=1
1915
+ note="$n/$(( ${#held} ? ${#held} : 1 ))"
1916
+ fi
1917
+ st=" " tt=$d
1918
+ (( tfocus == 1 && tf == 5 )) && st=$ac"▶"$z" " tt=$b
1919
+ out+=$'\e['$(( y + 2 ))';'$col'H'$st$tt"Images"$z$'\e['$(( y + 2 ))';'$(( end - ${#note} + 1 ))'H'$d$note$z
1920
+ pvz+=("$(( y + 2 )) $col $end teimg")
1921
+ if [[ -n $tune ]]; then
1922
+ bgstrip="$(( y + 2 )) $col $end"
1923
+ (( tfocus == 1 )) || tf=0
1924
+ __tt_pv_bg_panel $tpick $(( y + 9 )) $col $end
1925
+ tf=$tfs
1926
+ else
1927
+ __tt_pv_te_tile $(( y + 3 )) $col
1928
+ for (( i = 3; i <= 7; i++ )); do
1929
+ pvz+=("$(( y + i )) $col $(( col + 30 )) tefind")
1930
+ done
1931
+ __tt_pv_te_ghost $(( y + 9 )) $col $end
1932
+ fi
1933
+ elif (( bgcw )); then
1934
+ out+=$'\e['$(( y + 2 ))';'$(( col + 2 ))'H'$d"No picture yet"$z
1935
+ else
1936
+ out+=$'\e['$(( y + 2 ))';'$(( col + 2 ))'H'$d"This terminal shows no pictures"$z
1937
+ fi
1938
+ fi
1939
+ for (( i = 1; i <= T; i++ )); do
1940
+ y=$(( r0 + I + i - tetop ))
1941
+ (( y >= r0 && y <= r1 )) || continue
1942
+ out+=$'\e['$y';'$col'H'${teframe[11 + i]}$z
1943
+ pvz+=("$y $col $end tone $(( i - 1 ))")
1944
+ done
1945
+ y=$(( r0 + V - 1 - tetop ))
1946
+ (( y >= r0 && y <= r1 )) || return 0
1947
+ pvz+=("$y $col $end teapply")
1948
+ if [[ $mode == pin ]]; then
1949
+ note="saves, then asks how far it reaches"
1950
+ elif (( canpick )); then
1951
+ note="saves, then asks where"
1952
+ else
1953
+ note="saves and wears it in this tab"
1954
+ fi
1955
+ out+=$'\e['$y';'$col'H'
1956
+ if (( tfocus == 2 )); then
1957
+ (( color )) && out+=$ac"▶"$z" "$'\e[7;1m'$ac" Apply "$z || out+="▶ [Apply]"
1958
+ else
1959
+ (( color )) && out+=" "$b" Apply "$z || out+=" Apply "
1960
+ fi
1961
+ out+=" "$d$note$z
1962
+ return 0
1963
+ }
1964
+
1965
+ __tt_pv_te_draw() {
1966
+ local -i i end=$(( pw - 2 < 66 ? pw - 2 : 66 ))
1967
+ for (( i = 1; i < ph; i++ )); do
1968
+ out+=$'\e['$i$';1H\e[K'
1969
+ done
1970
+ __tt_pv_te_head 2 $end
1971
+ __tt_pv_te_panel 2 $end 3 $(( ph - 1 ))
1972
+ reach=()
1973
+ if [[ -n $pick && $mode == pin ]]; then
1974
+ __tt_pv_reach $se $(( ph - 13 ))
1975
+ if (( ${#reach} )); then
1976
+ __tt_pv_head $(( ph - 1 - ${#reach} )) 1 $se "$pick" "$rsub"
1977
+ for (( i = 1; i <= ${#reach}; i++ )); do
1978
+ out+=$'\e['$(( ph - 1 - ${#reach} + i ))$';1H\e[K'${reach[i]}
1979
+ done
1980
+ fi
1981
+ fi
1982
+ (( help )) && __tt_pv_help
1983
+ out+=$'\e['$ph';1H'
1984
+ __tt_pv_foot $pw
1985
+ (( osdt > 0 )) && __tt_pv_osd
1986
+ __tt_pv_flush
1987
+ }
1988
+
1989
+ __tt_pv_handle() {
1990
+ local name
1991
+ if [[ $key == mouse ]]; then
1992
+ __tt_pv_mouse
1993
+ return
1994
+ fi
1995
+ if (( help )); then
1996
+ case $key in
1997
+ $'\x03') return 1 ;;
1998
+ '?'|esc) help=0 ;;
1999
+ esac
2000
+ return 0
2001
+ fi
2002
+ if [[ -n $pick ]]; then
2003
+ __tt_pv_pick
2004
+ return
2005
+ fi
2006
+ if (( te )); then
2007
+ __tt_pv_te
2008
+ return
2009
+ fi
2010
+ if [[ -n $tune ]]; then
2011
+ __tt_pv_tune
2012
+ return
2013
+ fi
2014
+ if (( conf )); then
2015
+ __tt_pv_conf
2016
+ return
2017
+ fi
2018
+ case $key in
2019
+ $'\x03') return 1 ;;
2020
+ esc|$'\x15')
2021
+ if [[ -z $flt ]]; then
2022
+ [[ $key == esc ]] && return 1
2023
+ else
2024
+ name=""
2025
+ [[ ${rtype[cur]} == thm ]] && name=${rval[cur]}
2026
+ flt=""
2027
+ if [[ -n $name ]]; then
2028
+ __tt_pv_goto "$name"
2029
+ else
2030
+ __tt_pv_rows
2031
+ (( cur > ${#rval} )) && cur=${#rval}
2032
+ (( cur < 1 )) && cur=1
2033
+ fi
2034
+ fi
2035
+ ;;
2036
+ $'\r'|$'\n'|senter)
2037
+ if [[ ${rtype[cur]} == thm ]]; then
2038
+ if (( canpick )); then
2039
+ pick=${rval[cur]} pk=$pkdef
2040
+ else
2041
+ sel=${rval[cur]}
2042
+ return 1
2043
+ fi
2044
+ elif [[ ${rtype[cur]} == (hdr|cat) ]]; then
2045
+ __tt_pv_toggle
2046
+ fi
2047
+ ;;
2048
+ up)
2049
+ if (( cur > 1 )); then
2050
+ cur=$(( cur - 1 ))
2051
+ [[ ${rtype[cur]} == rule ]] && cur=$(( cur - 1 ))
2052
+ elif (( ${#rval} )); then
2053
+ cur=${#rval}
2054
+ fi
2055
+ ;;
2056
+ down)
2057
+ if (( cur < ${#rval} )); then
2058
+ cur=$(( cur + 1 ))
2059
+ [[ ${rtype[cur]} == rule ]] && cur=$(( cur + 1 ))
2060
+ elif (( ${#rval} )); then
2061
+ cur=1
2062
+ fi
2063
+ ;;
2064
+ right)
2065
+ if [[ ${rtype[cur]} == thm ]]; then
2066
+ __tt_te_open ${rval[cur]}
2067
+ elif [[ ${rtype[cur]} == (hdr|cat) && -z ${exp[${rval[cur]}]} ]]; then
2068
+ __tt_pv_toggle
2069
+ fi
2070
+ ;;
2071
+ $'\x05') [[ ${rtype[cur]} == thm ]] && __tt_te_open ${rval[cur]} ;;
2072
+ left) __tt_pv_left ;;
2073
+ home) cur=1 ;;
2074
+ end) (( ${#rval} )) && cur=${#rval} ;;
2075
+ pgup)
2076
+ if (( cur <= 1 )); then
2077
+ (( ${#rval} )) && cur=${#rval}
2078
+ else
2079
+ cur=$(( cur - ph + 5 ))
2080
+ (( cur < 1 )) && cur=1
2081
+ [[ ${rtype[cur]} == rule ]] && cur=$(( cur - 1 ))
2082
+ fi
2083
+ ;;
2084
+ pgdn)
2085
+ if (( cur >= ${#rval} )); then
2086
+ cur=1
2087
+ else
2088
+ cur=$(( cur + ph - 5 ))
2089
+ (( cur > ${#rval} )) && cur=${#rval}
2090
+ [[ ${rtype[cur]} == rule ]] && cur=$(( cur + 1 ))
2091
+ fi
2092
+ ;;
2093
+ ' ') [[ ${rtype[cur]} == (hdr|cat) ]] && __tt_pv_toggle ;;
2094
+ $'\t')
2095
+ if [[ ${rtype[cur]} == thm ]]; then
2096
+ __tt_te_open ${rval[cur]}
2097
+ elif (( hub )); then
2098
+ __tt_pv_screen 1 || return 1
2099
+ fi
2100
+ ;;
2101
+ stab) (( hub )) && { __tt_pv_screen -1 || return 1 } ;;
2102
+ altc)
2103
+ conf=1 cf=1 csnap=()
2104
+ for name in $cvars; do
2105
+ csnap+=("${(P)name}")
2106
+ done
2107
+ ;;
2108
+ '?') help=1 ;;
2109
+ sleft) (( --scene )) ;;
2110
+ sright) (( ++scene )) ;;
2111
+ $'\x7f'|$'\x08')
2112
+ if [[ -n $flt ]]; then
2113
+ name=""
2114
+ [[ ${rtype[cur]} == thm ]] && name=${rval[cur]}
2115
+ flt=${flt%?}
2116
+ __tt_pv_rows
2117
+ __tt_pv_first "$name"
2118
+ fi
2119
+ ;;
2120
+ [[:print:]])
2121
+ __tt_pv_lw
2122
+ (( ${(m)#flt} + ${(m)#key} > reply[1] - 12 )) && return 0
2123
+ name=""
2124
+ [[ ${rtype[cur]} == thm ]] && name=${rval[cur]}
2125
+ flt+=${(L)key}
2126
+ __tt_pv_rows
2127
+ __tt_pv_first "$name"
2128
+ ;;
2129
+ esac
2130
+ return 0
2131
+ }
2132
+
2133
+ __tt_preview() {
2134
+ emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace}
2135
+ zmodload -F zsh/datetime p:EPOCHREALTIME 2>/dev/null
2136
+ local mode=$1 pdir=${2:-$PWD} hubwas=""
2137
+ local -i hub=0 hubleft=0
2138
+ [[ $mode == hub ]] && hub=1
2139
+ if [[ ! -t 0 || ! -t 1 ]]; then
2140
+ print -u2 "ttheme ${mode:-preview}: needs a terminal"
2141
+ return 1
2142
+ fi
2143
+ local orig=$TTHEME_SPEC applied=$TTHEME_SPEC painted=$TTHEME_SPEC flt="" sel="" cn="" cdot="" key="" REPLY="" cur=1 top=1 color=0 pw=80 ph=24 resized=1 expal="" exgrp="" exnext=0 gstep=0 gseed=0 tick=0
2144
+ local pick="" pk=1 pkdef=1 picked=0 canpick=0 bgcw=0 bgch=0 bgname="" bgshown="" bginc="" osd="" osdt=0
2145
+ local tune="" tpick="" tf=1 help=0 msg="" msgt=0 an="" bgrel=0 bgmx=0 bgmy=0 bganchor=0 bgcut="" bgnext=0 bgbytes=0 bgstrip="" pvscene="" pvscenes=""
2146
+ local -i scene=0
2147
+ local -a bgorder=()
2148
+ local -A bgfrom=() bgurl=() bgby=() bgsent=() bgcost=() bgdim=() bgsrc=() bgfill=() bgfocus=() bgsize=() bgpos=() bgop=() bgdef=() bgoff=() bgbase=() bgload=() bgshot=() bgshotkey=() bgedit=() bgtunef=() bgofff=() bgimages=()
2149
+ local -A bgpic=() bgpics=() bgact=() bgview=() bgswap=() bgthumb=() tsnaps=() pvseek=() bgcolors=() bgprep=() TTHEME_ALIASES=()
2150
+ local conf=0 cf=1
2151
+ local -a plabel=(" Default " " This tab ") pkeys=() reach=() csnap=() teframe=()
2152
+ local te=0 tfocus=0 tetop=0 tename="" tedirty=0 temode=list tespec="" tesz="" teshown="" telook=""
2153
+ local -i TE_IN=0 TE_OUT=0 TE_PID=0 pvgone=0 bgprepid=0 mrow=0 mcol=0 mclick=0 mwheel=0 mlwheel=0 mlrow=0 mlcol=0
2154
+ local -F mlast=0
2155
+ local mact="" mzone="" pvmouse=""
2156
+ local -a pvz=()
2157
+ local -a cvars=(TTHEME_TAB_PALETTE TTHEME_ANNOUNCE TTHEME_FX TTHEME_SORT TTHEME_MOUSE TTHEME_BG_BLUR TTHEME_BG_COLORS) clabel=("New tabs" Announce "Search fx" Sort Mouse Blur Colors)
2158
+ local -a cchoice=("off seq" "1 0" "typewriter decode glitch" "abc series" "on off" "0 1 2 3 4" "tone original") cshow=("off seq" "on off" "typewriter decode glitch" "abc series" "on off" "off 1px 2px 3px 4px" "tone original")
2159
+ local -A cnote=(
2160
+ TTHEME_TAB_PALETTE:seq "New tabs rotate through palettes" TTHEME_TAB_PALETTE:off "New tabs keep the terminal theme"
2161
+ TTHEME_ANNOUNCE:1 "Shows the palette notice" TTHEME_ANNOUNCE:0 "Silences the palette notice"
2162
+ TTHEME_FX:typewriter "The search hint types itself" TTHEME_FX:decode "The search hint decodes" TTHEME_FX:glitch "The search hint glitches in"
2163
+ TTHEME_SORT:abc "Series and palettes by name" TTHEME_SORT:series "Series in the order added"
2164
+ TTHEME_MOUSE:on "Clicks, the wheel and drags work in ttheme's screens" TTHEME_MOUSE:off "The terminal keeps the mouse, so a drag selects text"
2165
+ TTHEME_BG_BLUR:0 "Pictures stay sharp" TTHEME_BG_BLUR:1 "Pictures soften a little behind the text"
2166
+ TTHEME_BG_BLUR:2 "Pictures soften behind the text" TTHEME_BG_BLUR:3 "Pictures blur behind the text"
2167
+ TTHEME_BG_BLUR:4 "Pictures blur well behind the text"
2168
+ TTHEME_BG_COLORS:tone "New pictures are tinted in one color of the palette"
2169
+ TTHEME_BG_COLORS:original "New pictures keep their own colors"
2170
+ )
2171
+ [[ -r $TTHEME_HOME/aliases.zsh ]] && source $TTHEME_HOME/aliases.zsh
2172
+ [[ $mode == pin ]] && __tt_pin_scopes "$pdir"
2173
+ __tt_pv_canpick
2174
+ __tt_pv_size
2175
+ local -a groups=() rtype=() rval=() rcnt=() reply=()
2176
+ local -A gthemes=() exp=() tstrip=()
2177
+ __tt_color && color=1
2178
+ __tt_pv_init
2179
+ __tt_pv_roll
2180
+ __tt_pv_rows
2181
+ [[ -n ${TTHEME_PALETTE[$cn]} ]] && __tt_pv_goto "$cn"
2182
+ local tty=""
2183
+ local -i TTHEME_RAW=0
2184
+ {
2185
+ tty=$(stty -g 2>/dev/null) && stty -echo -icanon min 1 time 0 2>/dev/null || tty=""
2186
+ TTHEME_RAW=$(( ${#tty} > 0 ))
2187
+ __tt_pv_bg_open
2188
+ printf '\e[?2026h\e[?1049h\e[?7l\e[?25l'
2189
+ __tt_pv_pointer
2190
+ while :; do
2191
+ printf '\e[?2026h'
2192
+ if (( tick && ! te )); then
2193
+ __tt_pv_draw hint
2194
+ else
2195
+ __tt_pv_focus
2196
+ [[ ${rtype[cur]} == thm ]] && an=${rval[cur]}
2197
+ __tt_pv_draw
2198
+ fi
2199
+ tick=0 mlwheel=0
2200
+ if ! __tt_pv_read; then
2201
+ (( pvgone )) && break
2202
+ [[ -t 0 ]] && continue
2203
+ break
2204
+ fi
2205
+ while :; do
2206
+ __tt_pv_handle || break 2
2207
+ __tt_pv_read drain || break
2208
+ done
2209
+ done
2210
+ } always {
2211
+ local spec=${sel:+${TTHEME_PALETTE[$sel]}}
2212
+ [[ -n $spec && $mode != pin ]] && (( ! ${#bgedit} && ! ${#bgswap} )) && __tt_pv_claim "$sel"
2213
+ printf '\e[?2026h'
2214
+ __tt_pv_bg_close
2215
+ if [[ -n $spec ]]; then
2216
+ [[ $spec == "$painted" ]] || __tt_apply "$spec"
2217
+ elif [[ $painted != "$orig" ]]; then
2218
+ if [[ -z $orig ]]; then
2219
+ __tt_osc_reset
2220
+ else
2221
+ __tt_apply "$orig"
2222
+ fi
2223
+ elif [[ $applied != "$orig" ]]; then
2224
+ __tt_pv_paint "${TTHEME_PAINTED:+$orig}"
2225
+ fi
2226
+ __tt_pv_pointer off
2227
+ printf '\e[?7h'
2228
+ (( hubleft )) || printf '\e[?1049l'
2229
+ printf '\e[?25h\e[?2026l'
2230
+ [[ -n $tty ]] && stty "$tty" 2>/dev/null
2231
+ TTHEME_RAW=0
2232
+ [[ -n $tune ]] && __tt_pv_untune
2233
+ (( TE_IN )) && __tt_te_stop
2234
+ (( conf )) && __tt_pv_unconf
2235
+ __tt_pv_bg_save
2236
+ if [[ -n $spec ]]; then
2237
+ TTHEME_SPEC=$spec
2238
+ if [[ $mode == pin ]]; then
2239
+ __tt_pin_save "$sel" "${pkeys[picked]}" "$orig"
2240
+ [[ $TTHEME_SPEC == "$orig" ]] || __tt_announce
2241
+ __tt_sync
2242
+ elif (( picked == 1 )); then
2243
+ __tt_announce
2244
+ __tt_keep "$sel" force
2245
+ else
2246
+ __tt_announce
2247
+ __tt_shown "$sel" force && __tt_reload
2248
+ fi
2249
+ else
2250
+ (( ${#bgedit} + ${#bgswap} )) && [[ -n ${TTHEME_PALETTE[$cn]} ]] && { __tt_shown "$cn" && __tt_reload }
2251
+ fi
2252
+ (( hubleft )) && __tt_catalog_done "$hubwas"
2253
+ }
2254
+ return 0
2255
+ }