static int insertKey_AtSpiScreen (ScreenKey key) { long keysym; int modMeta=0, modControl=0; setKeyModifiers(&key, SCR_KEY_CONTROL); if (isSpecialKey(key)) { switch (key & SCR_KEY_CHAR_MASK) { case SCR_KEY_ENTER: keysym = XK_KP_Enter; break; case SCR_KEY_TAB: keysym = XK_Tab; break; case SCR_KEY_BACKSPACE: keysym = XK_BackSpace; break; case SCR_KEY_ESCAPE: keysym = XK_Escape; break; case SCR_KEY_CURSOR_LEFT: keysym = XK_Left; break; case SCR_KEY_CURSOR_RIGHT: keysym = XK_Right; break; case SCR_KEY_CURSOR_UP: keysym = XK_Up; break; case SCR_KEY_CURSOR_DOWN: keysym = XK_Down; break; case SCR_KEY_PAGE_UP: keysym = XK_Page_Up; break; case SCR_KEY_PAGE_DOWN: keysym = XK_Page_Down; break; case SCR_KEY_HOME: keysym = XK_Home; break; case SCR_KEY_END: keysym = XK_End; break; case SCR_KEY_INSERT: keysym = XK_Insert; break; case SCR_KEY_DELETE: keysym = XK_Delete; break; case SCR_KEY_FUNCTION + 0: keysym = XK_F1; break; case SCR_KEY_FUNCTION + 1: keysym = XK_F2; break; case SCR_KEY_FUNCTION + 2: keysym = XK_F3; break; case SCR_KEY_FUNCTION + 3: keysym = XK_F4; break; case SCR_KEY_FUNCTION + 4: keysym = XK_F5; break; case SCR_KEY_FUNCTION + 5: keysym = XK_F6; break; case SCR_KEY_FUNCTION + 6: keysym = XK_F7; break; case SCR_KEY_FUNCTION + 7: keysym = XK_F8; break; case SCR_KEY_FUNCTION + 8: keysym = XK_F9; break; case SCR_KEY_FUNCTION + 9: keysym = XK_F10; break; case SCR_KEY_FUNCTION + 10: keysym = XK_F11; break; case SCR_KEY_FUNCTION + 11: keysym = XK_F12; break; case SCR_KEY_FUNCTION + 12: keysym = XK_F13; break; case SCR_KEY_FUNCTION + 13: keysym = XK_F14; break; case SCR_KEY_FUNCTION + 14: keysym = XK_F15; break; case SCR_KEY_FUNCTION + 15: keysym = XK_F16; break; case SCR_KEY_FUNCTION + 16: keysym = XK_F17; break; case SCR_KEY_FUNCTION + 17: keysym = XK_F18; break; case SCR_KEY_FUNCTION + 18: keysym = XK_F19; break; case SCR_KEY_FUNCTION + 19: keysym = XK_F20; break; case SCR_KEY_FUNCTION + 20: keysym = XK_F21; break; case SCR_KEY_FUNCTION + 21: keysym = XK_F22; break; case SCR_KEY_FUNCTION + 22: keysym = XK_F23; break; case SCR_KEY_FUNCTION + 23: keysym = XK_F24; break; case SCR_KEY_FUNCTION + 24: keysym = XK_F25; break; case SCR_KEY_FUNCTION + 25: keysym = XK_F26; break; case SCR_KEY_FUNCTION + 26: keysym = XK_F27; break; case SCR_KEY_FUNCTION + 27: keysym = XK_F28; break; case SCR_KEY_FUNCTION + 28: keysym = XK_F29; break; case SCR_KEY_FUNCTION + 29: keysym = XK_F30; break; case SCR_KEY_FUNCTION + 30: keysym = XK_F31; break; case SCR_KEY_FUNCTION + 31: keysym = XK_F32; break; case SCR_KEY_FUNCTION + 32: keysym = XK_F33; break; case SCR_KEY_FUNCTION + 33: keysym = XK_F34; break; case SCR_KEY_FUNCTION + 34: keysym = XK_F35; break; default: logMessage(LOG_WARNING, "key not insertable: %04X", key); return 0; } } else { wchar_t wc; if (key & SCR_KEY_ALT_LEFT) { key &= ~SCR_KEY_ALT_LEFT; modMeta = 1; } if (key & SCR_KEY_CONTROL) { key &= ~SCR_KEY_CONTROL; modControl = 1; } wc = key & SCR_KEY_CHAR_MASK; if (wc < 0x100) keysym = wc; /* latin1 character */ else keysym = 0x1000000 | wc; } logMessage(LOG_DEBUG, "inserting key: %04X -> %s%s%ld", key, (modMeta? "meta ": ""), (modControl? "control ": ""), keysym); { int ok = 0; if (!modMeta || SPI_generateKeyboardEvent(XK_Meta_L,NULL,SPI_KEY_PRESS)) { if (!modControl || SPI_generateKeyboardEvent(XK_Control_L,NULL,SPI_KEY_PRESS)) { if (SPI_generateKeyboardEvent(keysym,NULL,SPI_KEY_SYM)) { ok = 1; } else { logMessage(LOG_WARNING, "key insertion failed."); } if (modControl && !SPI_generateKeyboardEvent(XK_Control_L,NULL,SPI_KEY_RELEASE)) { logMessage(LOG_WARNING, "control release failed."); ok = 0; } } else { logMessage(LOG_WARNING, "control press failed."); } if (modMeta && !SPI_generateKeyboardEvent(XK_Meta_L,NULL,SPI_KEY_RELEASE)) { logMessage(LOG_WARNING, "meta release failed."); ok = 0; } } else { logMessage(LOG_WARNING, "meta press failed."); } return ok; } }
static int insertKey_ScreenScreen (ScreenKey key) { const unsigned char flags = getAuxiliaryData()[1]; wchar_t character = key & SCR_KEY_CHAR_MASK; char buffer[3]; char *sequence; logMessage(LOG_DEBUG, "insert key: %04X", key); setKeyModifiers(&key, 0); if (isSpecialKey(key)) { #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); } sequence = buffer + sizeof(buffer); *--sequence = 0; *--sequence = byte; if (key & SCR_KEY_ALT_LEFT) *--sequence = 0X1B; } return doScreenCommand("stuff", sequence, NULL); }