/*----------------------------------------------------------------*/ /* whatkey.c Keven Miller 02/01/2012 kevenm@3kranger.com */ /* Unix: cc -g -o whatkey whatkey.c -lncurses */ /*----------------------------------------------------------------*/ #include #include /* getenv */ #include /* memset */ #include #include /* tcgetattr termios */ #include int k_intr = 0; int k_quit = 0; int k_susp = 0; int mr, mc; char *tp; struct termios tbuf; mmask_t mouse_mask; /*----------------------------------------------------------------*/ void trap (int sig) { int c; switch (sig) { case SIGINT: c = k_intr; break; case SIGQUIT: c = k_quit; break; case SIGTSTP: c = k_susp; break; default: c = -1; } printw ("Sig %d %3d 0x%2.2X ^%c\n", sig, c, c, c | '@' ); printw ("--------------------\n"); refresh (); signal (sig, &trap ); } /*----------------------------------------------------------------*/ void head () { getmaxyx ( stdscr, mr, mc ); move (0,0); printw ("TERM=%s Intr=%s Quit=%s Susp=%s tty Iflags=0x%4.4x\n", tp, unctrl (k_intr), unctrl (k_quit), unctrl (k_susp), tbuf.c_iflag ); printw ("K toggle keypad C toggle raw/cbreak S Status M toggle mouse\n"); printw ("Press Q twice consecutive to exit (window rows %d cols %d)\n", mr, mc ); printw ("---------------------------------\n"); refresh (); } /*----------------------------------------------------------------*/ int main (int argc, char *argv[]) { int ch, nd, lin, kp, cb, mo, cnt, done; char *cp; struct termios tbuf; MEVENT mevt; tp = getenv ("TERM"); if (!tp) tp = "--Not Set--"; if ( tcgetattr ( 0, &tbuf )) memset ( &tbuf, 0, sizeof(tbuf)); k_intr = tbuf.c_cc [VINTR]; k_quit = tbuf.c_cc [VQUIT]; k_susp = tbuf.c_cc [VSUSP]; signal (SIGINT, &trap); signal (SIGQUIT, &trap); signal (SIGTSTP, &trap); initscr (); noecho (); nd = 0; nodelay (stdscr, nd); cb = 0; raw (); kp = 0; keypad (stdscr, kp); mo = 0; memset ( &mouse_mask, 0, sizeof (mouse_mask)); getmaxyx ( stdscr, mr, mc ); lin = mr -1; cnt = 0; scrollok (stdscr, 1); setscrreg (4, lin); head (); for ( done = 0; !done;) { ch = getch (); if (ERR == ch) { nd = 0; nodelay (stdscr, nd); printw ("--------------------\n"); continue; } cp = keyname (ch); printw ("[%c] %3d 0x%2.2X %s", ( ch >= ' ' && ch <= '~' ? ch : '.' ), ch, ch, cp ); if ( ch == KEY_MOUSE ) { if ( ERR != getmouse ( &mevt )) { printw ( " Row %d Col %d state %x", mevt.y, mevt.x, mevt.bstate ); } } printw ("\n"); refresh (); if ( !nd ) { switch (ch) { case 'K': kp = ( kp ? 0 : 1 ); keypad (stdscr, kp); printw ("keypad %d\n", kp); break; case 'C': cb = ( cb ? 0 : 1 ); if (cb) cbreak (); else raw (); printw ("cbreak %d\n", cb); break; case 'S': printw ("keypad %d cbreak %d nodelay %d mouse %d\n", kp, cb, nd, mo ); break; case 'M': mo = ( mo ? 0 : 1 ); if (mo) mousemask ( BUTTON1_RELEASED, &mouse_mask ); else mousemask ( mouse_mask, 0 ); printw ("mouse %d\n", mo); break; } if ( ch != 'Q' ) cnt = 0; else if ( ++cnt > 1 ) done = 1; } nd = 1; nodelay (stdscr, nd); } if (nd) nodelay (stdscr,0); if (mo) mousemask ( mouse_mask, 0 ); endwin (); return 0; } /*----------------------------------------------------------------*/