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: 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