quickscreen: fix UI update when USB connected

Regression introduced in commit 7aca1d4.

Quickscreen kept redrawing itself over the USB screen,
because remove_event_ex was only called after returning
from it.

Change-Id: I8a187809781cef46d13ed45392efecb28435a9df
This commit is contained in:
Christian Soffke 2026-05-11 10:44:23 +02:00
parent 075d1deac3
commit 9bda6389ce

View file

@ -50,15 +50,17 @@
#define MARGIN 10 #define MARGIN 10
#define CENTER_ICONAREA_SIZE (MARGIN+8*2) #define CENTER_ICONAREA_SIZE (MARGIN+8*2)
struct gui_quickscreen struct quickscreen
{ {
const struct settings_list *items[QUICKSCREEN_ITEM_COUNT]; const struct settings_list *items[QUICKSCREEN_ITEM_COUNT];
struct viewport parent[NB_SCREENS]; struct viewport parent[NB_SCREENS];
struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT]; struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT];
struct viewport vp_icons[NB_SCREENS]; struct viewport vp_icons[NB_SCREENS];
int button_enter;
enum quickscreen_return result;
}; };
static void quickscreen_fix_viewports(struct gui_quickscreen *qs, enum screen_type screen) static void quickscreen_fix_viewports(struct quickscreen *qs, enum screen_type screen)
{ {
int char_height, width, pad = 0; int char_height, width, pad = 0;
int left_width = 0, right_width = 0, vert_lines; int left_width = 0, right_width = 0, vert_lines;
@ -171,7 +173,7 @@ static void quickscreen_fix_viewports(struct gui_quickscreen *qs, enum screen_ty
vps[QUICKSCREEN_RIGHT].flags |= VP_FLAG_ALIGN_RIGHT; vps[QUICKSCREEN_RIGHT].flags |= VP_FLAG_ALIGN_RIGHT;
} }
static void gui_quickscreen_draw(struct gui_quickscreen *qs, enum screen_type screen) static void quickscreen_draw(struct quickscreen *qs, enum screen_type screen)
{ {
int temp, i; int temp, i;
char buf[MAX_PATH]; char buf[MAX_PATH];
@ -193,12 +195,12 @@ static void gui_quickscreen_draw(struct gui_quickscreen *qs, enum screen_type sc
title = P2STR(ID2P(qs->items[i]->lang_id)); title = P2STR(ID2P(qs->items[i]->lang_id));
temp = option_value_as_int(qs->items[i]); temp = option_value_as_int(qs->items[i]);
value = option_get_valuestring(qs->items[i], value = option_get_valuestring(qs->items[i],
buf, MAX_PATH, temp); buf, sizeof buf, temp);
if (viewport_get_nb_lines(vp) < 2) if (viewport_get_nb_lines(vp) < 2)
{ {
char text[MAX_PATH]; char text[MAX_PATH];
snprintf(text, MAX_PATH, "%s: %s", title, value); snprintf(text, sizeof text, "%s: %s", title, value);
display->puts_scroll(0, 0, text); display->puts_scroll(0, 0, text);
} }
else else
@ -235,14 +237,13 @@ static void gui_quickscreen_draw(struct gui_quickscreen *qs, enum screen_type sc
display->set_viewport(last_vp); display->set_viewport(last_vp);
} }
static void quickscreen_update_callback(unsigned short id, static void quickscreen_draw_cb(unsigned short id, void *data, void *userdata)
void *data, void *userdata)
{ {
(void)id; (void)id;
(void)data; (void)data;
FOR_NB_SCREENS(i) FOR_NB_SCREENS(i)
gui_quickscreen_draw((struct gui_quickscreen *) userdata, i); quickscreen_draw((struct quickscreen *) userdata, i);
} }
static void talk_qs_option(const struct settings_list *opt, bool enqueue) static void talk_qs_option(const struct settings_list *opt, bool enqueue)
@ -261,7 +262,7 @@ static void talk_qs_option(const struct settings_list *opt, bool enqueue)
* - button : the key we are going to analyse * - button : the key we are going to analyse
* returns : true if the button corresponded to an action, false otherwise * returns : true if the button corresponded to an action, false otherwise
*/ */
static bool gui_quickscreen_do_button(struct gui_quickscreen * qs, int button) static bool quickscreen_do_button(struct quickscreen * qs, int button)
{ {
int item; int item;
bool previous = false; bool previous = false;
@ -341,10 +342,27 @@ static int quickscreen_touchscreen_button(void)
} }
#endif #endif
static int gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter, bool *usb) static void cleanup(void *parameter)
{
struct quickscreen *qs = (struct quickscreen *) parameter;
remove_event_ex(GUI_EVENT_NEED_UI_UPDATE, quickscreen_draw_cb, qs);
FOR_NB_SCREENS(i)
{
for (int j = 0; j < QUICKSCREEN_ITEM_COUNT; j++)
screens[i].scroll_stop_viewport(&qs->vps[i][j]);
viewportmanager_theme_undo(i, !(qs->result & QUICKSCREEN_GOTO_SHORTCUTS_MENU));
}
/* Eliminate flashing of parent during transition to Shortcuts */
if (qs->result & QUICKSCREEN_GOTO_SHORTCUTS_MENU)
pop_current_activity_without_refresh();
else
pop_current_activity();
}
static void quickscreen_run(struct quickscreen * qs)
{ {
int button; int button;
int ret = QUICKSCREEN_OK;
/* To quit we need either : /* To quit we need either :
* - a second press on the button that made us enter * - a second press on the button that made us enter
* - an action taken while pressing the enter button, * - an action taken while pressing the enter button,
@ -359,9 +377,8 @@ static int gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter
screens[i].scroll_stop(); screens[i].scroll_stop();
viewportmanager_theme_enable(i, true, &qs->parent[i]); viewportmanager_theme_enable(i, true, &qs->parent[i]);
quickscreen_fix_viewports(qs, i); quickscreen_fix_viewports(qs, i);
gui_quickscreen_draw(qs, i); quickscreen_draw(qs, i);
} }
*usb = false;
/* Announce current selection on entering this screen. This is all /* Announce current selection on entering this screen. This is all
queued up, but can be interrupted as soon as a setting is queued up, but can be interrupted as soon as a setting is
changed. */ changed. */
@ -376,7 +393,7 @@ static int gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
action_gesture_reset(); action_gesture_reset();
#endif #endif
add_event_ex(GUI_EVENT_NEED_UI_UPDATE, false, quickscreen_update_callback, qs); add_event_ex(GUI_EVENT_NEED_UI_UPDATE, false, quickscreen_draw_cb, qs);
while (true) while (true)
{ {
button = get_action(CONTEXT_QUICKSCREEN, HZ/5); button = get_action(CONTEXT_QUICKSCREEN, HZ/5);
@ -384,19 +401,20 @@ static int gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter
if (button == ACTION_TOUCHSCREEN) if (button == ACTION_TOUCHSCREEN)
button = quickscreen_touchscreen_button(); button = quickscreen_touchscreen_button();
#endif #endif
if (default_event_handler(button) == SYS_USB_CONNECTED) if (default_event_handler_ex(button, cleanup, qs)
== SYS_USB_CONNECTED)
{ {
*usb = true; qs->result |= QUICKSCREEN_IN_USB;
break; return;
} }
if (gui_quickscreen_do_button(qs, button)) if (quickscreen_do_button(qs, button))
{ {
ret |= QUICKSCREEN_CHANGED; qs->result |= QUICKSCREEN_CHANGED;
can_quit = true; can_quit = true;
FOR_NB_SCREENS(i) FOR_NB_SCREENS(i)
gui_quickscreen_draw(qs, i); quickscreen_draw(qs, i);
} }
else if (button == button_enter) else if (button == qs->button_enter)
can_quit = true; can_quit = true;
else if (button == ACTION_QS_VOLUP) { else if (button == ACTION_QS_VOLUP) {
adjust_volume(1); adjust_volume(1);
@ -410,38 +428,25 @@ static int gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter
} }
else if (button == ACTION_STD_CONTEXT) else if (button == ACTION_STD_CONTEXT)
{ {
ret |= QUICKSCREEN_GOTO_SHORTCUTS_MENU; qs->result |= QUICKSCREEN_GOTO_SHORTCUTS_MENU;
break; break;
} }
if ((button == button_enter) && can_quit) if ((button == qs->button_enter) && can_quit)
break; break;
if (button == ACTION_STD_CANCEL) if (button == ACTION_STD_CANCEL)
break; break;
} }
remove_event_ex(GUI_EVENT_NEED_UI_UPDATE, quickscreen_update_callback, qs);
/* Notify that we're exiting this screen */ /* Notify that we're exiting this screen */
cond_talk_ids_fq(VOICE_OK); cond_talk_ids_fq(VOICE_OK);
FOR_NB_SCREENS(i) cleanup(qs);
{ /* stop scrolling before exiting */
for (int j = 0; j < QUICKSCREEN_ITEM_COUNT; j++)
screens[i].scroll_stop_viewport(&qs->vps[i][j]);
viewportmanager_theme_undo(i, !(ret & QUICKSCREEN_GOTO_SHORTCUTS_MENU));
}
if (ret & QUICKSCREEN_GOTO_SHORTCUTS_MENU) /* Eliminate flashing of parent during */
pop_current_activity_without_refresh(); /* transition to Shortcuts */
else
pop_current_activity();
return ret;
} }
int quick_screen_quick(int button_enter) int quick_screen_quick(int button_enter)
{ {
struct gui_quickscreen qs; struct quickscreen qs;
bool usb = false; qs.button_enter = button_enter;
qs.result = QUICKSCREEN_OK;
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
@ -451,13 +456,12 @@ int quick_screen_quick(int button_enter)
qs.items[i] = NULL; qs.items[i] = NULL;
} }
int ret = gui_syncquickscreen_run(&qs, button_enter, &usb); quickscreen_run(&qs);
if (ret & QUICKSCREEN_CHANGED)
if (qs.result & QUICKSCREEN_CHANGED)
settings_save(); settings_save();
if (usb)
return QUICKSCREEN_IN_USB; return qs.result & ~QUICKSCREEN_CHANGED;
return ret & QUICKSCREEN_GOTO_SHORTCUTS_MENU ? QUICKSCREEN_GOTO_SHORTCUTS_MENU :
QUICKSCREEN_OK;
} }
/* stuff to make the quickscreen configurable */ /* stuff to make the quickscreen configurable */