Files
desktop-planer/dev/input.sh
2026-09-19 22:50:49 +02:00

38 lines
2.4 KiB
Bash
Executable File

#!/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\"')$"