void x11_handle_key_event(XEvent *event) { if (!g_extern.system.key_event) return; static XComposeStatus state; char keybuf[32]; bool down = event->type == KeyPress; uint32_t character = 0; unsigned key = input_translate_keysym_to_rk(XLookupKeysym(&event->xkey, 0)); // FIXME: UTF-8. if (down && XLookupString(&event->xkey, keybuf, sizeof(keybuf), 0, &state)) character = keybuf[0]; // FIXME: Mod handling. g_extern.system.key_event(down, key, character, 0); }
void x11_handle_key_event(XEvent *event, XIC ic, bool filter) { int i; char keybuf[32] = {0}; uint32_t chars[32] = {0}; bool down = event->type == KeyPress; unsigned key = input_translate_keysym_to_rk(XLookupKeysym(&event->xkey, 0)); int num = 0; if (down && !filter) { KeySym keysym = 0; #ifdef X_HAVE_UTF8_STRING Status status = 0; // XwcLookupString doesn't seem to work. num = Xutf8LookupString(ic, &event->xkey, keybuf, ARRAY_SIZE(keybuf), &keysym, &status); // libc functions need UTF-8 locale to work properly, which makes mbrtowc a bit impractical. // Use custom utf8 -> UTF-32 conversion. num = conv_utf8_utf32(chars, ARRAY_SIZE(chars), keybuf, num); #else (void)ic; num = XLookupString(&event->xkey, keybuf, sizeof(keybuf), &keysym, NULL); // ASCII only. for (i = 0; i < num; i++) chars[i] = keybuf[i] & 0x7f; #endif } unsigned state = event->xkey.state; uint16_t mod = 0; mod |= (state & ShiftMask) ? RETROKMOD_SHIFT : 0; mod |= (state & LockMask) ? RETROKMOD_CAPSLOCK : 0; mod |= (state & ControlMask) ? RETROKMOD_CTRL : 0; mod |= (state & Mod1Mask) ? RETROKMOD_ALT : 0; mod |= (state & Mod4Mask) ? RETROKMOD_META : 0; input_keyboard_event(down, key, chars[0], mod); for (i = 1; i < num; i++) input_keyboard_event(down, RETROK_UNKNOWN, chars[i], mod); }
void apple_input_keyboard_event(bool down, unsigned code, uint32_t character, uint32_t mod) { code = HIDKEY(code); if (icade_enabled) { handle_icade_event(code); return; } if (small_keyboard_enabled && handle_small_keyboard(&code, down)) character = 0; if (code == 0 || code >= MAX_KEYS) return; g_current_input_data.keys[code] = down; /* This is copied here as it isn't defined in any standard iOS header */ enum { NSAlphaShiftKeyMask = 1 << 16, NSShiftKeyMask = 1 << 17, NSControlKeyMask = 1 << 18, NSAlternateKeyMask = 1 << 19, NSCommandKeyMask = 1 << 20, NSNumericPadKeyMask = 1 << 21, NSHelpKeyMask = 1 << 22, NSFunctionKeyMask = 1 << 23, NSDeviceIndependentModifierFlagsMask = 0xffff0000U }; enum retro_mod mods = RETROKMOD_NONE; mods |= (mod & NSAlphaShiftKeyMask) ? RETROKMOD_CAPSLOCK : 0; mods |= (mod & NSShiftKeyMask) ? RETROKMOD_SHIFT : 0; mods |= (mod & NSControlKeyMask) ? RETROKMOD_CTRL : 0; mods |= (mod & NSAlternateKeyMask) ? RETROKMOD_ALT : 0; mods |= (mod & NSCommandKeyMask) ? RETROKMOD_META : 0; mods |= (mod & NSNumericPadKeyMask) ? RETROKMOD_NUMLOCK : 0; input_keyboard_event(down, input_translate_keysym_to_rk(code), character, mods); }
static void rwebinput_input_poll(void *data) { rwebinput_input_t *rwebinput = (rwebinput_input_t*)data; rwebinput_state_t *state = RWebInputPoll(rwebinput->context); // get new keys for (unsigned i = 0; i < 32; i++) { if (state->keys[i] != rwebinput->state.keys[i]) { uint8_t diff = state->keys[i] ^ rwebinput->state.keys[i]; for (unsigned k = 0; diff; diff >>= 1, k++) { if (diff & 1) { input_keyboard_event((state->keys[i] & (1 << k)) != 0, input_translate_keysym_to_rk(i * 8 + k), 0, 0); } } } }