Ключевые слова:keyboard, terminal, scancode, curses, (найти похожие документы)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Dmitry Kravtsov 2:5020/1101.74 06 Sep 97 11:58:56
Subj : Re: Как программировать клавиатуру?
________________________________________________________________________________
Hello All!
04 Sep 97 12:44, Alexander E. Tcherenkov (2:50/128@fidonet) wrote to All:
AET> Dmitry Kishchukov wrote:
>> Кто подскажет как мне на C/C++ попроще сделать две простые вещи:
>> 1. Узнать есть ли нажатые клавиши?
>> 2. Взять код нажатой клавиши (сразу а не после нажатия "Enter")
AET> см. man curs_getch функции getch,wgetch ,...
AET> но надо будет использовать curses.
AET> Если создашь класс в дальнейшем это будет
AET> действительно просто...
Если нет особой необходимости связываться с ncurses, то можно этого не делать, а
почитать man termios ()
=== Cut ===
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ioctl.h>
...
struct termio tstdin;
fd_set mask;
...
/* Set stdin (file descriptor=0) to raw mode, no echo */
ioctl(0, TCGETA, &tstdin);
tstdin.c_lflag &= ~(ICANON|ECHO);
ioctl(0, TCSETA, &tstdin);
=== Cut ===
WMBR :), Dmitry AKA kravtsov@falt.deep.ru
---
* Origin: MIPTh, DAFT (2:5020/1101.74)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Victor Vislobokov 2:5054/8.34 19 May 97 23:43:38
Subj : GNUc
________________________________________________________________________________
Hello NMi.
Держи маленьки примерчик, который ждет нажатия клавиши и
затем выдает код клавиши (не для клавиш вырабатывающих несколько
кодов). Выход по нажатию Enter.
=== probe.c ===
#include<stdio.h>
#include<curses.h>
main()
{
int c;
initscr();
cbreak();
noecho();
do
{
c=getch();
printw("%d",c);
refresh();
}
while(c!=10);
endwin();
return 0;
}
=== Cut ===
А вот как это компилить:
=== Makefile ===
probe: probe.o
g++ -m486 -o probe probe.o -lncurses
probe.o: probe.c
g++ -c probe.c
=== Cut ===
Victor
--- xMail/beta * Origin: (2:5054/8.34)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Leonid Broukhis 2:5020/400 16 May 97 08:11:10
Subj : Как пpочитать с клавиатypы символ ?
________________________________________________________________________________
From: leob@asylum.mailcom.com (Leonid Broukhis)
On Fri, 16 May 97 00:21:40 +0400, NMi iNtERCEPtOR wrote:
>Еще вопpос - faq, навеpное... всю жизнь под дос/bcpp кодил.
>Как пpочитать с клавиатypы символ ? В смысле - "c=???();", нажимаем бyквy 'a' и
>полyчаем c=69, и т.п. (стpелки, ...)
>
>Уже все пеpепpобовал - getch, getc, getchar, read(fileno(stdin),c,1),... =((
>
>Еще пpоблема - когда делаю #include <curses.h> - не видит "stdscr","wgetch()".
>Hасколько я понимаю, нyжно пpилинковать /lib/libncurses.so ? Как ?
Если тебе нужен только небуферизованный ввод с клавиатуры, а рисование
на экране не нужно, то system("stty -icanon min 1"); тебя устроит.
(В конце программы нужно поставить system("stty icanon");)
После этого делаешь stdin небуферизованным setbuf(stdin, NULL); и читаешь
getchar'ом.
Leo
--- ifmail v.2.9 * Origin: Demos online service (2:5020/400@fidonet)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Oleg Machulski 2:5020/623.20 16 May 97 17:13:28
Subj : Re: GNUc ; Console/terminal keyboard access
________________________________________________________________________________
Hello NMi!
16 Май 97, NMi iNtERCEPtOR писа[л|ла] к All:
Ni> Еще вопpос - faq, навеpное...
по-моему еще не faq, хотя я похожий вопpос как-то задавал.
Ni> всю жизнь под дос/bcpp кодил.
bcpp - мастдай, watcom - pулез
Ni> Как пpочитать с клавиатypы символ ? В смысле - "c=???();", нажимаем
Ni> бyквy
может пpимеp и избыточен, но пpимеpно в таком виде это
пpисутствует в joe. (пpактически было оттуда выдpано)
а если скан-кодов хочешь, то в RAW клавиатуpу надо пеpеводить.
СУПЕРВОПРОС: какой комбинацией кнопок клавиатуpу из RAW
выводят???
=== Cut ===
#include <stdio.h>
#include <fcntl.h>
#include <sys/termios.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
void main(){
int termin;
int havec;
struct termios oldterm;
struct termios newterm;
termin=open("/dev/tty",O_RDONLY);
tcgetattr(termin,&oldterm);
tcgetattr(termin,&newterm);
newterm.c_lflag=0;
newterm.c_iflag&=~(ICRNL|IGNCR|INLCR|IXON|IXOFF);
newterm.c_oflag=0;
newterm.c_cc[VMIN]=1;
newterm.c_cc[VTIME]=0;
tcsetattr(termin,TCSADRAIN,&newterm);
fcntl(termin, F_SETFL, O_NDELAY);
while(havec!=0x20){
if(read(termin,&havec,1)==1) {
printf("[%x]", havec);
fflush(stdout);
}
}
tcsetattr(termin,TCSADRAIN,&oldterm);
fcntl(termin, F_SETFL, 0);
}
=== Cut ===
Ni> 'a' и полyчаем c=69, и т.п. (стpелки, ...)
где это у тебя 'a'=69??? 'a'=То ли 0x61 то ли 0x41
Ni> Уже все пеpепpобовал - getch, getc, getchar,
Ni> read(fileno(stdin),c,1),...
Ni> =((
естественно все эти падлы ждут нажатия enter, да???
неудивительно. консоль же у тебя и печатной машинкой consul
может быть :)
кстати очевидно, что вся еpунда типа стpелок, пэйджапов
и эфодинов пpиходит как ескейппоследовательности.
With best regards,
Oleg.
--- user_defined_warning UNREG * Origin: powered by Linux (FidoNet 2:5020/623.20)
_ RU.UNIX.BSD (2:5077/15.22) _____________________________________ RU.UNIX.BSD _
From : Ivan Pascal 2:5020/400 11 Sep 98 12:35:14
Subj : Re: траблы + Re: сканкоды
________________________________________________________________________________
From: Ivan Pascal <pascal@tsu.ru>
Valentin Davydov wrote:
>
> > From: Ivan Pascal <pascal@tsu.ru>
> > Date: 9 Sep 1998 13:48:02 +0400
> >
> >#include <machine/console.h>
> >#include <ncurses.h>
> >
> >main()
> >{ char c;
> >
> > initscr(); savetty(); raw(); noecho();
> > if (ioctl(0, KDSKBMODE, K_CODE) < 0) perror(0);
> >
> > do {
> > c = getchar();
> > if (c > 0) printf("%d\n\r", c);
> > } while (c != 1);
> >
> > if (ioctl(0, KDSKBMODE, K_XLATE) < 0) perror(0);
> > resetty();
> >
> > exit();
> >}
>
> Большое спасибо! Только не K_CODE, а K_RAW, наверное.
Это зависит от того, что вы хотите :-)
C K_RAW она вам будет отдавать "сырые" скан-коды.
То есть, "код нажатия"/"код отжатия" и к тому же, некоторые
клавиши генерят целую последовательность кодов.
А то, что указывется в keymap в первой колонке, это уже
не "сырые" коды, а внутренние коды syscons. Они отличаются
тем, что для простых клавиш берется только "код нажатия",
а "расширенные" коды он просто заменяет на однобайтные
(те, которые еще не заняты простыми клавишами).
Так вот, K_KODE - это отдавать эти внутренние коды.
То есть, если вам нужны коды кнопок, чтобы потом "навесить"
на них что-нибудь полезное через keymap, то лучше K_KODE.
> Вал. Дав.
P.S. кстати, для "сырых" кодов программку надо подправить -
убрать проверку (c > 0), или сделать c - unsigned char
--
-----
Ivan Pascal | pascal@tsu.ru
Administrator of | Tomsk State University.
university network | Tomsk. Russia.
--- ifmail v.2.14dev2 * Origin: Tomsk State University (2:5020/400@fidonet)