diff --git a/apps/appevents.h b/apps/appevents.h
index e3c4a92ff8..f7e695d4a9 100644
--- a/apps/appevents.h
+++ b/apps/appevents.h
@@ -48,9 +48,9 @@ enum {
/** Generic GUI class events **/
enum {
- GUI_EVENT_THEME_CHANGED = (EVENT_CLASS_GUI|1),
- GUI_EVENT_STATUSBAR_TOGGLE,
+ GUI_EVENT_STATUSBAR_TOGGLE = (EVENT_CLASS_GUI|1),
GUI_EVENT_ACTIONUPDATE,
+ GUI_EVENT_REFRESH,
};
#endif
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index a4a399d616..ea53d445fd 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -100,6 +100,7 @@
#if CONFIG_RTC == RTC_PCF50605
#include "pcf50605.h"
#endif
+#include "appevents.h"
#if CONFIG_CPU == DM320 || CONFIG_CPU == S3C2440 || CONFIG_CPU == TCC7801 \
|| CONFIG_CPU == IMX31L || CONFIG_CPU == AS3525 || CONFIG_CPU == JZ4732
@@ -2790,6 +2791,7 @@ static int menu_action_callback(int btn, struct gui_synclist *lists)
int oldbars = viewportmanager_set_statusbar(VP_SB_HIDE_ALL);
menuitems[gui_synclist_get_sel_pos(lists)].function();
btn = ACTION_REDRAW;
+ send_event(GUI_EVENT_REFRESH, NULL);
viewportmanager_set_statusbar(oldbars);
}
return btn;
diff --git a/apps/filetree.c b/apps/filetree.c
index 2d05bd54cf..ec7932435d 100644
--- a/apps/filetree.c
+++ b/apps/filetree.c
@@ -181,6 +181,11 @@ static void check_file_thumbnails(struct tree_context* c)
closedir(dir);
}
+static void filetree_drawlists(void)
+{
+ gui_synclist_draw(&tree_lists);
+}
+
/* support function for qsort() */
static int compare(const void* p1, const void* p2)
{
@@ -508,7 +513,13 @@ int ft_enter(struct tree_context* c)
splash(0, ID2P(LANG_WAIT));
if (!settings_load_config(buf,true))
break;
- gui_synclist_draw(&tree_lists);
+ /* do both steps seperately so that the redrawing after theme
+ * changing is independant of whether the theme has a custom ui
+ * vp or not */
+ send_event(GUI_EVENT_REFRESH, NULL);
+ /* for the statusbar */
+ send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
+ filetree_drawlists();
splash(HZ, ID2P(LANG_SETTINGS_LOADED));
break;
@@ -618,6 +629,8 @@ int ft_enter(struct tree_context* c)
}
}
+ send_event(GUI_EVENT_REFRESH, filetree_drawlists);
+
if ( play ) {
/* the resume_index must always be the index in the
shuffled list in case shuffle is enabled */
diff --git a/apps/gui/list.c b/apps/gui/list.c
index 8a65d3f298..3627f12221 100644
--- a/apps/gui/list.c
+++ b/apps/gui/list.c
@@ -55,29 +55,37 @@ static int offset_step = 16; /* pixels per screen scroll step */
/* should lines scroll out of the screen */
static bool offset_out_of_view = false;
#endif
-static int force_list_reinit = false;
static void gui_list_select_at_offset(struct gui_synclist * gui_list,
int offset);
void list_draw(struct screen *display, struct gui_synclist *list);
#ifdef HAVE_LCD_BITMAP
-static struct viewport parent[NB_SCREENS];
-void list_init_viewports(struct gui_synclist *list)
+static void list_init_viewports(struct gui_synclist *list)
{
+ struct viewport* vp;
int i;
- struct viewport *vp;
- FOR_NB_SCREENS(i)
+ bool parent_used = (*list->parent != NULL);
+ if (!parent_used)
{
- vp = &parent[i];
- if (!list || list->parent[i] == vp)
- viewport_set_defaults(vp, i);
+ vp = viewport_get_current_vp();
+ FOR_NB_SCREENS(i)
+ list->parent[i] = &vp[i];
}
#ifdef HAVE_BUTTONBAR
- if (list && (list->parent[0] == &parent[0]) && global_settings.buttonbar)
+ if (list && !parent_used[SCREEN_MAIN] && global_settings.buttonbar)
list->parent[0]->height -= BUTTONBAR_HEIGHT;
#endif
- force_list_reinit = false;
+}
+#else
+#define list_init_viewports(a)
+#endif
+
+#ifdef HAVE_LCD_BITMAP
+bool list_display_title(struct gui_synclist *list, enum screen_type screen)
+{
+ return list->title != NULL &&
+ viewport_get_nb_lines(list->parent[screen])>2;
}
#else
static struct viewport parent[NB_SCREENS] =
@@ -90,20 +98,6 @@ static struct viewport parent[NB_SCREENS] =
.height = LCD_HEIGHT
},
};
-void list_init_viewports(struct gui_synclist *list)
-{
- (void)list;
- force_list_reinit = false;
-}
-#endif
-
-#ifdef HAVE_LCD_BITMAP
-bool list_display_title(struct gui_synclist *list, enum screen_type screen)
-{
- return list->title != NULL &&
- viewport_get_nb_lines(list->parent[screen])>2;
-}
-#else
#define list_display_title(l, i) false
#endif
@@ -141,9 +135,12 @@ void gui_synclist_init(struct gui_synclist * gui_list,
if (list_parent)
gui_list->parent[i] = &list_parent[i];
else
- {
- gui_list->parent[i] = &parent[i];
- }
+ gui_list->parent[i] =
+#ifdef HAVE_LCD_BITMAP
+ NULL;
+#else
+ &parent[i];
+#endif
}
list_init_viewports(gui_list);
gui_list->limit_scroll = false;
@@ -162,7 +159,6 @@ void gui_synclist_init(struct gui_synclist * gui_list,
gui_list->title_color = -1;
gui_list->callback_get_item_color = NULL;
#endif
- force_list_reinit = true;
}
/* this toggles the selection bar or cursor */
@@ -218,7 +214,7 @@ void gui_synclist_draw(struct gui_synclist *gui_list)
#ifdef HAVE_BUTTONBAR
static bool last_buttonbar = false;
#endif
- if (force_list_reinit ||
+ if (
#ifdef HAVE_BUTTONBAR
last_buttonbar != screens[SCREEN_MAIN].has_buttonbar ||
#endif
@@ -436,7 +432,6 @@ void gui_synclist_set_title(struct gui_synclist * gui_list,
} else {
gui_list->title_width = 0;
}
- force_list_reinit = true;
}
diff --git a/apps/gui/list.h b/apps/gui/list.h
index 50aaebe93a..23997e8a65 100644
--- a/apps/gui/list.h
+++ b/apps/gui/list.h
@@ -139,8 +139,6 @@ extern void gui_list_screen_scroll_step(int ofs);
extern void gui_list_screen_scroll_out_of_view(bool enable);
#endif /* HAVE_LCD_BITMAP */
-void list_init_viewports(struct gui_synclist * lists);
-
extern void gui_synclist_init(
struct gui_synclist * lists,
list_get_name callback_get_item_name,
diff --git a/apps/gui/statusbar.c b/apps/gui/statusbar.c
index 5e215090f5..024ade330f 100644
--- a/apps/gui/statusbar.c
+++ b/apps/gui/statusbar.c
@@ -263,7 +263,7 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw)
memcmp(&(bar->info), &(bar->lastinfo), sizeof(struct status_info)))
{
struct viewport vp;
- viewport_set_defaults(&vp, display->screen_type);
+ viewport_set_fullscreen(&vp, display->screen_type);
vp.height = STATUSBAR_HEIGHT;
vp.x = STATUSBAR_X_POS;
if (statusbar_position(display->screen_type) != STATUSBAR_BOTTOM)
diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c
index ef527d90cc..bb4c291cc0 100644
--- a/apps/gui/viewport.c
+++ b/apps/gui/viewport.c
@@ -56,6 +56,22 @@
static int statusbar_enabled = 0;
+#ifdef HAVE_LCD_BITMAP
+
+static struct {
+ struct viewport* vp;
+ int active;
+} ui_vp_info;
+
+static struct viewport custom_vp[NB_SCREENS];
+
+/* callbacks for GUI_EVENT_* events */
+static void viewportmanager_ui_vp_changed(void *param);
+static void statusbar_toggled(void* param);
+static int viewport_init_ui_vp(void);
+#endif
+static void viewportmanager_redraw(void* data);
+
int viewport_get_nb_lines(struct viewport *vp)
{
#ifdef HAVE_LCD_BITMAP
@@ -78,9 +94,9 @@ static bool showing_bars(enum screen_type screen)
#endif
}
return false;
-}
+}
-void viewport_set_defaults(struct viewport *vp, enum screen_type screen)
+void viewport_set_fullscreen(struct viewport *vp, enum screen_type screen)
{
vp->x = 0;
vp->width = screens[screen].lcdwidth;
@@ -120,6 +136,30 @@ void viewport_set_defaults(struct viewport *vp, enum screen_type screen)
#endif
}
+void viewport_set_defaults(struct viewport *vp, enum screen_type screen)
+{
+#ifdef HAVE_LCD_BITMAP
+ if (ui_vp_info.active)
+ *vp = custom_vp[screen];
+ else
+#endif
+ viewport_set_fullscreen(vp, screen);
+}
+
+void viewportmanager_init(void)
+{
+ viewportmanager_set_statusbar(VP_SB_ALLSCREENS);
+#ifdef HAVE_LCD_BITMAP
+ add_event(GUI_EVENT_STATUSBAR_TOGGLE, false, statusbar_toggled);
+ ui_vp_info.active = viewport_init_ui_vp();
+ ui_vp_info.vp = custom_vp;
+#endif
+}
+
+int viewportmanager_get_statusbar(void)
+{
+ return statusbar_enabled;
+}
int viewportmanager_set_statusbar(int enabled)
{
@@ -133,37 +173,101 @@ int viewportmanager_set_statusbar(int enabled)
if (showing_bars(i))
gui_statusbar_draw(&statusbars.statusbars[i], true);
}
- add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_draw_statusbars);
+ add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_redraw);
}
else
{
- remove_event(GUI_EVENT_ACTIONUPDATE, viewportmanager_draw_statusbars);
+ remove_event(GUI_EVENT_ACTIONUPDATE, viewportmanager_redraw);
}
return old;
}
-void viewportmanager_draw_statusbars(void* data)
+static void viewportmanager_redraw(void* data)
{
int i;
FOR_NB_SCREENS(i)
{
if (showing_bars(i))
- gui_statusbar_draw(&statusbars.statusbars[i], (bool)data);
+ gui_statusbar_draw(&statusbars.statusbars[i], NULL != data);
+ }
+}
+#ifdef HAVE_LCD_BITMAP
+
+static void statusbar_toggled(void* param)
+{
+ (void)param;
+ /* update vp manager for the new setting and reposition vps
+ * if necessary */
+ viewportmanager_theme_changed(THEME_STATUSBAR);
+}
+
+void viewportmanager_theme_changed(int which)
+{
+ if (which & THEME_UI_VIEWPORT)
+ {
+ /* reset the ui viewport */
+ if ((ui_vp_info.active = viewport_init_ui_vp()))
+ add_event(GUI_EVENT_REFRESH, false, viewportmanager_ui_vp_changed);
+ else
+ remove_event(GUI_EVENT_REFRESH, viewportmanager_ui_vp_changed);
+ /* and point to it */
+ ui_vp_info.vp = custom_vp;
+ }
+ if (which & THEME_STATUSBAR)
+ {
+ statusbar_enabled = 0;
+ if (global_settings.statusbar != STATUSBAR_OFF)
+ statusbar_enabled = VP_SB_ONSCREEN(SCREEN_MAIN);
+#ifdef HAVE_REMOTE_LCD
+ if (global_settings.remote_statusbar != STATUSBAR_OFF)
+ statusbar_enabled |= VP_SB_ONSCREEN(SCREEN_REMOTE);
+#endif
+ if (statusbar_enabled)
+ add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_redraw);
+ else
+ remove_event(GUI_EVENT_ACTIONUPDATE, viewportmanager_redraw);
+
+ /* reposition viewport to fit statusbar, only if not using the ui vp */
+ if (!ui_vp_info.active)
+ {
+ int i;
+ FOR_NB_SCREENS(i)
+ viewport_set_fullscreen(&custom_vp[i], i);
+ }
}
}
-void viewportmanager_statusbar_changed(void* data)
+static void viewportmanager_ui_vp_changed(void *param)
{
- (void)data;
- statusbar_enabled = 0;
- if (global_settings.statusbar != STATUSBAR_OFF)
- statusbar_enabled = VP_SB_ONSCREEN(SCREEN_MAIN);
-#ifdef HAVE_REMOTE_LCD
- if (global_settings.remote_statusbar != STATUSBAR_OFF)
- statusbar_enabled |= VP_SB_ONSCREEN(SCREEN_REMOTE);
-#endif
+ /* if the user changed the theme, we need to initiate a full redraw */
+ int i;
+ /* cast param to a function */
+ void (*draw_func)(void) = ((void(*)(void))param);
+ /* start with clearing the screen */
+ FOR_NB_SCREENS(i)
+ screens[i].clear_display();
+ /* redraw the statusbar if it was enabled */
viewportmanager_set_statusbar(statusbar_enabled);
+ /* call the passed function which will redraw the content of
+ * the current screen */
+ if (param != NULL)
+ draw_func();
+ FOR_NB_SCREENS(i)
+ screens[i].update();
+}
+
+void viewport_set_current_vp(struct viewport* vp)
+{
+ if (vp != NULL)
+ ui_vp_info.vp = vp;
+ else
+ ui_vp_info.vp = custom_vp;
+}
+
+struct viewport* viewport_get_current_vp(void)
+{
+ return ui_vp_info.vp;
}
#ifdef HAVE_LCD_COLOR
@@ -172,7 +276,6 @@ void viewportmanager_statusbar_changed(void* data)
#define ARG_STRING(_depth) "dddddgg"
#endif
-#ifdef HAVE_LCD_BITMAP
const char* viewport_parse_viewport(struct viewport *vp,
enum screen_type screen,
const char *bufptr,
@@ -213,9 +316,9 @@ const char* viewport_parse_viewport(struct viewport *vp,
return NULL;
}
else
-#undef ARG_STRING
#endif
{}
+#undef ARG_STRING
/* X and Y *must* be set */
if (!LIST_VALUE_PARSED(set, PL_X) || !LIST_VALUE_PARSED(set, PL_Y))
@@ -259,4 +362,40 @@ const char* viewport_parse_viewport(struct viewport *vp,
return ptr;
}
+/*
+ * (re)parse the UI vp from the settings
+ * - Returns
+ * 0 if no UI vp is used
+ * >0 if it's used at least partly (on multiscreen targets)
+ * NB_SCREENS if all screens have a UI vp
+ */
+static int viewport_init_ui_vp(void)
+{
+ int screen, ret = NB_SCREENS;
+ FOR_NB_SCREENS(screen)
+ {
+#ifdef HAVE_REMOTE_LCD
+ if ((screen == SCREEN_REMOTE))
+ {
+ if(!(viewport_parse_viewport(&custom_vp[screen], screen,
+ global_settings.remote_ui_vp_config, ',')))
+ {
+ viewport_set_fullscreen(&custom_vp[screen], screen);
+ ret--;
+ }
+ }
+ else
+#endif
+ {
+ if (!(viewport_parse_viewport(&custom_vp[screen], screen,
+ global_settings.ui_vp_config, ',')))
+ {
+ viewport_set_fullscreen(&custom_vp[screen], screen);
+ ret--;
+ }
+ }
+ }
+ return ret;
+}
+
#endif /* HAVE_LCD_BITMAP */
diff --git a/apps/gui/viewport.h b/apps/gui/viewport.h
index 6c3fb92998..2ed138b365 100644
--- a/apps/gui/viewport.h
+++ b/apps/gui/viewport.h
@@ -34,26 +34,6 @@ int viewport_get_nb_lines(struct viewport *vp);
void viewport_set_defaults(struct viewport *vp, enum screen_type screen);
-/* Parse a viewport definition (vp_def), which looks like:
- *
- * Screens with depth > 1:
- * X|Y|width|height|font|foregorund color|background color
- * Screens with depth = 1:
- * X|Y|width|height|font
- *
- * | is a separator and can be specified via the parameter
- *
- * Returns the pointer to the char after the last character parsed
- * if everything went OK or NULL if an error happened (some values
- * not specified in the definition)
- */
-#ifdef HAVE_LCD_BITMAP
-const char* viewport_parse_viewport(struct viewport *vp,
- enum screen_type screen,
- const char *vp_def,
- const char separator);
-#endif
-
/* Used to specify which screens the statusbar (SB) should be displayed on.
*
* The parameter is a bit OR'ed combination of the following (screen is
@@ -74,14 +54,70 @@ const char* viewport_parse_viewport(struct viewport *vp,
* Returns the status before the call. This value can be used to restore the
* SB "displaying rules".
*/
+
+
+#define THEME_STATUSBAR (BIT_N(0))
+#define THEME_UI_VIEWPORT (BIT_N(1))
+#define THEME_ALL (~(0u))
+
#define VP_SB_HIDE_ALL 0
#define VP_SB_ONSCREEN(screen) BIT_N(screen)
#define VP_SB_IGNORE_SETTING(screen) BIT_N(4+screen)
#define VP_SB_ALLSCREENS (VP_SB_ONSCREEN(0)|VP_SB_ONSCREEN(1))
+
+/*
+ * Initialize the viewportmanager, which in turns initializes the UI vp and
+ * statusbar stuff
+ */
+void viewportmanager_init(void);
+int viewportmanager_get_statusbar(void);
int viewportmanager_set_statusbar(int enabled);
-/* callbacks for GUI_EVENT_* events */
-void viewportmanager_draw_statusbars(void*data);
-void viewportmanager_statusbar_changed(void* data);
+/* call this when a theme changed */
+void viewportmanager_theme_changed(int);
+/*
+ * Initializes the given viewport with maximum dimensions minus status- and
+ * buttonbar
+ */
+void viewport_set_fullscreen(struct viewport *vp, enum screen_type screen);
+
+#ifdef HAVE_LCD_BITMAP
+
+/*
+ * Parse a viewport definition (vp_def), which looks like:
+ *
+ * Screens with depth > 1:
+ * X|Y|width|height|font|foregorund color|background color
+ * Screens with depth = 1:
+ * X|Y|width|height|font
+ *
+ * | is a separator and can be specified via the parameter
+ *
+ * Returns the pointer to the char after the last character parsed
+ * if everything went OK or NULL if an error happened (some values
+ * not specified in the definition)
+ */
+const char* viewport_parse_viewport(struct viewport *vp,
+ enum screen_type screen,
+ const char *vp_def,
+ const char separator);
+
+/*
+ * Returns a pointer to the current viewport
+ * - That could be the UI vp, or a viewport passed to do_menu() or the like
+ */
+struct viewport* viewport_get_current_vp(void);
+
+/*
+ * Set the UI vp pointer to a different one - NULL to reset to the UI vp
+ *
+ * This is needed since the UI viewport needs is kept in RAM.
+ */
+void viewport_set_current_vp(struct viewport* vp);
+
+#else /* HAVE_LCD_CHARCELL */
+#define viewport_set_current_vp(a)
+#define viewport_get_current_vp() NULL
+#endif
#endif /* __VIEWPORT_H__ */
diff --git a/apps/gui/wps.c b/apps/gui/wps.c
index b57f06d2b5..055f8d01e6 100644
--- a/apps/gui/wps.c
+++ b/apps/gui/wps.c
@@ -565,6 +565,7 @@ static void gwps_leave_wps(void)
/* Play safe and unregister the hook */
lcd_activation_set_hook(NULL);
#endif
+ send_event(GUI_EVENT_REFRESH, NULL);
}
void gwps_draw_statusbars(void)
diff --git a/apps/main.c b/apps/main.c
index d0fba3fcce..49542e8b01 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -72,6 +72,7 @@
#include "eeprom_settings.h"
#include "scrobbler.h"
#include "icon.h"
+#include "viewport.h"
#ifdef IPOD_ACCESSORY_PROTOCOL
#include "iap.h"
@@ -135,9 +136,8 @@ static void app_main(void)
screens[i].update();
}
tree_gui_init();
- viewportmanager_set_statusbar(VP_SB_ALLSCREENS);
- add_event(GUI_EVENT_STATUSBAR_TOGGLE, false,
- viewportmanager_statusbar_changed);
+ gui_syncstatusbar_init(&statusbars);
+ viewportmanager_init();
#ifdef HAVE_USBSTACK
/* All threads should be created and public queues registered by now */
usb_start_monitoring();
@@ -296,8 +296,6 @@ static void init(void)
#ifdef DEBUG
debug_init();
#endif
- /* Must be done before any code uses the multi-screen APi */
- gui_syncstatusbar_init(&statusbars);
storage_init();
settings_reset();
settings_load(SETTINGS_ALL);
@@ -419,9 +417,6 @@ static void init(void)
radio_init();
#endif
- /* Must be done before any code uses the multi-screen APi */
- gui_syncstatusbar_init(&statusbars);
-
#if CONFIG_CHARGING && (CONFIG_CPU == SH7034)
/* charger_inserted() can't be used here because power_thread()
hasn't checked power_input_status() yet */
diff --git a/apps/menu.c b/apps/menu.c
index 96140cf4f8..539dc900a5 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -342,8 +342,8 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected,
const struct menu_item_ex *temp, *menu;
int ret = 0, i;
bool redraw_lists;
- int oldbars = viewportmanager_set_statusbar(
- hide_bars ? VP_SB_HIDE_ALL : VP_SB_ALLSCREENS);
+ int oldbars = viewportmanager_get_statusbar();
+ viewportmanager_set_statusbar(hide_bars ? VP_SB_HIDE_ALL : oldbars);
const struct menu_item_ex *menu_stack[MAX_MENUS];
int menu_stack_selected_item[MAX_MENUS];
diff --git a/apps/menus/display_menu.c b/apps/menus/display_menu.c
index 05b5bd268d..3989a6381b 100644
--- a/apps/menus/display_menu.c
+++ b/apps/menus/display_menu.c
@@ -39,6 +39,7 @@
#ifdef HAVE_TOUCHSCREEN
#include "screens.h"
#endif
+#include "viewport.h"
#ifdef HAVE_BACKLIGHT
static int filterfirstkeypress_callback(int action,const struct menu_item_ex *this_item)
@@ -313,8 +314,7 @@ static int statusbar_callback(int action,const struct menu_item_ex *this_item)
{
case ACTION_EXIT_MENUITEM:
send_event(GUI_EVENT_STATUSBAR_TOGGLE, NULL);
- /* this should be changed so only the viewports are reloaded */
- settings_apply(false);
+ send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
break;
}
return action;
diff --git a/apps/menus/theme_menu.c b/apps/menus/theme_menu.c
index d71ca71928..233d673da1 100644
--- a/apps/menus/theme_menu.c
+++ b/apps/menus/theme_menu.c
@@ -37,6 +37,7 @@
#include "lcd-remote.h"
#include "backdrop.h"
#include "exported_menus.h"
+#include "appevents.h"
#if LCD_DEPTH > 1
/**
@@ -47,6 +48,7 @@ static int clear_main_backdrop(void)
global_settings.backdrop_file[0]=0;
backdrop_unload(BACKDROP_MAIN);
backdrop_show(BACKDROP_MAIN);
+ send_event(GUI_EVENT_REFRESH, NULL);
settings_save();
return 0;
}
diff --git a/apps/plugin.c b/apps/plugin.c
index 238a01c322..e9acc97824 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -673,10 +673,10 @@ static const struct plugin_api rockbox_api = {
int plugin_load(const char* plugin, const void* parameter)
{
- int rc;
- int i;
+ int rc, i;
int oldbars;
struct plugin_header *hdr;
+ struct viewport plugin_vp[NB_SCREENS];
#ifdef SIMULATOR
void *pd;
#else /* !SIMULATOR */
@@ -781,8 +781,14 @@ int plugin_load(const char* plugin, const void* parameter)
lcd_remote_update();
#endif
- cpucache_invalidate();
oldbars = viewportmanager_set_statusbar(VP_SB_HIDE_ALL);
+
+ FOR_NB_SCREENS(i)
+ viewport_set_fullscreen(&plugin_vp[i], i);
+
+ viewport_set_current_vp(plugin_vp);
+
+ cpucache_invalidate();
#ifdef HAVE_TOUCHSCREEN
touchscreen_set_mode(TOUCHSCREEN_BUTTON);
@@ -826,14 +832,11 @@ int plugin_load(const char* plugin, const void* parameter)
if (rc != PLUGIN_GOTO_WPS)
{
- FOR_NB_SCREENS(i)
- {
- screens[i].clear_display();
- screens[i].update();
- }
+ send_event(GUI_EVENT_REFRESH, NULL);
}
viewportmanager_set_statusbar(oldbars);
+ viewport_set_current_vp(NULL);
if (pfn_tsr_exit == NULL)
plugin_loaded = false;
diff --git a/apps/recorder/keyboard.c b/apps/recorder/keyboard.c
index 0fa1d32503..160779f7ae 100644
--- a/apps/recorder/keyboard.c
+++ b/apps/recorder/keyboard.c
@@ -39,6 +39,7 @@
#include "viewport.h"
#include "file.h"
#include "splash.h"
+#include "appevents.h"
#ifndef O_BINARY
#define O_BINARY 0
@@ -1243,11 +1244,13 @@ int kbd_input(char* text, int buflen)
global_settings.buttonbar = buttonbar_config;
#endif
+ if (ret < 0)
+ splash(HZ/2, ID2P(LANG_CANCEL));
+
FOR_NB_SCREENS(l)
screens[l].setfont(FONT_UI);
viewportmanager_set_statusbar(oldbars);
+ send_event(GUI_EVENT_REFRESH, NULL);
- if (ret < 0)
- splash(HZ/2, ID2P(LANG_CANCEL));
return ret;
}
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index 9bcbf8be68..2716d932b5 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -76,6 +76,7 @@
#include "viewport.h"
#include "list.h"
#include "general.h"
+#include "appevents.h"
#ifdef HAVE_RECORDING
/* This array holds the record timer interval lengths, in seconds */
@@ -1924,9 +1925,11 @@ rec_abort:
rec_status &= ~RCSTAT_IN_RECSCREEN;
sound_settings_apply();
- viewportmanager_set_statusbar(oldbars);
FOR_NB_SCREENS(i)
screens[i].setfont(FONT_UI);
+
+ viewportmanager_set_statusbar(oldbars);
+ send_event(GUI_EVENT_REFRESH, NULL);
/* if the directory was created or recording happened, make sure the
browser is updated */
diff --git a/apps/root_menu.c b/apps/root_menu.c
index 848440a40c..a06caba176 100644
--- a/apps/root_menu.c
+++ b/apps/root_menu.c
@@ -192,6 +192,7 @@ static int browser(void* param)
}
}
}
+ send_event(GUI_EVENT_REFRESH, NULL);
if (!tagcache_is_usable())
return GO_TO_PREVIOUS;
filter = SHOW_ID3DB;
diff --git a/apps/settings.c b/apps/settings.c
index 1b0abfbf46..48571db20e 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -65,12 +65,12 @@
#include "filetypes.h"
#include "option_select.h"
#include "backdrop.h"
-#include "appevents.h"
#if CONFIG_TUNER
#include "radio.h"
#endif
#include "wps.h"
#include "skin_engine/skin_engine.h"
+#include "viewport.h"
#if CONFIG_CODEC == MAS3507D
void dac_line_in(bool enable);
@@ -761,6 +761,7 @@ void settings_apply_skins(void)
void settings_apply(bool read_disk)
{
+
char buf[64];
#if CONFIG_CODEC == SWCODEC
int i;
@@ -985,9 +986,9 @@ void settings_apply(bool read_disk)
#if defined(HAVE_RECORDING) && CONFIG_CODEC == SWCODEC
enc_global_settings_apply();
#endif
- send_event(GUI_EVENT_STATUSBAR_TOGGLE, NULL);
- list_init_viewports(NULL);
- send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
+#ifdef HAVE_LCD_BITMAP
+ viewportmanager_theme_changed(THEME_ALL);
+#endif
}
@@ -1109,7 +1110,8 @@ bool set_int_ex(const unsigned char* string,
item.lang_id = -1;
item.cfg_vals = (char*)string;
item.setting = (void *)variable;
- return option_screen(&item, NULL, false, NULL);
+ return option_screen(&item,
+ viewport_get_current_vp(), false, NULL);
}
diff --git a/apps/settings.h b/apps/settings.h
index becf164a8f..998fdc1cd9 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -762,6 +762,13 @@ struct user_settings
/* If values are just added to the end, no need to bump plugin API
version. */
/* new stuff to be added at the end */
+
+#ifdef HAVE_LCD_BITMAP
+ unsigned char ui_vp_config[64]; /* viewport string for the lists */
+#ifdef HAVE_REMOTE_LCD
+ unsigned char remote_ui_vp_config[64]; /* viewport string for the remote lists */
+#endif
+#endif
};
/** global variables **/
diff --git a/apps/settings_list.c b/apps/settings_list.c
index c03731f2b7..98dd900e3c 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -180,6 +180,10 @@
{.custom = (void*)default}, name, NULL, \
{.custom_setting = (struct custom_setting[]){ \
{load_from_cfg, write_to_cfg, is_change, set_default}}}}
+
+#define VIEWPORT_SETTING(var,name,default) \
+ TEXT_SETTING(0,var,name,default, NULL, NULL)
+
/* some sets of values which are used more than once, to save memory */
static const char off_on[] = "off,on";
static const char off_on_ask[] = "off,on,ask";
@@ -1539,6 +1543,13 @@ const struct settings_list settings[] = {
#endif
#endif
+ /* Customizable list */
+#ifdef HAVE_LCD_BITMAP
+ VIEWPORT_SETTING(ui_vp_config, "ui viewport", ""),
+#ifdef HAVE_REMOTE_LCD
+ VIEWPORT_SETTING(remote_ui_vp_config, "remote ui viewport", ""),
+#endif
+#endif
};
const int nb_settings = sizeof(settings)/sizeof(*settings);
diff --git a/wps/WPSLIST b/wps/WPSLIST
index 663b681533..58fa5f1114 100644
--- a/wps/WPSLIST
+++ b/wps/WPSLIST
@@ -69,6 +69,8 @@ backdrop:
iconset:
viewers iconset:
selector type: bar (inverse)
+ui viewport: -
+remote ui viewport: -
@@ -81,6 +83,8 @@ backdrop:
iconset:
viewers iconset:
selector type: bar (inverse)
+ui viewport: -
+remote ui viewport: -
@@ -93,6 +97,8 @@ iconset:
viewers iconset:
selector type: bar (inverse)
Statusbar: top
+ui viewport: -
+remote ui viewport: -
@@ -105,6 +111,8 @@ backdrop:
iconset:
viewers iconset:
selector type: bar (inverse)
+ui viewport:
+remote ui viewport:
@@ -152,6 +160,8 @@ backdrop:
iconset:
viewers iconset:
selector type: bar (inverse)
+ui viewport: -
+remote ui viewport: -
@@ -159,6 +169,8 @@ Name: marquee.rwps
Author: Mike Sobel
Font: 13-Nimbus.fnt
Statusbar: top
+ui viewport: -
+remote ui viewport: -
@@ -173,6 +185,8 @@ backdrop:
iconset:
viewers iconset:
selector type: bar (inverse)
+ui viewport: -
+remote ui viewport: -
@@ -206,6 +220,8 @@ backdrop:
iconset:
viewers iconset:
selector type: bar (inverse)
+ui viewport: -
+remote ui viewport: -
@@ -228,6 +244,8 @@ backdrop:
iconset:
viewers iconset:
selector type: bar (inverse)
+ui viewport: -
+remote ui viewport: -
@@ -261,6 +279,8 @@ backdrop:
iconset:
viewers iconset:
selector type: bar (inverse)
+ui viewport: -
+remote ui viewport: -
@@ -352,6 +372,10 @@ viewers iconset.240x400x16: /.rockbox/icons/tango_small_viewers.bmp
# Whether the WPS is designed to have the statusbar on or off
Statusbar: top
+
+# list & remote ui viewports
+ui viewport: -
+remote ui viewport: -
diff --git a/wps/wpsbuild.pl b/wps/wpsbuild.pl
index 735a63830a..e9e5c29a30 100755
--- a/wps/wpsbuild.pl
+++ b/wps/wpsbuild.pl
@@ -53,6 +53,8 @@ my $iconset;
my $viewericon;
my $lineselecttextcolor;
my $filetylecolor;
+my $listviewport;
+my $remotelistviewport;
# LCD sizes
my ($main_height, $main_width, $main_depth);
@@ -293,6 +295,12 @@ MOO
if($rwps && $has_remote ) {
push @out, "rwps: /$rbdir/wps/$rwps\n";
}
+ if(defined($listviewport)) {
+ push @out, "ui viewport: $listviewport\n";
+ }
+ if(defined($remotelistviewport) && $has_remote) {
+ push @out, "remote ui viewport: $listviewport\n";
+ }
if(-f "$rbdir/wps/$cfg") {
print STDERR "wpsbuild warning: wps/$cfg already exists!\n";
}
@@ -347,6 +355,8 @@ while() {
undef $viewericon;
undef $lineselecttextcolor;
undef $filetylecolor;
+ undef $listviewport;
+ undef $remotelistviewport;
next;
}
@@ -513,6 +523,12 @@ while() {
elsif($l =~ /^filetype colours: *(.*)/i) {
$filetylecolor = $1;
}
+ elsif($l =~ /^ui viewport: *(.*)/i) {
+ $listviewport = $1;
+ }
+ elsif($l =~ /^remote ui viewport: *(.*)/i) {
+ $remotelistviewport = $1;
+ }
else{
#print "Unknown line: $l!\n";
}