Dateneingabe im VT100 Style

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.

graph LR W[Win32
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.