diff options
author | Thomas Martitz <kugel@rockbox.org> | 2009-10-16 20:30:09 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2009-10-16 20:30:09 +0000 |
commit | 8d032ae136035563f262dabf9b839b90db25de29 (patch) | |
tree | a044aeabdd553bc7fb58e0a2a1434767204c6d32 /apps | |
parent | 27ece8c366b89fab05a47c342edc3edc18a6c5e3 (diff) | |
download | rockbox-8d032ae136035563f262dabf9b839b90db25de29.tar.gz rockbox-8d032ae136035563f262dabf9b839b90db25de29.zip |
initial custom statusbar commit
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23212 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/SOURCES | 1 | ||||
-rw-r--r-- | apps/filetree.c | 17 | ||||
-rw-r--r-- | apps/filetypes.h | 2 | ||||
-rw-r--r-- | apps/gui/list.c | 1 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_display.c | 36 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_parser.c | 7 | ||||
-rw-r--r-- | apps/gui/skin_engine/wps_internals.h | 2 | ||||
-rw-r--r-- | apps/gui/statusbar-skinned.c | 127 | ||||
-rw-r--r-- | apps/gui/statusbar-skinned.h | 41 | ||||
-rw-r--r-- | apps/gui/viewport.c | 18 | ||||
-rw-r--r-- | apps/gui/wps.c | 2 | ||||
-rw-r--r-- | apps/main.c | 1 | ||||
-rw-r--r-- | apps/settings.c | 12 | ||||
-rw-r--r-- | apps/settings.h | 2 | ||||
-rw-r--r-- | apps/settings_list.c | 2 |
15 files changed, 253 insertions, 18 deletions
diff --git a/apps/SOURCES b/apps/SOURCES index bac376589a..49d248d8ff 100644 --- a/apps/SOURCES +++ b/apps/SOURCES @@ -78,6 +78,7 @@ gui/quickscreen.c #endif gui/wps.c +gui/statusbar-skinned.c gui/scrollbar.c gui/splash.c gui/statusbar.c diff --git a/apps/filetree.c b/apps/filetree.c index 8fbc39fa67..504c06c7fb 100644 --- a/apps/filetree.c +++ b/apps/filetree.c @@ -477,7 +477,22 @@ int ft_enter(struct tree_context* c) break; #endif - +#ifdef HAVE_LCD_BITMAP + case FILE_ATTR_SB: + splash(0, ID2P(LANG_WAIT)); + set_file(buf, (char *)global_settings.sb_file, + MAX_FILENAME); + settings_apply_skins(); + break; +#endif +#ifdef HAVE_REMOTE_LCD + case FILE_ATTR_RSB: + splash(0, ID2P(LANG_WAIT)); + set_file(buf, (char *)global_settings.rsb_file, + MAX_FILENAME); + settings_apply_skins(); + break; +#endif /* wps config file */ case FILE_ATTR_WPS: splash(0, ID2P(LANG_WAIT)); diff --git a/apps/filetypes.h b/apps/filetypes.h index f872cf86f0..472f792298 100644 --- a/apps/filetypes.h +++ b/apps/filetypes.h @@ -41,6 +41,8 @@ #define FILE_ATTR_KBD 0x0C00 /* keyboard file */ #define FILE_ATTR_FMR 0x0D00 /* preset file */ #define FILE_ATTR_CUE 0x0E00 /* cuesheet file */ +#define FILE_ATTR_SB 0x0F00 /* cuesheet file */ +#define FILE_ATTR_RSB 0x1000 /* cuesheet file */ #define FILE_ATTR_MASK 0xFF00 /* which bits tree.c uses for file types */ struct filetype { diff --git a/apps/gui/list.c b/apps/gui/list.c index d7ecdccd30..0090f44b42 100644 --- a/apps/gui/list.c +++ b/apps/gui/list.c @@ -29,6 +29,7 @@ #include "kernel.h" #include "system.h" +#include "appevents.h" #include "action.h" #include "screen_access.h" #include "list.h" diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index a5ea28619a..ef1c39c1c7 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c @@ -168,7 +168,7 @@ static void draw_progressbar(struct gui_wps *gwps, elapsed = 0; length = 0; } - + if (pb->have_bitmap_pb) gui_bitmap_scrollbar_draw(display, pb->bm, pb->x, y, pb->width, pb->bm.height, @@ -482,7 +482,12 @@ static bool evaluate_conditional(struct gui_wps *gwps, int *token_index) #ifdef HAVE_LCD_BITMAP /* clear all pictures in the conditional and nested ones */ if (data->tokens[i].type == WPS_TOKEN_IMAGE_PRELOAD_DISPLAY) - clear_image_pos(gwps, find_image(data->tokens[i].value.i&0xFF, gwps->data)); + { + struct gui_img *tmp = find_image(data->tokens[i].value.i&0xFF, + data); + if (tmp) + clear_image_pos(gwps, tmp); + } #endif #ifdef HAVE_ALBUMART if (data->albumart && data->tokens[i].type == WPS_TOKEN_ALBUMART_DISPLAY) @@ -499,17 +504,35 @@ static bool evaluate_conditional(struct gui_wps *gwps, int *token_index) #ifdef HAVE_LCD_BITMAP struct gui_img* find_image(char label, struct wps_data *data) { + static int i = 0; + struct gui_img *ret = NULL; struct skin_token_list *list = data->images; + if (data->debug) + { + DEBUGF("%s >> requesting image (id: %d)\n", __func__, n); + DEBUGF("%s >> first list data (p: %p\n", __func__, data->images); + } while (list) { struct gui_img *img = (struct gui_img *)list->token->value.data; if (img->label == label) - return img; + { + i = 0; + ret = img; goto end; + } list = list->next; +/* + if (!list && data->debug) + DEBUGF("failed to find: %s\n", img->bm.data); +*/ } - return NULL; -} -#endif + i = 0; +end: + if (data->debug) + DEBUGF("%s >> returning %p\n", __func__, ret); + return ret; +} +#endif struct skin_viewport* find_viewport(char label, struct wps_data *data) { @@ -524,7 +547,6 @@ struct skin_viewport* find_viewport(char label, struct wps_data *data) return NULL; } - /* Read a (sub)line to the given alignment format buffer. linebuf is the buffer where the data is actually stored. align is the alignment format that'll be used to display the text. diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index fa35ed994f..9a8d3f5ce4 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -603,6 +603,8 @@ static int parse_image_load(const char *wps_bufptr, return WPS_ERROR_INVALID_PARAM; /* save a pointer to the filename */ img->bm.data = (char*)filename; + if (wps_data->debug) + DEBUGF("%s >> image parsed (label: %c)\n", __func__, *id); img->label = *id; img->x = x; img->y = y; @@ -1639,8 +1641,13 @@ void skin_data_reset(struct wps_data *wps_data) wps_data->wps_progress_pat[i] = 0; } wps_data->full_line_progressbar = false; + +#ifdef HAVE_REMOTE_LCD + data->remote_wps = rwps; #endif wps_data->wps_loaded = false; + if (wps_data->debug) + DEBUGF("%s >> wps_data trashed (%p)\n", __func__, data); } #ifdef HAVE_LCD_BITMAP diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index 638fb0a081..1d1bcbc8e4 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h @@ -263,7 +263,6 @@ struct wps_data int num_tokens; /* tick the volume button was last pressed */ unsigned int button_time_volume; - #ifdef HAVE_LCD_BITMAP bool peak_meter_enabled; bool wps_sb_tag; @@ -277,6 +276,7 @@ struct wps_data /* this must not be reset on skin loading */ bool remote_wps; #endif + bool debug; }; /* wps_data end */ diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c new file mode 100644 index 0000000000..bb77a5088c --- /dev/null +++ b/apps/gui/statusbar-skinned.c @@ -0,0 +1,127 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2009 Thomas Martitz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "config.h" + +#include "system.h" +#include "settings.h" +#include "appevents.h" +#include "screens.h" +#include "screen_access.h" +#include "skin_engine/skin_engine.h" +#include "skin_engine/wps_internals.h" +#include "debug.h" + + +/* currently only one wps_state is needed */ +extern struct wps_state wps_state; +static struct gui_wps sb_skin[NB_SCREENS]; +static struct wps_data sb_skin_data[NB_SCREENS]; + +/* initial setup of wps_data */ +static void sb_skin_update(void*); +static bool loaded_ok = false; + +void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile) +{ + + loaded_ok = buf && skin_data_load(sb_skin[screen].data, + &screens[screen], buf, isfile); + + + if (loaded_ok) + add_event(GUI_EVENT_ACTIONUPDATE, false, sb_skin_update); + else + remove_event(GUI_EVENT_ACTIONUPDATE, sb_skin_update); + +#ifdef HAVE_REMOVE_LCD + sb_skin[screen].data->remote_wps = !(screen == SCREEN_MAIN); +#endif +} + +void sb_skin_data_init(enum screen_type screen) +{ + skin_data_init(sb_skin[screen].data); +} + +bool sb_skin_active(void) +{ + return loaded_ok; +} + +void sb_skin_update(void* param) +{ + int i; + (void)param; + FOR_NB_SCREENS(i) + { + skin_update(&sb_skin[i], wps_state.do_full_update? + WPS_REFRESH_ALL : WPS_REFRESH_NON_STATIC); + } +} + +void sb_skin_init(void) +{ + int i; + FOR_NB_SCREENS(i) + { + skin_data_init(&sb_skin_data[i]); +#ifdef HAVE_ALBUMART + sb_skin_data[i].wps_uses_albumart = 0; +#endif +#ifdef HAVE_REMOTE_LCD + sb_skin_data[i].remote_wps = (i == SCREEN_REMOTE); +#endif + sb_skin[i].data = &sb_skin_data[i]; + sb_skin[i].display = &screens[i]; + sb_skin[i].data->debug = true; + DEBUGF("data in init: %p, debug: %d\n", &sb_skin_data[i], sb_skin_data[i].debug); + /* Currently no seperate wps_state needed/possible + so use the only available ( "global" ) one */ + sb_skin[i].state = &wps_state; + } +#ifdef HAVE_LCD_BITMAP +/* + add_event(GUI_EVENT_STATUSBAR_TOGGLE, false, statusbar_toggle_handler); +*/ +#endif +} + +#ifdef HAVE_ALBUMART +bool sb_skin_uses_statusbar(int *width, int *height) +{ + int i; + FOR_NB_SCREENS(i) { + struct gui_wps *gwps = &sb_skin[i]; + if (gwps->data && (gwps->data->wps_uses_albumart != WPS_ALBUMART_NONE)) + { + if (width) + *width = sb_skin[0].data->albumart_max_width; + if (height) + *height = sb_skin[0].data->albumart_max_height; + return true; + } + } + return false; +} +#endif diff --git a/apps/gui/statusbar-skinned.h b/apps/gui/statusbar-skinned.h new file mode 100644 index 0000000000..7714496e52 --- /dev/null +++ b/apps/gui/statusbar-skinned.h @@ -0,0 +1,41 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2009 Thomas Martitz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "config.h" + +#ifndef __STATUSBAR_SKINNED_H__ +#define __STATUSBAR_SKINNED_H__ + + +void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile); +void sb_skin_data_init(enum screen_type screen); + +/* probably temporary, to shut the classic statusbar up */ +bool sb_skin_active(void); +void sb_skin_init(void); + +#ifdef HAVE_ALBUMART +bool sb_skin_uses_statusbar(int *width, int *height); +#endif + +#endif /* __STATUSBAR_SKINNED_H__ */ diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c index fdd06bdc46..1a2b29a65a 100644 --- a/apps/gui/viewport.c +++ b/apps/gui/viewport.c @@ -189,7 +189,8 @@ int viewportmanager_set_statusbar(const int enabled) if (showing_bars(i)) gui_statusbar_draw(&statusbars.statusbars[i], true); } - add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_redraw); + if (!sb_skin_active()) + add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_redraw); } else { @@ -250,14 +251,13 @@ void viewportmanager_theme_changed(const int which) if (which & THEME_STATUSBAR) { statusbar_enabled = VP_SB_HIDE_ALL; - - FOR_NB_SCREENS(i) - { - if (statusbar_position(i) != STATUSBAR_OFF) - statusbar_enabled |= VP_SB_ONSCREEN(i); - } - - if (statusbar_enabled != VP_SB_HIDE_ALL) + 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 && !sb_skin_active()) add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_redraw); else remove_event(GUI_EVENT_ACTIONUPDATE, viewportmanager_redraw); diff --git a/apps/gui/wps.c b/apps/gui/wps.c index 342ebdea2b..3ea5cf97f7 100644 --- a/apps/gui/wps.c +++ b/apps/gui/wps.c @@ -131,6 +131,7 @@ void wps_data_load(enum screen_type screen, const char *buf, bool isfile) loaded_ok = buf && skin_data_load(gui_wps[screen].data, &screens[screen], buf, isfile); + DEBUGF("%s >> wps loading\n", __func__); if (!loaded_ok) /* load the hardcoded default */ { char *skin_buf[NB_SCREENS] = { @@ -1291,6 +1292,7 @@ void gui_sync_wps_init(void) #ifdef HAVE_REMOTE_LCD wps_datas[i].remote_wps = (i == SCREEN_REMOTE); #endif + wps_datas[i].debug = false; gui_wps[i].data = &wps_datas[i]; gui_wps[i].display = &screens[i]; /* Currently no seperate wps_state needed/possible diff --git a/apps/main.c b/apps/main.c index f48dd2d0a0..6e902a73b1 100644 --- a/apps/main.c +++ b/apps/main.c @@ -322,6 +322,7 @@ static void init(void) settings_reset(); settings_load(SETTINGS_ALL); gui_sync_wps_init(); + sb_skin_init(); settings_apply(true); init_dircache(true); init_dircache(false); diff --git a/apps/settings.c b/apps/settings.c index 2a5e31824f..2069bfced4 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -740,6 +740,7 @@ void settings_apply_skins(void) char buf[MAX_PATH]; /* re-initialize the skin buffer before we start reloading skins */ skin_buffer_init(); + sb_skin_data_init(SCREEN_MAIN); if ( global_settings.wps_file[0] && global_settings.wps_file[0] != 0xff ) { @@ -751,6 +752,17 @@ void settings_apply_skins(void) { wps_data_load(SCREEN_MAIN, NULL, true); } + if ( global_settings.sb_file[0] && + global_settings.sb_file[0] != 0xff ) { + snprintf(buf, sizeof buf, WPS_DIR "/%s.sb", + global_settings.sb_file); + sb_skin_data_load(SCREEN_MAIN, buf, true); + } + else + { + sb_skin_data_init(SCREEN_MAIN); + sb_skin_data_load(SCREEN_MAIN, NULL, true); + } #if defined(HAVE_REMOTE_LCD) && (NB_SCREENS > 1) if ( global_settings.rwps_file[0]) { diff --git a/apps/settings.h b/apps/settings.h index ad250ed3b7..305ffddcfa 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -60,6 +60,7 @@ struct opt_items { #define FONT_DIR ROCKBOX_DIR "/fonts" #define LANG_DIR ROCKBOX_DIR "/langs" #define WPS_DIR ROCKBOX_DIR "/wps" +#define SB_DIR ROCKBOX_DIR "/statusbar" #define THEME_DIR ROCKBOX_DIR "/themes" #define ICON_DIR ROCKBOX_DIR "/icons" @@ -548,6 +549,7 @@ struct user_settings int peak_meter_max; /* range maximum */ unsigned char wps_file[MAX_FILENAME+1]; /* last wps */ + unsigned char sb_file[MAX_FILENAME+1]; /* last wps */ unsigned char lang_file[MAX_FILENAME+1]; /* last language */ unsigned char playlist_catalog_dir[MAX_FILENAME+1]; int skip_length; /* skip length */ diff --git a/apps/settings_list.c b/apps/settings_list.c index 62a9351782..59638bbeed 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -1440,6 +1440,8 @@ const struct settings_list settings[] = { #endif TEXT_SETTING(F_THEMESETTING,wps_file, "wps", DEFAULT_WPSNAME, WPS_DIR "/", ".wps"), + TEXT_SETTING(F_THEMESETTING,sb_file, "sb", + DEFAULT_WPSNAME, WPS_DIR "/", ".sb"), TEXT_SETTING(0,lang_file,"lang","",LANG_DIR "/",".lng"), #ifdef HAVE_REMOTE_LCD TEXT_SETTING(F_THEMESETTING,rwps_file,"rwps", |