From 46142b91cd2427d584e42a4bf7612f3505375740 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Tue, 14 Sep 2010 11:59:52 +0000 Subject: new file got lost git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28074 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/skin_engine/skin_engine.c | 246 +++++++++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 apps/gui/skin_engine/skin_engine.c (limited to 'apps/gui/skin_engine/skin_engine.c') diff --git a/apps/gui/skin_engine/skin_engine.c b/apps/gui/skin_engine/skin_engine.c new file mode 100644 index 0000000000..b3f0fd9e42 --- /dev/null +++ b/apps/gui/skin_engine/skin_engine.c @@ -0,0 +1,246 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Stuart Martin + * RTC config saving code (C) 2002 by hessu@hes.iki.fi + * + * 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 +#include +#include +#include +#include "inttypes.h" +#include "config.h" +#include "action.h" +#include "crc32.h" +#include "settings.h" +#include "wps.h" +#include "file.h" +#include "buffer.h" +#if CONFIG_TUNER +#include "radio.h" +#endif +#include "skin_engine.h" +#include "skin_buffer.h" +#include "statusbar-skinned.h" + +static char *skin_buffer = NULL; +void theme_init_buffer(void) +{ + skin_buffer = buffer_alloc(SKIN_BUFFER_SIZE); +} + +void settings_apply_skins(void) +{ + int i, j; + skin_buffer_init(skin_buffer, SKIN_BUFFER_SIZE); + +#ifdef HAVE_LCD_BITMAP + skin_backdrop_init(); + skin_font_init(); +#endif + gui_sync_skin_init(); + + /* Make sure each skin is loaded */ + for (i=0; i 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 + FOR_NB_SCREENS(i) + skin_backdrop_show(sb_get_backdrop(i)); +#endif +} + + +char* wps_default_skin(enum screen_type screen); +char* default_radio_skin(enum screen_type screen); +int sb_preproccess(enum screen_type screen, struct wps_data *data); +int sb_postproccess(enum screen_type screen, struct wps_data *data); +struct wps_state wps_state = { .id3 = NULL }; +static struct gui_skin_helper { + int (*preproccess)(enum screen_type screen, struct wps_data *data); + int (*postproccess)(enum screen_type screen, struct wps_data *data); + char* (*default_skin)(enum screen_type screen); +} skin_helpers[SKINNABLE_SCREENS_COUNT] = { + [CUSTOM_STATUSBAR] = { sb_preproccess, sb_postproccess, sb_create_from_settings }, + [WPS] = { NULL, NULL, wps_default_skin }, +#if CONFIG_TUNER + [FM_SCREEN] = { NULL, NULL, default_radio_skin } +#endif +}; + +struct gui_skin { + struct gui_wps gui_wps; + struct wps_data data; + char *buffer_start; + size_t buffer_usage; + + bool needs_full_update; +} skins[SKINNABLE_SCREENS_COUNT][NB_SCREENS]; + + +void gui_sync_skin_init(void) +{ + int i, j; + for(j=0; j 1 + if (screen == SCREEN_REMOTE) + { + setting = global_settings.rsbs_file; + ext = "rsbs"; + } + else +#endif + { + setting = global_settings.sbs_file; + ext = "sbs"; + } + break; + case WPS: +#if defined(HAVE_REMOTE_LCD) && NB_SCREENS > 1 + if (screen == SCREEN_REMOTE) + { + setting = global_settings.rwps_file; + ext = "rwps"; + } + else +#endif + { + setting = global_settings.wps_file; + ext = "wps"; + } + break; +#if CONFIG_TUNER + case FM_SCREEN: +#if defined(HAVE_REMOTE_LCD) && NB_SCREENS > 1 + if (screen == SCREEN_REMOTE) + { + setting = global_settings.rfms_file; + ext = "rfms"; + } + else +#endif + { + setting = global_settings.fms_file; + ext = "fms"; + } + break; +#endif + default: + return NULL; + } + + buf[0] = '\0'; /* force it to reload the default */ + if (strcmp(setting, "rockbox_failsafe")) + { + snprintf(buf, sizeof buf, "%s/%s.%s", + get_user_file_path(WPS_DIR, false, path, sizeof(path)), + setting, ext); + } + cpu_boost(true); + skin_load(skin, screen, buf, true); + cpu_boost(false); + loading_a_sbs = false; + } + + return &skins[skin][screen].gui_wps; +} + +struct wps_state *skin_get_global_state(void) +{ + return &wps_state; +} + +/* This is called to find out if we the screen needs a full update. + * if true you MUST do a full update as the next call will return false */ +bool skin_do_full_update(enum skinnable_screens skin, + enum screen_type screen) +{ + bool ret = skins[skin][screen].needs_full_update; + skins[skin][screen].needs_full_update = false; + return ret; +} + +/* tell a skin to do a full update next time */ +void skin_request_full_update(enum skinnable_screens skin) +{ + int i; + FOR_NB_SCREENS(i) + skins[skin][i].needs_full_update = true; +} -- cgit