TIP: Click on subject to list as thread! ANSI
echo: artware
to: All
from: andrew clarke
date: 2003-06-12 07:34:50
subject: keytest.c

/*
 *  keytest.c
 *
 *  Uses Curses getch() to read keypresses from the user and report back
 *  what key was pressed.  Compile with gcc -o keytest keytest.c -lcurses .
 *
 *  This program written in June 2003 by Andrew Clarke 
 *  and released to the public domain.
 */

#include 
#include 
#include 
#include 

typedef struct
{
    int key;
    char *desc;
}
keytable_t;

static keytable_t keytable[] =
{
    { KEY_BREAK, "KEY_BREAK - Break key" },

    { KEY_DOWN, "KEY_DOWN - Down arrow" },
    { KEY_UP, "KEY_UP - Up arrow" },
    { KEY_LEFT, "KEY_LEFT - Left arrow" },
    { KEY_RIGHT, "KEY_RIGHT - Right arrow" },
    { KEY_HOME, "KEY_HOME - Home key (upward+left arrow)" },

    { KEY_BACKSPACE, "KEY_BACKSPACE - Backspace" },

    { KEY_F(0), "KEY_F(0) - F0" },
    { KEY_F(1), "KEY_F(1) - F1" },
    { KEY_F(2), "KEY_F(2) - F2" },
    { KEY_F(3), "KEY_F(3) - F3" },
    { KEY_F(4), "KEY_F(4) - F4" },
    { KEY_F(5), "KEY_F(5) - F5" },
    { KEY_F(6), "KEY_F(6) - F6" },
    { KEY_F(7), "KEY_F(7) - F7" },
    { KEY_F(8), "KEY_F(8) - F8" },
    { KEY_F(9), "KEY_F(9) - F9" },

    { KEY_F(10), "KEY_F(10) - F10" },
    { KEY_F(11), "KEY_F(11) - F11" },
    { KEY_F(12), "KEY_F(12) - F12" },
    { KEY_F(13), "KEY_F(13) - F13" },
    { KEY_F(14), "KEY_F(14) - F14" },
    { KEY_F(15), "KEY_F(15) - F15" },
    { KEY_F(16), "KEY_F(16) - F16" },
    { KEY_F(17), "KEY_F(17) - F17" },
    { KEY_F(18), "KEY_F(18) - F18" },
    { KEY_F(19), "KEY_F(19) - F19" },

    { KEY_F(20), "KEY_F(20) - F20" },
    { KEY_F(21), "KEY_F(21) - F21" },
    { KEY_F(22), "KEY_F(22) - F22" },
    { KEY_F(23), "KEY_F(23) - F23" },
    { KEY_F(24), "KEY_F(24) - F24" },
    { KEY_F(25), "KEY_F(25) - F25" },
    { KEY_F(26), "KEY_F(26) - F26" },
    { KEY_F(27), "KEY_F(27) - F27" },
    { KEY_F(28), "KEY_F(28) - F28" },
    { KEY_F(29), "KEY_F(29) - F29" },

    { KEY_F(30), "KEY_F(30) - F30" },
    { KEY_F(31), "KEY_F(31) - F31" },
    { KEY_F(32), "KEY_F(32) - F32" },
    { KEY_F(33), "KEY_F(33) - F33" },
    { KEY_F(34), "KEY_F(34) - F34" },
    { KEY_F(35), "KEY_F(35) - F35" },
    { KEY_F(36), "KEY_F(36) - F36" },
    { KEY_F(37), "KEY_F(37) - F37" },
    { KEY_F(38), "KEY_F(38) - F38" },
    { KEY_F(39), "KEY_F(39) - F39" },

	{ KEY_F(40), "KEY_F(40) - F40" },
    { KEY_F(41), "KEY_F(41) - F41" },
    { KEY_F(42), "KEY_F(42) - F42" },
    { KEY_F(43), "KEY_F(43) - F43" },
    { KEY_F(44), "KEY_F(44) - F44" },
    { KEY_F(45), "KEY_F(45) - F45" },
    { KEY_F(46), "KEY_F(46) - F46" },
    { KEY_F(47), "KEY_F(47) - F47" },
    { KEY_F(48), "KEY_F(48) - F48" },
    { KEY_F(49), "KEY_F(49) - F49" },

    { KEY_F(50), "KEY_F(50) - F50" },
    { KEY_F(51), "KEY_F(51) - F51" },
    { KEY_F(52), "KEY_F(52) - F52" },
    { KEY_F(53), "KEY_F(53) - F53" },
    { KEY_F(54), "KEY_F(54) - F54" },
    { KEY_F(55), "KEY_F(55) - F55" },
    { KEY_F(56), "KEY_F(56) - F56" },
    { KEY_F(57), "KEY_F(57) - F57" },
    { KEY_F(58), "KEY_F(58) - F58" },
    { KEY_F(59), "KEY_F(59) - F59" },

    { KEY_F(60), "KEY_F(60) - F60" },
    { KEY_F(61), "KEY_F(61) - F61" },
    { KEY_F(62), "KEY_F(62) - F62" },
    { KEY_F(63), "KEY_F(63) - F63" },

    { KEY_DL, "KEY_DL - Delete line" },
    { KEY_IL, "KEY_IL - Insert line" },
    { KEY_DC, "KEY_DC - Delete character" },
    { KEY_IC, "KEY_IC - Insert char or enter insert mode" },
    { KEY_EIC, "KEY_EIC - Exit insert char mode" },
    { KEY_CLEAR, "KEY_CLEAR - Clear screen" },
    { KEY_EOS, "KEY_EOS - Clear to end of screen" },
    { KEY_EOL, "KEY_EOL - Clear to end of line" },
    { KEY_SF, "KEY_SF - Scroll 1 line forward" },
    { KEY_SR, "KEY_SR - Scroll 1 line backward (reverse)" },
    { KEY_NPAGE, "KEY_NPAGE - Next page" },
    { KEY_PPAGE, "KEY_PPAGE - Previous page" },
    { KEY_STAB, "KEY_STAB - Set tab" },
    { KEY_CTAB, "KEY_CTAB - Clear tab" },
    { KEY_CATAB, "KEY_CATAB - Clear all tabs" },
    { KEY_ENTER, "KEY_ENTER - Enter or send" },
    { KEY_SRESET, "KEY_SRESET - Soft (partial) reset" },
    { KEY_RESET, "KEY_RESET - Reset or hard reset" },
    { KEY_PRINT, "KEY_PRINT - Print or copy" },
    { KEY_LL, "KEY_LL - Home down or bottom (lower left)." },
    { KEY_A1, "KEY_A1 - Upper left of keypad" },
    { KEY_A3, "KEY_A3 - Upper right of keypad" },
    { KEY_B2, "KEY_B2 - Center of keypad" },
    { KEY_C1, "KEY_C1 - Lower left of keypad" },
    { KEY_C3, "KEY_C3 - Lower right of keypad" },
    { KEY_BTAB, "KEY_BTAB - Back tab key" },
    { KEY_BEG, "KEY_BEG - Beg(inning) key" },
    { KEY_CANCEL, "KEY_CANCEL - Cancel key" },
    { KEY_CLOSE, "KEY_CLOSE - Close key" },
    { KEY_COMMAND, "KEY_COMMAND - Cmd (command) key" },
    { KEY_COPY, "KEY_COPY - Copy key" },
    { KEY_CREATE, "KEY_CREATE - Create key" },
    { KEY_END, "KEY_END - End key" },
    { KEY_EXIT, "KEY_EXIT - Exit key" },
    { KEY_FIND, "KEY_FIND - Find key" },
    { KEY_HELP, "KEY_HELP - Help key" },
    { KEY_MARK, "KEY_MARK - Mark key" },
    { KEY_MESSAGE, "KEY_MESSAGE - Message key" },
    { KEY_MOUSE, "KEY_MOUSE - Mouse event read" },
    { KEY_MOVE, "KEY_MOVE - Move key" },
    { KEY_NEXT, "KEY_NEXT - Next object key" },
    { KEY_OPEN, "KEY_OPEN - Open key" },
    { KEY_OPTIONS, "KEY_OPTIONS - Options key" },
    { KEY_PREVIOUS, "KEY_PREVIOUS - Previous object key" },
    { KEY_REDO, "KEY_REDO - Redo key" },
    { KEY_REFERENCE, "KEY_REFERENCE - Ref(erence) key" },
    { KEY_REFRESH, "KEY_REFRESH - Refresh key" },
    { KEY_REPLACE, "KEY_REPLACE - Replace key" },

#ifdef KEY_RESIZE
    { KEY_RESIZE, "KEY_RESIZE - Screen resized" },
#endif

    { KEY_RESTART, "KEY_RESTART - Restart key" },
    { KEY_RESUME, "KEY_RESUME - Resume key" },
    { KEY_SAVE, "KEY_SAVE - Save key" },
    { KEY_SBEG, "KEY_SBEG - Shifted beginning key" },
    { KEY_SCANCEL, "KEY_SCANCEL - Shifted cancel key" },
    { KEY_SCOMMAND, "KEY_SCOMMAND - Shifted command key" },
    { KEY_SCOPY, "KEY_SCOPY - Shifted copy key" },
    { KEY_SCREATE, "KEY_SCREATE - Shifted create key" },
    { KEY_SDC, "KEY_SDC - Shifted delete char key" },
    { KEY_SDL, "KEY_SDL - Shifted delete line key" },
    { KEY_SELECT, "KEY_SELECT - Select key" },
    { KEY_SEND, "KEY_SEND - Shifted end key" },
    { KEY_SEOL, "KEY_SEOL - Shifted clear line key" },
    { KEY_SEXIT, "KEY_SEXIT - Shifted exit key" },
    { KEY_SFIND, "KEY_SFIND - Shifted find key" },
    { KEY_SHELP, "KEY_SHELP - Shifted help key" },
    { KEY_SHOME, "KEY_SHOME - Shifted home key" },
    { KEY_SIC, "KEY_SIC - Shifted input key" },
    { KEY_SLEFT, "KEY_SLEFT - Shifted left arrow key" },
    { KEY_SMESSAGE, "KEY_SMESSAGE - Shifted message key" },
    { KEY_SMOVE, "KEY_SMOVE - Shifted move key" },
    { KEY_SNEXT, "KEY_SNEXT - Shifted next key" },
    { KEY_SOPTIONS, "KEY_SOPTIONS - Shifted options key" },
    { KEY_SPREVIOUS, "KEY_SPREVIOUS - Shifted prev key" },
    { KEY_SPRINT, "KEY_SPRINT - Shifted print key" },
    { KEY_SREDO, "KEY_SREDO - Shifted redo key" },
    { KEY_SREPLACE, "KEY_SREPLACE - Shifted replace key" },
    { KEY_SRIGHT, "KEY_SRIGHT - Shifted right arrow" },
    { KEY_SRSUME, "KEY_SRSUME - Shifted resume key" },
    { KEY_SSAVE, "KEY_SSAVE - Shifted save key" },
    { KEY_SSUSPEND, "KEY_SSUSPEND - Shifted suspend key" },
    { KEY_SUNDO, "KEY_SUNDO - Shifted undo key" },
    { KEY_SUSPEND, "KEY_SUSPEND - Suspend key" },
    { KEY_UNDO, "KEY_UNDO - Undo key" },

    { 0, NULL }
};

