diff --git a/driver.c b/driver.c index c42872bdde..faf70c86a0 100644 --- a/driver.c +++ b/driver.c @@ -508,9 +508,10 @@ bool driver_update_system_av_info(const struct retro_system_av_info *info) #ifdef HAVE_MENU static void init_menu(void) { - if (!driver.menu_ctx) - find_menu_driver(); + if (driver.menu) + return; + find_menu_driver(); if (!(driver.menu = (rgui_handle_t*)menu_init(driver.menu_ctx))) { RARCH_ERR("Cannot initialize menu.\n"); @@ -547,6 +548,9 @@ void init_drivers(void) g_extern.system.hw_render_callback.context_reset(); driver.video_cache_context_ack = false; + if (driver.menu_ctx && driver.menu_ctx->context_reset) + driver.menu_ctx->context_reset(driver.menu); + init_audio(); #ifdef HAVE_CAMERA @@ -631,9 +635,15 @@ void uninit_drivers(void) if (g_extern.system.hw_render_callback.context_destroy && !driver.video_cache_context) g_extern.system.hw_render_callback.context_destroy(); + if (driver.menu_ctx && driver.menu_ctx->context_destroy) + driver.menu_ctx->context_destroy(driver.menu); + #ifdef HAVE_MENU if (!driver.menu_data_own) + { menu_free(driver.menu); + driver.menu = NULL; + } #endif uninit_video_input(); diff --git a/driver.h b/driver.h index 6540c8f0d7..f1e2738608 100644 --- a/driver.h +++ b/driver.h @@ -418,8 +418,8 @@ typedef struct menu_ctx_driver void (*frame)(void); void* (*init)(void); void (*free)(void*); - void (*init_assets)(void*); - void (*free_assets)(void*); + void (*context_reset)(void*); + void (*context_destroy)(void*); void (*populate_entries)(void*, unsigned); void (*iterate)(void*, unsigned); int (*input_postprocess)(uint64_t); diff --git a/frontend/menu/disp/lakka.c b/frontend/menu/disp/lakka.c index 5487175cc1..8649bfe818 100644 --- a/frontend/menu/disp/lakka.c +++ b/frontend/menu/disp/lakka.c @@ -1019,7 +1019,7 @@ static GLuint png_texture_load(const char * file_name, int * width, int * height return texture; } -static void lakka_free_assets(void *data) +static void lakka_context_destroy(void *data) { (void)data; @@ -1036,7 +1036,7 @@ static void lakka_free_assets(void *data) free(tweens); } -static void lakka_init_assets(void *data) +static void lakka_context_reset(void *data) { char path[256], dirpath[256];; rgui_handle_t *rgui = (rgui_handle_t*)data; @@ -1190,13 +1190,10 @@ static void lakka_init_items(int i, menu_category_t *category, core_info_t *info } - static void lakka_free(void *data) { rgui_handle_t *rgui = (rgui_handle_t*)data; - lakka_free_assets(rgui); - if (rgui->alloc_font) free((uint8_t*)rgui->font); } @@ -1246,7 +1243,6 @@ static void *lakka_init(void) init_font(gl, g_settings.video.font_path, g_settings.video.font_size, gl->win_width, gl->win_height); lakka_init_core_info(rgui); - lakka_init_assets(rgui); if (categories) { @@ -1358,8 +1354,8 @@ const menu_ctx_driver_t menu_ctx_lakka = { lakka_frame, lakka_init, lakka_free, - lakka_init_assets, - lakka_free_assets, + lakka_context_reset, + lakka_context_destroy, NULL, NULL, lakka_input_postprocess, diff --git a/frontend/menu/disp/rmenu.c b/frontend/menu/disp/rmenu.c index 4b8565e25c..c9b8476a11 100644 --- a/frontend/menu/disp/rmenu.c +++ b/frontend/menu/disp/rmenu.c @@ -450,7 +450,7 @@ void rmenu_set_texture(void *data, bool enable) } } -static void rmenu_init_assets(void *data) +static void rmenu_context_reset(void *data) { rgui_handle_t *rgui = (rgui_handle_t*)data; @@ -476,19 +476,16 @@ static void *rmenu_init(void) if (!rgui) return NULL; - rmenu_init_assets(rgui); - return rgui; } -static void rmenu_free_assets(void *data) +static void rmenu_context_destroy(void *data) { texture_image_free(driver.video_data, menu_texture); } static void rmenu_free(void *data) { - rmenu_free_assets(data); } static int rmenu_input_postprocess(uint64_t old_state) @@ -524,8 +521,8 @@ const menu_ctx_driver_t menu_ctx_rmenu = { NULL, rmenu_init, rmenu_free, - rmenu_init_assets, - rmenu_free_assets, + rmenu_context_reset, + rmenu_context_destroy, NULL, NULL, rmenu_input_postprocess, diff --git a/retroarch.c b/retroarch.c index 6e013d4a09..e7d03b43a1 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1963,6 +1963,10 @@ static void check_savestates(bool immutable) void rarch_set_fullscreen(bool fullscreen) { +#ifdef HAVE_MENU + driver.menu_data_own = true; // Don't reinit menu for something trivial. +#endif + g_settings.video.fullscreen = fullscreen; driver.video_cache_context = g_extern.system.hw_render_callback.cache_context; driver.video_cache_context_ack = false; @@ -1973,6 +1977,10 @@ void rarch_set_fullscreen(bool fullscreen) // Poll input to avoid possibly stale data to corrupt things. if (driver.input) input_poll_func(); + +#ifdef HAVE_MENU + driver.menu_data_own = false; +#endif } bool rarch_check_fullscreen(void)