diff options
Diffstat (limited to 'apps/gui/list.c')
-rw-r--r-- | apps/gui/list.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/apps/gui/list.c b/apps/gui/list.c index d1b2748a60..96b3447728 100644 --- a/apps/gui/list.c +++ b/apps/gui/list.c | |||
@@ -596,6 +596,23 @@ 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 | */ | ||
609 | static struct gui_synclist *current_lists; | ||
610 | void _lists_uiviewport_update_callback(void *data) | ||
611 | { | ||
612 | (void)data; | ||
613 | gui_synclist_draw(current_lists); | ||
614 | } | ||
615 | |||
599 | bool gui_synclist_do_button(struct gui_synclist * lists, | 616 | bool gui_synclist_do_button(struct gui_synclist * lists, |
600 | int *actionptr, enum list_wrap wrap) | 617 | int *actionptr, enum list_wrap wrap) |
601 | { | 618 | { |
@@ -610,6 +627,8 @@ bool gui_synclist_do_button(struct gui_synclist * lists, | |||
610 | static int next_item_modifier = 1; | 627 | static int next_item_modifier = 1; |
611 | static int last_accel_tick = 0; | 628 | static int last_accel_tick = 0; |
612 | 629 | ||
630 | remove_event(GUI_EVENT_NEED_UI_UPDATE, _lists_uiviewport_update_callback); | ||
631 | |||
613 | if (action != ACTION_TOUCHSCREEN) | 632 | if (action != ACTION_TOUCHSCREEN) |
614 | { | 633 | { |
615 | if (global_settings.list_accel_start_delay) | 634 | if (global_settings.list_accel_start_delay) |
@@ -772,6 +791,9 @@ int list_do_action_timeout(struct gui_synclist *lists, int timeout) | |||
772 | /* Returns the lowest of timeout or the delay until a postponed | 791 | /* Returns the lowest of timeout or the delay until a postponed |
773 | scheduled announcement is due (if any). */ | 792 | scheduled announcement is due (if any). */ |
774 | { | 793 | { |
794 | current_lists = lists; | ||
795 | add_event(GUI_EVENT_NEED_UI_UPDATE, false, | ||
796 | _lists_uiviewport_update_callback); | ||
775 | if(lists->scheduled_talk_tick) | 797 | if(lists->scheduled_talk_tick) |
776 | { | 798 | { |
777 | long delay = lists->scheduled_talk_tick -current_tick +1; | 799 | long delay = lists->scheduled_talk_tick -current_tick +1; |