/** * input_keyboard_event: * @down : Keycode was pressed down? * @code : Keycode. * @character : Character inputted. * @mod : TODO/FIXME: ??? * * Keyboard event utils. Called by drivers when keyboard events are fired. * This interfaces with the global system driver struct and libretro callbacks. **/ void input_keyboard_event(bool down, unsigned code, uint32_t character, uint16_t mod, unsigned device) { static bool deferred_wait_keys; rarch_system_info_t *system = rarch_system_info_get_ptr(); if (deferred_wait_keys) { if (down) return; input_keyboard_wait_keys_cancel(); deferred_wait_keys = false; } else if (g_keyboard_press_cb) { if (!down) return; if (code == RETROK_UNKNOWN) return; if (g_keyboard_press_cb(g_keyboard_press_data, code)) return; deferred_wait_keys = true; } else if (g_keyboard_line) { if (!down) return; switch (device) { case RETRO_DEVICE_POINTER: if (!input_keyboard_line_event(g_keyboard_line, (code != 0x12d) ? (char)code : character)) return; break; default: if (!input_keyboard_line_event(g_keyboard_line, character)) return; break; } /* Line is complete, can free it now. */ input_keyboard_line_free(g_keyboard_line); g_keyboard_line = NULL; /* Unblock all hotkeys. */ input_driver_keyboard_mapping_set_block(false); } else if (system->key_event) system->key_event(down, code, character, mod); }
/** * input_keyboard_event: * @down : Keycode was pressed down? * @code : Keycode. * @character : Character inputted. * @mod : TODO/FIXME: ??? * * Keyboard event utils. Called by drivers when keyboard events are fired. * This interfaces with the global system driver struct and libretro callbacks. **/ void input_keyboard_event(bool down, unsigned code, uint32_t character, uint16_t mod, unsigned device) { static bool deferred_wait_keys; if (code == RETROK_RETURN || code == RETROK_UNKNOWN) return_pressed = down; if (deferred_wait_keys) { if (down) return; g_keyboard_press_cb = NULL; g_keyboard_press_data = NULL; input_driver_keyboard_mapping_set_block(false); deferred_wait_keys = false; } else if (g_keyboard_press_cb) { if (!down || code == RETROK_UNKNOWN) return; if (g_keyboard_press_cb(g_keyboard_press_data, code)) return; deferred_wait_keys = true; } else if (g_keyboard_line) { if (!down) return; switch (device) { case RETRO_DEVICE_POINTER: if (code != 0x12d) character = (char)code; /* fall-through */ default: if (!input_keyboard_line_event(g_keyboard_line, character)) return; break; } /* Line is complete, can free it now. */ input_keyboard_ctl(RARCH_INPUT_KEYBOARD_CTL_LINE_FREE, NULL); /* Unblock all hotkeys. */ input_driver_keyboard_mapping_set_block(false); } else { retro_keyboard_event_t *key_event = NULL; runloop_ctl(RUNLOOP_CTL_KEY_EVENT_GET, &key_event); if (key_event && *key_event) (*key_event)(down, code, character, mod); } }