summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/appevents.h3
-rw-r--r--apps/gui/list.c22
-rw-r--r--apps/gui/skin_engine/skin_render.c8
3 files changed, 33 insertions, 0 deletions
diff --git a/apps/appevents.h b/apps/appevents.h
index 36e19b0df7..5cb0ee57b2 100644
--- a/apps/appevents.h
+++ b/apps/appevents.h
@@ -61,6 +61,9 @@ enum {
GUI_EVENT_STATUSBAR_TOGGLE = (EVENT_CLASS_GUI|1),
GUI_EVENT_ACTIONUPDATE,
GUI_EVENT_THEME_CHANGED,
+ /* Called when the UI viewport is cleared in the skin engine to
+ * notify the current screen that it needs to do an update */
+ GUI_EVENT_NEED_UI_UPDATE,
};
/** Recording events **/
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;
diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c
index 80d8c83d27..965d785233 100644
--- a/apps/gui/skin_engine/skin_render.c
+++ b/apps/gui/skin_engine/skin_render.c
@@ -29,6 +29,7 @@
#include "config.h"
#include "core_alloc.h"
#include "kernel.h"
+#include "appevents.h"
#ifdef HAVE_ALBUMART
#include "albumart.h"
#endif
@@ -859,6 +860,13 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
display->set_framebuffer(NULL);
skin_backdrop_show(data->backdrop_id);
#endif
+
+ if (((refresh_mode&SKIN_REFRESH_ALL) == SKIN_REFRESH_ALL))
+ {
+ /* If this is the UI viewport then let the UI know
+ * to redraw itself */
+ send_event(GUI_EVENT_NEED_UI_UPDATE, NULL);
+ }
/* Restore the default viewport */
display->set_viewport(NULL);
display->update();