AtlatestRepositorysigil-wm

sigil-wm / tree / scriptstest-focus-click

1#!/usr/bin/env bash
2set -euo pipefail
3cd "$(dirname "$0")/.."
4make -j2 all build/pixel-client
5mkdir -p build/receipts
6runtime_dir=$(mktemp -d /tmp/sigil-wm-focus-click.XXXXXX)
7export XDG_RUNTIME_DIR=$runtime_dir SIGIL_WM_REPL="$runtime_dir/repl"
8export WLR_BACKENDS=headless WLR_RENDERER=pixman WLR_HEADLESS_OUTPUTS=1
9unset WAYLAND_DISPLAY DISPLAY
10server_pid= first_pid= second_pid=
11cleanup() {
12 for child in "$second_pid" "$first_pid" "$server_pid"; do
13 [[ -z $child ]] || kill "$child" 2>/dev/null || true
14 [[ -z $child ]] || wait "$child" 2>/dev/null || true
15 done
16 rm -rf "$runtime_dir"
18trap cleanup EXIT
19value() { bash scripts/msg "$SIGIL_WM_REPL" "$1"; }
20wait_value() {
21 for ((attempt=0; attempt<100; attempt++)); do
22 if value "$1" | grep -q '(value #t)'; then return; fi
23 sleep 0.05
24 done
25 cat build/receipts/focus-click.log >&2
26 return 1
28wait_log() {
29 for ((attempt=0; attempt<200; attempt++)); do
30 if grep -q "$2" "$1" 2>/dev/null; then return; fi
31 kill -0 "$server_pid" 2>/dev/null || break
32 sleep 0.05
33 done
34 cat "$1" >&2
35 cat build/receipts/focus-click.log >&2
36 return 1
38timeout 90 bash scripts/run-sigil -L src eval -f test/focus-click.sgl > build/receipts/focus-click.log 2>&1 &
39server_pid=$!
40wait_log build/receipts/focus-click.log '^WAYLAND_SOCKET='
41export WAYLAND_DISPLAY
42WAYLAND_DISPLAY=$(sed -n 's/^WAYLAND_SOCKET=//p' build/receipts/focus-click.log | head -1)
43timeout 80 build/pixel-client 00cc44 'First client' > build/receipts/focus-click-first.log 2>&1 &
44first_pid=$!
45wait_value '(= (length windows) 1)'
46timeout 80 build/pixel-client cc2244 'Second client' > build/receipts/focus-click-second.log 2>&1 &
47second_pid=$!
48wait_value '(= (length windows) 2)'
49wait_log build/receipts/focus-click-second.log '^CLIENT_KEYBOARD_ENTER'
50value '(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))'
51wait_log build/receipts/focus-click-second.log '^CLIENT_BUTTON=272,0'
52if grep -q '^CLIENT_BUTTON=272,1' build/receipts/focus-click-first.log; then
53 echo 'FOCUS_CLICK_ORDER=FAIL motion overtook the pending press' >&2
54 exit 1
55fi
56echo 'FOCUS_CLICK_ORDER=PASS press and release stayed with the original pointer target'
57value '(set! cookie? #t)'
58value '(begin (emulate-motion! host 1 100 100) (emulate-button! host 1 272 #t) (emulate-button! host 1 272 #f))'
59wait_log build/receipts/focus-click-first.log '^CLIENT_BUTTON=272,0'
60wait_value '(= (dict-ref (host-snapshot host) focus:) (car windows))'
61value '(begin (set! hover? #t) (observe-pointer! host #t))'
62value '(begin (emulate-motion! host 1 600 100) (emulate-button! host 1 272 #t) (emulate-button! host 1 272 #f))'
63for ((attempt=0; attempt<100; attempt++)); do
64 [[ $(grep -c '^CLIENT_BUTTON=272,0' build/receipts/focus-click-second.log) -lt 2 ]] || break
65 sleep 0.05
66done
67[[ $(grep -c '^CLIENT_BUTTON=272,0' build/receipts/focus-click-second.log) -eq 2 ]]
68wait_value '(= (dict-ref (host-snapshot host) focus:) (cadr windows))'
69value '(begin (set! hover? #f) (focus-window! host 0))'
70wait_value '(= (dict-ref (host-snapshot host) focus:) 0)'
71value '(focus-window! host (cadr windows) pointer-token: pointer-token)'
72wait_value '(and (pair? focus-results) (not (event-ref (car focus-results) accepted?:)) (= (dict-ref (host-snapshot host) focus:) 0))'
73echo 'FOCUS_OBSERVER=PASS yielding hover preserved queued first click stale authorization refused'
74value '(close-window! host (car windows))'
75wait "$first_pid"
76first_pid=
77wait_value '(and (= (length windows) 1) (equal? last-plan applied-plan))'
78value '(close-window! host (car windows))'
79wait "$second_pid"
80second_pid=
81wait_value '(null? windows)'
82value '(stop-host! host)'
83wait "$server_pid"
84server_pid=
85grep -q '^FOCUS_CLICK_HOST=PASS' build/receipts/focus-click.log
86if grep -q 'event handler failed' build/receipts/focus-click.log; then cat build/receipts/focus-click.log >&2; exit 1; fi
87echo 'FOCUS_CLICK=PASS ordered unhooked motion paired buttons explicit focus authorization clean teardown'