diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 4f3cbfcece..969a444027 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -289,27 +289,6 @@ int menu_driver_bind_init(menu_file_list_cbs_t *cbs, label_hash, menu_label_hash); } -bool menu_driver_iterate(enum menu_action action) -{ - if (menu_driver_ctl(RARCH_MENU_CTL_IS_PENDING_QUIT, NULL)) - { - menu_driver_ctl(RARCH_MENU_CTL_UNSET_PENDING_QUIT, NULL); - return false; - } - if (menu_driver_ctl(RARCH_MENU_CTL_IS_PENDING_SHUTDOWN, NULL)) - { - menu_driver_ctl(RARCH_MENU_CTL_UNSET_PENDING_SHUTDOWN, NULL); - if (!event_cmd_ctl(EVENT_CMD_QUIT, NULL)) - return false; - return true; - } - if (!menu_driver_ctx || !menu_driver_ctx->iterate) - return false; - if (menu_driver_ctx->iterate(menu_driver_data, menu_userdata, action) == -1) - return false; - return true; -} - static void menu_input_key_event(bool down, unsigned keycode, uint32_t character, uint16_t mod) { @@ -783,6 +762,28 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) return menu_driver_ctx->load_image(menu_userdata, load_image_info->data, load_image_info->type); } + case RARCH_MENU_CTL_ITERATE: + { + menu_ctx_iterate_t *iterate = (menu_ctx_iterate_t*)data; + + if (menu_driver_ctl(RARCH_MENU_CTL_IS_PENDING_QUIT, NULL)) + { + menu_driver_ctl(RARCH_MENU_CTL_UNSET_PENDING_QUIT, NULL); + return false; + } + if (menu_driver_ctl(RARCH_MENU_CTL_IS_PENDING_SHUTDOWN, NULL)) + { + menu_driver_ctl(RARCH_MENU_CTL_UNSET_PENDING_SHUTDOWN, NULL); + if (!event_cmd_ctl(EVENT_CMD_QUIT, NULL)) + return false; + return true; + } + if (!menu_driver_ctx || !menu_driver_ctx->iterate) + return false; + if (menu_driver_ctx->iterate(menu_driver_data, menu_userdata, iterate->action) == -1) + return false; + } + break; default: case RARCH_MENU_CTL_NONE: break; diff --git a/menu/menu_driver.h b/menu/menu_driver.h index e8926e82c1..731744c55e 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -146,7 +146,8 @@ enum rarch_menu_ctl_state RARCH_MENU_CTL_FIND_DRIVER, RARCH_MENU_CTL_LOAD_IMAGE, RARCH_MENU_CTL_LIST_CACHE, - RARCH_MENU_CTL_LIST_INSERT + RARCH_MENU_CTL_LIST_INSERT, + RARCH_MENU_CTL_ITERATE }; typedef enum @@ -339,12 +340,10 @@ typedef struct menu_ctx_list unsigned action; } menu_ctx_list_t; -extern menu_ctx_driver_t menu_ctx_xui; -extern menu_ctx_driver_t menu_ctx_rgui; -extern menu_ctx_driver_t menu_ctx_mui; -extern menu_ctx_driver_t menu_ctx_xmb; -extern menu_ctx_driver_t menu_ctx_zarch; -extern menu_ctx_driver_t menu_ctx_null; +typedef struct menu_ctx_iterate +{ + enum menu_action action; +} menu_ctx_iterate_t; /** * menu_driver_find_handle: @@ -377,8 +376,6 @@ const char* config_get_menu_driver_options(void); menu_handle_t *menu_driver_get_ptr(void); - - void menu_driver_list_free(file_list_t *list, size_t i, size_t list_size); size_t menu_driver_list_get_size(menu_list_type_t type); @@ -391,8 +388,6 @@ size_t menu_driver_list_get_selection(void); bool menu_environment_cb(menu_environ_cb_t type, void *data); -bool menu_driver_iterate(enum menu_action action); - int menu_driver_bind_init(menu_file_list_cbs_t *cbs, const char *path, const char *label, unsigned type, size_t idx, const char *elem0, const char *elem1, @@ -409,6 +404,13 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data); int menu_iterate_render(void *data, void *userdata); +extern menu_ctx_driver_t menu_ctx_xui; +extern menu_ctx_driver_t menu_ctx_rgui; +extern menu_ctx_driver_t menu_ctx_mui; +extern menu_ctx_driver_t menu_ctx_xmb; +extern menu_ctx_driver_t menu_ctx_zarch; +extern menu_ctx_driver_t menu_ctx_null; + #ifdef __cplusplus } #endif diff --git a/runloop.c b/runloop.c index 360cea6ecd..1d800c0c4b 100644 --- a/runloop.c +++ b/runloop.c @@ -1360,13 +1360,16 @@ int runloop_iterate(unsigned *sleep_ms) #ifdef HAVE_MENU if (menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL)) { + menu_ctx_iterate_t iter; bool focused = runloop_ctl(RUNLOOP_CTL_CHECK_FOCUS, NULL) && !ui_companion_is_on_foreground(); bool is_idle = runloop_ctl(RUNLOOP_CTL_IS_IDLE, NULL); enum menu_action action = (enum menu_action) menu_input_frame_retropad(cmd.state[0], cmd.state[2]); - if (!menu_driver_iterate(action)) + iter.action = action; + + if (!menu_driver_ctl(RARCH_MENU_CTL_ITERATE, &iter)) rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL); if (focused || !is_idle) diff --git a/ui/drivers/cocoa/cocoatouch_menu.m b/ui/drivers/cocoa/cocoatouch_menu.m index 3d5ddadf72..d6f5a80824 100644 --- a/ui/drivers/cocoa/cocoatouch_menu.m +++ b/ui/drivers/cocoa/cocoatouch_menu.m @@ -613,12 +613,15 @@ didSelectRowAtIndexPath:(NSIndexPath *)indexPath - (void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - switch (buttonIndex) - { - case 0: - menu_driver_iterate(MENU_ACTION_OK); - break; - } + menu_ctx_iterate_t iter; + + switch (buttonIndex) + { + case 0: + iter.action = MENU_ACTION_OK; + menu_driver_ctl(RARCH_MENU_CTL_ITERATE, &iter); + break; + } } @end