🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #2055

Re: alternative zu getch ?

#2055
From: Erik Thiele
Date: Tue, 09 Apr 1996 08:35
89 lines
2699 bytes
In article <4k1cmh$fnp@c4.hrz.uni-giessen.de>,
	l045@felix.hrz.uni-giessen.de (Ronald Woelfel) writes:
>Weiss jemand ne Moeglichkeit ein Zeichen in C einzuloesen
>ohne dass ein Enter erforderlich ist. Die Loesung soll
>auch unter Unix funktionieren, also getch is nicht.
>Danke im voraus

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <termios.h>

/***************************************************
Gibt 0 zurueck, falls keine Taste gedrueckt wurde,
ansonsten Ergebnis ungleich 0.
***************************************************/

int kbhit()
{
        fd_set a;
        FD_ZERO(&a);
        FD_SET(0,&a);

        timeval t;
        t.tv_usec=0;
        t.tv_sec=0;

        return(select(1,&a,NULL,NULL,&t));
};

/***************************************************
Gibt ein Byte aus STDIN zurueck.
Falls keines vorhanden ist, wird unendlich lang
gewartet, bis eins vorhanden ist.
***************************************************/

char getch()
{
        char a;
        read(0,&a,1);
        return(a);
};

int main()
{
        // ** Initialisierung des Terminals in den Kanonenmodus :-)
        termios a;
        if (tcgetattr ( 0, &a )) perror("FUCK !");
        a.c_lflag&=~ICANON;
        if (tcsetattr (0,TCSANOW,&a)) perror("FUCK2 !");


        while (!kbhit()) {
                printf("Warte immernoch auf Tastendruck\n");
                usleep(500);
        };


        char b;
        read(0,&b,1);
        printf(" You pressed the glourious %c key :-) \n ",b);


        // ** Deinitialisierung des Terminals in den Normalmodus :-(
        if (tcgetattr ( 0, &a )) perror("FUCK3 !");
        a.c_lflag|=ICANON;
        if (tcsetattr (0,TCSANOW,&a)) perror("FUCK4 !");

        return(0);
};

Du musst das Terminal erst in den ICANON modus schalten. sonst schickt es
seine Daten erst beim Druck auf Enter. im ICANON modus hingegen kommt byte
fuer byte an.

ob in einem stream was vorhanden ist fragt man mit select ab.

das ganze laeuft auf gcc 2.7.0 mit linux 1.2.13


tschuesss...
Erik

--
EMAIL: erik@master.unterland.de        \\\\
IRC:   erikyyy                         o `QQ'_
                                        /   __8
                                        '  `
Technical Details
Message-ID: <4kd7g3$7f@master.unterland.de>
Path: arc1-ca.pugleaf.net!master.unterland.de!news
References: <4k1cmh$fnp@c4.hrz.uni-giessen.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!master.unterland.de!news
From: erik@master.unterland.de (Erik Thiele)
Newsgroups: de.comp.lang.c++
Subject: Re: alternative zu getch ?
Date: 9 Apr 1996 08:35:15 GMT
Organization: private
Message-ID: <4kd7g3$7f@master.unterland.de>
References: <4k1cmh$fnp@c4.hrz.uni-giessen.de>
NNTP-Posting-Host: master.unterland.de
X-Newsreader: knews 0.9.3