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