getch

Juraj Hilovsky hilovsky na unipo.sk
Úterý Leden 2 08:56:21 CET 2001


Osvedcila sa mi jedna funkcia (hoci ju este treba vylepsit kvoli snimaniu
funkcnych klaves v Solarise).
V linuxe funguje ok, mam aj verziu pre DOS, ale ta je zlozitejsia.
Podstatne je pouzitie f. ioctl na zmenu parametrov vstupu.
Ostatne si uz prisposobite podla vlastnych poziadaviek.
Tato f. vrati kod (pripadne esc-sekvenciu) stlacenej klavesy ako 4-bajtovy
int.
// ------
// #define LINUX
// #define SOLARIS

#include <stdio.h>

#include <termios.h>
#include <sys/ioctl.h>

int Skm()
{
 struct termios ts;
 struct termios nts;
 int d,i,pocet,kod;
 ioctl(0, TCGETS, &ts);   // nacitanie parametrov vstupu
 nts=ts;
 nts.c_lflag &= !ICANON;  // non-canonical input
// nts.c_lflag &= !ECHO;   // vypnutie echa
 nts.c_cc[VMIN] = 1;      // minimum znakov = 1
// nts.c_cc[VTIME] = 0;
 ioctl(0, TCSETS, &nts);  // zapis zmenenych parametrov vstupu
 kod=0;                 // vynulovanie bafra
 kod=getchar();
#ifdef SOLARIS
 while((typ==1 && kod==0x1b) ||stdin->_cnt>0) kod=256*kod+getchar();
#endif
#ifdef LINUX
 while(stdin->_IO_read_ptr<stdin->_IO_read_end) kod=256*kod+getchar();
#endif
 ioctl(0, TCSETS, &ts);   // obnovenie povodnych parametrov vstupu
 return kod;
}
// ---------
Nech Vam sluzi k spokojnosti.
Prajem vela zdravia a stastia v novom roku, storoci, tisicroci atd.
Lebo ako povedal isty clovek, na Titaniku boli vsetci zdravi, dokonca mali
aj peniaze, ale nemali stastie.
jh

----- Original Message -----
From: Martin Žižka <zizka na bigfoot.com>
To: Linux <linux na linux.cz>
Sent: Saturday, December 23, 2000 2:15 AM
Subject: getch


> Potreboval bych ve skriptu pockat a vyhodnotit stisknutou klavesu. Problem
> je v tom, ze jsem neprisel na to, jak to provest. V BASHi 2.neco umi READ
> cist jenom jeden znak, tak je to mozne s urcitymi obtizemi take resit,
> jenomze ja bych to potreboval, aby to behalo i pod starsim BASHem. Zkousel
> jsem najit i nejakou C funkci, ktera by tohle resila, ze bych si napsal
> nejaky externi programek, ale getchar() nacte cely radek az do stisku
Enter
> a vrati prvni znak = nepouzitelne a jedina dalsi funkce, kterou jsem nasel
> je getch z knihovny ncurses, jenomze to aby fungovalo se musi
> nainicializovat (initscr) a soucasti te inicializace je vymaz obrazovky =
> nepouzitelne, v dobe cekani na klavesu musi byt na obrazovce informace...
> Jak tohle resit?
>
> M.
>




Další informace o konferenci Linux