AtlatestRepositorysigil-wm
1
#!/usr/bin/env bash2
set -euo pipefail3
cd "$(dirname "$0")/.."4
make -j2 all build/pixel-client5
mkdir -p build/receipts6
runtime_dir=$(mktemp -d /tmp/sigil-wm-focus-click.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= first_pid= second_pid=11
cleanup() {12
for child in "$second_pid" "$first_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/focus-click.log >&226
return 127
}28
wait_log() {29
for ((attempt=0; attempt<200; attempt++)); do30
if grep -q "$2" "$1" 2>/dev/null; then return; fi31
kill -0 "$server_pid" 2>/dev/null || break32
sleep 0.0533
done34
cat "$1" >&235
cat build/receipts/focus-click.log >&236
return 137
}38
timeout 90 bash scripts/run-sigil -L src eval -f test/focus-click.sgl > build/receipts/focus-click.log 2>&1 &39
server_pid=$!40
wait_log build/receipts/focus-click.log '^WAYLAND_SOCKET='41
export WAYLAND_DISPLAY42
WAYLAND_DISPLAY=$(sed -n 's/^WAYLAND_SOCKET=//p' build/receipts/focus-click.log | head -1)43
timeout 80 build/pixel-client 00cc44 'First client' > build/receipts/focus-click-first.log 2>&1 &44
first_pid=$!45
wait_value '(= (length windows) 1)'46
timeout 80 build/pixel-client cc2244 'Second client' > build/receipts/focus-click-second.log 2>&1 &47
second_pid=$!48
wait_value '(= (length windows) 2)'49
wait_log build/receipts/focus-click-second.log '^CLIENT_KEYBOARD_ENTER'50
value '(begin (emulate-motion! host 1 600 100) (emulate-button! host 1 272 #t) (emulate-motion! host 1 100 100) (emulate-button! host 1 272 #f))'51
wait_log build/receipts/focus-click-second.log '^CLIENT_BUTTON=272,0'52
if grep -q '^CLIENT_BUTTON=272,1' build/receipts/focus-click-first.log; then53
echo 'FOCUS_CLICK_ORDER=FAIL motion overtook the pending press' >&254
exit 155
fi56
echo 'FOCUS_CLICK_ORDER=PASS press and release stayed with the original pointer target'57
value '(set! cookie? #t)'58
value '(begin (emulate-motion! host 1 100 100) (emulate-button! host 1 272 #t) (emulate-button! host 1 272 #f))'59
wait_log build/receipts/focus-click-first.log '^CLIENT_BUTTON=272,0'60
wait_value '(= (dict-ref (host-snapshot host) focus:) (car windows))'61
value '(begin (set! hover? #t) (observe-pointer! host #t))'62
value '(begin (emulate-motion! host 1 600 100) (emulate-button! host 1 272 #t) (emulate-button! host 1 272 #f))'63
for ((attempt=0; attempt<100; attempt++)); do64
[[ $(grep -c '^CLIENT_BUTTON=272,0' build/receipts/focus-click-second.log) -lt 2 ]] || break65
sleep 0.0566
done67
[[ $(grep -c '^CLIENT_BUTTON=272,0' build/receipts/focus-click-second.log) -eq 2 ]]68
wait_value '(= (dict-ref (host-snapshot host) focus:) (cadr windows))'69
value '(begin (set! hover? #f) (focus-window! host 0))'70
wait_value '(= (dict-ref (host-snapshot host) focus:) 0)'71
value '(focus-window! host (cadr windows) pointer-token: pointer-token)'72
wait_value '(and (pair? focus-results) (not (event-ref (car focus-results) accepted?:)) (= (dict-ref (host-snapshot host) focus:) 0))'73
echo 'FOCUS_OBSERVER=PASS yielding hover preserved queued first click stale authorization refused'74
value '(close-window! host (car windows))'75
wait "$first_pid"76
first_pid=77
wait_value '(and (= (length windows) 1) (equal? last-plan applied-plan))'78
value '(close-window! host (car windows))'79
wait "$second_pid"80
second_pid=81
wait_value '(null? windows)'82
value '(stop-host! host)'83
wait "$server_pid"84
server_pid=85
grep -q '^FOCUS_CLICK_HOST=PASS' build/receipts/focus-click.log86
if grep -q 'event handler failed' build/receipts/focus-click.log; then cat build/receipts/focus-click.log >&2; exit 1; fi87
echo 'FOCUS_CLICK=PASS ordered unhooked motion paired buttons explicit focus authorization clean teardown'