summaryrefslogtreecommitdiff
path: root/apps/gui/list.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/list.c')
-rw-r--r--apps/gui/list.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/apps/gui/list.c b/apps/gui/list.c
index d1b2748a60..5af4501b45 100644
--- a/apps/gui/list.c
+++ b/apps/gui/list.c
@@ -596,6 +596,25 @@ bool gui_synclist_keyclick_callback(int action, void* data)
596} 596}
597#endif 597#endif
598 598
599/*
600 * Magic to make sure the list gets updated correctly if the skin does
601 * something naughty like a full screen update when we are in a button
602 * loop.
603 *
604 * The GUI_EVENT_NEED_UI_UPDATE event is registered for in list_do_action_timeout()
605 * and unregistered in gui_synclict_do_button(). This is done because
606 * if something is using the list UI they *must* be calling those
607 * two functions in the correct order or the list wont work.
608 */
609static struct gui_synclist *current_lists;
610static bool ui_update_event_registered = false;
611void _lists_uiviewport_update_callback(void *data)
612{
613 (void)data;
614 if (current_lists)
615 gui_synclist_draw(current_lists);
616}
617
599bool gui_synclist_do_button(struct gui_synclist * lists, 618bool gui_synclist_do_button(struct gui_synclist * lists,
600 int *actionptr, enum list_wrap wrap) 619 int *actionptr, enum list_wrap wrap)
601{ 620{
@@ -643,6 +662,9 @@ bool gui_synclist_do_button(struct gui_synclist * lists,
643 _gui_synclist_stop_kinetic_scrolling(); 662 _gui_synclist_stop_kinetic_scrolling();
644#endif 663#endif
645 664
665 /* Disable the skin redraw callback */
666 current_lists = NULL;
667
646 switch (wrap) 668 switch (wrap)
647 { 669 {
648 case LIST_WRAP_ON: 670 case LIST_WRAP_ON:
@@ -772,6 +794,14 @@ int list_do_action_timeout(struct gui_synclist *lists, int timeout)
772/* Returns the lowest of timeout or the delay until a postponed 794/* Returns the lowest of timeout or the delay until a postponed
773 scheduled announcement is due (if any). */ 795 scheduled announcement is due (if any). */
774{ 796{
797 if (lists != current_lists)
798 {
799 if (!ui_update_event_registered)
800 ui_update_event_registered =
801 add_event(GUI_EVENT_NEED_UI_UPDATE, false,
802 _lists_uiviewport_update_callback);
803 current_lists = lists;
804 }
775 if(lists->scheduled_talk_tick) 805 if(lists->scheduled_talk_tick)
776 { 806 {
777 long delay = lists->scheduled_talk_tick -current_tick +1; 807 long delay = lists->scheduled_talk_tick -current_tick +1;