AtlatestRepositorysigil-wm
1
#!/usr/bin/env bash2
set -euo pipefail3
cd "$(dirname "$0")/.."4
make -j2 all build/data-client build/protocol-client build/readback5
mkdir -p build/receipts6
server_pid= source_pid= target_pid= runtime_dir=7
cleanup() {8
for child in "$target_pid" "$source_pid" "$server_pid"; do9
[[ -z $child ]] || kill "$child" 2>/dev/null || true10
[[ -z $child ]] || wait "$child" 2>/dev/null || true11
done12
[[ -z $runtime_dir ]] || rm -rf "$runtime_dir"13
}14
trap cleanup EXIT15
value() {16
local result17
result=$(bash scripts/msg "$SIGIL_WM_REPL" "$1") || return18
printf '%s\n' "$result"19
[[ $result != *'(error '* ]]20
}21
wait_value() {22
for ((attempt=0; attempt<120; attempt++)); do23
if value "$1" | grep -q '(value #t)'; then return; fi24
kill -0 "$server_pid" 2>/dev/null || break25
sleep 0.0526
done27
cat "$server_log" >&228
return 129
}30
wait_log() {31
for ((attempt=0; attempt<600; attempt++)); do32
if grep -q "$2" "$1" 2>/dev/null; then return; fi33
kill -0 "$server_pid" 2>/dev/null || break34
sleep 0.135
done36
cat "$server_log" >&237
cat "$1" >&238
return 139
}40
start_manager() {41
arm=$142
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=145
unset WAYLAND_DISPLAY DISPLAY46
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_DISPLAY51
WAYLAND_DISPLAY=$(sed -n 's/^WAYLAND_SOCKET=//p' "$server_log" | head -1)52
}53
stop_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; fi60
rm -rf "$runtime_dir"61
runtime_dir=62
}63
close_windows() {64
value '(for-each (lambda (id) (close-window! host id)) windows)'65
}66
for kind in clipboard primary; do67
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_windows81
wait "$source_pid"82
source_pid=83
stop_manager84
echo "DESKTOP_SELECTION=$kind PASS real serial transfer focus teardown"85
done86
for mode in refuse expire retire; do87
start_manager "selection-$mode"88
if [[ $mode == refuse ]]; then value '(set! accept? #f)'; else value '(set! hold? #t)'; fi89
source_log="build/receipts/desktop-selection-$mode-source.log"90
if [[ $mode == retire ]]; then91
SIGIL_WM_DATA_RETIRE=1 timeout 90 build/data-client clipboard source 'retired' > "$source_log" 2>&1 &92
else93
timeout 90 build/data-client clipboard source 'refused' > "$source_log" 2>&1 &94
fi95
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 ]]; then99
wait_value '(and (= (length requests) 1) (memv (event-ref (car requests) id:) retired) #t)'100
wait_value '(null? results)'101
else102
wait_value '(and (= (length results) 1) (not (event-ref (car results) accepted?:)))'103
fi104
close_windows105
wait "$source_pid"106
source_pid=107
stop_manager108
echo "DESKTOP_SELECTION=$mode PASS refusal deadline retirement ownership"109
done110
for mode in transfer invalid refuse expire retire; do111
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 ]]; then115
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 ]]; then119
value '(set! accept? #f)'120
elif [[ $mode == expire || $mode == retire ]]; then121
value '(set! hold? #t)'122
fi123
client_mode=source124
[[ $mode != invalid ]] || client_mode=invalid125
retire_now=126
[[ $mode != retire ]] || retire_now=1127
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)'; fi130
value '(begin (emulate-motion! host 1 25 25) (emulate-button! host 1 272 #t))'131
if [[ $mode == transfer ]]; then132
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++)); do136
[[ ! -s build/receipts/desktop-drag.ppm ]] || break137
sleep 0.05138
done139
sleep 0.1140
build/readback build/receipts/desktop-drag.ppm build/receipts/desktop-drag.png drag141
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 ]]; then152
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
else158
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
fi164
value '(emulate-button! host 1 272 #f)'165
stop_manager166
echo "DESKTOP_DRAG=$mode PASS admission transfer icon deadline retirement ownership"167
done168
echo 'DESKTOP=PASS'