diff --git a/menu/drivers/zarch.c b/menu/drivers/zarch.c index d4144e4274..5dc93f0f90 100644 --- a/menu/drivers/zarch.c +++ b/menu/drivers/zarch.c @@ -119,7 +119,6 @@ typedef struct zarch_handle unsigned height; gfx_font_raster_block_t tmp_block; unsigned hash; - bool time_to_quit; struct { bool enable; @@ -881,7 +880,7 @@ static int zarch_zui_render_sidebar(zui_t *zui) if (zarch_zui_button_full(zui, x1, y1, x1 + width, y1 + 64, "Exit")) { - zui->time_to_quit = true; + menu_driver_ctl(RARCH_MENU_CTL_SET_PENDING_SHUTDOWN, NULL); return 1; } @@ -1270,14 +1269,6 @@ static int zarch_iterate(void *data, void *userdata, enum menu_action action) if (perform_action) ret = menu_entry_action(&entry, action_id, act); - if (zui->time_to_quit) - { - zui->time_to_quit = false; - if (!event_cmd_ctl(EVENT_CMD_QUIT, NULL)) - return -1; - return 0; - } - return ret; } diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 860d69cb86..f89fb1fde6 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -296,6 +296,13 @@ int menu_driver_iterate(enum menu_action action) menu_driver_ctl(RARCH_MENU_CTL_UNSET_PENDING_QUIT, NULL); return -1; } + 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 -1; + return 0; + } if (!menu_driver_ctx || !menu_driver_ctx->iterate) return -1; return menu_driver_ctx->iterate(menu_driver_data, menu_userdata, action); @@ -402,6 +409,7 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) static bool menu_driver_alive = false; static bool menu_driver_data_own = false; static bool menu_driver_pending_quit = false; + static bool menu_driver_pending_shutdown = false; static content_playlist_t *menu_driver_playlist = NULL; static struct video_shader *menu_driver_shader = NULL; settings_t *settings = config_get_ptr(); @@ -416,7 +424,17 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) case RARCH_MENU_CTL_UNSET_PENDING_QUIT: menu_driver_pending_quit = false; break; + case RARCH_MENU_CTL_IS_PENDING_SHUTDOWN: + return menu_driver_pending_shutdown; + case RARCH_MENU_CTL_SET_PENDING_SHUTDOWN: + menu_driver_pending_shutdown = true; + break; + case RARCH_MENU_CTL_UNSET_PENDING_SHUTDOWN: + menu_driver_pending_shutdown = false; + break; case RARCH_MENU_CTL_DESTROY: + menu_driver_pending_quit = false; + menu_driver_pending_shutdown = false; menu_driver_prevent_populate = false; menu_driver_load_no_content = false; menu_driver_alive = false; diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 6758f64ef8..5f922c7771 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -101,6 +101,9 @@ enum rarch_menu_ctl_state RARCH_MENU_CTL_IS_PENDING_QUIT, RARCH_MENU_CTL_SET_PENDING_QUIT, RARCH_MENU_CTL_UNSET_PENDING_QUIT, + RARCH_MENU_CTL_IS_PENDING_SHUTDOWN, + RARCH_MENU_CTL_SET_PENDING_SHUTDOWN, + RARCH_MENU_CTL_UNSET_PENDING_SHUTDOWN, RARCH_MENU_CTL_DEINIT, RARCH_MENU_CTL_INIT, RARCH_MENU_CTL_SHADER_DEINIT,