/** * 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); }
bool input_keyboard_ctl(enum rarch_input_keyboard_ctl_state state, void *data) { switch (state) { case RARCH_INPUT_KEYBOARD_CTL_LINE_FREE: if (g_keyboard_line) input_keyboard_line_free(g_keyboard_line); g_keyboard_line = NULL; break; case RARCH_INPUT_KEYBOARD_CTL_START_WAIT_KEYS: { input_keyboard_ctx_wait_t *keys = (input_keyboard_ctx_wait_t*)data; if (!keys) return false; g_keyboard_press_cb = keys->cb; g_keyboard_press_data = keys->userdata; } /* While waiting for input, we have to block all hotkeys. */ input_driver_keyboard_mapping_set_block(true); break; case RARCH_INPUT_KEYBOARD_CTL_CANCEL_WAIT_KEYS: g_keyboard_press_cb = NULL; g_keyboard_press_data = NULL; input_driver_keyboard_mapping_set_block(false); break; case RARCH_INPUT_KEYBOARD_CTL_DESTROY: input_driver_keyboard_linefeed_enable = false; break; case RARCH_INPUT_KEYBOARD_CTL_SET_LINEFEED_ENABLED: input_driver_keyboard_linefeed_enable = true; break; case RARCH_INPUT_KEYBOARD_CTL_UNSET_LINEFEED_ENABLED: input_driver_keyboard_linefeed_enable = false; break; case RARCH_INPUT_KEYBOARD_CTL_IS_LINEFEED_ENABLED: return input_driver_keyboard_linefeed_enable; case RARCH_INPUT_KEYBOARD_CTL_NONE: default: break; } return true; }