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