 |
PC, Linux und Hardware
Prof. Jürgen Plate |
Tastatur-Funktionen
Im Headerfile prakt.h sind einige Tastaturfunktionen enthalten, die
von der Standard-Bibliothek nicht geboten werden:
- int echo_on(void);
Schaltet das Tastaturecho ein (Normalbetrieb)
- int echo_off(void);
Schaltet das Tastaturecho aus, z. B. für eine Passworteingabe
- int getch(void);
Liest einen einzigen Tastendruck ein, ohne auf ein anschliessendes Enter
zu warten. Wartet aber, bis eine Taste betätigt wurde. Das eingegebenen Zeichen
wird nicht geechot.
- int getch_nw(void);
Liest einen einzigen Tastendruck ein, ohne auf ein anschliessendes Enter
zu warten. Wartet NICHT, bis eine Taste betätigt wurde und gibt in diesem
Fall -1 zurück. Das eingegebenen Zeichen wird nicht geechot.
Die Funktionen sind so kurz, dass sie gleich komplett im Headerfile
stehen (Download prakt.h). Eine C-Quelldatei
ist daher nicht nötig. Der Quelltext ist auch im folgenden Listing
zu sehen:
/* prakt.h
* Headerdatei mit Spezialfunktionen fuer stdin
*/
#ifndef __PRAKT__
#define __PRAKT__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <termios.h>
#include <sys/types.h>
int echo_on(void); /* Tastaturecho einschalten */
int echo_off(void); /* Tastaturecho ausschalten */
int getch(void); /* Taste einlesen (ohne anschl. Enter, ohne Echo) */
int getch_nw(void); /* Taste einlesen (ohne Warten, ohne Echo) */
int echo_on(void)
/* Echo input on screen */
{
struct termios attributes;
if(tcgetattr(STDIN_FILENO,&attributes) != 0)
return (-1);
attributes.c_lflag |= ECHO;
if(tcsetattr(STDIN_FILENO,TCSANOW,&attributes) != 0)
return (-1);
return(0);
}
int echo_off(void)
/* Don't echo input on screen */
{
struct termios attributes;
if(tcgetattr(STDIN_FILENO,&attributes) != 0)
return (-1);
attributes.c_lflag &= ~(ECHO);
if(tcsetattr(STDIN_FILENO,TCSAFLUSH,&attributes) != 0)
return (-1);
return(0);
}
int getch(void)
{
/* Einlesen von genau einem Zeichen (ohne anschl. Enter, ohne Echo) */
struct termios term, oterm;
int ch;
tcgetattr(STDIN_FILENO, &oterm);
term = oterm;
term.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &term );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oterm );
return ch;
}
int getch_nw(void)
{
/* Einlesen von genau einem Zeichen (ohne Warten, ohne Echo) */
/* gibt -1 zurueck, wenn kein Zeichen gelesen wurde */
struct termios term, oterm;
int fd = 0; /* STDIN */
int ch = 0;
tcgetattr(fd, &oterm);
term.c_lflag &= ~( ICANON | ECHO );
term.c_cc[VMIN] = 0;
term.c_cc[VTIME] = 1;
tcsetattr(fd, TCSANOW, &term);
ch = getchar();
tcsetattr(fd, TCSANOW, &oterm);
return ch;
}
#endif
Copyright © FH München, FB 04, Prof. Jürgen Plate