diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 43a78e9648..8ba5af0aae 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -4801,11 +4801,12 @@ void menu_driver_set_thumbnail_content(char *s, size_t len) void menu_driver_destroy( struct menu_state *menu_st) { - menu_st->pending_quick_menu = false; - menu_st->prevent_populate = false; - menu_st->data_own = false; - menu_st->driver_ctx = NULL; - menu_st->userdata = NULL; + menu_st->pending_quick_menu = false; + menu_st->prevent_populate = false; + menu_st->data_own = false; + menu_st->driver_ctx = NULL; + menu_st->userdata = NULL; + menu_st->input_driver_flushing_input = 0; } bool menu_driver_list_get_entry(menu_ctx_list_t *list) @@ -4928,3 +4929,61 @@ void menu_input_key_event(bool down, unsigned keycode, menu_st->kb_key_state[key] = ((menu_st->kb_key_state[key] & 1) << 1) | down; } + +const char *menu_input_dialog_get_label_setting_buffer(void) +{ + struct menu_state *menu_st = &menu_driver_state; + return menu_st->input_dialog_kb_label_setting; +} + +const char *menu_input_dialog_get_label_buffer(void) +{ + struct menu_state *menu_st = &menu_driver_state; + return menu_st->input_dialog_kb_label; +} + +unsigned menu_input_dialog_get_kb_idx(void) +{ + struct menu_state *menu_st = &menu_driver_state; + return menu_st->input_dialog_kb_idx; +} + +void menu_input_dialog_end(void) +{ + struct menu_state *menu_st = &menu_driver_state; + menu_st->input_dialog_kb_type = 0; + menu_st->input_dialog_kb_idx = 0; + menu_st->input_dialog_kb_display = false; + menu_st->input_dialog_kb_label[0] = '\0'; + menu_st->input_dialog_kb_label_setting[0] = '\0'; + + /* Avoid triggering states on pressing return. */ + /* Inhibits input for 2 frames + * > Required, since input is ignored for 1 frame + * after certain events - e.g. closing the OSK */ + menu_st->input_driver_flushing_input = 2; +} + +void menu_dialog_unset_pending_push(void) +{ + struct menu_state *menu_st = &menu_driver_state; + menu_dialog_t *p_dialog = &menu_st->dialog_st; + + p_dialog->pending_push = false; +} + +void menu_dialog_push_pending(enum menu_dialog_type type) +{ + struct menu_state *menu_st = &menu_driver_state; + menu_dialog_t *p_dialog = &menu_st->dialog_st; + p_dialog->current_type = type; + p_dialog->pending_push = true; +} + +void menu_dialog_set_current_id(unsigned id) +{ + struct menu_state *menu_st = &menu_driver_state; + menu_dialog_t *p_dialog = &menu_st->dialog_st; + + p_dialog->current_id = id; +} diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 778ae9e294..4c86f0f388 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -456,19 +456,30 @@ struct menu_state unsigned acceleration; } scroll; + /* unsigned alignment */ + unsigned input_dialog_kb_type; + unsigned input_dialog_kb_idx; + unsigned input_driver_flushing_input; + menu_dialog_t dialog_st; + /* int16_t alignment */ menu_input_pointer_hw_state_t input_pointer_hw_state; - unsigned char kb_key_state[RETROK_LAST]; - /* Storage container for current menu datetime - * representation string */ - char datetime_cache[255]; - /* When generating a menu list in menu_displaylist_build_list(), * the entry with a label matching 'pending_selection' will * be selected automatically */ char pending_selection[PATH_MAX_LENGTH]; + /* Storage container for current menu datetime + * representation string */ + char datetime_cache[255]; +#ifdef HAVE_MENU + char input_dialog_kb_label_setting[256]; + char input_dialog_kb_label[256]; +#endif + unsigned char kb_key_state[RETROK_LAST]; + + bool input_dialog_kb_display; /* when enabled, on next iteration the 'Quick Menu' list will * be pushed onto the stack */ bool pending_quick_menu; diff --git a/retroarch.c b/retroarch.c index 24fae5970b..25e0b60d69 100644 --- a/retroarch.c +++ b/retroarch.c @@ -525,30 +525,6 @@ void input_keyboard_mapping_bits(unsigned mode, unsigned key) #ifdef HAVE_MENU -void menu_dialog_unset_pending_push(void) -{ - struct rarch_state *p_rarch = &rarch_st; - menu_dialog_t *p_dialog = &p_rarch->dialog_st; - - p_dialog->pending_push = false; -} - -void menu_dialog_push_pending(enum menu_dialog_type type) -{ - struct rarch_state *p_rarch = &rarch_st; - menu_dialog_t *p_dialog = &p_rarch->dialog_st; - p_dialog->current_type = type; - p_dialog->pending_push = true; -} - -void menu_dialog_set_current_id(unsigned id) -{ - struct rarch_state *p_rarch = &rarch_st; - menu_dialog_t *p_dialog = &p_rarch->dialog_st; - - p_dialog->current_id = id; -} - static bool menu_input_key_bind_custom_bind_keyboard_cb( void *data, unsigned code) { @@ -717,7 +693,7 @@ static bool menu_input_key_bind_iterate( /* Inhibits input for 2 frames * > Required, since input is ignored for 1 frame * after certain events - e.g. closing the OSK */ - p_rarch->input_driver_flushing_input = 2; + menu_st->input_driver_flushing_input = 2; /* We won't be getting any key events, so just cancel early. */ if (timed_out) @@ -801,7 +777,7 @@ static bool menu_input_key_bind_iterate( /* Inhibits input for 2 frames * > Required, since input is ignored for 1 frame * after certain events - e.g. closing the OSK */ - p_rarch->input_driver_flushing_input = 2; + menu_st->input_driver_flushing_input = 2; new_binds.begin++; @@ -891,7 +867,7 @@ static int generic_menu_iterate( { case ITERATE_TYPE_HELP: ret = menu_dialog_iterate( - &p_rarch->dialog_st, settings, + &menu_st->dialog_st, settings, menu->menu_state_msg, sizeof(menu->menu_state_msg), current_time); @@ -1159,7 +1135,7 @@ static int generic_menu_iterate( BIT64_SET(menu->state, MENU_STATE_POST_ITERATE); /* Have to defer it so we let settings refresh. */ - if (p_rarch->dialog_st.pending_push) + if (menu_st->dialog_st.pending_push) { const char *label; menu_displaylist_info_t info; @@ -1668,7 +1644,7 @@ static bool menu_driver_init_internal( if (!menu_st->driver_data || !rarch_menu_init( menu_st, - &p_rarch->dialog_st, + &menu_st->dialog_st, menu_st->driver_ctx, &menu_st->input_state, &menu_st->input_pointer_hw_state, @@ -1818,9 +1794,9 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) command_event(CMD_EVENT_HISTORY_DEINIT, NULL); rarch_favorites_deinit(); - p_rarch->dialog_st.pending_push = false; - p_rarch->dialog_st.current_id = 0; - p_rarch->dialog_st.current_type = MENU_DIALOG_NONE; + menu_st->dialog_st.pending_push = false; + menu_st->dialog_st.current_id = 0; + menu_st->dialog_st.current_type = MENU_DIALOG_NONE; free(menu_st->driver_data); } @@ -4996,40 +4972,6 @@ bool gfx_widgets_ready(void) #ifdef HAVE_MENU -const char *menu_input_dialog_get_label_buffer(void) -{ - struct rarch_state *p_rarch = &rarch_st; - return p_rarch->menu_input_dialog_keyboard_label; -} - -const char *menu_input_dialog_get_label_setting_buffer(void) -{ - struct rarch_state *p_rarch = &rarch_st; - return p_rarch->menu_input_dialog_keyboard_label_setting; -} - -void menu_input_dialog_end(void) -{ - struct rarch_state *p_rarch = &rarch_st; - p_rarch->menu_input_dialog_keyboard_type = 0; - p_rarch->menu_input_dialog_keyboard_idx = 0; - p_rarch->menu_input_dialog_keyboard_display = false; - p_rarch->menu_input_dialog_keyboard_label[0] = '\0'; - p_rarch->menu_input_dialog_keyboard_label_setting[0] = '\0'; - - /* Avoid triggering states on pressing return. */ - /* Inhibits input for 2 frames - * > Required, since input is ignored for 1 frame - * after certain events - e.g. closing the OSK */ - p_rarch->input_driver_flushing_input = 2; -} - -unsigned menu_input_dialog_get_kb_idx(void) -{ - struct rarch_state *p_rarch = &rarch_st; - return p_rarch->menu_input_dialog_keyboard_idx; -} - bool menu_input_dialog_start_search(void) { struct rarch_state *p_rarch = &rarch_st; @@ -5044,10 +4986,10 @@ bool menu_input_dialog_start_search(void) if (!menu) return false; - p_rarch->menu_input_dialog_keyboard_display = true; - strlcpy(p_rarch->menu_input_dialog_keyboard_label, + menu_st->input_dialog_kb_display = true; + strlcpy(menu_st->input_dialog_kb_label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SEARCH), - sizeof(p_rarch->menu_input_dialog_keyboard_label)); + sizeof(menu_st->input_dialog_kb_label)); if (p_rarch->keyboard_line.buffer) free(p_rarch->keyboard_line.buffer); @@ -5080,31 +5022,31 @@ bool menu_input_dialog_start_search(void) bool menu_input_dialog_start(menu_input_ctx_line_t *line) { - struct rarch_state *p_rarch = &rarch_st; + struct rarch_state *p_rarch = &rarch_st; #ifdef HAVE_ACCESSIBILITY - settings_t *settings = p_rarch->configuration_settings; - bool accessibility_enable = settings->bools.accessibility_enable; + settings_t *settings = p_rarch->configuration_settings; + bool accessibility_enable = settings->bools.accessibility_enable; unsigned accessibility_narrator_speech_speed = settings->uints.accessibility_narrator_speech_speed; #endif - struct menu_state *menu_st = menu_state_get_ptr(); - menu_handle_t *menu = menu_st->driver_data; + struct menu_state *menu_st = menu_state_get_ptr(); + menu_handle_t *menu = menu_st->driver_data; if (!line || !menu) return false; - p_rarch->menu_input_dialog_keyboard_display = true; + menu_st->input_dialog_kb_display = true; /* Only copy over the menu label and setting if they exist. */ if (line->label) - strlcpy(p_rarch->menu_input_dialog_keyboard_label, + strlcpy(menu_st->input_dialog_kb_label, line->label, - sizeof(p_rarch->menu_input_dialog_keyboard_label)); + sizeof(menu_st->input_dialog_kb_label)); if (line->label_setting) - strlcpy(p_rarch->menu_input_dialog_keyboard_label_setting, + strlcpy(menu_st->input_dialog_kb_label_setting, line->label_setting, - sizeof(p_rarch->menu_input_dialog_keyboard_label_setting)); + sizeof(menu_st->input_dialog_kb_label_setting)); - p_rarch->menu_input_dialog_keyboard_type = line->type; - p_rarch->menu_input_dialog_keyboard_idx = line->idx; + menu_st->input_dialog_kb_type = line->type; + menu_st->input_dialog_kb_idx = line->idx; if (p_rarch->keyboard_line.buffer) free(p_rarch->keyboard_line.buffer); @@ -5138,6 +5080,7 @@ bool menu_input_dialog_start(menu_input_ctx_line_t *line) bool menu_input_dialog_get_display_kb(void) { struct rarch_state *p_rarch = &rarch_st; + struct menu_state *menu_st = menu_state_get_ptr(); #ifdef HAVE_LIBNX SwkbdConfig kbd; Result rc; @@ -5154,9 +5097,9 @@ bool menu_input_dialog_get_display_kb(void) /* swkbd only works on "real" titles */ if ( __nx_applet_type != AppletType_Application && __nx_applet_type != AppletType_SystemApplication) - return p_rarch->menu_input_dialog_keyboard_display; + return menu_st->input_dialog_kb_display; - if (!p_rarch->menu_input_dialog_keyboard_display) + if (!menu_st->input_dialog_kb_display) return false; rc = swkbdCreate(&kbd, 0); @@ -5168,7 +5111,7 @@ bool menu_input_dialog_get_display_kb(void) swkbdConfigMakePresetDefault(&kbd); swkbdConfigSetGuideText(&kbd, - p_rarch->menu_input_dialog_keyboard_label); + menu_st->input_dialog_kb_label); rc = swkbdShow(&kbd, buf, sizeof(buf)); @@ -5180,7 +5123,7 @@ bool menu_input_dialog_get_display_kb(void) for (i = 0; i < LIBNX_SWKBD_LIMIT; i++) { /* In case a previous "Enter" press closed the keyboard */ - if (!p_rarch->menu_input_dialog_keyboard_display) + if (!menu_st->input_dialog_kb_display) break; if (buf[i] == '\n' || buf[i] == '\0') @@ -5205,7 +5148,7 @@ bool menu_input_dialog_get_display_kb(void) } /* fail-safe */ - if (p_rarch->menu_input_dialog_keyboard_display) + if (menu_st->input_dialog_kb_display) input_keyboard_event(true, '\n', '\n', 0, RETRO_DEVICE_KEYBOARD); typing = false; @@ -5214,7 +5157,7 @@ bool menu_input_dialog_get_display_kb(void) } libnx_apply_overclock(); #endif - return p_rarch->menu_input_dialog_keyboard_display; + return menu_st->input_dialog_kb_display; } /* Checks if the menu is still running */ @@ -16259,8 +16202,13 @@ int16_t input_state_internal(unsigned port, unsigned device, #else const input_device_driver_t *sec_joypad = NULL; #endif - bool input_blocked = (p_rarch->input_driver_flushing_input > 0) || +#ifdef HAVE_MENU + struct menu_state *menu_st = menu_state_get_ptr(); + bool input_blocked = (menu_st->input_driver_flushing_input > 0) || p_rarch->input_driver_block_libretro_input; +#else + bool input_blocked = p_rarch->input_driver_block_libretro_input; +#endif bool bitmask_enabled = false; unsigned max_users = settings->uints.input_max_users; int16_t result = 0; @@ -24458,7 +24406,6 @@ static void retroarch_deinit_drivers( if (input_driver_st) input_driver_st->nonblocking_flag = false; - p_rarch->input_driver_flushing_input = 0; memset(&p_rarch->input_driver_turbo_btns, 0, sizeof(turbo_buttons_t)); memset(&p_rarch->input_driver_analog_requested, 0, sizeof(p_rarch->input_driver_analog_requested)); @@ -26921,7 +26868,7 @@ void retroarch_menu_running(void) } /* Prevent stray input (for a single frame) */ - p_rarch->input_driver_flushing_input = 1; + menu_st->input_driver_flushing_input = 1; #ifdef HAVE_AUDIOMIXER if (audio_enable_menu && audio_enable_menu_bgm) @@ -26993,7 +26940,7 @@ void retroarch_menu_running_finished(bool quit) /* Prevent stray input * (for a single frame) */ - p_rarch->input_driver_flushing_input = 1; + menu_st->input_driver_flushing_input = 1; if (!quit) { @@ -28397,23 +28344,24 @@ static enum runloop_state runloop_check_state( menu_toggle_gamepad_combo, current_time, &last_input))) BIT256_SET(current_bits, RARCH_MENU_TOGGLE); -#endif - if (p_rarch->input_driver_flushing_input > 0) + if (menu_st->input_driver_flushing_input > 0) { bool input_active = bits_any_set(current_bits.data, ARRAY_SIZE(current_bits.data)); - p_rarch->input_driver_flushing_input = input_active - ? p_rarch->input_driver_flushing_input - : (p_rarch->input_driver_flushing_input - 1); + menu_st->input_driver_flushing_input = input_active + ? menu_st->input_driver_flushing_input + : (menu_st->input_driver_flushing_input - 1); - if (input_active || (p_rarch->input_driver_flushing_input > 0)) + if (input_active || (menu_st->input_driver_flushing_input > 0)) { BIT256_CLEAR_ALL(current_bits); if (runloop_paused) BIT256_SET(current_bits, RARCH_PAUSE_TOGGLE); } } +#endif + if (!VIDEO_DRIVER_IS_THREADED_INTERNAL()) { diff --git a/retroarch_data.h b/retroarch_data.h index b50a0318da..58f2609379 100644 --- a/retroarch_data.h +++ b/retroarch_data.h @@ -1399,19 +1399,11 @@ struct rarch_state input_device_info_t input_device_info[MAX_INPUT_DEVICES]; input_mouse_info_t input_mouse_info[MAX_INPUT_DEVICES]; /* unsigned alignment */ -#ifdef HAVE_MENU - menu_dialog_t dialog_st; /* unsigned alignment */ -#endif #ifdef HAVE_THREAD_STORAGE sthread_tls_t rarch_tls; /* unsigned alignment */ #endif unsigned fastforward_after_frames; -#ifdef HAVE_MENU - unsigned menu_input_dialog_keyboard_type; - unsigned menu_input_dialog_keyboard_idx; -#endif - unsigned recording_width; unsigned recording_height; @@ -1425,7 +1417,6 @@ struct rarch_state unsigned video_driver_height; unsigned osk_last_codepoint; unsigned osk_last_codepoint_len; - unsigned input_driver_flushing_input; unsigned input_hotkey_block_counter; #ifdef HAVE_ACCESSIBILITY unsigned gamepad_input_override; @@ -1493,10 +1484,6 @@ struct rarch_state char video_driver_gpu_device_string[128]; char video_driver_gpu_api_version_string[128]; char error_string[255]; -#ifdef HAVE_MENU - char menu_input_dialog_keyboard_label_setting[256]; - char menu_input_dialog_keyboard_label[256]; -#endif char video_driver_window_title[512]; #ifdef HAVE_NETWORKING char server_address_deferred[512]; @@ -1668,7 +1655,6 @@ struct rarch_state input_game_focus_state_t game_focus_state; /* bool alignment */ #ifdef HAVE_MENU - bool menu_input_dialog_keyboard_display; /* Is the menu driver still running? */ bool menu_driver_alive; /* Are we binding a button inside the menu? */