diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index eace635fc6..118a06a316 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -2746,10 +2746,6 @@ static bool gl2_frame(void *data, const void *frame, #endif } } - -#ifdef HAVE_MENU_WIDGETS - menu_widgets_frame(video_info); -#endif #endif #ifdef HAVE_OVERLAY @@ -2757,6 +2753,10 @@ static bool gl2_frame(void *data, const void *frame, gl2_render_overlay(gl, video_info); #endif +#ifdef HAVE_MENU_WIDGETS + menu_widgets_frame(video_info); +#endif + if (!string_is_empty(msg)) { if (video_info->msg_bgcolor_enable) diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index fa86e8c179..328fc5c2cc 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -1928,18 +1928,18 @@ static bool vulkan_frame(void *data, const void *frame, (const struct font_params*)&video_info->osd_stat_params); } } - -#ifdef HAVE_MENU_WIDGETS - menu_widgets_frame(video_info); #endif + +#ifdef HAVE_OVERLAY + if (vk->overlay.enable) + vulkan_render_overlay(vk, video_info); #endif if (!string_is_empty(msg)) font_driver_render_msg(video_info, NULL, msg, NULL); -#ifdef HAVE_OVERLAY - if (vk->overlay.enable) - vulkan_render_overlay(vk, video_info); +#ifdef HAVE_MENU_WIDGETS + menu_widgets_frame(video_info); #endif /* End the render pass. We're done rendering to backbuffer now. */ diff --git a/menu/widgets/menu_widgets.c b/menu/widgets/menu_widgets.c index 27163b2a57..e15d1631e9 100644 --- a/menu/widgets/menu_widgets.c +++ b/menu/widgets/menu_widgets.c @@ -463,7 +463,10 @@ static bool menu_widgets_msg_queue_push_internal(retro_task_t *task, const char unsigned new_width = font_driver_get_message_width(font_regular, task->title, len, msg_queue_text_scale_factor); if (msg_widget->msg_new) + { free(msg_widget->msg_new); + msg_widget->msg_new = NULL; + } msg_widget->msg_new = strdup(task->title); msg_widget->msg_len = len; @@ -606,9 +609,17 @@ static void menu_widgets_msg_queue_free(menu_widget_msg_t *msg, bool touch_list) size_t i; menu_animation_ctx_tag tag = (uintptr_t) msg; - /* Update tasks count */ if (msg->task_ptr) + { + /* remove the reference the task has of ourself + only if the task is not finished already + (finished tasks are freed before the widget) */ + if (!msg->task_finished && !msg->task_error && !msg->task_cancelled) + msg->task_ptr->frontend_userdata = NULL; + + /* update tasks count */ msg_queue_tasks_count--; + } /* Kill all animations */ menu_timer_kill(&msg->hourglass_timer); @@ -1553,7 +1564,7 @@ void menu_widgets_frame(video_frame_info_t *video_info) menu_widgets_draw_icon(video_info, icon_size, icon_size, volume_icon, - 0, 0, + 0, 0, video_info->width, video_info->height, 0, 1, menu_widgets_pure_white ); @@ -1602,7 +1613,7 @@ void menu_widgets_frame(video_frame_info_t *video_info) (int)(volume_percent * 100.0f)); menu_display_draw_text(font_regular, - msg, + msg, volume_width - simple_widget_padding, settings->floats.video_font_size * 2, video_info->width, video_info->height, text_color_db, @@ -1716,8 +1727,6 @@ void menu_widgets_init(bool video_is_threaded) if (menu_widgets_inited) return; - menu_widgets_inited = true; - if (!menu_display_init_first_driver(video_is_threaded)) goto err; @@ -1735,7 +1744,10 @@ void menu_widgets_init(bool video_is_threaded) if (!current_msgs) goto err; - file_list_reserve(current_msgs, MSG_QUEUE_ONSCREEN_MAX); + if (!file_list_reserve(current_msgs, MSG_QUEUE_ONSCREEN_MAX)) + goto err; + + menu_widgets_inited = true; return; err: @@ -1948,6 +1960,7 @@ void menu_widgets_free(void) } fifo_free(msg_queue); + msg_queue = NULL; } /* Purge everything from the list */ @@ -1961,19 +1974,30 @@ void menu_widgets_free(void) menu_widgets_msg_queue_free(msg, false); } file_list_free(current_msgs); + current_msgs = NULL; } + msg_queue_tasks_count = 0; + /* Achievement notification */ menu_widgets_achievement_free(NULL); - /* Screenshot texture */ - video_driver_texture_unload(&screenshot_texture); - /* Font */ video_coord_array_free(&font_raster_regular.carr); video_coord_array_free(&font_raster_bold.carr); font_driver_bind_block(NULL, NULL); + + /* Reset state of all other widgets */ + /* Generic message*/ + generic_message[0] = '\0'; + + /* Volume */ + volume_alpha = 0.0f; + + /* Screenshot */ + screenshot_alpha = 0.0f; + menu_widgets_screenshot_dispose(NULL); } static void menu_widgets_volume_timer_end(void *userdata)