Maus in der Konsole

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Maus in der Konsole

Beitrag von heinz » 15.08.2016 13:53:45

Hallo Zusamen,

ich versuche gerade eine Mausabfrage in einem xterm-Fenster zu realisieren und habe da ein Problem.
Alles läuft gut, bis ein Maus-Wert einen bestimmten Wert überschreitet.
(Im Beispielcode, wenn z.B. der X-Wert über 193 wird...)
Dann wird der String, der die Mausdaten enthält länger weil die Werte nicht mehr in z.B. 1 Byte passen.

Wie kann ich den Mausdaten-Strom zuverlässig(er) auswerten?

Danke fürs Lesen und ich hoffe, ich konnte mich einigermaßen verständlich ausdrücken.
gruß heinz



Momentan mache ich es so:

Code: Alles auswählen

xterm starten
Mausausgabe aktivieren mit:

Code: Alles auswählen

echo -e "\033[?1003h"   #(Maustasten und Mausbewegung ausgeben)
Den Datenstrom entgegennehmen mit:

Code: Alles auswählen

while read -rs -n6
Die Werte extrahieren mit:

Code: Alles auswählen

werte=( `echo "$REPLY"|od -tu1 -An|tr -s ' '|cut -f5-7 -d' '` )
dann ist:

Code: Alles auswählen

werte[0]=Maustaste
werte[1]=Maus-X
werte[2]=Maus-Y
Um die Konsole zurück zu setzen:

Code: Alles auswählen

echo -e "\033[?1003l"
oder besser:

Code: Alles auswählen

reset

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Maus in der Konsole

Beitrag von rendegast » 01.09.2016 20:27:03

Ich habe den 'read -n6'-Stream jetzt mal 'hd' statt 'od' zu fressen gegeben,
das 'tr | cut' weggelassen und sed-Magie
(am besten zu sehen mit monospace-Font)

Code: Alles auswählen

00000000 4d 43 ba 3c 1b 5b 0a       |MC.<.[.|   00000007
00000000 4d 43 bb 3c 1b 5b 0a       |MC.<.[.|   00000007
00000000 4d 43 bc 3c 1b 5b 0a       |MC.<.[.|   00000007
00000000 4d 43 bd 3c 1b 5b 0a       |MC.<.[.|   00000007
00000000 4d 43 be 3c 1b 5b 0a       |MC.<.[.|   00000007
00000000 4d 43 bf 3c 1b 5b 0a       |MC.<.[.|   00000007
00000000 4d 43 c0 3c 1b 5b 0a       |MC.<.[.|   00000007
00000000 4d 43 c1 3c 1b 5b 0a       |MC.<.[.|   00000007
00000000 4d 43 c2 3c 1b 5b 4d 0a    |MC.<.[M.|  00000008
00000000 43 c3 3c 1b 5b 4d 43 0a    |C.<.[MC.|  00000008
00000000 c4 3c 1b 5b 4d 43 c5 3c 0a |.<.[MC.<.| 00000009
00000000 1b 5b 4d 43 c6 3c 1b 0a    |.[MC.<..|  00000008
00000000 5b 4d 43 c7 3c 1b 5b 0a    |[MC.<.[.|  00000008
00000000 4d 43 c8 3c 1b 5b 4d 0a    |MC.<.[M.|  00000008
00000000 43 c9 3c 1b 5b 4d 43 0a    |C.<.[MC.|  00000008
00000000 ca 3c 1b 5b 4d 43 cb 3c 0a |.<.[MC.<.| 00000009
00000000 1b 5b 4d 43 cc 3c 1b 0a    |.[MC.<..|  00000008
00000000 5b 4d 43 cd 3c 1b 5b 0a    |[MC.<.[.|  00000008
00000000 4d 43 ce 3c 1b 5b 4d 0a    |MC.<.[M.|  00000008
00000000 43 cf 3c 1b 5b 4d 43 0a    |C.<.[MC.|  00000008
00000000 d0 3c 1b 5b 4d 43 d1 3c 0a |.<.[MC.<.| 00000009
00000000 1b 5b 4d 43 d2 3c 1b 0a    |.[MC.<..|  00000008
00000000 5b 4d 43 d2 3b 1b 5b 0a    |[MC.;.[.|  00000008
00000000 4d 43 d3 3b 1b 5b 4d 0a    |MC.;.[M.|  00000008
die Maus dabei in einem übergroßen xterm-Fenster immer weiter möglichst nur nach rechts bewegt.
Dabei zu sehen, daß der "Haltepunkt" '4d 43' durch das Muster wandert,
da kommt das zusätzliche Byte, resp. zwei Byte.

Das 'read -n6' ist zu statisch, in Folge formatiert es den Stream wohl auch zu unpassenden Zeilen, besser: "Leseabschnitten".

Wie könnte der Stream passend vorformatiert werden?
Sodaß an der richtigen Stelle eine Unterbrechung gemacht werden könnte,
um dann die richtigen Ergänzungen einfügen und Bytes addieren zu können.
Ich habe versucht derart

Code: Alles auswählen

$ hd | while read .....
$ cat | hd | while read ....
usw.
dann kommt aber wieder das unbehandelte auf den Bildschirm.

'xev' scheint das ja richtig zu machen.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Maus in der Konsole

Beitrag von heinz » 02.09.2016 09:50:20

Hallo rendegast,

zunächst mal vielen Dank für Deine Antwort.
rendegast hat geschrieben:Wie könnte der Stream passend vorformatiert werden?
Ich habe leider auch noch keine Möglichkeit gefunden und bin z.Z. eher auf der Suche nach einer Möglichkeit den Stream gleich auf eine "andere Weise" (als Mehr-Byte-Wert) ausgeben zu lassen.
Z.B. kann man mit:

Code: Alles auswählen

"\033[?1006h"
den Stream dezimal ausgeben lassen... (Was im gegebenen Fall natürlich nix nützt.)

Code: Alles auswählen

man console_codes
ist leider nicht ins Deutsche übersetzt, weshalb es bei meinen Englisch-Kenntnissen etwas dauern kann...

Falls ich eine Lösung finde, "sag" ich bescheid.

Bin auch für weitere Vorschläge offen...

gruß heinz

Antworten