static char *keydesc(int ch)
{
    keytable_t *k;
    static char buf[10];

    k = keytable;

    while (k->key != 0)
    {
        if (k->key == ch)
        {
            return k->desc;
        }

        k++;
    }

    /* fell through */
   
    sprintf(buf, "'%c'", ch);

    return buf;
}

int main(void)
{
    int nq;

    if (initscr() == NULL)
    {
        fprintf(stderr, "initscr() failed\n");
        return EXIT_FAILURE;
    }

    addstr("Press the \"q\" key three times in sequence to
end this program.");
    move(2, 0);
    refresh();

    nq = 0;

    noecho();
    raw();
    keypad(stdscr, TRUE);
    scrollok(stdscr, TRUE);

    do
    {
        char buf[80];
        int ch;

        ch = getch();

        sprintf(buf, "%s == %4d (0x%04x)\n", keydesc(ch), ch, ch);
        addstr(buf);
        refresh();

        if (tolower(ch) == 'q')
        {
            nq++;
        }
        else
        {
            nq = 0;
        }
    }
    while (nq < 3);
   
    if (endwin() != OK)
    {
        fprintf(stderr, "endwin() failed\n");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

-- mail{at}ozzmosis.com

--- timEd/FreeBSD 1.11.b1
* Origin: Blizzard of Ozz, Mt Eliza, Melbourne, Australia (3:633/267)
SEEN-BY: 633/267 270
@PATH: 633/267

SOURCE: echomail via fidonet.ozzmosis.com

Email questions or comments to sysop@ipingthereforeiam.com
All parts of this website painstakingly hand-crafted in the U.S.A.!
IPTIA BBS/MUD/Terminal/Game Server List, © 2025 IPTIA Consulting™.