84 lines
2.9 KiB
Bash
Executable file
84 lines
2.9 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Part of JoeyLib, Copyright (c) 2026 Scott Duensing, under the MIT License.
|
|
# See LICENSE.md for license information.
|
|
# SPDX-License-Identifier: MIT
|
|
#
|
|
# verify-win32-joy.sh - Joystick gate for the Win32 port: both sticks, every
|
|
# direction, both buttons and every release, driven through two virtual
|
|
# gamepads under Wine and read back from what examples/joy draws; then the
|
|
# pads unplugged while JOY runs.
|
|
#
|
|
# The port (src/hosted/win32/win32Backend.c) reads JOYSTICKID1 and
|
|
# JOYSTICKID2 through joyGetPosEx once a virtual frame, their X and Y scaled
|
|
# from the driver's range and buttons 1 and 2. Under Wine those come from its
|
|
# bus driver (winebus, through the host's SDL); the pads are Linux uinput
|
|
# devices laid out as Xbox 360 pads (scripts/lib/padGate.sh), the only ones
|
|
# SDL is let see. JOY runs headless under Wine (scripts/lib/wineGate.sh) at
|
|
# one window pixel per stage pixel, and window grabs go through
|
|
# scripts/lib/joyScreen.py (scripts/lib/joyGate.sh). Removing the pads must
|
|
# leave both sticks disconnected, and Escape must then end JOY.
|
|
#
|
|
# Usage: scripts/verify-win32-joy.sh
|
|
# Env: JOY_SHOTS also keep the screenshots in this folder
|
|
# Requires: Wine, write access to /dev/uinput, Xvfb, xdotool, ImageMagick,
|
|
# python3 + PIL; build/win32/bin/JOY.EXE (make win32).
|
|
set -uo pipefail
|
|
|
|
repo=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
|
source "$repo/scripts/lib/joeyEnv.sh"
|
|
source "$repo/scripts/lib/joyGate.sh"
|
|
source "$repo/scripts/lib/padGate.sh"
|
|
source "$repo/scripts/lib/wineGate.sh"
|
|
wineNeed
|
|
|
|
JOY_LABEL=verify-win32-joy
|
|
JOY_SCALE=1
|
|
program=$(joeyExampleProgram joy win32)
|
|
unplugSeconds=3 # the pads gone until Wine has dropped them
|
|
exitSeconds=5 # Escape until JOY has gone
|
|
|
|
[ -f "$program" ] || { echo "$JOY_LABEL: build JOY.EXE first (make win32)" >&2; exit 2; }
|
|
|
|
JOY_WORK=$(mktemp -d -t joeylib-win32-joy.XXXXXX)
|
|
win=""
|
|
cleanup() {
|
|
padStop
|
|
wineStop
|
|
rm -rf "$JOY_WORK"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
|
|
joyShot() {
|
|
import -window "$win" "$1" 2> /dev/null
|
|
}
|
|
|
|
|
|
wineStart "$JOY_WORK"
|
|
padStart "$JOY_WORK"
|
|
# Wine's services (its bus driver among them) start with the first program
|
|
# and take its environment.
|
|
for setting in "${PAD_ONLY_ENV[@]}"; do
|
|
export "${setting?}"
|
|
done
|
|
JOEYLIB_SCALE=1 JOEYLIB_ASPECT=square wineRun "$program"
|
|
win=$(wineWindow JOY) || { echo "$JOY_LABEL: FAIL - JOY's window did not come up" >&2; cat "$JOY_WORK/wine.log" >&2; exit 1; }
|
|
xdotool windowfocus --sync "$win" 2> /dev/null || true
|
|
sleep 2
|
|
|
|
padOrder
|
|
joyCheck "rest" "A=$JOY_REST B=$JOY_REST"
|
|
joyRunSteps "${JOY_STEPS_TWO_STICKS[@]}"
|
|
|
|
padStop
|
|
sleep "$unplugSeconds"
|
|
joyCheck "pads unplugged" "A=$JOY_ABSENT B=$JOY_ABSENT"
|
|
|
|
xdotool key Escape
|
|
for ((waited = 0; waited < exitSeconds; waited++)); do
|
|
joeyAlive "$WINE_PID" || break
|
|
sleep 1
|
|
done
|
|
joeyAlive "$WINE_PID" && joyFail "Escape did not end JOY"
|
|
|
|
joyResult "$JOY_LABEL" "both pads, every direction, both buttons and every release; unplugged, both sticks gone; Escape ends JOY"
|