summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2009-08-23 23:44:31 +0000
committerThomas Martitz <kugel@rockbox.org>2009-08-23 23:44:31 +0000
commit19f44a61cfb333c363d823e43b5de282ef2d2ed0 (patch)
tree77aeee29551bc99be86adc39f43436ebc4bda5f1
parent7dfec97c5d0c0295403bb97570a5f524b2cb26b4 (diff)
downloadrockbox-19f44a61cfb333c363d823e43b5de282ef2d2ed0.zip
rockbox-19f44a61cfb333c363d823e43b5de282ef2d2ed0.tar.gz
rockbox-19f44a61cfb333c363d823e43b5de282ef2d2ed0.tar.bz2
rockbox-19f44a61cfb333c363d823e43b5de282ef2d2ed0.tar.xz
Fix redraw issues when the statusbar setting was changed with an UI viewport. Now the old statusbar area is cleared upon changing the setting.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22484 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/gui/statusbar.c50
-rw-r--r--apps/gui/statusbar.h9
-rw-r--r--apps/menus/display_menu.c34
-rw-r--r--apps/settings.h4
-rw-r--r--apps/settings_list.c4
5 files changed, 80 insertions, 21 deletions
diff --git a/apps/gui/statusbar.c b/apps/gui/statusbar.c
index 024ade3..1a72440 100644
--- a/apps/gui/statusbar.c
+++ b/apps/gui/statusbar.c
@@ -34,6 +34,7 @@
#include "powermgmt.h"
#include "usb.h"
#include "led.h"
+#include "screen_access.h"
#include "status.h" /* needed for battery_state global var */
#include "action.h" /* for keys_locked */
@@ -172,13 +173,23 @@ static void gui_statusbar_init(struct gui_statusbar * bar)
#endif
}
+#define GET_RECT(vp, vals,display) do { \
+ viewport_set_fullscreen(&(vp), (display)->screen_type); \
+ (vp).height = STATUSBAR_HEIGHT; \
+ (vp).x = STATUSBAR_X_POS; \
+ if ((vals) != STATUSBAR_BOTTOM) \
+ (vp).y = 0; \
+ else \
+ (vp).y = (display)->lcdheight - STATUSBAR_HEIGHT; \
+ } while(0)
+
void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw)
{
struct screen * display = bar->display;
#ifdef HAVE_LCD_CHARCELLS
int val;
- (void)force_redraw; /* players always "redraw" */
+ (void)force_redraw; /* The Player always has "redraw" */
#endif /* HAVE_LCD_CHARCELLS */
bar->info.battlevel = battery_level();
@@ -263,13 +274,8 @@ 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_fullscreen(&vp, display->screen_type);
- vp.height = STATUSBAR_HEIGHT;
- vp.x = STATUSBAR_X_POS;
- if (statusbar_position(display->screen_type) != STATUSBAR_BOTTOM)
- vp.y = 0;
- else
- vp.y = display->lcdheight - STATUSBAR_HEIGHT;
+
+ GET_RECT(vp,statusbar_position(display->screen_type),display);
display->set_viewport(&vp);
display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
display->fillrect(0, 0, display->getwidth(), STATUSBAR_HEIGHT);
@@ -816,11 +822,33 @@ void gui_syncstatusbar_draw(struct gui_syncstatusbar * bars,
}
}
-void gui_statusbar_changed(int enabled)
+#ifdef HAVE_LCD_BITMAP
+void gui_statusbar_changed( enum screen_type screen,
+ enum statusbar_values old)
{
- (void)enabled;
- send_event(GUI_EVENT_STATUSBAR_TOGGLE, NULL);
+ /* clear and update the statusbar area to remove old parts */
+ enum statusbar_values bar;
+#ifdef HAVE_REMOTE_LCD
+ if (screen == SCREEN_REMOTE)
+ bar = global_settings.remote_statusbar;
+ else
+#endif
+ bar = global_settings.statusbar;
+
+ struct screen *display = &screens[screen];
+ struct viewport vp;
+
+ if (old != STATUSBAR_OFF && old != bar)
+ {
+ GET_RECT(vp, old, display);
+ display->set_viewport(&vp);
+ display->clear_viewport();
+ display->update_viewport();
+ display->set_viewport(NULL);
+ }
}
+#endif
+
#ifdef HAVE_REMOTE_LCD
int statusbar_position(int screen)
{
diff --git a/apps/gui/statusbar.h b/apps/gui/statusbar.h
index c2829a0..169b76b 100644
--- a/apps/gui/statusbar.h
+++ b/apps/gui/statusbar.h
@@ -54,6 +54,9 @@ struct status_info {
};
+/* statusbar visibility/position, used for settings also */
+enum statusbar_values { STATUSBAR_OFF = 0, STATUSBAR_TOP, STATUSBAR_BOTTOM };
+
struct gui_statusbar
{
long battery_icon_switch_tick;
@@ -97,8 +100,10 @@ struct gui_syncstatusbar
};
extern void gui_syncstatusbar_init(struct gui_syncstatusbar * bars);
-extern void gui_syncstatusbar_draw(struct gui_syncstatusbar * bars, bool force_redraw);
-void gui_statusbar_changed(int enabled);
+extern void gui_syncstatusbar_draw(struct gui_syncstatusbar * bars,
+ bool force_redraw);
+void gui_statusbar_changed(enum screen_type screen,
+ enum statusbar_values old);
#if !defined(HAVE_REMOTE_LCD) || defined(__PCTOOL__)
#define statusbar_position(a) (global_settings.statusbar)
#else
diff --git a/apps/menus/display_menu.c b/apps/menus/display_menu.c
index 24e36e5..0b27698 100644
--- a/apps/menus/display_menu.c
+++ b/apps/menus/display_menu.c
@@ -40,6 +40,7 @@
#include "screens.h"
#endif
#include "viewport.h"
+#include "statusbar.h" /* statusbar_vals enum*/
#ifdef HAVE_BACKLIGHT
static int filterfirstkeypress_callback(int action,const struct menu_item_ex *this_item)
@@ -307,23 +308,50 @@ MAKE_MENU(scroll_settings_menu, ID2P(LANG_SCROLL_MENU), 0, Icon_NOICON,
/***********************************/
/* BARS MENU */
#ifdef HAVE_LCD_BITMAP
-static int statusbar_callback(int action,const struct menu_item_ex *this_item)
+static int statusbar_callback_ex(int action,const struct menu_item_ex *this_item,
+ enum screen_type screen)
{
(void)this_item;
+ /* we save the old statusbar value here, so the old statusbars can get
+ * removed and cleared from the display properly on exiting
+ * (in gui_statusbar_changed() ) */
+ static enum statusbar_values old_bar[NB_SCREENS];
switch (action)
{
+ case ACTION_ENTER_MENUITEM:
+#ifdef HAVE_REMOTE_LCD
+ if (screen == SCREEN_REMOTE)
+ old_bar[screen] = global_settings.remote_statusbar;
+ else
+#endif
+ old_bar[screen] = global_settings.statusbar;
+ break;
case ACTION_EXIT_MENUITEM:
+ gui_statusbar_changed(screen, old_bar[screen]);
send_event(GUI_EVENT_STATUSBAR_TOGGLE, NULL);
send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
break;
}
return action;
}
+
+#ifdef HAVE_REMOTE_LCD
+static int statusbar_callback_remote(int action,const struct menu_item_ex *this_item)
+{
+ return statusbar_callback_ex(action, this_item, SCREEN_REMOTE);
+}
+#endif
+static int statusbar_callback(int action,const struct menu_item_ex *this_item)
+{
+ return statusbar_callback_ex(action, this_item, SCREEN_MAIN);
+}
MENUITEM_SETTING(scrollbar_item, &global_settings.scrollbar, NULL);
MENUITEM_SETTING(scrollbar_width, &global_settings.scrollbar_width, NULL);
-MENUITEM_SETTING(statusbar, &global_settings.statusbar, statusbar_callback);
+MENUITEM_SETTING(statusbar, &global_settings.statusbar,
+ statusbar_callback);
#ifdef HAVE_REMOTE_LCD
-MENUITEM_SETTING(remote_statusbar, &global_settings.remote_statusbar, statusbar_callback);
+MENUITEM_SETTING(remote_statusbar, &global_settings.remote_statusbar,
+ statusbar_callback_remote);
#endif
#if CONFIG_KEYPAD == RECORDER_PAD
MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, NULL);
diff --git a/apps/settings.h b/apps/settings.h
index cbd7b6d..1365736 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -26,6 +26,7 @@
#include <stddef.h>
#include "inttypes.h"
#include "config.h"
+#include "statusbar.h" /* for the statusbar values */
#include "button.h"
#if CONFIG_CODEC == SWCODEC
#include "audio.h"
@@ -156,9 +157,6 @@ enum { REPLAYGAIN_TRACK = 0, REPLAYGAIN_ALBUM, REPLAYGAIN_SHUFFLE, REPLAYGAIN_OF
/* show path types */
enum { SHOW_PATH_OFF = 0, SHOW_PATH_CURRENT, SHOW_PATH_FULL };
-/* statusbar visibility/position */
-enum { STATUSBAR_OFF = 0, STATUSBAR_TOP, STATUSBAR_BOTTOM };
-
/* scrollbar visibility/position */
enum { SCROLLBAR_OFF = 0, SCROLLBAR_LEFT, SCROLLBAR_RIGHT };
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 450d0ea..23424f9 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -604,12 +604,12 @@ const struct settings_list settings[] = {
#endif
CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, statusbar,
LANG_STATUS_BAR, STATUSBAR_TOP, "statusbar","off,top,bottom",
- gui_statusbar_changed, 3, ID2P(LANG_OFF), ID2P(LANG_STATUSBAR_TOP),
+ NULL, 3, ID2P(LANG_OFF), ID2P(LANG_STATUSBAR_TOP),
ID2P(LANG_STATUSBAR_BOTTOM)),
#ifdef HAVE_REMOTE_LCD
CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, remote_statusbar,
LANG_REMOTE_STATUSBAR, STATUSBAR_TOP, "remote statusbar","off,top,bottom",
- gui_statusbar_changed, 3, ID2P(LANG_OFF), ID2P(LANG_STATUSBAR_TOP),
+ NULL, 3, ID2P(LANG_OFF), ID2P(LANG_STATUSBAR_TOP),
ID2P(LANG_STATUSBAR_BOTTOM)),
#endif
CHOICE_SETTING(F_TEMPVAR, scrollbar,