AtlatestRepositorysigil-wm
1
#!/usr/bin/env bash2
set -euo pipefail3
cd "$(dirname "$0")/.."4
make -j2 all build/protocol-client build/input-driver build/lock-client5
mkdir -p build/receipts6
runtime_dir=$(mktemp -d /tmp/sigil-wm-constraints.XXXXXX)7
export XDG_RUNTIME_DIR="$runtime_dir" SIGIL_WM_REPL="$runtime_dir/repl"8
export WLR_BACKENDS=headless WLR_RENDERER=pixman WLR_HEADLESS_OUTPUTS=19
unset WAYLAND_DISPLAY DISPLAY10
server_pid= client_pid= input_pid= lock_pid=11
cleanup() {12
for child in "$lock_pid" "$input_pid" "$client_pid" "$server_pid"; do13
[[ -z $child ]] || kill "$child" 2>/dev/null || true14
[[ -z $child ]] || wait "$child" 2>/dev/null || true15
done16
rm -rf "$runtime_dir"17
}18
trap cleanup EXIT19
value() { bash scripts/msg "$SIGIL_WM_REPL" "$1"; }20
wait_value() {21
for ((attempt=0; attempt<100; attempt++)); do22
if value "$1" | grep -q '(value #t)'; then return; fi23
sleep 0.0524
done25
cat build/receipts/constraints.log >&226
return 127
}28
wait_count() {29
local count30
for ((attempt=0; attempt<200; attempt++)); do31
count=$(grep -c "$2" "$1" 2>/dev/null || true)32
if (( ${count:-0} >= $3 )); then return; fi33
sleep 0.0534
done35
tail -30 "$1" >&236
tail -20 build/receipts/constraints.log >&237
return 138
}39
sample() {40
value '(set! sample-token (query-pointer! host))' >/dev/null41
wait_value '(let ((sample (dict-ref (host-snapshot host) pointer-state:))) (and sample (= (event-ref sample id:) sample-token)))'42
}43
point_is() {44
sample45
wait_value "(let ((sample (dict-ref (host-snapshot host) pointer-state:))) (and (= (event-ref sample x-milli:) $1) (= (event-ref sample y-milli:) $2)))"46
}47
timeout 160 bash scripts/run-sigil -L src eval -f test/constraints.sgl > build/receipts/constraints.log 2>&1 &48
server_pid=$!49
wait_count build/receipts/constraints.log '^WAYLAND_SOCKET=' 150
export WAYLAND_DISPLAY51
WAYLAND_DISPLAY=$(sed -n 's/^WAYLAND_SOCKET=//p' build/receipts/constraints.log | head -1)52
mkfifo "$runtime_dir/client-control" "$runtime_dir/input-control" "$runtime_dir/lock-control"53
exec {client_control}<> "$runtime_dir/client-control"54
exec {input_control}<> "$runtime_dir/input-control"55
exec {lock_control}<> "$runtime_dir/lock-control"56
SIGIL_WM_CLIENT_CONSTRAINTS=1 timeout 150 build/protocol-client green 36000 < "$runtime_dir/client-control" > build/receipts/constraint-client.log 2>&1 &57
client_pid=$!58
wait_value '(= (length windows) 1)'59
wait_count build/receipts/constraint-client.log '^CLIENT_RELATIVE_READY' 160
timeout 150 build/input-driver < "$runtime_dir/input-control" > build/receipts/constraint-input.log 2>&1 &61
input_pid=$!62
wait_count build/receipts/constraint-input.log '^INPUT_DEVICE_READY' 163
value '(define sample-token #f)'64
value '(emulate-motion! host 1 100 100)'65
point_is 100000 10000066
printf 'l\n' >&"$client_control"67
wait_count build/receipts/constraint-client.log '^CLIENT_SYNC=l' 168
wait_value '(and (= (length (dict-ref (host-snapshot host) constraints:)) 1) (not (dict-ref (car (dict-ref (host-snapshot host) constraints:)) active?:)))'69
if grep -q '^CLIENT_LOCKED' build/receipts/constraint-client.log; then exit 1; fi70
value '(begin (set! accept? #t) (choose-constraint!))'71
wait_count build/receipts/constraint-client.log '^CLIENT_LOCKED' 172
value '(define states-before states)'73
for ((index=1; index<=20; index++)); do printf 'relative 8192 4096 %s\n' "$((700+index))" >&"$input_control"; done74
wait_count build/receipts/constraint-input.log '^INPUT_ACK=' 2075
wait_count build/receipts/constraint-client.log '^CLIENT_RELATIVE=' 2076
point_is 100000 10000077
wait_value '(= states states-before)'78
printf 'h\nu\n' >&"$client_control"79
wait_value '(null? (dict-ref (host-snapshot host) constraints:))'80
point_is 160000 18000081
wait_value '(and (pair? hints) (event-ref (car hints) accepted?:))'82
echo 'CONSTRAINT_LOCK=PASS explicit inert admission native relative path zero per-motion facts accepted scoped hint'83
printf 'c\n' >&"$client_control"84
wait_count build/receipts/constraint-client.log '^CLIENT_CONFINED' 185
printf 'motion 500 500\n' >&"$input_control"86
wait_count build/receipts/constraint-input.log '^INPUT_ACK=' 2187
sample88
wait_value '(let ((p (dict-ref (host-snapshot host) pointer-state:))) (and (<= 20000 (event-ref p x-milli:)) (< (event-ref p x-milli:) 320000) (<= 20000 (event-ref p y-milli:)) (< (event-ref p y-milli:) 320000)))'89
printf 'r\n' >&"$client_control"90
wait_count build/receipts/constraint-client.log '^CLIENT_UNCONFINED' 191
printf 'absolute 120 100\n' >&"$input_control"92
wait_count build/receipts/constraint-client.log '^CLIENT_CONFINED' 293
printf 'motion 500 500\n' >&"$input_control"94
wait_count build/receipts/constraint-input.log '^INPUT_ACK=' 2395
sample96
wait_value '(let ((p (dict-ref (host-snapshot host) pointer-state:))) (and (<= 100000 (event-ref p x-milli:)) (< (event-ref p x-milli:) 160000) (<= 80000 (event-ref p y-milli:)) (< (event-ref p y-milli:) 140000)))'97
printf 'u\n' >&"$client_control"98
wait_value '(null? (dict-ref (host-snapshot host) constraints:))'99
echo 'CONSTRAINT_CONFINE=PASS native bounds committed region shrink deactivation reentry'100
value '(begin (set! allow-hints? #f) (emulate-motion! host 1 100 100))'101
printf 'l\n' >&"$client_control"102
wait_count build/receipts/constraint-client.log '^CLIENT_LOCKED' 2103
printf 'h\nu\n' >&"$client_control"104
wait_value '(and (= (length hints) 2) (not (event-ref (car hints) accepted?:)))'105
point_is 100000 100000106
value '(set! allow-hints? #t)'107
printf 'n\n' >&"$client_control"108
wait_count build/receipts/constraint-client.log '^CLIENT_LOCKED' 3109
value '(focus-window! host 0)'110
wait_count build/receipts/constraint-client.log '^CLIENT_UNLOCKED' 1111
printf 'u\n' >&"$client_control"112
wait_value '(null? (dict-ref (host-snapshot host) constraints:))'113
point_is 100000 100000114
echo 'CONSTRAINT_SCOPE=PASS refused hint default region immediate activation focus-epoch deactivation no stale warp'115
value '(redraw!)'116
wait_value '(= (dict-ref (host-snapshot host) focus:) (car windows))'117
printf 'o\n' >&"$client_control"118
wait_count build/receipts/constraint-client.log '^CLIENT_LOCKED' 4119
value '(focus-window! host 0)'120
wait_value '(null? (dict-ref (host-snapshot host) constraints:))'121
printf 'u\n' >&"$client_control"122
value '(redraw!)'123
wait_value '(= (dict-ref (host-snapshot host) focus:) (car windows))'124
printf 'l\n' >&"$client_control"125
wait_count build/receipts/constraint-client.log '^CLIENT_LOCKED' 5126
timeout 40 build/lock-client draw < "$runtime_dir/lock-control" > build/receipts/constraint-lock.log 2>&1 &127
lock_pid=$!128
wait_count build/receipts/constraint-lock.log '^LOCKED ' 1129
wait_value '(and locked? (not (dict-ref (car (dict-ref (host-snapshot host) constraints:)) active?:)))'130
relative_before=$(grep -c '^CLIENT_RELATIVE=' build/receipts/constraint-client.log)131
printf 'motion 30 40\n' >&"$input_control"132
wait_count build/receipts/constraint-input.log '^INPUT_ACK=' 24133
printf 's\n' >&"$client_control"134
wait_count build/receipts/constraint-client.log '^CLIENT_SYNC=s' 1135
[[ $(grep -c '^CLIENT_RELATIVE=' build/receipts/constraint-client.log) == "$relative_before" ]]136
printf 'u\n' >&"$lock_control"137
wait "$lock_pid"138
lock_pid=139
wait_value '(not locked?)'140
wait_count build/receipts/constraint-client.log '^CLIENT_LOCKED' 6141
printf 'u\n' >&"$client_control"142
value '(for-each (lambda (window) (close-window! host window)) windows)'143
wait "$client_pid"144
client_pid=145
kill "$input_pid"146
wait "$input_pid" 2>/dev/null || true147
input_pid=148
wait_value '(and (null? windows) (= (host-statistic host 1) 0))'149
value '(stop-host! host)'150
wait "$server_pid"151
server_pid=152
grep -q '^CONSTRAINT_HOST=PASS' build/receipts/constraints.log153
if grep -q 'event handler failed' build/receipts/constraints.log; then cat build/receipts/constraints.log >&2; exit 1; fi154
echo 'CONSTRAINTS=PASS one-shot cleanup lock isolation authenticated restoration ownership'