#!/bin/bash # Run a KWin script in the session under test and print what it logged. # # KWin's scripting interface is the only way to ask the compositor what it # actually believes about a window — class, caption, desktop file, geometry, # minimised, keep-above. Everything this experiment claims about window # behaviour is measured through here rather than inferred from a screenshot. set -euo pipefail NAME="${LAB_NAME:-classroom-v2-lab}" SCRIPT="${1:?usage: kwin-script FILE}" ID="labscript$RANDOM" # /tmp inside the lab is a tmpfs created after the container started, which # `docker cp` cannot see, so the script is piped in instead. docker exec -i "$NAME" sh -c "cat > /tmp/$ID.js && chown classroom /tmp/$ID.js" \ < "$SCRIPT" run() { docker exec -u classroom \ -e XDG_RUNTIME_DIR=/run/user/1000 \ -e DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \ -e HOME=/home/classroom \ "$NAME" "$@" } since=$(docker exec "$NAME" date '+%Y-%m-%d %H:%M:%S') number=$(run qdbus6 org.kde.KWin /Scripting org.kde.kwin.Scripting.loadScript \ "/tmp/$ID.js" "$ID" 2>/dev/null | tr -d '\r') run qdbus6 org.kde.KWin "/Scripting/Script$number" org.kde.kwin.Script.run >/dev/null 2>&1 sleep 1 run qdbus6 org.kde.KWin /Scripting org.kde.kwin.Scripting.unloadScript "$ID" >/dev/null 2>&1 || true # KWin's print() reaches the journal, tagged by the wrapper process. docker exec "$NAME" journalctl --since "$since" --no-pager -o cat 2>/dev/null \ | grep -a "LAB:" | sed 's/.*LAB://'