forked from len0rd/rockbox
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
This commit is contained in:
parent
7dfec97c5d
commit
19f44a61cf
5 changed files with 80 additions and 21 deletions
|
|
@ -34,6 +34,7 @@
|
||||||
#include "powermgmt.h"
|
#include "powermgmt.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "led.h"
|
#include "led.h"
|
||||||
|
#include "screen_access.h"
|
||||||
|
|
||||||
#include "status.h" /* needed for battery_state global var */
|
#include "status.h" /* needed for battery_state global var */
|
||||||
#include "action.h" /* for keys_locked */
|
#include "action.h" /* for keys_locked */
|
||||||
|
|
@ -172,13 +173,23 @@ static void gui_statusbar_init(struct gui_statusbar * bar)
|
||||||
#endif
|
#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)
|
void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw)
|
||||||
{
|
{
|
||||||
struct screen * display = bar->display;
|
struct screen * display = bar->display;
|
||||||
|
|
||||||
#ifdef HAVE_LCD_CHARCELLS
|
#ifdef HAVE_LCD_CHARCELLS
|
||||||
int val;
|
int val;
|
||||||
(void)force_redraw; /* players always "redraw" */
|
(void)force_redraw; /* The Player always has "redraw" */
|
||||||
#endif /* HAVE_LCD_CHARCELLS */
|
#endif /* HAVE_LCD_CHARCELLS */
|
||||||
|
|
||||||
bar->info.battlevel = battery_level();
|
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)))
|
memcmp(&(bar->info), &(bar->lastinfo), sizeof(struct status_info)))
|
||||||
{
|
{
|
||||||
struct viewport vp;
|
struct viewport vp;
|
||||||
viewport_set_fullscreen(&vp, display->screen_type);
|
|
||||||
vp.height = STATUSBAR_HEIGHT;
|
GET_RECT(vp,statusbar_position(display->screen_type),display);
|
||||||
vp.x = STATUSBAR_X_POS;
|
|
||||||
if (statusbar_position(display->screen_type) != STATUSBAR_BOTTOM)
|
|
||||||
vp.y = 0;
|
|
||||||
else
|
|
||||||
vp.y = display->lcdheight - STATUSBAR_HEIGHT;
|
|
||||||
display->set_viewport(&vp);
|
display->set_viewport(&vp);
|
||||||
display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
|
display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
|
||||||
display->fillrect(0, 0, display->getwidth(), STATUSBAR_HEIGHT);
|
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;
|
/* clear and update the statusbar area to remove old parts */
|
||||||
send_event(GUI_EVENT_STATUSBAR_TOGGLE, NULL);
|
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
|
#ifdef HAVE_REMOTE_LCD
|
||||||
int statusbar_position(int screen)
|
int statusbar_position(int screen)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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
|
struct gui_statusbar
|
||||||
{
|
{
|
||||||
long battery_icon_switch_tick;
|
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_init(struct gui_syncstatusbar * bars);
|
||||||
extern void gui_syncstatusbar_draw(struct gui_syncstatusbar * bars, bool force_redraw);
|
extern void gui_syncstatusbar_draw(struct gui_syncstatusbar * bars,
|
||||||
void gui_statusbar_changed(int enabled);
|
bool force_redraw);
|
||||||
|
void gui_statusbar_changed(enum screen_type screen,
|
||||||
|
enum statusbar_values old);
|
||||||
#if !defined(HAVE_REMOTE_LCD) || defined(__PCTOOL__)
|
#if !defined(HAVE_REMOTE_LCD) || defined(__PCTOOL__)
|
||||||
#define statusbar_position(a) (global_settings.statusbar)
|
#define statusbar_position(a) (global_settings.statusbar)
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@
|
||||||
#include "screens.h"
|
#include "screens.h"
|
||||||
#endif
|
#endif
|
||||||
#include "viewport.h"
|
#include "viewport.h"
|
||||||
|
#include "statusbar.h" /* statusbar_vals enum*/
|
||||||
|
|
||||||
#ifdef HAVE_BACKLIGHT
|
#ifdef HAVE_BACKLIGHT
|
||||||
static int filterfirstkeypress_callback(int action,const struct menu_item_ex *this_item)
|
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 */
|
/* BARS MENU */
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#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;
|
(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)
|
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:
|
case ACTION_EXIT_MENUITEM:
|
||||||
|
gui_statusbar_changed(screen, old_bar[screen]);
|
||||||
send_event(GUI_EVENT_STATUSBAR_TOGGLE, NULL);
|
send_event(GUI_EVENT_STATUSBAR_TOGGLE, NULL);
|
||||||
send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
|
send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return action;
|
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_item, &global_settings.scrollbar, NULL);
|
||||||
MENUITEM_SETTING(scrollbar_width, &global_settings.scrollbar_width, 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
|
#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
|
#endif
|
||||||
#if CONFIG_KEYPAD == RECORDER_PAD
|
#if CONFIG_KEYPAD == RECORDER_PAD
|
||||||
MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, NULL);
|
MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, NULL);
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include "inttypes.h"
|
#include "inttypes.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "statusbar.h" /* for the statusbar values */
|
||||||
#include "button.h"
|
#include "button.h"
|
||||||
#if CONFIG_CODEC == SWCODEC
|
#if CONFIG_CODEC == SWCODEC
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
|
|
@ -156,9 +157,6 @@ enum { REPLAYGAIN_TRACK = 0, REPLAYGAIN_ALBUM, REPLAYGAIN_SHUFFLE, REPLAYGAIN_OF
|
||||||
/* show path types */
|
/* show path types */
|
||||||
enum { SHOW_PATH_OFF = 0, SHOW_PATH_CURRENT, SHOW_PATH_FULL };
|
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 */
|
/* scrollbar visibility/position */
|
||||||
enum { SCROLLBAR_OFF = 0, SCROLLBAR_LEFT, SCROLLBAR_RIGHT };
|
enum { SCROLLBAR_OFF = 0, SCROLLBAR_LEFT, SCROLLBAR_RIGHT };
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -604,12 +604,12 @@ const struct settings_list settings[] = {
|
||||||
#endif
|
#endif
|
||||||
CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, statusbar,
|
CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, statusbar,
|
||||||
LANG_STATUS_BAR, STATUSBAR_TOP, "statusbar","off,top,bottom",
|
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)),
|
ID2P(LANG_STATUSBAR_BOTTOM)),
|
||||||
#ifdef HAVE_REMOTE_LCD
|
#ifdef HAVE_REMOTE_LCD
|
||||||
CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, remote_statusbar,
|
CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, remote_statusbar,
|
||||||
LANG_REMOTE_STATUSBAR, STATUSBAR_TOP, "remote statusbar","off,top,bottom",
|
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)),
|
ID2P(LANG_STATUSBAR_BOTTOM)),
|
||||||
#endif
|
#endif
|
||||||
CHOICE_SETTING(F_TEMPVAR, scrollbar,
|
CHOICE_SETTING(F_TEMPVAR, scrollbar,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue