static int insertKey_ScreenScreen (ScreenKey key) { char *sequence; char buffer[0X10]; setScreenKeyModifiers(&key, 0); wchar_t character = key & SCR_KEY_CHAR_MASK; if (isSpecialKey(key)) { const unsigned char flags = getAuxiliaryData()[1]; #define KEY(key,string) case (key): sequence = (string); break #define CURSOR_KEY(key,string1,string2) KEY((key), ((flags & 0X01)? (string1): (string2))) switch (character) { KEY(SCR_KEY_ENTER, "\r"); KEY(SCR_KEY_TAB, "\t"); KEY(SCR_KEY_BACKSPACE, "\x7f"); KEY(SCR_KEY_ESCAPE, "\x1b"); CURSOR_KEY(SCR_KEY_CURSOR_LEFT , "\x1bOD", "\x1b[D"); CURSOR_KEY(SCR_KEY_CURSOR_RIGHT, "\x1bOC", "\x1b[C"); CURSOR_KEY(SCR_KEY_CURSOR_UP , "\x1bOA", "\x1b[A"); CURSOR_KEY(SCR_KEY_CURSOR_DOWN , "\x1bOB", "\x1b[B"); KEY(SCR_KEY_PAGE_UP, "\x1b[5~"); KEY(SCR_KEY_PAGE_DOWN, "\x1b[6~"); KEY(SCR_KEY_HOME, "\x1b[1~"); KEY(SCR_KEY_END, "\x1b[4~"); KEY(SCR_KEY_INSERT, "\x1b[2~"); KEY(SCR_KEY_DELETE, "\x1b[3~"); KEY(SCR_KEY_FUNCTION+0, "\x1bOP"); KEY(SCR_KEY_FUNCTION+1, "\x1bOQ"); KEY(SCR_KEY_FUNCTION+2, "\x1bOR"); KEY(SCR_KEY_FUNCTION+3, "\x1bOS"); KEY(SCR_KEY_FUNCTION+4, "\x1b[15~"); KEY(SCR_KEY_FUNCTION+5, "\x1b[17~"); KEY(SCR_KEY_FUNCTION+6, "\x1b[18~"); KEY(SCR_KEY_FUNCTION+7, "\x1b[19~"); KEY(SCR_KEY_FUNCTION+8, "\x1b[20~"); KEY(SCR_KEY_FUNCTION+9, "\x1b[21~"); KEY(SCR_KEY_FUNCTION+10, "\x1b[23~"); KEY(SCR_KEY_FUNCTION+11, "\x1b[24~"); KEY(SCR_KEY_FUNCTION+12, "\x1b[25~"); KEY(SCR_KEY_FUNCTION+13, "\x1b[26~"); KEY(SCR_KEY_FUNCTION+14, "\x1b[28~"); KEY(SCR_KEY_FUNCTION+15, "\x1b[29~"); KEY(SCR_KEY_FUNCTION+16, "\x1b[31~"); KEY(SCR_KEY_FUNCTION+17, "\x1b[32~"); KEY(SCR_KEY_FUNCTION+18, "\x1b[33~"); KEY(SCR_KEY_FUNCTION+19, "\x1b[34~"); default: logMessage(LOG_WARNING, "unsuported key: %04X", key); return 0; } #undef CURSOR_KEY #undef KEY } else { int byte = convertWcharToChar(character); if (byte == EOF) { logMessage(LOG_WARNING, "character not supported in local character set: 0X%04X", key); return 0; } STR_BEGIN(buffer, sizeof(buffer)); if (key & SCR_KEY_ALT_LEFT) STR_PRINTF("%c", ESC); STR_PRINTF("\\%03o", byte); STR_END; sequence = buffer; } logBytes(LOG_CATEGORY(SCREEN_DRIVER), "insert bytes", sequence, strlen(sequence)); return doScreenCommand("stuff", sequence, NULL); }
static int insertMapped (ScreenKey key) { char buffer[2]; char *sequence; char *end; if (isSpecialKey(key)) { switch (key & SCR_KEY_CHAR_MASK) { case SCR_KEY_ENTER: sequence = "\r"; break; case SCR_KEY_TAB: sequence = "\t"; break; case SCR_KEY_BACKSPACE: sequence = "\x08"; break; case SCR_KEY_ESCAPE: sequence = "\x1b"; break; case SCR_KEY_CURSOR_LEFT: return(simulateKey(105, 0)); case SCR_KEY_CURSOR_RIGHT: return(simulateKey(106, 0)); case SCR_KEY_CURSOR_UP: return(simulateKey(103, 0)); case SCR_KEY_CURSOR_DOWN: return(simulateKey(108, 0)); case SCR_KEY_PAGE_UP: return(simulateKey(104, 0)); case SCR_KEY_PAGE_DOWN: return(simulateKey(109, 0)); case SCR_KEY_HOME: return(simulateKey(102, 0)); case SCR_KEY_END: return(simulateKey(107, 0)); case SCR_KEY_INSERT: return(simulateKey(110, 0)); case SCR_KEY_DELETE: return(simulateKey(111, 0)); case SCR_KEY_FUNCTION + 0: case SCR_KEY_FUNCTION + 1: case SCR_KEY_FUNCTION + 2: case SCR_KEY_FUNCTION + 3: case SCR_KEY_FUNCTION + 4: case SCR_KEY_FUNCTION + 5: case SCR_KEY_FUNCTION + 6: case SCR_KEY_FUNCTION + 7: case SCR_KEY_FUNCTION + 8: case SCR_KEY_FUNCTION + 9: case SCR_KEY_FUNCTION + 10: return(simulateKey(key - SCR_KEY_FUNCTION + 59, 0)); case SCR_KEY_FUNCTION + 11: return(simulateKey(87, 0)); case SCR_KEY_FUNCTION + 12: return(simulateKey(88, 0)); default: logMessage(LOG_WARNING, "Key %4.4X not suported.", key); return 0; } end = sequence + strlen(sequence); } else { int character = key & SCR_KEY_CHAR_MASK; int c = convertWcharToChar(character); if (c== EOF) { logMessage(LOG_WARNING, "Character %d not supported", character); return 0; } sequence = end = buffer + ARRAY_COUNT(buffer); *--sequence = key & SCR_KEY_CHAR_MASK; if (key & SCR_KEY_ALT_LEFT) *--sequence = 0X1B; } while (sequence != end) if (simulateKey(0, *sequence++)) return 0; return 1; }