@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.
- package/README.md +15 -6
- package/bin/ttheme.js +429 -229
- package/bin/ttheme.js.map +1 -1
- package/dist/manifest.json +127 -16
- package/package.json +1 -2
- package/shell/adapters/_bg.zsh +52 -5
- package/shell/adapters/_osc.zsh +20 -10
- package/shell/adapters/_wired.zsh +4 -0
- package/shell/adapters/iterm2.zsh +86 -10
- package/shell/adapters/konsole.zsh +225 -21
- package/shell/adapters/terminal-app.zsh +265 -6
- package/shell/adapters/warp.zsh +65 -20
- package/shell/adapters/wezterm.zsh +13 -4
- package/shell/preview.zsh +2255 -0
- package/shell/ttheme.zsh +78 -2023
|
@@ -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
|
+
}
|