AtlatestRepositorysigil-wm

sigil-wm / tree / scriptstest-desktop

1#!/usr/bin/env bash
2set -euo pipefail
3cd "$(dirname "$0")/.."
4make -j2 all build/data-client build/protocol-client build/readback
5mkdir -p build/receipts
6server_pid= source_pid= target_pid= runtime_dir=
7cleanup() {
8 for child in "$target_pid" "$source_pid" "$server_pid"; do
9 [[ -z $child ]] || kill "$child" 2>/dev/null || true
10 [[ -z $child ]] || wait "$child" 2>/dev/null || true
11 done
12 [[ -z $runtime_dir ]] || rm -rf "$runtime_dir"
14trap cleanup EXIT
15value() {
16 local result
17 result=$(bash scripts/msg "$SIGIL_WM_REPL" "$1") || return
18 printf '%s\n' "$result"
19 [[ $result != *'(error '* ]]
21wait_value() {
22 for ((attempt=0; attempt<120; attempt++)); do
23 if value "$1" | grep -q '(value #t)'; then return; fi
24 kill -0 "$server_pid" 2>/dev/null || break
25 sleep 0.05
26 done
27 cat "$server_log" >&2
28 return 1
30wait_log() {
31 for ((attempt=0; attempt<600; attempt++)); do
32 if grep -q "$2" "$1" 2>/dev/null; then return; fi
33 kill -0 "$server_pid" 2>/dev/null || break
34 sleep 0.1
35 done
36 cat "$server_log" >&2
37 cat "$1" >&2
38 return 1
40start_manager() {
41 arm=$1
42 runtime_dir=$(mktemp -d /tmp/sigil-wm-desktop.XXXXXX)
43 export XDG_RUNTIME_DIR=$runtime_dir SIGIL_WM_REPL="$runtime_dir/repl"
44 export WLR_BACKENDS=headless WLR_RENDERER=pixman WLR_HEADLESS_OUTPUTS=1
45 unset WAYLAND_DISPLAY DISPLAY
46 server_log="build/receipts/desktop-$arm.log"
47 timeout 120 bash scripts/run-sigil -L src eval -f test/desktop.sgl > "$server_log" 2>&1 &
48 server_pid=$!
49 wait_log "$server_log" '^WAYLAND_SOCKET='
50 export WAYLAND_DISPLAY
51 WAYLAND_DISPLAY=$(sed -n 's/^WAYLAND_SOCKET=//p' "$server_log" | head -1)
53stop_manager() {
54 wait_value '(null? windows)'
55 value '(stop-host! host)'
56 wait "$server_pid"
57 server_pid=
58 grep -q '^DESKTOP_HOST=PASS' "$server_log"
59 if grep -q 'event handler failed' "$server_log"; then cat "$server_log" >&2; return 1; fi
60 rm -rf "$runtime_dir"
61 runtime_dir=
63close_windows() {
64 value '(for-each (lambda (id) (close-window! host id)) windows)'
66for kind in clipboard primary; do
67 start_manager "$kind"
68 source_log="build/receipts/desktop-$kind-source.log"
69 target_log="build/receipts/desktop-$kind-target.log"
70 timeout 100 build/data-client "$kind" source 'selection-payload-λ' > "$source_log" 2>&1 &
71 source_pid=$!
72 wait_log "$source_log" '^DATA_FOCUS=PASS'
73 value '(begin (emulate-key! host 1 30 #t) (emulate-key! host 1 30 #f))'
74 wait_value '(and (= (length results) 1) (event-ref (car results) accepted?:))'
75 timeout 90 build/data-client "$kind" target 'selection-payload-λ' > "$target_log" 2>&1 &
76 target_pid=$!
77 wait_log "$target_log" '^DATA_RECEIVED=PASS'
78 wait "$target_pid"
79 target_pid=
80 close_windows
81 wait "$source_pid"
82 source_pid=
83 stop_manager
84 echo "DESKTOP_SELECTION=$kind PASS real serial transfer focus teardown"
85done
86for mode in refuse expire retire; do
87 start_manager "selection-$mode"
88 if [[ $mode == refuse ]]; then value '(set! accept? #f)'; else value '(set! hold? #t)'; fi
89 source_log="build/receipts/desktop-selection-$mode-source.log"
90 if [[ $mode == retire ]]; then
91 SIGIL_WM_DATA_RETIRE=1 timeout 90 build/data-client clipboard source 'retired' > "$source_log" 2>&1 &
92 else
93 timeout 90 build/data-client clipboard source 'refused' > "$source_log" 2>&1 &
94 fi
95 source_pid=$!
96 wait_log "$source_log" '^DATA_FOCUS=PASS'
97 value '(begin (emulate-key! host 1 30 #t) (emulate-key! host 1 30 #f))'
98 if [[ $mode == retire ]]; then
99 wait_value '(and (= (length requests) 1) (memv (event-ref (car requests) id:) retired) #t)'
100 wait_value '(null? results)'
101 else
102 wait_value '(and (= (length results) 1) (not (event-ref (car results) accepted?:)))'
103 fi
104 close_windows
105 wait "$source_pid"
106 source_pid=
107 stop_manager
108 echo "DESKTOP_SELECTION=$mode PASS refusal deadline retirement ownership"
109done
110for mode in transfer invalid refuse expire retire; do
111 start_manager "drag-$mode"
112 source_log="build/receipts/desktop-drag-$mode-source.log"
113 target_log="build/receipts/desktop-drag-$mode-target.log"
114 if [[ $mode == transfer ]]; then
115 SIGIL_WM_CLIENT_DND=target SIGIL_WM_CLIENT_TITLE=target timeout 90 build/protocol-client red 36000 > "$target_log" 2>&1 &
116 target_pid=$!
117 wait_value '(= (length windows) 1)'
118 elif [[ $mode == refuse ]]; then
119 value '(set! accept? #f)'
120 elif [[ $mode == expire || $mode == retire ]]; then
121 value '(set! hold? #t)'
122 fi
123 client_mode=source
124 [[ $mode != invalid ]] || client_mode=invalid
125 retire_now=
126 [[ $mode != retire ]] || retire_now=1
127 SIGIL_WM_DND_RETIRE=$retire_now SIGIL_WM_CLIENT_DND=$client_mode SIGIL_WM_CLIENT_TITLE=source SIGIL_WM_DND_EXPECT_CANCEL=1 timeout 90 build/protocol-client green 36000 > "$source_log" 2>&1 &
128 source_pid=$!
129 if [[ $mode == transfer ]]; then wait_value '(= (length windows) 2)'; else wait_value '(= (length windows) 1)'; fi
130 value '(begin (emulate-motion! host 1 25 25) (emulate-button! host 1 272 #t))'
131 if [[ $mode == transfer ]]; then
132 wait_value '(and (= (length drags) 1) (event-ref (car drags) icon?:))'
133 value "(capture-output! host output-id \"$PWD/build/receipts/desktop-drag.ppm\")"
134 wait_log "$source_log" '^DND_SOURCE_REQUESTED'
135 for ((attempt=0; attempt<200; attempt++)); do
136 [[ ! -s build/receipts/desktop-drag.ppm ]] || break
137 sleep 0.05
138 done
139 sleep 0.1
140 build/readback build/receipts/desktop-drag.ppm build/receipts/desktop-drag.png drag
141 value '(emulate-motion! host 1 350 30)'
142 wait_log "$target_log" '^DND_COPY_NEGOTIATED'
143 value '(emulate-button! host 1 272 #f)'
144 wait_log "$target_log" '^DND_TARGET_PAYLOAD=drag-payload-λ'
145 wait_log "$source_log" '^DND_SOURCE_FINISHED'
146 wait "$target_pid"
147 target_pid=
148 wait "$source_pid"
149 source_pid=
150 wait_value '(and (= (length drops) 1) (= (length ended) 1))'
151 elif [[ $mode == retire ]]; then
152 wait_value '(= (length requests) 1)'
153 wait "$source_pid"
154 source_pid=
155 wait_value '(and (memv (event-ref (car requests) id:) retired) #t)'
156 wait_value '(and (null? results) (null? drags))'
157 else
158 wait_value '(and (= (length results) 1) (not (event-ref (car results) accepted?:)))'
159 wait_value '(null? drags)'
160 wait_log "$source_log" '^DND_.*CANCELLED'
161 wait "$source_pid"
162 source_pid=
163 fi
164 value '(emulate-button! host 1 272 #f)'
165 stop_manager
166 echo "DESKTOP_DRAG=$mode PASS admission transfer icon deadline retirement ownership"
167done
168echo 'DESKTOP=PASS'