void android_keycode_to_emulator(int keyCode, int metaState, bool pressed) { int key = -1; bool isASCII = true; do { if ((keyCode >= KEYCODE_NUMPAD_0) && (keyCode <= KEYCODE_NUMPAD_9)) { key = keyCode - ASCII_NUMPAD_0_OFFSET; break; } else if ((keyCode >= KEYCODE_A) && (keyCode <= KEYCODE_Z)) { key = caps_lock || _is_shifted(metaState) ? (keyCode + ASCII_UCASE_OFFSET) : (keyCode + ASCII_LCASE_OFFSET); break; } else if ((keyCode >= KEYCODE_F1) && (keyCode <= KEYCODE_F12)) { isASCII = false; key = keyCode - FN_OFFSET; break; } switch (keyCode) { case KEYCODE_BUTTON_A: case KEYCODE_BUTTON_X: case KEYCODE_BUTTON_L1: joydriver_setButton0Pressed(pressed); return; case KEYCODE_BUTTON_B: case KEYCODE_BUTTON_Y: case KEYCODE_BUTTON_R1: joydriver_setButton1Pressed(pressed); return; } switch (keyCode) { case KEYCODE_0: key = _is_shifted(metaState) ? ')' : keyCode + ASCII_0_OFFSET; break; case KEYCODE_1: key = _is_shifted(metaState) ? '!' : keyCode + ASCII_0_OFFSET; break; case KEYCODE_2: key = _is_shifted(metaState) ? '@' : keyCode + ASCII_0_OFFSET; break; case KEYCODE_3: key = _is_shifted(metaState) ? '#' : keyCode + ASCII_0_OFFSET; break; case KEYCODE_4: key = _is_shifted(metaState) ? '$' : keyCode + ASCII_0_OFFSET; break; case KEYCODE_5: key = _is_shifted(metaState) ? '%' : keyCode + ASCII_0_OFFSET; break; case KEYCODE_6: key = _is_shifted(metaState) ? '^' : keyCode + ASCII_0_OFFSET; break; case KEYCODE_7: key = _is_shifted(metaState) ? '&' : keyCode + ASCII_0_OFFSET; break; case KEYCODE_8: key = _is_shifted(metaState) ? '*' : keyCode + ASCII_0_OFFSET; break; case KEYCODE_9: key = _is_shifted(metaState) ? '(' : keyCode + ASCII_0_OFFSET; break; case KEYCODE_APOSTROPHE: key = _is_shifted(metaState) ? '"' : '\''; break; case KEYCODE_AT: key = '@'; break; case KEYCODE_BACKSLASH: key = _is_shifted(metaState) ? '|' : '\\'; break; case KEYCODE_COMMA: key = _is_shifted(metaState) ? '<' : ','; break; case KEYCODE_EQUALS: key = _is_shifted(metaState) ? '+' : '='; break; case KEYCODE_GRAVE: key = _is_shifted(metaState) ? '~' : '`'; break; case KEYCODE_LEFT_BRACKET: key = _is_shifted(metaState) ? '{' : '['; break; case KEYCODE_MINUS: key = _is_shifted(metaState) ? '_' : '-'; break; case KEYCODE_NUMPAD_ADD: key = '+'; break; case KEYCODE_NUMPAD_COMMA: key = ','; break; case KEYCODE_NUMPAD_DIVIDE: key = '/'; break; case KEYCODE_NUMPAD_DOT: key = '.'; break; case KEYCODE_NUMPAD_EQUALS: key = '='; break; case KEYCODE_NUMPAD_LEFT_PAREN: key = '('; break; case KEYCODE_NUMPAD_RIGHT_PAREN: key = ')'; break; case KEYCODE_NUMPAD_MULTIPLY: key = '*'; break; case KEYCODE_NUMPAD_SUBTRACT: key = '-'; break; case KEYCODE_PERIOD: key = _is_shifted(metaState) ? '>' : '.'; break; case KEYCODE_PLUS: key = '+'; break; case KEYCODE_POUND: key = '#'; break; case KEYCODE_RIGHT_BRACKET: key = _is_shifted(metaState) ? '}' : ']'; break; case KEYCODE_SEMICOLON: key = _is_shifted(metaState) ? ':' : ';'; break; case KEYCODE_SLASH: key = _is_shifted(metaState) ? '?' : '/'; break; case KEYCODE_SPACE: key = ' '; break; case KEYCODE_STAR: key = '*'; break; default: break; } if (key != -1) { break; } // META isASCII = false; switch (keyCode) { case KEYCODE_DPAD_LEFT: key = SCODE_L; break; case KEYCODE_DPAD_RIGHT: key = SCODE_R; break; case KEYCODE_DPAD_DOWN: key = SCODE_D; break; case KEYCODE_DPAD_UP: key = SCODE_U; break; case KEYCODE_DPAD_CENTER: key = SCODE_HOME; break; case KEYCODE_PAGE_UP: key = SCODE_PGUP; break; case KEYCODE_PAGE_DOWN: key = SCODE_PGDN; break; case KEYCODE_INSERT: key = SCODE_INS; break; case KEYCODE_SHIFT_LEFT: key = SCODE_L_SHIFT; break; case KEYCODE_SHIFT_RIGHT: key = SCODE_R_SHIFT; break; case KEYCODE_CTRL_LEFT: key = SCODE_L_CTRL; break; case KEYCODE_CTRL_RIGHT: key = SCODE_R_CTRL; break; case KEYCODE_ALT_LEFT: case KEYCODE_META_LEFT: key = SCODE_L_ALT; break; case KEYCODE_ALT_RIGHT: case KEYCODE_META_RIGHT: key = SCODE_R_ALT; break; case KEYCODE_BREAKPAUSE: key = SCODE_BRK; break; case KEYCODE_CAPS_LOCK: caps_lock = (metaState & META_CAPS_LOCK_ON); return; case KEYCODE_DEL: key = SCODE_L;// DEL is prolly not what they meant =P break; case KEYCODE_ENTER: key = SCODE_RET; break; case KEYCODE_TAB: key = SCODE_TAB; break; case KEYCODE_ESC: key = SCODE_ESC; break; default: break; } } while (0); //LOG("keyCode:%08x -> key:%02x ('%c') metaState:%08x", keyCode, key, key, metaState); if (isASCII && _is_ctrl(metaState)) { key = c_keys_ascii_to_scancode(key); c_keys_handle_input(key, true, false); isASCII = false; pressed = false; } assert(key < 0x80); c_keys_handle_input(key, pressed, isASCII); }
// Map glut keys into Apple//ix internal-representation scancodes. static int _glutkey_to_scancode(int key) { switch (key) { case GLUT_KEY_F1: key = SCODE_F1; break; case GLUT_KEY_F2: key = SCODE_F2; break; case GLUT_KEY_F3: key = SCODE_F3; break; case GLUT_KEY_F4: key = SCODE_F4; break; case GLUT_KEY_F5: key = SCODE_F5; break; case GLUT_KEY_F6: key = SCODE_F6; break; case GLUT_KEY_F7: key = SCODE_F7; break; case GLUT_KEY_F8: key = SCODE_F8; break; case GLUT_KEY_F9: key = SCODE_F9; break; case GLUT_KEY_F10: key = SCODE_F10; break; case GLUT_KEY_F11: key = SCODE_F11; break; case GLUT_KEY_F12: key = SCODE_F12; break; case GLUT_KEY_LEFT: key = SCODE_L; break; case GLUT_KEY_RIGHT: key = SCODE_R; break; case GLUT_KEY_DOWN: key = SCODE_D; break; case GLUT_KEY_UP: key = SCODE_U; break; case GLUT_KEY_PAGE_UP: key = SCODE_PGUP; break; case GLUT_KEY_PAGE_DOWN: key = SCODE_PGDN; break; case GLUT_KEY_HOME: key = SCODE_HOME; break; case GLUT_KEY_END: key = SCODE_END; break; case GLUT_KEY_INSERT: key = SCODE_INS; break; case GLUT_KEY_SHIFT_L: key = SCODE_L_SHIFT; break; case GLUT_KEY_SHIFT_R: key = SCODE_R_SHIFT; break; case GLUT_KEY_CTRL_L: key = SCODE_L_CTRL; break; case GLUT_KEY_CTRL_R: key = SCODE_R_CTRL; break; case GLUT_KEY_ALT_L: key = SCODE_L_ALT; break; case GLUT_KEY_ALT_R: key = SCODE_R_ALT; break; //--------------------------------------------------------------------- // GLUT does not appear to differentiate keypad keys? //case XK_KP_5: case GLUT_KEY_BEGIN: key = SCODE_KPAD_C; break; default: key = c_keys_ascii_to_scancode(key); break; } assert(key < 0x80); return key; }