Forum: PC-Programmierung Tasten in C unter Linux


von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Um ab und zu Programme, die irgendwann auf einem Controller laufen 
sollen, teste ich Algorithmen und Programmabläufe gerne zuvor auf dem 
Linux-PC aus.

Hier benötige ich dann Funktionen, mit denen ich zum Einen festellen 
kann, ob eine Taste gedrückt wurde und wenn ja, welche.

Vor geraumer Zeit habe ich mich hier in die Tiefen von termios.h begeben 
und mich da schlau gemacht (von dem ich wieder vieles vergessen habe).

Auch wenn mein Code (im Anhang) funktioniert, war ich nie zu 100% 
zufrieden, denn er hat einen Schönheitsfehler in der Anwendung.

Bisweilen, aber nicht immer gibt er mir an der aktuellen Cursorposition 
die Escape-Sequezen für bspw. die Cursortasten oder die Funktionstasten 
aus:
1
^[[A   ^[[B   etc.

Meine < readkey > Funktion liefert mir neben den Ascii-Codes der Tasten 
auch die erweiterten Codes für eben oben genannte Cursor und 
Funktionstasten.
1
  #define keyleft         0x00005b44
2
  #define keyright        0x00005b43
3
  #define keyup           0x00005b41
4
  #define keydown         0x00005b42
5
  #define pageup          0x005b357e
6
  #define pagedown        0x005b367e
7
  #define keypos1         0x00005b48
8
  #define keyend          0x00005b46
9
10
  #define keyf1           0x00004f50
11
  #define keyf2           0x00004f51
12
  #define keyf3           0x00004f52
13
  #define keyf4           0x00004f53
14
  #define keyf5           0x5b31357e
15
  #define keyf6           0x5b31377e
16
  #define keyf7           0x5b31387e
17
  #define keyf8           0x5b31397e
18
  #define keyf9           0x5b32307e
19
  #define keyf10          0x5b32317e
Leider zerstört mir das Ausgeben der Escapesequenzen meinen 
Bildschirmaufbau. Bisher habe ich mir damit beholfen, dass ich in meinen 
Programmen einen Bereich schwarze Textfarbe auf schwarzem Hintergrund 
definiere auf den ich nach jeder Bildschirmausgabe verzweige.

Irgendein Puffer in dem wohl die erweiterten Tasten abgelegt werden muß 
wohl gelöscht werden, aber ich weiß nicht wo und wie ich das 
bewerkstellige.

Vllt. kennt einer der Linux- Systemprogrammierercracks wie das geht ?

von Walter T. (nicolas)


Lesenswert?

Probier mal SDL2 aus. Dann hast Du direkt auch eine Display-Emulation 
und bist auch nicht auf Linux beschränkt.

: Bearbeitet durch User
von Ralph S. (jjflash)


Lesenswert?

Walter T. schrieb:
> Probier mal SDL2 aus.

SDL ist mir für manche Dinge, die nur "quick and dirty" ausprobiert 
werden soll zu "komplex" und erfordert einen Overhead.

Zudem habe ich einige Quellen (noch aus den 80er und 90er Jahre), die 
ich immer noch verwenden möchte oder wieder aufarbeiten will (momentan 
ist es ein altes Computerspiel aus 1992 von mir, dass ich im Ziel auf 
einem Mikrocontroller laufen lassen mag).

Um da nicht zu viel umschreiben zu müssen, ist SDL für mich von daher 
für diesen Einsatzzweck keine Option (im vorliegenden Fall hatte ich 
zuerst das Programm von TurboPascal nach C portieren  müssen .... sieht 
nicht so schön aus der Code, aber funktioniert)

von Chris S. (schris)


Angehängte Dateien:

Lesenswert?

Hier eine Implementierung von kbhit

von Ralph S. (jjflash)


Lesenswert?

Chris S. schrieb:
> Hier eine Implementierung von kbhit

_kbhit funktioniert ähnlich meinem keypressed.
Außerdem muß für _kbhit in deiner Implementierung noch ein #include 
<sys/ioctl.h> und zudem muß es (heute) heißen: struct term termios; 
(anstelle von nur term termios)

Aber mein Problem, dass die ESC-Sequenz der Taste noch auf dem 
Bildschirm mit ausgegeben wird ist auch mit _kbhit nicht behoben

von G. K. (zumsel)


Lesenswert?

Ralph S. schrieb:

> Aber mein Problem, dass die ESC-Sequenz der Taste noch auf dem
> Bildschirm mit ausgegeben wird ist auch mit _kbhit nicht behoben

Echo abschalten?

https://c-for-dummies.com/blog/?p=4001
https://man7.org/tlpi/code/online/dist/tty/no_echo.c.html

von Chris S. (schris)


Lesenswert?

Ok, ich würde dir raten eine conio.h Implementierung in c von GitHub für 
Linux runterzuladen. Dort gibt es die Funktion getch() und getche(). Die 
Funktion getch() stellt sicher dass kein ECHO und kein ICANON flag 
verwendet wird.

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Chris S. schrieb:
> Ok, ich würde dir raten eine conio.h Implementierung in c von GitHub für
> Linux runterzuladen. Dort gibt es die Funktion getch() und getche(). Die
> Funktion getch() stellt sicher dass kein ECHO und kein ICANON flag
> verwendet wird.

Ich hatte mir früher einmal Implementierungen von conio für Linux 
angesehen gehabt und war damals nicht zufrieden gewesen, was der Grund 
war, mir eigene Funktionen zu schreiben. War ich gerade eben aber wieder 
nachsehen und habe festgestellt, dass es hier nur etwas mehr Auswahl als 
vor 10 Jahren  gibt. Grundsätzlich ging es mir darum, auch "ähnliche" 
Funktionen wie aus TurboPascal und Turbo C zu haben. conio werde ich 
nicht weiter verfolgen weil:

G. K. schrieb:
> Echo abschalten?
>
> https://c-for-dummies.com/blog/?p=4001
> https://man7.org/tlpi/code/online/dist/tty/no_echo.c.html

Super herzlichen und vielen Dank an zumsel. Die Links waren für mich 
sehr zielführend und ich konnte das Tastenecho abschalten. Herrlich !

Im Anhang ist die erste Verwendung hiervon zu sehen und das ist das, was 
ich dann in einem Mikrocontroller zur Anwendung bringen möchte.

Das Original hatte ich in 1992 in TurboPascal geschrieben. Dass der 
C-Code bisweilen etwas "unschön" aussieht ist genau diesem Umstand 
geschuldet, dass es 1:1 aus dem Original umgesetzt wurde. Hier gab es 
zuerst ein Textmode-Spiel, bevor es dann zu MCGA-Grafik (320*200 Pixel / 
256 Farben) umgesetzt wurde. Lange ist es her! Heute gibt es in dieser 
Form einige ähnliche Spiele, aber damals war das neu. Eine Art Mischung 
aus Tetris und Klax.

Nachdem das nun auch wieder unter Linux läuft hat es für mich wieder den 
alten Charme hervorgebracht und ich habe (wie früher) zu viel Zeit jetzt 
verdaddelt.

Wer es ausprobieren möchte: Im Ordner einfach "make" eingeben, danach 
kann das Spiel mit ./3ac gestartet werden.

--------------------------

Von oben fallen farbige Klötzchen herunter, die farbig sortiert 
übereinander gestappelt werden müssen. Sind 3 Klötzchen einer Farbe 
übereinander (Three A Color), verschwinden diese und der Score wird 
erhöht.

Der Fänger in der Mitte kann mit den Cursortasten bewegt werden und kann 
ein einzelnes Klötzchen fangen und es dann in der X-Position 
verschieben. Ein Druck auf die Leertaste lässt das Klötzchen fallen.

Rechts und links ist der Mülleimer in dem Klötzchen weggeworfen können 
(hier baut sich bei 3 übereinander gleichen Farben jedoch der Aufbau 
nicht ab). Erreicht ein aufgestappelter Klötzchenturm die Höhe der Mauer 
links und rechts, ist das Spiel beendet. Ebenso ist das Spiel beendet, 
wenn ein Klötzchen (versehentlich) auf die Mauer abgelegt wird :-)

Die Taste "p" pausiert das Spiel.

Wer es ausprobieren mag:

Viel Spaß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.