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