Das läuft auf ein Programm hinaus, das vom Kernel Input Device für die Maus lesen müsste (eine detaillierte Dokumentation dazu gibt es z.B. hier: https://www.kernel.org/doc/html/v4.14/input/input_uapi.html). Das geht z.B. mit evtest, wenn man das mit den Mitteln der Shell lösen wollte.
Mit Python3 und dem Paket python3-evdev kann man das etwas strukturierter machen und von mehreren Geräten parallel lesen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 | #!/usr/bin/env python3
import sys
from collections import Counter, defaultdict
from select import select
from evdev import InputDevice, ecodes
buttons = Counter()
axes = defaultdict(int)
devices = map(InputDevice, sys.argv[1:])
devices = {dev.fd: dev for dev in devices}
while True:
last_abs_x = 0
last_abs_y = 0
r, w, x = select(devices, [], [])
for fd in r:
for event in devices[fd].read():
if event.type == ecodes.EV_KEY:
btn_name = ecodes.BTN.get(event.code)
if isinstance(btn_name, list):
btn_name, *_ = btn_name
buttons.update([btn_name])
elif event.type in (ecodes.EV_REL, ecodes.EV_ABS):
ev_str = ecodes.bytype.get(event.type, {}).get(event.code)
if ev_str == 'ABS_X':
value = abs(max(last_abs_x, event.value) - min(last_abs_x, event.value))
last_abs_x = event.value
elif ev_str == 'ABS_Y':
value = abs(max(last_abs_y, event.value) - min(last_abs_y, event.value))
last_abs_y = event.value
else:
value = abs(event.value)
axes[ev_str] += value
print(f'\r{buttons.most_common()} {axes.items()}', end='')
|
Das Skript muss man mit den gewünschten Geräteknoten als Argumente aufrufen - z.B. für meine VM, in der ich das gerade ausprobiert habe:
$ sudo evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: Power Button
/dev/input/event1: Sleep Button
/dev/input/event2: Video Bus
/dev/input/event3: AT Translated Set 2 keyboard
/dev/input/event4: VirtualBox USB Tablet
/dev/input/event5: VirtualBox mouse integration
/dev/input/event6: PC Speaker
/dev/input/event7: ImExPS/2 Generic Explorer Mouse
/dev/input/event8: HDA Intel Mic
/dev/input/event9: HDA Intel Line
/dev/input/event10: HDA Intel Speaker Front
/dev/input/event11: HDA Intel Speaker CLFE
/dev/input/event12: HDA Intel Front Headphone
/dev/input/event13: HDA Intel SPDIF In
Select the device event number [0-13]:
Hier interessieren mich event5 und event7 (mit evtest ausprobieren, ob da events kommen, wenn man die Maus bewegt bzw. Tasten drückt) - also kann ich sowas machen:
sudo python3 mousemeter.py /dev/input/event5 /dev/input/event7
Und bekomme dann eine laufend aktualisierte Zusammenfassung wie
[('BTN_LEFT', 8), ('BTN_MIDDLE', 6), ('BTN_RIGHT', 4)] dict_items([('ABS_Y', 4700594), ('ABS_X', 1990640), ('REL_WHEEL', 58)])
angezeigt (was man natürlich noch attraktiver formatieren und in eine GUI packen könnte - die Mouse-Units für ABS_X, ABS_Y (bzw. REL_X, REL_Y, wenn man eine "freie" Maus hat) müsste man dann ggf. noch in eine SI-Einheit umrechnen, damit man sich etwas darunter vorstellen kann).