From 71f025c2b68195513db1a5fbc3b52e72d4b5067c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Tue, 23 Jun 2015 22:22:53 -0300 Subject: [PATCH 1/2] (RGUI) Fix delayed info/help/search screens --- menu/drivers/rgui.c | 47 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 73fb78616f..7d9a5eb7ec 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -52,6 +52,10 @@ #define TITLE_COLOR(settings) (argb32_to_rgba4444(settings->menu.title_color)) #endif +typedef struct { + char msgbox[4096]; +} rgui_t; + static INLINE uint16_t argb32_to_rgba4444(uint32_t col) { unsigned a = ((col >> 24) & 0xff) >> 4; @@ -253,6 +257,18 @@ static void rgui_render_background(void) green_filler); } +static void rgui_set_message(const char *message) +{ + menu_handle_t *menu = menu_driver_get_ptr(); + rgui_t *rgui = NULL; + + if (!menu || !menu->userdata) + return; + + rgui = (rgui_t*)menu->userdata; + strlcpy(rgui->msgbox, message, sizeof(rgui->msgbox)); +} + static void rgui_render_messagebox(const char *message) { size_t i; @@ -359,6 +375,7 @@ static void rgui_render(void) settings_t *settings = config_get_ptr(); menu_animation_t *anim = menu_animation_get_ptr(); uint64_t frame_count = video_driver_get_frame_count(); + rgui_t *rgui = NULL; title[0] = '\0'; title_buf[0] = '\0'; @@ -367,16 +384,17 @@ static void rgui_render(void) (void)driver; - if (!menu) + if (!menu || !menu->userdata) return; - if (menu_entries_needs_refresh() && menu_driver_alive() && !disp->msg_force) - return; + rgui = menu->userdata; - if (runloop->is_idle) - return; - - if (!menu_display_update_pending()) + if (menu_entries_needs_refresh() + && menu_driver_alive() + && !disp->msg_force + && runloop->is_idle + && !menu_display_update_pending() + && rgui->msgbox[0] == '\0') return; /* ensures the framebuffer will be rendered on the screen */ @@ -384,6 +402,7 @@ static void rgui_render(void) anim->is_active = false; anim->label.is_updated = false; + if (settings->menu.pointer.enable) { menu_input->pointer.ptr = menu_input->pointer.y / 11 - 2 + menu_entries_get_start(); @@ -530,6 +549,12 @@ static void rgui_render(void) rgui_render_messagebox(msg); } + if (rgui->msgbox[0] != '\0') + { + rgui_render_messagebox(rgui->msgbox); + rgui->msgbox[0] = '\0'; + } + if (settings->menu.mouse.enable) rgui_blit_cursor(menu); } @@ -539,10 +564,16 @@ static void *rgui_init(void) bool ret = false; menu_framebuf_t *frame_buf = NULL; menu_handle_t *menu = (menu_handle_t*)calloc(1, sizeof(*menu)); + rgui_t *rgui = NULL; if (!menu) return NULL; + menu->userdata = rgui = (rgui_t*)calloc(1, sizeof(rgui_t)); + + if (!rgui) + goto error; + frame_buf = &menu->display.frame_buf; /* 4 extra lines to cache the checked background */ @@ -687,7 +718,7 @@ static void rgui_populate_entries(const char *path, menu_ctx_driver_t menu_ctx_rgui = { rgui_set_texture, - rgui_render_messagebox, + rgui_set_message, rgui_render, NULL, rgui_init, From 45556766bf7ba2dde50c9746f820afcf234c9c58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Tue, 23 Jun 2015 23:07:08 -0300 Subject: [PATCH 2/2] (RGUI) Fix performance regression --- menu/drivers/rgui.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 7d9a5eb7ec..b1cdaf11ed 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -53,6 +53,7 @@ #endif typedef struct { + bool force_redraw; char msgbox[4096]; } rgui_t; @@ -259,14 +260,16 @@ static void rgui_render_background(void) static void rgui_set_message(const char *message) { - menu_handle_t *menu = menu_driver_get_ptr(); - rgui_t *rgui = NULL; + menu_handle_t *menu = menu_driver_get_ptr(); + menu_animation_t *anim = menu_animation_get_ptr(); + rgui_t *rgui = NULL; - if (!menu || !menu->userdata) + if (!menu || !menu->userdata || !anim || !message || !*message) return; rgui = (rgui_t*)menu->userdata; strlcpy(rgui->msgbox, message, sizeof(rgui->msgbox)); + rgui->force_redraw = true; } static void rgui_render_messagebox(const char *message) @@ -389,18 +392,23 @@ static void rgui_render(void) rgui = menu->userdata; - if (menu_entries_needs_refresh() - && menu_driver_alive() - && !disp->msg_force - && runloop->is_idle - && !menu_display_update_pending() - && rgui->msgbox[0] == '\0') - return; + if (!rgui->force_redraw) + { + if (menu_entries_needs_refresh() && menu_driver_alive() && !disp->msg_force) + return; + + if (runloop->is_idle) + return; + + if (!menu_display_update_pending()) + return; + } /* ensures the framebuffer will be rendered on the screen */ menu_display_fb_set_dirty(); anim->is_active = false; anim->label.is_updated = false; + rgui->force_redraw = false; if (settings->menu.pointer.enable) @@ -553,6 +561,7 @@ static void rgui_render(void) { rgui_render_messagebox(rgui->msgbox); rgui->msgbox[0] = '\0'; + rgui->force_redraw = true; } if (settings->menu.mouse.enable)