Dateneingabe im VT100 Style
« | 10 Jul 2021 | »Während man unter Windows diverse Sondertasten durch VKEYs gut abbilden kann, steht man in POSIX oder Linux vor der Frage, wie man dort mit Tastenkombinationen oder z.B. den F-Tasten umgehen soll.
X11 käme mit seinen keysyms
um die Ecke, doch das gilt nur für X11 apps. Aus meiner Sicht sind die alten
VT100 Escape-Codes die einzig
“generische” Möglichkeit sich diesem Thema plattformübergreifend zu widmen.
Code sagt mehr als tausend Worte:
1#include <stdio.h> 2#include <sys/select.h> 3#include <string.h> 4#include <unistd.h> 5#include <termios.h> 6 7int main() 8{ 9# define BUFLEN 32 10 char buffer[BUFLEN]; 11 struct termios t; 12 t.c_lflag &= ~ICANON; 13 tcsetattr(STDIN_FILENO, TCSANOW, &t); 14 for(;;) 15 { 16 ssize_t received = read(STDIN_FILENO, &buffer[0], BUFLEN); 17 if(received > 0) 18 { 19 printf("\r\n-----\r\n"); 20 for(ssize_t n = 0; n != received; ++n) 21 { 22 unsigned char chr = (unsigned char)buffer[n]; 23 printf("%03d 0x%02x\r\n", (unsigned)chr, (unsigned)chr); 24 } 25 printf("=====\r\n"); 26 } 27 } 28 return 0; 29}
Und jetzt sieht man, wie Tastatureingaben in Bytes übersetzt werden.
Die CTRL
+ Buchstabe Kombinationen habe ich ja
letztes Jahr geprüft,
doch ALT
Tasten und weitere Konstellationen hatte ich damals ausgespart.
Wie sich hier zeigt, werden viele dieser Konstellationen mit dem ESC
Zeichen (0x1b
) eingeleitet, wir sind also im VT100 Land.
Sondertasten wie die Pfeiltasten oder der Ziffernblock setzen sich zusammen
aus 0x1b
, 0x5b
([
) und einem oder mehreren Bytes.
ALT
+ Buchstabe manifestiert sich als 0x1b
+ ASCII-Code des Buchstaben.
Tja, und daraus lässt sich eine Tabelle basteln, mit der man Eingaben fixen
switch
-baren Codes zuordnen kann. Denn solche “Keycodes” sind wesentlich
angenehmer als eine Zuordnung mit variablen Bytefolgen durchzuführen.
Und wenn es dann um das Thema plattformunabhängige Remote-Administration geht, haben wir auch gleich eine Lösung.
VKEY] -->|Mapping| G1(GATE
Keycode) G1 --> C{Communication
Channel} C --> G2(GATE
Keycode) G2 -->|Mapping| P[POSIX
VT100] P -->|Mapping| G2 G2 --> C C --> G1 G1 -->|Mapping| W
Fazit
Es geht also weiter mit der Analyse und dem Versuch ohne ncurses mit Eingaben an der Konsole zu arbeiten.