gui: delay updating SBS when setting list title

rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]> Wed, 29 Apr 2026 15:44:30 -0400
Newsgroups gmane.comp.systems.archos.rockbox.cvs
Message-ID <[email protected]>
commit c41beebcdad6e6e10bcc343c77fd54b4ab3dbadb
Author: Christian Soffke <[email protected]>
Date:   Wed Apr 29 09:07:41 2026 +0200

    gui: delay updating SBS when setting list title
    
    We currently force a skin refresh when setting the
    list title. This causes very noticeable flickering
    of the list, if the SBS draws over the UI viewport,
    when there is no displayable list content yet
    (For an example, check out the Adwaitapod theme).
    
    Instead, only mark the title as dirty. Later, when
    drawing the list, register for a UI update callback
    and ask the skin engine to render, so that we can
    draw the list at the same time.
    
    Note: Flickering related to display updates when
    switching activities or when toggling the theme is
    unrelated to this, and will still need to be addressed
    in separate commits.
    
    Change-Id: Icce899905aa311deccb0cc498aacce2866aaae8a

diff --git a/apps/gui/list.c b/apps/gui/list.c
index 572a7757cc..9bbe09f325 100644
--- a/apps/gui/list.c
+++ b/apps/gui/list.c
@@ -49,6 +49,8 @@
 void list_draw(struct screen *display, struct gui_synclist *list);
 
 static long last_dirty_tick;
+static bool sb_title_is_dirty;
+static bool theme_enabled;
 static struct viewport parent[NB_SCREENS];
 static struct gui_synclist *current_lists;
 
@@ -220,11 +222,32 @@ int gui_list_get_item_offset(struct gui_synclist * gui_list,
     return item_offset;
 }
 
+static void sb_title_cb(unsigned short id, void *data, void *userdata)
+{
+    (void)id;
+    (void)data;
+    theme_enabled = true;
+    gui_synclist_draw((struct gui_synclist *) userdata);
+}
+
 /*
  * Force a full screen update.
  */
 void gui_synclist_draw(struct gui_synclist *gui_list)
 {
+    if (sb_title_is_dirty)
+    {
+        sb_title_is_dirty = theme_enabled = false;
+
+        /* tell skin engine to refresh, then call us back */
+        add_event_ex(GUI_EVENT_NEED_UI_UPDATE, true, sb_title_cb, gui_list);
+        send_event(GUI_EVENT_ACTIONUPDATE, (void*)1);
+        remove_event_ex(GUI_EVENT_NEED_UI_UPDATE, sb_title_cb, gui_list);
+
+        /* sb_title_cb was only called if theme is enabled */
+        if (theme_enabled)
+            return;
+    }
     if (list_is_dirty(gui_list))
     {
         list_init_viewports(gui_list);
@@ -439,7 +462,7 @@ void gui_synclist_set_title(struct gui_synclist * gui_list,
     gui_list->title_icon = icon;
     FOR_NB_SCREENS(i)
         sb_set_title_text(title, icon, i);
-    send_event(GUI_EVENT_ACTIONUPDATE, (void*)1);
+    sb_title_is_dirty = true;
 }
 
 void gui_synclist_set_nb_items(struct gui_synclist * lists, int nb_items)
-- 
rockbox-cvs mailing list
[email protected]
https://lists.haxx.se/mailman/listinfo/rockbox-cvs