diff options
author | William Wilgus <wilgus.william@gmail.com> | 2023-11-24 16:17:33 -0500 |
---|---|---|
committer | William Wilgus <wilgus.william@gmail.com> | 2023-11-24 16:17:33 -0500 |
commit | b6ce98c55c31039fdc8189b4cbe0bb7e56eaf894 (patch) | |
tree | 30163c508e0c9708775a21dfb831e7f8bd5c222c /apps/gui/yesno.c | |
parent | cb3b5397b34eb6ad181b2c9d32996152f28d3974 (diff) | |
download | rockbox-b6ce98c55c31039fdc8189b4cbe0bb7e56eaf894.tar.gz rockbox-b6ce98c55c31039fdc8189b4cbe0bb7e56eaf894.zip |
[BugFix] yesno screen disappears
sending GUI_EVENT_NEED_UI_UPDATE ensured we got redrawn but it also
sometimes resulted in the yesno screen being overdrawn
depending on which event callback was called last
now increasing the update frequency,
clear the dirty bit on whatever vp we are replacing
and well as call our redraw function instead of sending UI_UPDATE
also found a potential bug in get_font()
Change-Id: I1da6defa6db799a4778590daa0c107aba00a9d34
Diffstat (limited to 'apps/gui/yesno.c')
-rw-r--r-- | apps/gui/yesno.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/apps/gui/yesno.c b/apps/gui/yesno.c index 6056d239a6..a0fd908727 100644 --- a/apps/gui/yesno.c +++ b/apps/gui/yesno.c | |||
@@ -88,7 +88,7 @@ static void gui_yesno_draw(struct gui_yesno * yn) | |||
88 | enum yesno_res def_res = yn->tmo_default_res; | 88 | enum yesno_res def_res = yn->tmo_default_res; |
89 | long end_tick = yn->end_tick; | 89 | long end_tick = yn->end_tick; |
90 | 90 | ||
91 | last_vp = display->set_viewport(vp); | 91 | last_vp = display->set_viewport_ex(vp, VP_FLAG_VP_SET_CLEAN); |
92 | display->clear_viewport(); | 92 | display->clear_viewport(); |
93 | nb_lines = yn->main_message->nb_lines; | 93 | nb_lines = yn->main_message->nb_lines; |
94 | vp_lines = viewport_get_nb_lines(vp); | 94 | vp_lines = viewport_get_nb_lines(vp); |
@@ -182,9 +182,10 @@ static bool gui_yesno_draw_result(struct gui_yesno * yn, enum yesno_res result) | |||
182 | const struct text_message * message=yn->result_message[result]; | 182 | const struct text_message * message=yn->result_message[result]; |
183 | struct viewport *vp = yn->vp; | 183 | struct viewport *vp = yn->vp; |
184 | struct screen * display=yn->display; | 184 | struct screen * display=yn->display; |
185 | struct viewport *last_vp = display->set_viewport_ex(vp, VP_FLAG_VP_SET_CLEAN); | ||
186 | |||
185 | if(message==NULL) | 187 | if(message==NULL) |
186 | return false; | 188 | return false; |
187 | struct viewport *last_vp = display->set_viewport(vp); | ||
188 | display->clear_viewport(); | 189 | display->clear_viewport(); |
189 | put_message(yn->display, message, 0, viewport_get_nb_lines(vp)); | 190 | put_message(yn->display, message, 0, viewport_get_nb_lines(vp)); |
190 | display->update_viewport(); | 191 | display->update_viewport(); |
@@ -223,21 +224,16 @@ enum yesno_res gui_syncyesno_run_w_tmo(int ticks, enum yesno_res tmo_default_res | |||
223 | { | 224 | { |
224 | int button; | 225 | int button; |
225 | int result=-1; | 226 | int result=-1; |
226 | bool result_displayed; | 227 | bool result_displayed = false; |
227 | struct gui_yesno yn[NB_SCREENS]; | 228 | struct gui_yesno yn[NB_SCREENS]; |
228 | struct viewport vp[NB_SCREENS]; | 229 | struct viewport vp[NB_SCREENS]; |
229 | long talked_tick = 0; | 230 | long talked_tick = 0; |
230 | long end_tick = current_tick + ticks; | 231 | long end_tick = current_tick + ticks; |
231 | long button_scan_tmo; | 232 | long button_scan_tmo = HZ/2; |
232 | 233 | ||
233 | if (ticks >= HZ) /* Display a prompt with timeout to the user */ | 234 | if (ticks < HZ) /* Display a prompt with NO timeout to the user */ |
234 | { | ||
235 | button_scan_tmo = HZ/2; | ||
236 | } | ||
237 | else | ||
238 | { | 235 | { |
239 | tmo_default_res = YESNO_TMO; | 236 | tmo_default_res = YESNO_TMO; |
240 | button_scan_tmo = HZ*5; | ||
241 | } | 237 | } |
242 | 238 | ||
243 | FOR_NB_SCREENS(i) | 239 | FOR_NB_SCREENS(i) |
@@ -278,7 +274,8 @@ enum yesno_res gui_syncyesno_run_w_tmo(int ticks, enum yesno_res tmo_default_res | |||
278 | talked_tick = current_tick; | 274 | talked_tick = current_tick; |
279 | talk_text_message(main_message, false); | 275 | talk_text_message(main_message, false); |
280 | } | 276 | } |
281 | send_event(GUI_EVENT_NEED_UI_UPDATE, NULL); | 277 | FOR_NB_SCREENS(i) |
278 | gui_yesno_draw(&yn[i]); | ||
282 | 279 | ||
283 | button = get_action(CONTEXT_YESNOSCREEN, button_scan_tmo); | 280 | button = get_action(CONTEXT_YESNOSCREEN, button_scan_tmo); |
284 | 281 | ||
@@ -340,12 +337,14 @@ enum yesno_res gui_syncyesno_run_w_tmo(int ticks, enum yesno_res tmo_default_res | |||
340 | : no_message, false); | 337 | : no_message, false); |
341 | talk_force_enqueue_next(); | 338 | talk_force_enqueue_next(); |
342 | } | 339 | } |
343 | if(result_displayed) | 340 | |
344 | sleep(HZ); | ||
345 | 341 | ||
346 | exit: | 342 | exit: |
347 | remove_event_ex(GUI_EVENT_NEED_UI_UPDATE, gui_yesno_ui_update, &yn[0]); | 343 | remove_event_ex(GUI_EVENT_NEED_UI_UPDATE, gui_yesno_ui_update, &yn[0]); |
348 | 344 | ||
345 | if(result_displayed) | ||
346 | sleep(HZ); | ||
347 | |||
349 | FOR_NB_SCREENS(i) | 348 | FOR_NB_SCREENS(i) |
350 | { | 349 | { |
351 | screens[i].scroll_stop_viewport(yn[i].vp); | 350 | screens[i].scroll_stop_viewport(yn[i].vp); |