#!/bin/bash # Echte Eingaben in der headless Test-Shell (virtuelle Geräte, nur dort gefahrlos): # dev/input.sh click X Y Linksklick # dev/input.sh rclick X Y Rechtsklick # dev/input.sh mclick X Y Klick mit der mittleren Taste # dev/input.sh drag X1 Y1 X2 Y2 Linke Taste drücken, ziehen, loslassen # dev/input.sh move X Y Zeiger bewegen # dev/input.sh press X Y Linke Taste drücken (halten) # dev/input.sh release Linke Taste loslassen # dev/input.sh type "Text" Text tippen (ASCII) # dev/input.sh key Escape Taste (Clutter.KEY_*-Name ohne Präfix), z.B. Return, Escape, Tab DIR=$(cd "$(dirname "$0")" && pwd) PRE='const Clutter = imports.gi.Clutter; const seat = Clutter.get_default_backend().get_default_seat(); globalThis._vp ??= seat.create_virtual_device(Clutter.InputDeviceType.POINTER_DEVICE); globalThis._vk ??= seat.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE); const t = () => GLib.get_monotonic_time(); const move = (x, y) => globalThis._vp.notify_absolute_motion(t(), x, y); const button = (b, s) => globalThis._vp.notify_button(t(), b, s ? Clutter.ButtonState.PRESSED : Clutter.ButtonState.RELEASED); const key = (k, s) => globalThis._vk.notify_keyval(t(), k, s ? Clutter.KeyState.PRESSED : Clutter.KeyState.RELEASED); ' case "$1" in click) CODE="move($2, $3); button(Clutter.BUTTON_PRIMARY, 1); button(Clutter.BUTTON_PRIMARY, 0);" ;; rclick) CODE="move($2, $3); button(Clutter.BUTTON_SECONDARY, 1); button(Clutter.BUTTON_SECONDARY, 0);" ;; mclick) CODE="move($2, $3); button(Clutter.BUTTON_MIDDLE, 1); button(Clutter.BUTTON_MIDDLE, 0);" ;; drag) "$0" press "$2" "$3"; sleep 0.15 for i in 1 2 3 4; do "$0" move $(( $2 + ($4 - $2) * i / 4 )) $(( $3 + ($5 - $3) * i / 4 )); sleep 0.1; done "$0" release; exit ;; move) CODE="move($2, $3);" ;; press) CODE="move($2, $3); button(Clutter.BUTTON_PRIMARY, 1);" ;; release) CODE="button(Clutter.BUTTON_PRIMARY, 0);" ;; type) TEXT=$(printf '%s' "$2" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))') CODE="for (const ch of $TEXT) { const k = ch.charCodeAt(0) === 10 ? Clutter.KEY_Return : Clutter.unicode_to_keysym(ch.codePointAt(0)); key(k, 1); key(k, 0); }" ;; key) CODE="key(Clutter.KEY_$2, 1); key(Clutter.KEY_$2, 0);" ;; *) echo "unbekannt: $1"; exit 1 ;; esac "$DIR/eval.sh" "$PRE $CODE 'ok'" | grep -v "^OK '\"ok\"')$"