summaryrefslogtreecommitdiffstats
path: root/apps/gui/list.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/list.c')
-rw-r--r--apps/gui/list.c22
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)
}
#endif
+/*
+ * Magic to make sure the list gets updated correctly if the skin does
+ * something naughty like a full screen update when we are in a button
+ * loop.
+ *
+ * The GUI_EVENT_NEED_UI_UPDATE event is registered for in list_do_action_timeout()
+ * and unregistered in gui_synclict_do_button(). This is done because
+ * if something is using the list UI they *must* be calling those
+ * two functions in the correct order or the list wont work.
+ */
+static struct gui_synclist *current_lists;
+void _lists_uiviewport_update_callback(void *data)
+{
+ (void)data;
+ gui_synclist_draw(current_lists);
+}
+
bool gui_synclist_do_button(struct gui_synclist * lists,
int *actionptr, enum list_wrap wrap)
{
@@ -610,6 +627,8 @@ bool gui_synclist_do_button(struct gui_synclist * lists,
static int next_item_modifier = 1;
static int last_accel_tick = 0;
+ remove_event(GUI_EVENT_NEED_UI_UPDATE, _lists_uiviewport_update_callback);
+
if (action != ACTION_TOUCHSCREEN)
{
if (global_settings.list_accel_start_delay)
@@ -772,6 +791,9 @@ int list_do_action_timeout(struct gui_synclist *lists, int timeout)
/* Returns the lowest of timeout or the delay until a postponed
scheduled announcement is due (if any). */
{
+ current_lists = lists;
+ add_event(GUI_EVENT_NEED_UI_UPDATE, false,
+ _lists_uiviewport_update_callback);
if(lists->scheduled_talk_tick)
{
long delay = lists->scheduled_talk_tick -current_tick +1;