quickscreen: redraw only the relevant viewports

rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]>
Newsgroups gmane.comp.systems.archos.rockbox.cvs
Message-ID <[email protected]>
commit 30a5f1d858903f053d23ce114338cdbed529cc7e
Author: Christian Soffke <[email protected]>
Date:   Sat Aug 15 12:50:48 2026 +0200

    quickscreen: redraw only the relevant viewports
    
    For each setting adjustment, the whole QS was
    redrawn, including icons that never change at
    all. Only redraw the viewports that contain a
    setting that has been adjusted.
    
    Change-Id: I74188fbf382a92c6e8bf517d9518c3a96bdd21ef

diff --git a/apps/gui/quickscreen.c b/apps/gui/quickscreen.c
index af42df6e65..45a0552809 100644
--- a/apps/gui/quickscreen.c
+++ b/apps/gui/quickscreen.c
@@ -173,11 +173,55 @@ static void quickscreen_fix_viewports(struct quickscreen *qs, enum screen_type s
     vps[QUICKSCREEN_RIGHT].flags  |= VP_FLAG_ALIGN_RIGHT;
 }
 
-static void quickscreen_draw(struct quickscreen *qs, enum screen_type screen)
+/* Draw QS item into current viewport */
+static void quickscreen_draw_item(struct quickscreen *qs, struct screen *display,
+                                  enum quickscreen_item i, bool single_line)
 {
-    int temp, i;
     char buf[MAX_PATH];
+    int int_value;
     unsigned const char *title, *value;
+
+    title = P2STR(ID2P(qs->items[i]->lang_id));
+    int_value = option_value_as_int(qs->items[i]);
+    value = option_get_valuestring(qs->items[i], buf, sizeof buf, int_value);
+
+    if (single_line)
+    {
+        char text[MAX_PATH];
+        snprintf(text, sizeof text, "%s: %s", title, value);
+        display->puts_scroll(0, 0, text);
+    }
+    else
+    {
+        display->puts_scroll(0, 0, title);
+        display->puts_scroll(0, 1, value);
+    }
+}
+
+/* Redraw viewports affected by the adjusted setting */
+static void quickscreen_update(struct quickscreen *qs, enum quickscreen_item selected)
+{
+    FOR_NB_SCREENS(screen)
+    {
+        struct screen *display = &screens[screen];
+        struct viewport *vps = qs->vps[screen];
+
+        for (int i = 0; i < QUICKSCREEN_ITEM_COUNT; i++)
+            if (qs->items[i] == qs->items[selected])
+            {
+                struct viewport *last_vp = display->set_viewport(&vps[i]);
+                display->clear_viewport();
+                quickscreen_draw_item(qs, display, i, viewport_get_nb_lines(&vps[i]) < 2);
+                display->set_viewport(last_vp);
+            }
+
+        skin_mark_dirty(screen);
+    }
+}
+
+/* Redraw whole Quickscreen */
+static void quickscreen_draw(struct quickscreen *qs, enum screen_type screen)
+{
     struct screen *display = &screens[screen];
     struct viewport *parent = &qs->parent[screen];
     struct viewport *vps = qs->vps[screen];
@@ -185,55 +229,33 @@ static void quickscreen_draw(struct quickscreen *qs, enum screen_type screen)
     struct viewport *last_vp = display->set_viewport(parent);
     display->clear_viewport();
 
-    for (i = 0; i < QUICKSCREEN_ITEM_COUNT; i++)
-    {
-        struct viewport *vp = &vps[i];
-        if (!qs->items[i])
-            continue;
-        display->set_viewport(vp);
-
-        title = P2STR(ID2P(qs->items[i]->lang_id));
-        temp = option_value_as_int(qs->items[i]);
-        value = option_get_valuestring(qs->items[i],
-                                       buf, sizeof buf, temp);
-
-        if (viewport_get_nb_lines(vp) < 2)
-        {
-            char text[MAX_PATH];
-            snprintf(text, sizeof text, "%s: %s", title, value);
-            display->puts_scroll(0, 0, text);
-        }
-        else
+    /* items */
+    for (int i = 0; i < QUICKSCREEN_ITEM_COUNT; i++)
+        if (qs->items[i])
         {
-            display->puts_scroll(0, 0, title);
-            display->puts_scroll(0, 1, value);
+            display->set_viewport(&vps[i]);
+            quickscreen_draw_item(qs, display, i, viewport_get_nb_lines(&vps[i]) < 2);
         }
-    }
-    /* draw the icons */
-    display->set_viewport(vp_icons);
 
-    if (qs->items[QUICKSCREEN_TOP] != NULL)
-    {
+    /* icons */
+    display->set_viewport(vp_icons);
+    if (qs->items[QUICKSCREEN_TOP])
         display->mono_bitmap(bitmap_icons_7x8[Icon_UpArrow],
-            (vp_icons->width/2) - 4, 0, 7, 8);
-    }
-    if (qs->items[QUICKSCREEN_RIGHT] != NULL)
-    {
+                             (vp_icons->width/2) - 4, 0, 7, 8);
+
+    if (qs->items[QUICKSCREEN_RIGHT])
         display->mono_bitmap(bitmap_icons_7x8[Icon_FastForward],
-            vp_icons->width - 8, (vp_icons->height/2) - 4, 7, 8);
-    }
-    if (qs->items[QUICKSCREEN_LEFT] != NULL)
-    {
+                             vp_icons->width - 8, (vp_icons->height/2) - 4, 7, 8);
+
+    if (qs->items[QUICKSCREEN_LEFT])
         display->mono_bitmap(bitmap_icons_7x8[Icon_FastBackward],
-            0, (vp_icons->height/2) - 4, 7, 8);
-    }
-    if (qs->items[QUICKSCREEN_BOTTOM] != NULL)
-    {
+                             0, (vp_icons->height/2) - 4, 7, 8);
+
+    if (qs->items[QUICKSCREEN_BOTTOM])
         display->mono_bitmap(bitmap_icons_7x8[Icon_DownArrow],
-            (vp_icons->width/2) - 4, vp_icons->height - 8, 7, 8);
-    }
+                             (vp_icons->width/2) - 4, vp_icons->height - 8, 7, 8);
 
