Ключевые слова:scancode, curses, keyboard, (найти похожие документы)
Date: Thu, 12 Dec 2002 22:00:52 +0500
From: Valentin Nechayev <netch@segfault.kiev.ua>
Newsgroups: ftn.ru.unix.prog
Subject: Определение нажатия F1 в консоли через ncurses
> Таже проблема жду нажатия F1 , а при нажатии должно вызваться меню
> но при нажатии на любую из клавиш Fx прога выходит (у меня выход по
> ESC). Тобишь передаеться два байта оно обрабатывает только первый а
Hу так убери выход по esc, он тебе мешает понимать ситуацию.
> второй нет. Хотя я ставил keypad(stdscr,TRUE); как написанно в man :
Попробовал дома.
F1-F12 отрабатывает, так же как и всю цифровую клавиатуру без numlock.
Из shift+Fn, ctrl+Fn знает только Shift+F2, остальных не знает - разбирает
на отдельные коды.
F1 показывает как 265.
Терминалы - cons25r и screen.
Под curses не пишу, все делал строго по ману.
FreeBSD 4.7, ncurses 5.1.
#include <sys/types.h>
#include <signal.h>
#include <termios.h>
#include <unistd.h>
#include <curses.h>
#include <err.h>
struct termios tio0;
void
onsig_exit( int s )
{
(void) s;
endwin();
tcsetattr( 0, TCSADRAIN, &tio0 );
exit(3);
}
int C[10];
int
main()
{
if( !isatty( 0 ) ) errx( 1, "not at terminal" );
if( tcgetattr( 0, &tio0 ) < 0 ) err( 1, "tcgetattr" );
signal( SIGINT, onsig_exit );
initscr();
cbreak();
noecho();
nonl();
intrflush( stdscr, FALSE );
keypad( stdscr, TRUE );
meta( stdscr, TRUE );
timeout( 4 );
refresh();
for(;;) {
int got, ro;
clear();
for( ro = 0; ro < 10; ++ro ) {
char B[12];
int co;
snprintf( B, sizeof B, "%d %d ", ro, C[ro] );
for( co = 0; co < strlen( B ); ++co )
mvaddch( ro, co, B[co] );
}
refresh();
got = getch();
if( got == ERR ) {
usleep( 100000 );
continue;
}
for( ro = 0; ro < 9; ++ro )
C[ro] = C[ro+1];
C[9] = got;
}
}