-    skin_mark_dirty(display->screen_type);
+    skin_mark_dirty(screen);
     display->set_viewport(last_vp);
 }
 
@@ -262,39 +284,39 @@ static void talk_qs_option(const struct settings_list *opt, bool enqueue)
  *  - button : the key we are going to analyse
  * returns : true if the button corresponded to an action, false otherwise
  */
-static bool quickscreen_do_button(struct quickscreen * qs, int button)
+static bool quickscreen_do_button(struct quickscreen * qs, int button,
+                                  enum quickscreen_item *item)
 {
-    int item;
     bool previous = false;
     switch(button)
     {
         case ACTION_QS_TOP:
-            item = QUICKSCREEN_TOP;
+            *item = QUICKSCREEN_TOP;
             break;
 
         case ACTION_QS_LEFT:
-            item = QUICKSCREEN_LEFT;
+            *item = QUICKSCREEN_LEFT;
             previous = true;
             break;
 
         case ACTION_QS_DOWN:
-            item = QUICKSCREEN_BOTTOM;
+            *item = QUICKSCREEN_BOTTOM;
             previous = true;
             break;
 
         case ACTION_QS_RIGHT:
-            item = QUICKSCREEN_RIGHT;
+            *item = QUICKSCREEN_RIGHT;
             break;
 
         default:
             return false;
     }
 
-    if (qs->items[item] == NULL)
+    if (qs->items[*item] == NULL)
         return false;
 
-    option_select_next_val(qs->items[item], previous, true);
-    talk_qs_option(qs->items[item], false);
+    option_select_next_val(qs->items[*item], previous, true);
+    talk_qs_option(qs->items[*item], false);
     return true;
 }
 
@@ -363,6 +385,7 @@ static void cleanup(void *parameter)
 static void quickscreen_run(struct quickscreen * qs)
 {
     int button;
+    enum quickscreen_item item;
     /* To quit we need either :
      *  - a second press on the button that made us enter
      *  - an action taken while pressing the enter button,
@@ -407,12 +430,11 @@ static void quickscreen_run(struct quickscreen * qs)
             qs->result |= QUICKSCREEN_IN_USB;
             return;
         }
-        if (quickscreen_do_button(qs, button))
+        if (quickscreen_do_button(qs, button, &item))
         {
             qs->result |= QUICKSCREEN_CHANGED;
             can_quit = true;
-            FOR_NB_SCREENS(i)
-                quickscreen_draw(qs, i);
+            quickscreen_update(qs, item);
         }
         else if (button == qs->button_enter)
             can_quit = true;
-- 
rockbox-cvs mailing list
[email protected]
https://lists.haxx.se/mailman/listinfo/rockbox-cvs
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.