Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Untitled

By: a guest on Aug 17th, 2010  |  syntax: None  |  size: 51.64 KB  |  views: 87  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
  2. index 8e08343..3021715 100644
  3. --- a/apps/gui/skin_engine/skin_display.c
  4. +++ b/apps/gui/skin_engine/skin_display.c
  5. @@ -80,7 +80,7 @@ void skin_update(struct gui_wps *gwps, unsigned int update_type)
  6.  {
  7.      /* This maybe shouldnt be here,
  8.       * This is also safe for skined screen which dont use the id3 */
  9. -    struct mp3entry *id3 = gwps->state->id3;
  10. +    struct mp3entry *id3 = skin_get_global_state()->id3;
  11.      bool cuesheet_update = (id3 != NULL ? cuesheet_subtrack_changed(id3) : false);
  12.      gwps->sync_data->do_full_update |= cuesheet_update;
  13.  
  14. @@ -126,7 +126,7 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb)
  15.  {
  16.      struct screen *display = gwps->display;
  17.      struct viewport *vp = pb->vp;
  18. -    struct wps_state *state = gwps->state;
  19. +    struct wps_state *state = skin_get_global_state();
  20.      struct mp3entry *id3 = state->id3;
  21.      int y = pb->y, height = pb->height;
  22.      unsigned long length, end;
  23. @@ -730,11 +730,10 @@ bool skin_has_sbs(enum screen_type screen, struct wps_data *data)
  24.  
  25.  /* do the button loop as often as required for the peak meters to update
  26.   * with a good refresh rate.
  27. - * gwps is really gwps[NB_SCREENS]! don't wrap this if FOR_NB_SCREENS()
  28.   */
  29. -int skin_wait_for_action(struct gui_wps *gwps, int context, int timeout)
  30. +int skin_wait_for_action(enum skinnable_screens skin, int context, int timeout)
  31.  {
  32. -    (void)gwps; /* silence charcell warning */
  33. +    (void)skin; /* silence charcell warning */
  34.      int button = ACTION_NONE;
  35.  #ifdef HAVE_LCD_BITMAP
  36.      int i;
  37. @@ -745,7 +744,7 @@ int skin_wait_for_action(struct gui_wps *gwps, int context, int timeout)
  38.      bool pm=false;
  39.      FOR_NB_SCREENS(i)
  40.      {
  41. -       if(gwps[i].data->peak_meter_enabled)
  42. +       if(skin_get_gwps(skin, i)->data->peak_meter_enabled)
  43.             pm = true;
  44.      }
  45.  
  46. @@ -764,8 +763,8 @@ int skin_wait_for_action(struct gui_wps *gwps, int context, int timeout)
  47.              if (TIME_AFTER(current_tick, next_refresh)) {
  48.                  FOR_NB_SCREENS(i)
  49.                  {
  50. -                    if(gwps[i].data->peak_meter_enabled)
  51. -                        skin_update(&gwps[i], SKIN_REFRESH_PEAK_METER);
  52. +                    if(skin_get_gwps(skin, i)->data->peak_meter_enabled)
  53. +                        skin_update(skin_get_gwps(skin, i), SKIN_REFRESH_PEAK_METER);
  54.                      next_refresh += HZ / PEAK_METER_FPS;
  55.                  }
  56.              }
  57. @@ -782,3 +781,109 @@ int skin_wait_for_action(struct gui_wps *gwps, int context, int timeout)
  58.      }
  59.      return button;
  60.  }
  61. +
  62. +char* wps_default_skin(enum screen_type screen);
  63. +char* default_radio_skin(enum screen_type screen);
  64. +int sb_preproccess(enum screen_type screen, struct wps_data *data);
  65. +int sb_postproccess(enum screen_type screen, struct wps_data *data);
  66. +struct wps_state     wps_state               = { .id3 = NULL };
  67. +static struct gui_skin_helper {
  68. +    int (*preproccess)(enum screen_type screen, struct wps_data *data);
  69. +    int (*postproccess)(enum screen_type screen, struct wps_data *data);
  70. +    char* (*default_skin)(enum screen_type screen);
  71. +} skin_helpers[SKINNABLE_SCREENS_COUNT] = {
  72. +    [CUSTOM_STATUSBAR] = { sb_preproccess, sb_postproccess, sb_create_from_settings },
  73. +    [WPS] = { NULL, NULL, wps_default_skin },
  74. +#if CONFIG_TUNER
  75. +    [FM_SCREEN] = { NULL, NULL, default_radio_skin }
  76. +#endif
  77. +};
  78. +    
  79. +struct gui_skin {
  80. +    struct gui_wps       gui_wps;
  81. +    struct wps_data      data;
  82. +    char                 *buffer_start;
  83. +    size_t               buffer_usage;
  84. +} skins[SKINNABLE_SCREENS_COUNT][NB_SCREENS];
  85. +static struct wps_sync_data wps_sync_data[SKINNABLE_SCREENS_COUNT];
  86. +
  87. +
  88. +void gui_sync_skin_init(void)
  89. +{
  90. +    int i, j;
  91. +    for(j=0; j<SKINNABLE_SCREENS_COUNT; j++)
  92. +    {
  93. +        FOR_NB_SCREENS(i)
  94. +        {
  95. +#ifdef HAVE_ALBUMART
  96. +            skins[j][i].data.albumart = NULL;
  97. +            skins[j][i].data.playback_aa_slot = -1;
  98. +#endif
  99. +            skins[j][i].gui_wps.data = &skins[j][i].data;
  100. +            skins[j][i].gui_wps.display = &screens[i];
  101. +            /* must point to the same struct for both screens */
  102. +            skins[j][i].gui_wps.sync_data = &wps_sync_data[j];
  103. +        }
  104. +    }
  105. +}
  106. +
  107. +void skin_load(enum skinnable_screens skin, enum screen_type screen,
  108. +               const char *buf, bool isfile)
  109. +{
  110. +    bool loaded = false;
  111. +    int i;
  112. +    /* First step should be to unload all skins which are after this one.
  113. +    for (i=skin; i<
  114. +    */
  115. +    
  116. +    if (skin_helpers[skin].preproccess)
  117. +        skin_helpers[skin].preproccess(screen, &skins[skin][screen].data);
  118. +    
  119. +    loaded = skin_data_load(screen, &skins[skin][screen].data, buf, isfile);
  120. +    if (!loaded)
  121. +        loaded = skin_data_load(screen, &skins[skin][screen].data,
  122. +                                skin_helpers[skin].default_skin(screen), false);
  123. +    if (skin_helpers[skin].postproccess)
  124. +        skin_helpers[skin].postproccess(screen, &skins[skin][screen].data);
  125. +}
  126. +
  127. +struct gui_wps *skin_get_gwps(enum skinnable_screens skin, enum screen_type screen)
  128. +{
  129. +    if (skins[skin][screen].data.wps_loaded == false)
  130. +    {
  131. +        char buf[MAX_PATH*2], path[MAX_PATH];
  132. +        char *setting, *ext;
  133. +        switch (skin)
  134. +        {
  135. +            case CUSTOM_STATUSBAR:
  136. +                return &skins[skin][screen].gui_wps;
  137. +                break;
  138. +            case WPS:
  139. +                setting = global_settings.wps_file;
  140. +                ext = "wps";
  141. +                break;
  142. +#if CONFIG_TUNER
  143. +            case FM_SCREEN:
  144. +                setting = global_settings.fms_file;
  145. +                ext = "fms";
  146. +                break;
  147. +#endif
  148. +            default:
  149. +                return NULL;
  150. +        }
  151. +        snprintf(buf, sizeof buf, "%s/%s.%s",
  152. +             get_user_file_path(WPS_DIR, false, path, sizeof(path)),
  153. +             setting, ext);
  154. +        skin_load(skin, screen, buf, true);
  155. +    }
  156. +        
  157. +    return &skins[skin][screen].gui_wps;
  158. +}
  159. +
  160. +struct wps_state *skin_get_global_state(void)
  161. +{
  162. +    return &wps_state;
  163. +}
  164. +
  165. +
  166. +
  167. diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h
  168. index 9845d8c..be61414 100644
  169. --- a/apps/gui/skin_engine/skin_engine.h
  170. +++ b/apps/gui/skin_engine/skin_engine.h
  171. @@ -97,7 +97,12 @@ void skin_backdrop_init(void);
  172.   * with a good refresh rate.
  173.   * gwps is really gwps[NB_SCREENS]! don't wrap this in FOR_NB_SCREENS()
  174.   */
  175. -int skin_wait_for_action(struct gui_wps *gwps, int context, int timeout);
  176. +int skin_wait_for_action(enum skinnable_screens skin, int context, int timeout);
  177.  #endif
  178.  
  179. +void skin_load(enum skinnable_screens skin, enum screen_type screen,
  180. +               const char *buf, bool isfile);
  181. +struct gui_wps *skin_get_gwps(enum skinnable_screens skin, enum screen_type screen);
  182. +struct wps_state *skin_get_global_state(void);
  183. +
  184.  #endif
  185. diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c
  186. index 0c18848..5b504f0 100644
  187. --- a/apps/gui/skin_engine/skin_render.c
  188. +++ b/apps/gui/skin_engine/skin_render.c
  189. @@ -706,7 +706,8 @@ static void skin_render_playlistviewer(struct playlistviewer* viewer,
  190.      else
  191.  #endif
  192.      {
  193. -        struct cuesheet *cue = gwps->state->id3 ? gwps->state->id3->cuesheet:NULL;
  194. +        struct cuesheet *cue = skin_get_global_state()->id3 ?
  195. +                               skin_get_global_state()->id3->cuesheet : NULL;
  196.          cur_pos = playlist_get_display_index();
  197.          max = playlist_amount()+1;
  198.          if (cue)
  199. diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
  200. index b555885..82abe62 100644
  201. --- a/apps/gui/skin_engine/skin_tokens.c
  202. +++ b/apps/gui/skin_engine/skin_tokens.c
  203. @@ -517,14 +517,15 @@ static struct mp3entry* get_mp3entry_from_offset(struct gui_wps *gwps,
  204.                                                   int offset, char **filename)
  205.  {
  206.      struct mp3entry* pid3 = NULL;
  207. -    struct cuesheet *cue = gwps->state->id3 ? gwps->state->id3->cuesheet:NULL;
  208. +    struct wps_state *state = skin_get_global_state();
  209. +    struct cuesheet *cue = state->id3 ? state->id3->cuesheet : NULL;
  210.      const char *fname = NULL;
  211.      if (cue && cue->curr_track_idx + offset < cue->track_count)
  212. -        pid3 = gwps->state->id3;
  213. +        pid3 = state->id3;
  214.      else if (offset == 0)
  215. -        pid3 = gwps->state->id3;
  216. +        pid3 = state->id3;
  217.      else if (offset == 1)
  218. -        pid3 = gwps->state->nid3;
  219. +        pid3 = state->nid3;
  220.      else
  221.      {
  222.          static char filename_buf[MAX_PATH + 1];
  223. @@ -566,7 +567,7 @@ const char *get_token_value(struct gui_wps *gwps,
  224.          return NULL;
  225.  
  226.      struct wps_data *data = gwps->data;
  227. -    struct wps_state *state = gwps->state;
  228. +    struct wps_state *state = skin_get_global_state();
  229.      struct mp3entry *id3; /* Think very carefully about using this.
  230.                               maybe get_id3_token() is the better place? */
  231.      const char *out_text = NULL;
  232. diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
  233. index c886a75..62fc62b 100644
  234. --- a/apps/gui/skin_engine/wps_internals.h
  235. +++ b/apps/gui/skin_engine/wps_internals.h
  236. @@ -320,7 +320,6 @@ struct gui_wps
  237.  {
  238.      struct screen *display;
  239.      struct wps_data *data;
  240. -    struct wps_state *state;
  241.      /* must point to the same struct for all screens */
  242.      struct wps_sync_data *sync_data;
  243.  };
  244. diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c
  245. index 8928378..48e32b4 100644
  246. --- a/apps/gui/statusbar-skinned.c
  247. +++ b/apps/gui/statusbar-skinned.c
  248. @@ -39,13 +39,6 @@
  249.  #include "font.h"
  250.  #include "icon.h"
  251.  
  252. -
  253. -/* currently only one wps_state is needed */
  254. -extern struct wps_state     wps_state; /* from wps.c */
  255. -static struct gui_wps       sb_skin[NB_SCREENS]      = {{ .data = NULL }};
  256. -static struct wps_data      sb_skin_data[NB_SCREENS] = {{ .wps_loaded = 0 }};
  257. -static struct wps_sync_data sb_skin_sync_data        = { .do_full_update = false };
  258. -
  259.  /* initial setup of wps_data  */
  260.  static int update_delay = DEFAULT_UPDATE_DELAY;
  261.  static int set_title_worker(char* title, enum themable_icons icon,
  262. @@ -101,26 +94,25 @@ static int set_title_worker(char* title, enum themable_icons icon,
  263.  
  264.  bool sb_set_title_text(char* title, enum themable_icons icon, enum screen_type screen)
  265.  {
  266. -    bool retval = set_title_worker(title, icon, &sb_skin_data[screen],
  267. -                                   sb_skin_data[screen].tree) > 0;
  268. +    struct wps_data *data = skin_get_gwps(CUSTOM_STATUSBAR, screen)->data;
  269. +    bool retval = set_title_worker(title, icon, data, data->tree) > 0;
  270.      return retval;
  271.  }
  272.      
  273. -
  274. -void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile)
  275. +int sb_preproccess(enum screen_type screen, struct wps_data *data)
  276.  {
  277. -    struct wps_data *data = sb_skin[screen].data;
  278. -
  279. -    int success;
  280. +    (void)data;
  281.      /* We need to disable the theme here or else viewport_set_defaults()
  282.       * (which is called in the viewport tag parser) will crash because
  283.       * the theme is enabled but sb_set_info_vp() isnt set untill after the sbs
  284.       * is parsed. This only affects the default viewport which is ignored
  285.       * int he sbs anyway */
  286.      viewportmanager_theme_enable(screen, false, NULL);
  287. -    success = buf && skin_data_load(screen, data, buf, isfile);
  288. -
  289. -    if (success)
  290. +    return 1;
  291. +}
  292. +int sb_postproccess(enum screen_type screen, struct wps_data *data)
  293. +{
  294. +    if (data->wps_loaded)
  295.      {  
  296.          /* hide the sb's default viewport because it has nasty effect with stuff
  297.          * not part of the statusbar,
  298. @@ -132,17 +124,20 @@ void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile)
  299.          {
  300.              if (!next_vp)
  301.              {    /* no second viewport, let parsing fail */
  302. -                success = false;
  303. +                return 0;
  304.              }
  305.              /* hide this viewport, forever */
  306.              vp->hidden_flags = VP_NEVER_VISIBLE;
  307.          }
  308.          sb_set_info_vp(screen, VP_DEFAULT_LABEL);
  309.      }
  310. -
  311. -    if (!success && isfile)
  312. -        sb_create_from_settings(screen);
  313.      viewportmanager_theme_undo(screen, false);
  314. +    return 1;
  315. +}
  316. +
  317. +void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile)
  318. +{
  319. +    skin_load(CUSTOM_STATUSBAR, screen, buf, isfile);
  320.  }
  321.  static char *infovp_label[NB_SCREENS];
  322.  static char *oldinfovp_label[NB_SCREENS];
  323. @@ -153,6 +148,7 @@ void sb_set_info_vp(enum screen_type screen, char *label)
  324.      
  325.  struct viewport *sb_skin_get_info_vp(enum screen_type screen)
  326.  {
  327. +    struct wps_data *data = skin_get_gwps(CUSTOM_STATUSBAR, screen)->data;
  328.      if (oldinfovp_label[screen] &&
  329.          strcmp(oldinfovp_label[screen], infovp_label[screen]))
  330.      {
  331. @@ -161,23 +157,24 @@ struct viewport *sb_skin_get_info_vp(enum screen_type screen)
  332.          viewportmanager_theme_enable(screen, false, NULL);
  333.          viewportmanager_theme_undo(screen, true);
  334.      }        
  335. -    return &find_viewport(infovp_label[screen], true, sb_skin[screen].data)->vp;
  336. +    return &find_viewport(infovp_label[screen], true, data)->vp;
  337.  }
  338.  
  339.  #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1)
  340.  char* sb_get_backdrop(enum screen_type screen)
  341.  {
  342. -    return sb_skin[screen].data->backdrop;
  343. +    return skin_get_gwps(CUSTOM_STATUSBAR, screen)->data->backdrop;
  344.  }
  345.  
  346.  bool sb_set_backdrop(enum screen_type screen, char* filename)
  347.  {
  348. +    struct wps_data *data = skin_get_gwps(CUSTOM_STATUSBAR, screen)->data;
  349.      if (!filename)
  350.      {
  351. -        sb_skin[screen].data->backdrop = NULL;
  352. +        data->backdrop = NULL;
  353.          return true;
  354.      }
  355. -    else if (!sb_skin[screen].data->backdrop)
  356. +    else if (!data->backdrop)
  357.      {
  358.          /* need to make room on the buffer */
  359.          size_t buf_size;
  360. @@ -187,22 +184,23 @@ bool sb_set_backdrop(enum screen_type screen, char* filename)
  361.          else
  362.  #endif
  363.              buf_size = LCD_BACKDROP_BYTES;
  364. -        sb_skin[screen].data->backdrop = (char*)skin_buffer_alloc(buf_size);
  365. -        if (!sb_skin[screen].data->backdrop)
  366. +        data->backdrop = (char*)skin_buffer_alloc(buf_size);
  367. +        if (!data->backdrop)
  368.              return false;          
  369.      }
  370.    
  371. -    if (!screens[screen].backdrop_load(filename, sb_skin[screen].data->backdrop))
  372. -        sb_skin[screen].data->backdrop = NULL;
  373. -    return sb_skin[screen].data->backdrop != NULL;
  374. +    if (!screens[screen].backdrop_load(filename, data->backdrop))
  375. +        data->backdrop = NULL;
  376. +    return data->backdrop != NULL;
  377.  }
  378.          
  379.  #endif
  380.  void sb_skin_update(enum screen_type screen, bool force)
  381.  {
  382. +    struct wps_data *data = skin_get_gwps(CUSTOM_STATUSBAR, screen)->data;
  383.      static long next_update[NB_SCREENS] = {0};
  384.      int i = screen;
  385. -    if (!sb_skin_data[screen].wps_loaded)
  386. +    if (!data->wps_loaded)
  387.          return;
  388.      if (TIME_AFTER(current_tick, next_update[i]) || force)
  389.      {
  390. @@ -212,11 +210,11 @@ void sb_skin_update(enum screen_type screen, bool force)
  391.          if (lcd_active() || (i != SCREEN_MAIN))
  392.  #endif
  393.          {
  394. -            bool full_update = sb_skin[i].sync_data->do_full_update;
  395. +            bool full_update = skin_get_gwps(CUSTOM_STATUSBAR, screen)->sync_data->do_full_update;
  396.  #if NB_SCREENS > 1
  397. -            if (i==SCREEN_MAIN && sb_skin[i].sync_data->do_full_update)
  398. +            if (i==SCREEN_MAIN && skin_get_gwps(CUSTOM_STATUSBAR, screen)->sync_data->do_full_update)
  399.              {
  400. -                sb_skin[i].sync_data->do_full_update = false;
  401. +                skin_get_gwps(CUSTOM_STATUSBAR, screen)->sync_data->do_full_update = false;
  402.                  /* we need to make sure the remote gets a full update
  403.                   * next time it is drawn also. so quick n dirty hack */
  404.                  next_update[SCREEN_REMOTE] = 0;
  405. @@ -226,9 +224,9 @@ void sb_skin_update(enum screen_type screen, bool force)
  406.                  full_update = true;
  407.              }
  408.  #else
  409. -            sb_skin[i].sync_data->do_full_update = false;
  410. +            skin_get_gwps(CUSTOM_STATUSBAR, screen)->sync_data->do_full_update = false;
  411.  #endif
  412. -            skin_update(&sb_skin[i], force || full_update?
  413. +            skin_update(skin_get_gwps(CUSTOM_STATUSBAR, screen), force || full_update?
  414.                      SKIN_REFRESH_ALL : SKIN_REFRESH_NON_STATIC);
  415.          }
  416.          next_update[i] = current_tick + update_delay; /* don't update too often */
  417. @@ -240,7 +238,7 @@ void do_sbs_update_callback(void *param)
  418.      (void)param;
  419.      /* the WPS handles changing the actual id3 data in the id3 pointers
  420.       * we imported, we just want a full update */
  421. -    sb_skin_sync_data.do_full_update = true;
  422. +    skin_get_gwps(CUSTOM_STATUSBAR, 0)->sync_data->do_full_update = true;
  423.      /* force timeout in wps main loop, so that the update is instantly */
  424.      queue_post(&button_queue, BUTTON_NONE, 0);
  425.  }
  426. @@ -256,9 +254,10 @@ void sb_skin_set_update_delay(int delay)
  427.   *  - ui viewport
  428.   *  - backdrop
  429.   */
  430. -void sb_create_from_settings(enum screen_type screen)
  431. +char* sb_create_from_settings(enum screen_type screen)
  432.  {
  433. -    char buf[128], *ptr, *ptr2;
  434. +    static char buf[128];
  435. +    char *ptr, *ptr2;
  436.      int len, remaining = sizeof(buf);
  437.      int bar_position = statusbar_position(screen);
  438.      ptr = buf;
  439. @@ -328,7 +327,7 @@ void sb_create_from_settings(enum screen_type screen)
  440.          len = snprintf(ptr, remaining, "%%ax%%Vi(-,0,%d,-,%d,1)\n",
  441.                         y, height);
  442.      }
  443. -    sb_skin_data_load(screen, buf, false);
  444. +    return buf;
  445.  }
  446.  
  447.  void sb_skin_init(void)
  448. @@ -337,16 +336,6 @@ void sb_skin_init(void)
  449.      FOR_NB_SCREENS(i)
  450.      {
  451.          oldinfovp_label[i] = NULL;
  452. -#ifdef HAVE_ALBUMART
  453. -        sb_skin_data[i].albumart = NULL;
  454. -        sb_skin_data[i].playback_aa_slot = -1;
  455. -#endif
  456. -        sb_skin[i].data = &sb_skin_data[i];
  457. -        sb_skin[i].display = &screens[i];
  458. -        /* Currently no seperate wps_state needed/possible
  459. -           so use the only available ( "global" ) one */
  460. -        sb_skin[i].state = &wps_state;
  461. -        sb_skin[i].sync_data = &sb_skin_sync_data;
  462.      }
  463.  }
  464.  
  465. @@ -365,9 +354,9 @@ int sb_touch_to_button(int context)
  466.          return ACTION_TOUCHSCREEN;
  467.      
  468.      if (last_context != context)
  469. -        skin_disarm_touchregions(&sb_skin_data[SCREEN_MAIN]);
  470. +        skin_disarm_touchregions(skin_get_gwps(CUSTOM_STATUSBAR, SCREEN_MAIN)->data);
  471.      last_context = context;
  472. -    button = skin_get_touchaction(&sb_skin_data[SCREEN_MAIN], &offset);
  473. +    button = skin_get_touchaction(skin_get_gwps(CUSTOM_STATUSBAR, SCREEN_MAIN)->data, &offset);
  474.      
  475.      switch (button)
  476.      {
  477. diff --git a/apps/gui/statusbar-skinned.h b/apps/gui/statusbar-skinned.h
  478. index 893d489..983b371 100644
  479. --- a/apps/gui/statusbar-skinned.h
  480. +++ b/apps/gui/statusbar-skinned.h
  481. @@ -34,7 +34,7 @@
  482.  
  483.  void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile);
  484.  
  485. -void sb_create_from_settings(enum screen_type screen);
  486. +char* sb_create_from_settings(enum screen_type screen);
  487.  void sb_skin_init(void) INIT_ATTR;
  488.  void sb_set_info_vp(enum screen_type screen, char *label);
  489.  struct viewport *sb_skin_get_info_vp(enum screen_type screen);
  490. diff --git a/apps/gui/theme_settings.c b/apps/gui/theme_settings.c
  491. index a975c21..b340a71 100644
  492. --- a/apps/gui/theme_settings.c
  493. +++ b/apps/gui/theme_settings.c
  494. @@ -61,6 +61,7 @@ static const struct skin_load_setting skins[] = {
  495.  #ifdef HAVE_LCD_BITMAP
  496.      { global_settings.sbs_file, "sbs", sb_skin_data_load},
  497.  #endif    
  498. +#if 0
  499.      { global_settings.wps_file, "wps", wps_data_load},
  500.  #if CONFIG_TUNER
  501.      { global_settings.fms_file, "fms", fms_data_load},
  502. @@ -72,6 +73,7 @@ static const struct skin_load_setting skins[] = {
  503.      { global_settings.rfms_file, "rfms", fms_data_load},
  504.  #endif
  505.  #endif
  506. +#endif
  507.  };
  508.  
  509.  void settings_apply_skins(void)
  510. @@ -86,9 +88,6 @@ void settings_apply_skins(void)
  511.      skin_backdrop_init();
  512.      skin_font_init();
  513.  #endif
  514. -#if CONFIG_TUNER
  515. -    fms_skin_init();
  516. -#endif
  517.      for (i=0; i<ARRAYLEN(skins); i++)
  518.      {
  519.  #ifdef HAVE_REMOTE_LCD
  520. diff --git a/apps/gui/wps.c b/apps/gui/wps.c
  521. index 6ab016f..a59e1af 100644
  522. --- a/apps/gui/wps.c
  523. +++ b/apps/gui/wps.c
  524. @@ -74,12 +74,6 @@
  525.                                  /* 3% of 30min file == 54s step size */
  526.  #define MIN_FF_REWIND_STEP 500
  527.  
  528. -/* currently only one wps_state is needed, initialize to 0 */
  529. -       struct wps_state     wps_state               = { .id3 = NULL };
  530. -static struct gui_wps       gui_wps[NB_SCREENS]     = {{ .data = NULL }};
  531. -static struct wps_data      wps_datas[NB_SCREENS]   = {{ .wps_loaded = 0 }};
  532. -static struct wps_sync_data wps_sync_data           = { .do_full_update = false };
  533. -
  534.  /* initial setup of wps_data  */
  535.  static void wps_state_init(void);
  536.  static void track_changed_callback(void *param);
  537. @@ -94,8 +88,40 @@ static void nextid3available_callback(void* param);
  538.  #define DEFAULT_WPS(screen) (WPS_DEFAULTCFG)
  539.  #endif
  540.  
  541. +char* wps_default_skin(enum screen_type screen)
  542. +{
  543. +    static char *skin_buf[NB_SCREENS] = {
  544. +#ifdef HAVE_LCD_BITMAP
  545. +#if LCD_DEPTH > 1
  546. +            "%X(d)\n"
  547. +#endif
  548. +            "%s%?it<%?in<%in. |>%it|%fn>\n"
  549. +            "%s%?ia<%ia|%?d(2)<%d(2)|%(root%)>>\n"
  550. +            "%s%?id<%id|%?d(1)<%d(1)|%(root%)>> %?iy<%(%iy%)|>\n\n"
  551. +            "%al%pc/%pt%ar[%pp:%pe]\n"
  552. +            "%fbkBit %?fv<avg|> %?iv<%(id3v%iv%)|%(no id3%)>\n"
  553. +            "%pb\n%pm\n",
  554. +#else
  555. +            "%s%pp/%pe: %?it<%it|%fn> - %?ia<%ia|%d(2)> - %?id<%id|%d(1)>\n"
  556. +            "%pc%?ps<*|/>%pt\n",
  557. +#endif
  558. +#ifdef HAVE_REMOTE_LCD
  559. +#if LCD_REMOTE_DEPTH > 1
  560. +            "%X(d)\n"
  561. +#endif
  562. +            "%s%?ia<%ia|%?d(2)<%d(2)|%(root%)>>\n"
  563. +            "%s%?it<%?in<%in. |>%it|%fn>\n"
  564. +            "%al%pc/%pt%ar[%pp:%pe]\n"
  565. +            "%fbkBit %?fv<avg|> %?iv<%(id3v%iv%)|%(no id3%)>\n"
  566. +            "%pb\n",
  567. +#endif
  568. +        };
  569. +    return skin_buf[screen];
  570. +}
  571. +
  572.  void wps_data_load(enum screen_type screen, const char *buf, bool isfile)
  573.  {
  574. +#if 0
  575.      bool loaded_ok;
  576.  
  577.  #ifndef __PCTOOL__
  578. @@ -122,34 +148,11 @@ void wps_data_load(enum screen_type screen, const char *buf, bool isfile)
  579.  
  580.      if (!loaded_ok) /* load the hardcoded default */
  581.      {
  582. -        char *skin_buf[NB_SCREENS] = {
  583. -#ifdef HAVE_LCD_BITMAP
  584. -#if LCD_DEPTH > 1
  585. -            "%X(d)\n"
  586. -#endif
  587. -            "%s%?it<%?in<%in. |>%it|%fn>\n"
  588. -            "%s%?ia<%ia|%?d(2)<%d(2)|%(root%)>>\n"
  589. -            "%s%?id<%id|%?d(1)<%d(1)|%(root%)>> %?iy<%(%iy%)|>\n\n"
  590. -            "%al%pc/%pt%ar[%pp:%pe]\n"
  591. -            "%fbkBit %?fv<avg|> %?iv<%(id3v%iv%)|%(no id3%)>\n"
  592. -            "%pb\n%pm\n",
  593. -#else
  594. -            "%s%pp/%pe: %?it<%it|%fn> - %?ia<%ia|%d(2)> - %?id<%id|%d(1)>\n"
  595. -            "%pc%?ps<*|/>%pt\n",
  596. -#endif
  597. -#ifdef HAVE_REMOTE_LCD
  598. -#if LCD_REMOTE_DEPTH > 1
  599. -            "%X(d)\n"
  600. -#endif
  601. -            "%s%?ia<%ia|%?d(2)<%d(2)|%(root%)>>\n"
  602. -            "%s%?it<%?in<%in. |>%it|%fn>\n"
  603. -            "%al%pc/%pt%ar[%pp:%pe]\n"
  604. -            "%fbkBit %?fv<avg|> %?iv<%(id3v%iv%)|%(no id3%)>\n"
  605. -            "%pb\n",
  606. -#endif
  607. -        };
  608. +        
  609.          skin_data_load(screen, gui_wps[screen].data, skin_buf[screen], false);
  610.      }
  611. +#endif
  612. +    skin_load(WPS, screen, buf, isfile);
  613.  }
  614.  
  615.  void fade(bool fade_in, bool updatewps)
  616. @@ -158,7 +161,7 @@ void fade(bool fade_in, bool updatewps)
  617.      int fp_min_vol = sound_min(SOUND_VOLUME) << 8;
  618.      int fp_step = (fp_global_vol - fp_min_vol) / 30;
  619.      int i;
  620. -    wps_state.is_fading = !fade_in;
  621. +    skin_get_global_state()->is_fading = !fade_in;
  622.      if (fade_in) {
  623.          /* fade in */
  624.          int fp_volume = fp_min_vol;
  625. @@ -175,7 +178,7 @@ void fade(bool fade_in, bool updatewps)
  626.              if (updatewps)
  627.              {
  628.                  FOR_NB_SCREENS(i)
  629. -                    skin_update(&gui_wps[i], SKIN_REFRESH_NON_STATIC);
  630. +                    skin_update(skin_get_gwps(WPS, i), SKIN_REFRESH_NON_STATIC);
  631.              }
  632.              sleep(1);
  633.          }
  634. @@ -191,12 +194,12 @@ void fade(bool fade_in, bool updatewps)
  635.              if (updatewps)
  636.              {
  637.                  FOR_NB_SCREENS(i)
  638. -                    skin_update(&gui_wps[i], SKIN_REFRESH_NON_STATIC);
  639. +                    skin_update(skin_get_gwps(WPS, i), SKIN_REFRESH_NON_STATIC);
  640.              }
  641.              sleep(1);
  642.          }
  643.          audio_pause();
  644. -        wps_state.is_fading = false;
  645. +        skin_get_global_state()->is_fading = false;
  646.  #if CONFIG_CODEC != SWCODEC
  647.  #ifndef SIMULATOR
  648.          /* let audio thread run and wait for the mas to run out of data */
  649. @@ -249,16 +252,16 @@ static int skintouch_to_wps(struct wps_data *data)
  650.              return ACTION_WPS_HOTKEY;
  651.  #endif
  652.          case WPS_TOUCHREGION_SCROLLBAR:
  653. -            wps_state.id3->elapsed = wps_state.id3->length*offset/100;
  654. -            if (!wps_state.paused)
  655. +            skin_get_global_state()->id3->elapsed = skin_get_global_state()->id3->length*offset/100;
  656. +            if (!skin_get_global_state()->paused)
  657.  #if (CONFIG_CODEC == SWCODEC)
  658.                  audio_pre_ff_rewind();
  659.  #else
  660.                  audio_pause();
  661.  #endif
  662. -            audio_ff_rewind(wps_state.id3->elapsed);
  663. +            audio_ff_rewind(skin_get_global_state()->id3->elapsed);
  664.  #if (CONFIG_CODEC != SWCODEC)
  665. -            if (!wps_state.paused)
  666. +            if (!skin_get_global_state()->paused)
  667.                  audio_resume();
  668.  #endif
  669.              return ACTION_TOUCHSCREEN;
  670. @@ -299,20 +302,20 @@ bool ffwd_rew(int button)
  671.              case ACTION_WPS_SEEKFWD:
  672.                   direction = 1;
  673.              case ACTION_WPS_SEEKBACK:
  674. -                if (wps_state.ff_rewind)
  675. +                if (skin_get_global_state()->ff_rewind)
  676.                  {
  677.                      if (direction == 1)
  678.                      {
  679.                          /* fast forwarding, calc max step relative to end */
  680. -                        max_step = (wps_state.id3->length -
  681. -                                    (wps_state.id3->elapsed +
  682. +                        max_step = (skin_get_global_state()->id3->length -
  683. +                                    (skin_get_global_state()->id3->elapsed +
  684.                                       ff_rewind_count)) *
  685.                                       FF_REWIND_MAX_PERCENT / 100;
  686.                      }
  687.                      else
  688.                      {
  689.                          /* rewinding, calc max step relative to start */
  690. -                        max_step = (wps_state.id3->elapsed + ff_rewind_count) *
  691. +                        max_step = (skin_get_global_state()->id3->elapsed + ff_rewind_count) *
  692.                                      FF_REWIND_MAX_PERCENT / 100;
  693.                      }
  694.  
  695. @@ -329,9 +332,9 @@ bool ffwd_rew(int button)
  696.                  else
  697.                  {
  698.                      if ( (audio_status() & AUDIO_STATUS_PLAY) &&
  699. -                          wps_state.id3 && wps_state.id3->length )
  700. +                          skin_get_global_state()->id3 && skin_get_global_state()->id3->length )
  701.                      {
  702. -                        if (!wps_state.paused)
  703. +                        if (!skin_get_global_state()->paused)
  704.  #if (CONFIG_CODEC == SWCODEC)
  705.                              audio_pre_ff_rewind();
  706.  #else
  707. @@ -339,14 +342,14 @@ bool ffwd_rew(int button)
  708.  #endif
  709.  #if CONFIG_KEYPAD == PLAYER_PAD
  710.                          FOR_NB_SCREENS(i)
  711. -                            gui_wps[i].display->stop_scroll();
  712. +                            skin_get_gwps(WPS, i)->display->stop_scroll();
  713.  #endif
  714.                          if (direction > 0)
  715.                              status_set_ffmode(STATUS_FASTFORWARD);
  716.                          else
  717.                              status_set_ffmode(STATUS_FASTBACKWARD);
  718.  
  719. -                        wps_state.ff_rewind = true;
  720. +                        skin_get_global_state()->ff_rewind = true;
  721.  
  722.                          step = 1000 * global_settings.ff_rewind_min_step;
  723.                      }
  724. @@ -355,23 +358,23 @@ bool ffwd_rew(int button)
  725.                  }
  726.  
  727.                  if (direction > 0) {
  728. -                    if ((wps_state.id3->elapsed + ff_rewind_count) >
  729. -                        wps_state.id3->length)
  730. -                        ff_rewind_count = wps_state.id3->length -
  731. -                            wps_state.id3->elapsed;
  732. +                    if ((skin_get_global_state()->id3->elapsed + ff_rewind_count) >
  733. +                        skin_get_global_state()->id3->length)
  734. +                        ff_rewind_count = skin_get_global_state()->id3->length -
  735. +                            skin_get_global_state()->id3->elapsed;
  736.                  }
  737.                  else {
  738. -                    if ((int)(wps_state.id3->elapsed + ff_rewind_count) < 0)
  739. -                        ff_rewind_count = -wps_state.id3->elapsed;
  740. +                    if ((int)(skin_get_global_state()->id3->elapsed + ff_rewind_count) < 0)
  741. +                        ff_rewind_count = -skin_get_global_state()->id3->elapsed;
  742.                  }
  743.  
  744.                  /* set the wps state ff_rewind_count so the progess info
  745.                     displays corectly */
  746. -                wps_state.ff_rewind_count = (wps_state.wps_time_countup == false)?
  747. +                skin_get_global_state()->ff_rewind_count = (skin_get_global_state()->wps_time_countup == false)?
  748.                                              ff_rewind_count:-ff_rewind_count;
  749.                  FOR_NB_SCREENS(i)
  750.                  {
  751. -                    skin_update(&gui_wps[i],
  752. +                    skin_update(skin_get_gwps(WPS, i),
  753.                                  SKIN_REFRESH_PLAYER_PROGRESS |
  754.                                  SKIN_REFRESH_DYNAMIC);
  755.                  }
  756. @@ -379,18 +382,18 @@ bool ffwd_rew(int button)
  757.                  break;
  758.  
  759.              case ACTION_WPS_STOPSEEK:
  760. -                wps_state.id3->elapsed = wps_state.id3->elapsed+ff_rewind_count;
  761. -                audio_ff_rewind(wps_state.id3->elapsed);
  762. -                wps_state.ff_rewind_count = 0;
  763. -                wps_state.ff_rewind = false;
  764. +                skin_get_global_state()->id3->elapsed = skin_get_global_state()->id3->elapsed+ff_rewind_count;
  765. +                audio_ff_rewind(skin_get_global_state()->id3->elapsed);
  766. +                skin_get_global_state()->ff_rewind_count = 0;
  767. +                skin_get_global_state()->ff_rewind = false;
  768.                  status_set_ffmode(0);
  769.  #if (CONFIG_CODEC != SWCODEC)
  770. -                if (!wps_state.paused)
  771. +                if (!skin_get_global_state()->paused)
  772.                      audio_resume();
  773.  #endif
  774.  #ifdef HAVE_LCD_CHARCELLS
  775.                  FOR_NB_SCREENS(i)
  776. -                    skin_update(&gui_wps[i], SKIN_REFRESH_ALL);
  777. +                    skin_update(skin_get_gwps(WPS, i), SKIN_REFRESH_ALL);
  778.  #endif
  779.                  exit = true;
  780.                  break;
  781. @@ -408,7 +411,7 @@ bool ffwd_rew(int button)
  782.              button = get_action(CONTEXT_WPS|ALLOW_SOFTLOCK,TIMEOUT_BLOCK);
  783.  #ifdef HAVE_TOUCHSCREEN
  784.              if (button == ACTION_TOUCHSCREEN)
  785. -                button = skintouch_to_wps(gui_wps[SCREEN_MAIN].data);
  786. +                button = skintouch_to_wps(skin_get_gwps(WPS, SCREEN_MAIN)->data);
  787.              if (button != ACTION_WPS_SEEKFWD &&
  788.                  button != ACTION_WPS_SEEKBACK)
  789.                  button = ACTION_WPS_STOPSEEK;
  790. @@ -423,7 +426,7 @@ void display_keylock_text(bool locked)
  791.  {
  792.      int i;
  793.      FOR_NB_SCREENS(i)
  794. -        gui_wps[i].display->stop_scroll();
  795. +        skin_get_gwps(WPS, i)->display->stop_scroll();
  796.  
  797.      splash(HZ, locked ? ID2P(LANG_KEYLOCK_ON) : ID2P(LANG_KEYLOCK_OFF));
  798.  }
  799. @@ -489,20 +492,21 @@ static void change_dir(int direction)
  800.  
  801.  static void prev_track(unsigned long skip_thresh)
  802.  {
  803. -    if (wps_state.id3->elapsed < skip_thresh)
  804. +    struct wps_state *state = skin_get_global_state();
  805. +    if (state->id3->elapsed < skip_thresh)
  806.      {
  807.          audio_prev();
  808.          return;
  809.      }
  810.      else
  811.      {
  812. -        if (wps_state.id3->cuesheet)
  813. +        if (state->id3->cuesheet)
  814.          {
  815. -            curr_cuesheet_skip(wps_state.id3->cuesheet, -1, wps_state.id3->elapsed);
  816. +            curr_cuesheet_skip(state->id3->cuesheet, -1, state->id3->elapsed);
  817.              return;
  818.          }
  819.  
  820. -        if (!wps_state.paused)
  821. +        if (!state->paused)
  822.  #if (CONFIG_CODEC == SWCODEC)
  823.              audio_pre_ff_rewind();
  824.  #else
  825. @@ -512,7 +516,7 @@ static void prev_track(unsigned long skip_thresh)
  826.          audio_ff_rewind(0);
  827.  
  828.  #if (CONFIG_CODEC != SWCODEC)
  829. -        if (!wps_state.paused)
  830. +        if (!state->paused)
  831.              audio_resume();
  832.  #endif
  833.      }
  834. @@ -520,10 +524,11 @@ static void prev_track(unsigned long skip_thresh)
  835.  
  836.  static void next_track(void)
  837.  {
  838. +    struct wps_state *state = skin_get_global_state();
  839.      /* take care of if we're playing a cuesheet */
  840. -    if (wps_state.id3->cuesheet)
  841. +    if (state->id3->cuesheet)
  842.      {
  843. -        if (curr_cuesheet_skip(wps_state.id3->cuesheet, 1, wps_state.id3->elapsed))
  844. +        if (curr_cuesheet_skip(state->id3->cuesheet, 1, state->id3->elapsed))
  845.          {
  846.              /* if the result was false, then we really want
  847.                 to skip to the next track */
  848. @@ -536,9 +541,10 @@ static void next_track(void)
  849.  
  850.  static void play_hop(int direction)
  851.  {
  852. +    struct wps_state *state = skin_get_global_state();
  853.      long step = global_settings.skip_length*1000;
  854. -    long elapsed = wps_state.id3->elapsed;
  855. -    long remaining = wps_state.id3->length - elapsed;
  856. +    long elapsed = state->id3->elapsed;
  857. +    long remaining = state->id3->length - elapsed;
  858.  
  859.      if (step < 0)
  860.      {
  861. @@ -582,7 +588,7 @@ static void play_hop(int direction)
  862.      {
  863.          elapsed += step * direction;
  864.      }
  865. -    if((audio_status() & AUDIO_STATUS_PLAY) && !wps_state.paused)
  866. +    if((audio_status() & AUDIO_STATUS_PLAY) && !state->paused)
  867.      {
  868.  #if (CONFIG_CODEC == SWCODEC)
  869.          audio_pre_ff_rewind();
  870. @@ -590,9 +596,9 @@ static void play_hop(int direction)
  871.          audio_pause();
  872.  #endif
  873.      }
  874. -    audio_ff_rewind(wps_state.id3->elapsed = elapsed);
  875. +    audio_ff_rewind(state->id3->elapsed = elapsed);
  876.  #if (CONFIG_CODEC != SWCODEC)
  877. -    if (!wps_state.paused)
  878. +    if (!state->paused)
  879.          audio_resume();
  880.  #endif
  881.  }
  882. @@ -607,7 +613,7 @@ static void play_hop(int direction)
  883.  static void wps_lcd_activation_hook(void *param)
  884.  {
  885.      (void)param;
  886. -    wps_sync_data.do_full_update = true;
  887. +    skin_get_gwps(WPS, 0)->sync_data->do_full_update = true;
  888.      /* force timeout in wps main loop, so that the update is instantly */
  889.      queue_post(&button_queue, BUTTON_NONE, 0);
  890.  }
  891. @@ -619,11 +625,11 @@ static void gwps_leave_wps(void)
  892.  
  893.      FOR_NB_SCREENS(i)
  894.      {
  895. -        gui_wps[i].display->stop_scroll();
  896. +        skin_get_gwps(WPS, i)->display->stop_scroll();
  897.  #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
  898. -        gui_wps[i].display->backdrop_show(sb_get_backdrop(i));
  899. +        skin_get_gwps(WPS, i)->display->backdrop_show(sb_get_backdrop(i));
  900.  #endif
  901. -        viewportmanager_theme_undo(i, skin_has_sbs(i, gui_wps[i].data));
  902. +        viewportmanager_theme_undo(i, skin_has_sbs(i, skin_get_gwps(WPS, i)->data));
  903.          
  904.      }
  905.  
  906. @@ -645,10 +651,10 @@ static void gwps_enter_wps(void)
  907.      int i;
  908.      FOR_NB_SCREENS(i)
  909.      {
  910. -        struct gui_wps *gwps = &gui_wps[i];
  911. +        struct gui_wps *gwps = skin_get_gwps(WPS, i);
  912.          struct screen *display = gwps->display;
  913.          display->stop_scroll();
  914. -        viewportmanager_theme_enable(i, skin_has_sbs(i, gui_wps[i].data), NULL);
  915. +        viewportmanager_theme_enable(i, skin_has_sbs(i, skin_get_gwps(WPS, i)->data), NULL);
  916.  
  917.          /* Update the values in the first (default) viewport - in case the user
  918.             has modified the statusbar or colour settings */
  919. @@ -702,6 +708,7 @@ long gui_wps_show(void)
  920.      bool vol_changed = false;
  921.      int i;
  922.      long last_left = 0, last_right = 0;
  923. +    struct wps_state *state = skin_get_global_state();
  924.  
  925.  #ifdef HAVE_LCD_CHARCELLS
  926.      status_set_audio(true);
  927. @@ -719,19 +726,19 @@ long gui_wps_show(void)
  928.          bool audio_paused = (audio_status() & AUDIO_STATUS_PAUSE)?true:false;
  929.  
  930.          /* did someone else (i.e power thread) change audio pause mode? */
  931. -        if (wps_state.paused != audio_paused) {
  932. -            wps_state.paused = audio_paused;
  933. +        if (state->paused != audio_paused) {
  934. +            state->paused = audio_paused;
  935.  
  936.              /* if another thread paused audio, we are probably in car mode,
  937.                 about to shut down. lets save the settings. */
  938. -            if (wps_state.paused) {
  939. +            if (state->paused) {
  940.                  settings_save();
  941.  #if !defined(HAVE_RTC_RAM) && !defined(HAVE_SW_POWEROFF)
  942.                  call_storage_idle_notifys(true);
  943.  #endif
  944.              }
  945.          }
  946. -        button = skin_wait_for_action(gui_wps, CONTEXT_WPS|ALLOW_SOFTLOCK,
  947. +        button = skin_wait_for_action(WPS, CONTEXT_WPS|ALLOW_SOFTLOCK,
  948.                                        restore ? 1 : HZ/5);
  949.  
  950.          /* Exit if audio has stopped playing. This happens e.g. at end of
  951. @@ -778,7 +785,7 @@ long gui_wps_show(void)
  952.              {
  953.                  bool hotkey = button == ACTION_WPS_HOTKEY;
  954.                  gwps_leave_wps();
  955. -                int retval = onplay(wps_state.id3->path,
  956. +                int retval = onplay(state->id3->path,
  957.                             FILE_ATTR_AUDIO, CONTEXT_WPS, hotkey);
  958.                  /* if music is stopped in the context menu we want to exit the wps */
  959.                  if (retval == ONPLAY_MAINMENU
  960. @@ -807,9 +814,9 @@ long gui_wps_show(void)
  961.              case ACTION_WPS_PLAY:
  962.                  if (global_settings.party_mode)
  963.                      break;
  964. -                if ( wps_state.paused )
  965. +                if ( state->paused )
  966.                  {
  967. -                    wps_state.paused = false;
  968. +                    state->paused = false;
  969.                      if ( global_settings.fade_on_stop )
  970.                          fade(true, true);
  971.                      else
  972. @@ -817,7 +824,7 @@ long gui_wps_show(void)
  973.                  }
  974.                  else
  975.                  {
  976. -                    wps_state.paused = true;
  977. +                    state->paused = true;
  978.                      if ( global_settings.fade_on_stop )
  979.                          fade(false, true);
  980.                      else
  981. @@ -844,7 +851,7 @@ long gui_wps_show(void)
  982.                      break;
  983.                  if (current_tick -last_right < HZ)
  984.                  {
  985. -                    if (wps_state.id3->cuesheet)
  986. +                    if (state->id3->cuesheet)
  987.                      {
  988.                          audio_next();
  989.                      }
  990. @@ -864,9 +871,9 @@ long gui_wps_show(void)
  991.                      break;
  992.                  if (current_tick -last_left < HZ)
  993.                  {
  994. -                    if (wps_state.id3->cuesheet)
  995. +                    if (state->id3->cuesheet)
  996.                      {
  997. -                        if (!wps_state.paused)
  998. +                        if (!state->paused)
  999.  #if (CONFIG_CODEC == SWCODEC)
  1000.                              audio_pre_ff_rewind();
  1001.  #else
  1002. @@ -894,7 +901,7 @@ long gui_wps_show(void)
  1003.                     is past the A marker, jump back to the A marker... */
  1004.                  if ( ab_repeat_mode_enabled() )
  1005.                  {
  1006. -                    if ( ab_after_A_marker(wps_state.id3->elapsed) )
  1007. +                    if ( ab_after_A_marker(state->id3->elapsed) )
  1008.                      {
  1009.                          ab_jump_to_A_marker();
  1010.                          break;
  1011. @@ -917,7 +924,7 @@ long gui_wps_show(void)
  1012.                     before the A marker, jump to the A marker... */
  1013.                  if ( ab_repeat_mode_enabled() )
  1014.                  {
  1015. -                    if ( ab_before_A_marker(wps_state.id3->elapsed) )
  1016. +                    if ( ab_before_A_marker(state->id3->elapsed) )
  1017.                      {
  1018.                          ab_jump_to_A_marker();
  1019.                          break;
  1020. @@ -936,7 +943,7 @@ long gui_wps_show(void)
  1021.  #if defined(AB_REPEAT_ENABLE)
  1022.                  if (ab_repeat_mode_enabled())
  1023.                  {
  1024. -                    ab_set_B_marker(wps_state.id3->elapsed);
  1025. +                    ab_set_B_marker(state->id3->elapsed);
  1026.                      ab_jump_to_A_marker();
  1027.                  }
  1028.                  else
  1029. @@ -950,7 +957,7 @@ long gui_wps_show(void)
  1030.                      break;
  1031.  #if defined(AB_REPEAT_ENABLE)
  1032.                  if (ab_repeat_mode_enabled())
  1033. -                    ab_set_A_marker(wps_state.id3->elapsed);
  1034. +                    ab_set_A_marker(state->id3->elapsed);
  1035.                  else
  1036.  #endif
  1037.                  {
  1038. @@ -1052,7 +1059,7 @@ long gui_wps_show(void)
  1039.               /* this case is used by the softlock feature
  1040.                * it requests a full update here */
  1041.              case ACTION_REDRAW:
  1042. -                wps_sync_data.do_full_update = true;
  1043. +                skin_get_gwps(WPS, 0)->sync_data->do_full_update = true;
  1044.                  break;
  1045.              case ACTION_NONE: /* Timeout, do a partial update */
  1046.                  update = true;
  1047. @@ -1087,7 +1094,7 @@ long gui_wps_show(void)
  1048.              setvol();
  1049.              FOR_NB_SCREENS(i)
  1050.              {
  1051. -                if(update_onvol_change(&gui_wps[i]))
  1052. +                if(update_onvol_change(skin_get_gwps(WPS, i)))
  1053.                      res = true;
  1054.              }
  1055.              if (res) {
  1056. @@ -1109,15 +1116,15 @@ long gui_wps_show(void)
  1057.          /* we remove the update delay since it's not very usable in the wps,
  1058.           * e.g. during volume changing or ffwd/rewind */
  1059.              sb_skin_set_update_delay(0);
  1060. -            wps_sync_data.do_full_update = update = false;
  1061. +            skin_get_gwps(WPS, 0)->sync_data->do_full_update = update = false;
  1062.              gwps_enter_wps();
  1063.          }
  1064. -        else if (wps_sync_data.do_full_update || update)
  1065. +        else if (skin_get_gwps(WPS, 0)->sync_data->do_full_update || update)
  1066.          {
  1067.  #if defined(HAVE_BACKLIGHT) || defined(HAVE_REMOTE_LCD)
  1068. -            gwps_caption_backlight(&wps_state);
  1069. +            gwps_caption_backlight(state);
  1070.  #endif
  1071. -            bool full_update = wps_sync_data.do_full_update;
  1072. +            bool full_update = skin_get_gwps(WPS, 0)->sync_data->do_full_update;
  1073.              FOR_NB_SCREENS(i)
  1074.              {
  1075.  #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
  1076. @@ -1127,15 +1134,15 @@ long gui_wps_show(void)
  1077.  #endif
  1078.                  {
  1079.  #if NB_SCREENS > 1
  1080. -                    if (i==SCREEN_MAIN && wps_sync_data.do_full_update)
  1081. +                    if (i==SCREEN_MAIN && skin_get_gwps(WPS, 0)->sync_data->do_full_update)
  1082.                      {
  1083. -                        wps_sync_data.do_full_update = false;
  1084. +                        skin_get_gwps(WPS, 0)->sync_data->do_full_update = false;
  1085.                      }
  1086.                      
  1087.  #else
  1088. -                    wps_sync_data.do_full_update = false;
  1089. +                    skin_get_gwps(WPS, 0)->sync_data->do_full_update = false;
  1090.  #endif
  1091. -                    skin_update(&gui_wps[i], full_update ?
  1092. +                    skin_update(skin_get_gwps(WPS, i), full_update ?
  1093.                                       SKIN_REFRESH_ALL : SKIN_REFRESH_NON_STATIC);
  1094.                  }
  1095.              }
  1096. @@ -1175,38 +1182,40 @@ long gui_wps_show(void)
  1097.  /* this is called from the playback thread so NO DRAWING! */
  1098.  static void track_changed_callback(void *param)
  1099.  {
  1100. -    wps_state.id3 = (struct mp3entry*)param;
  1101. -    wps_state.nid3 = audio_next_track();
  1102. -    if (wps_state.id3->cuesheet)
  1103. +    struct wps_state *state = skin_get_global_state();
  1104. +    state->id3 = (struct mp3entry*)param;
  1105. +    state->nid3 = audio_next_track();
  1106. +    if (state->id3->cuesheet)
  1107.      {
  1108. -        cue_find_current_track(wps_state.id3->cuesheet, wps_state.id3->elapsed);
  1109. +        cue_find_current_track(state->id3->cuesheet, state->id3->elapsed);
  1110.      }
  1111. -    wps_sync_data.do_full_update = true;
  1112. +    skin_get_gwps(WPS, 0)->sync_data->do_full_update = true;
  1113.  }
  1114.  static void nextid3available_callback(void* param)
  1115.  {
  1116.      (void)param;
  1117. -    wps_state.nid3 = audio_next_track();
  1118. -    wps_sync_data.do_full_update = true;
  1119. +    skin_get_global_state()->nid3 = audio_next_track();
  1120. +    skin_get_gwps(WPS, 0)->sync_data->do_full_update = true;
  1121.  }
  1122.  
  1123.  
  1124.  static void wps_state_init(void)
  1125.  {
  1126. -    wps_state.ff_rewind = false;
  1127. -    wps_state.paused = false;
  1128. +    struct wps_state *state = skin_get_global_state();
  1129. +    state->ff_rewind = false;
  1130. +    state->paused = false;
  1131.      if(audio_status() & AUDIO_STATUS_PLAY)
  1132.      {
  1133. -        wps_state.id3 = audio_current_track();
  1134. -        wps_state.nid3 = audio_next_track();
  1135. +        state->id3 = audio_current_track();
  1136. +        state->nid3 = audio_next_track();
  1137.      }
  1138.      else
  1139.      {
  1140. -        wps_state.id3 = NULL;
  1141. -        wps_state.nid3 = NULL;
  1142. +        state->id3 = NULL;
  1143. +        state->nid3 = NULL;
  1144.      }
  1145.      /* We'll be updating due to restore initialized with true */
  1146. -    wps_sync_data.do_full_update = false;
  1147. +    skin_get_gwps(WPS, 0)->sync_data->do_full_update = true;
  1148.      /* add the WPS track event callbacks */
  1149.      add_event(PLAYBACK_EVENT_TRACK_CHANGE, false, track_changed_callback);
  1150.      add_event(PLAYBACK_EVENT_NEXTTRACKID3_AVAILABLE, false, nextid3available_callback);
  1151. @@ -1215,32 +1224,18 @@ static void wps_state_init(void)
  1152.  
  1153.  void gui_sync_wps_init(void)
  1154.  {
  1155. -    int i;
  1156. -    FOR_NB_SCREENS(i)
  1157. -    {
  1158. -#ifdef HAVE_ALBUMART
  1159. -        wps_datas[i].albumart = NULL;
  1160. -        wps_datas[i].playback_aa_slot = -1;
  1161. -#endif
  1162. -        gui_wps[i].data = &wps_datas[i];
  1163. -        gui_wps[i].display = &screens[i];
  1164. -        /* Currently no seperate wps_state needed/possible
  1165. -           so use the only available ( "global" ) one */
  1166. -        gui_wps[i].state = &wps_state;
  1167. -        /* must point to the same struct for both screens */
  1168. -        gui_wps[i].sync_data = &wps_sync_data;
  1169. -    }
  1170. +    gui_sync_skin_init();
  1171.  }
  1172.  
  1173.  
  1174.  #ifdef IPOD_ACCESSORY_PROTOCOL
  1175.  bool is_wps_fading(void)
  1176.  {
  1177. -    return wps_state.is_fading;
  1178. +    return skin_get_global_state()->is_fading;
  1179.  }
  1180.  
  1181.  int wps_get_ff_rewind_count(void)
  1182.  {
  1183. -    return wps_state.ff_rewind_count;
  1184. +    return skin_get_global_state()->ff_rewind_count;
  1185.  }
  1186.  #endif
  1187. diff --git a/apps/radio/radio.c b/apps/radio/radio.c
  1188. index 74bdb4b..8c4d88c 100644
  1189. --- a/apps/radio/radio.c
  1190. +++ b/apps/radio/radio.c
  1191. @@ -422,7 +422,7 @@ int radio_screen(void)
  1192.      {
  1193.          radio_load_presets(global_settings.fmr_file);
  1194.      }
  1195. -    fms_get(SCREEN_MAIN)->state->id3 = NULL;
  1196. +    skin_get_global_state()->id3 = NULL;
  1197.  #ifdef HAVE_ALBUMART
  1198.      radioart_init(true);
  1199.  #endif    
  1200. diff --git a/apps/radio/radio.h b/apps/radio/radio.h
  1201. index 7c263ce..f02558f 100644
  1202. --- a/apps/radio/radio.h
  1203. +++ b/apps/radio/radio.h
  1204. @@ -52,7 +52,6 @@ const struct fmstation *radio_get_preset(int preset);
  1205.  
  1206.  /* skin functions */
  1207.  void fms_data_load(enum screen_type screen, const char *buf, bool isfile);
  1208. -void fms_skin_init(void);
  1209.  
  1210.  /* callbacks for the radio settings */
  1211.  void set_radio_region(int region);
  1212. diff --git a/apps/radio/radio_skin.c b/apps/radio/radio_skin.c
  1213. index 26e6dac..4697e11 100644
  1214. --- a/apps/radio/radio_skin.c
  1215. +++ b/apps/radio/radio_skin.c
  1216. @@ -32,45 +32,42 @@
  1217.  #include "statusbar-skinned.h"
  1218.  
  1219.  
  1220. -extern struct wps_state     wps_state; /* from wps.c */
  1221. -static struct gui_wps       fms_skin[NB_SCREENS]      = {{ .data = NULL }};
  1222. -static struct wps_data      fms_skin_data[NB_SCREENS] = {{ .wps_loaded = 0 }};
  1223. -static struct wps_sync_data fms_skin_sync_data        = { .do_full_update = false };
  1224. -
  1225. -void fms_data_load(enum screen_type screen, const char *buf, bool isfile)
  1226. +char* default_radio_skin(enum screen_type screen)
  1227.  {
  1228. -    struct wps_data *data = fms_skin[screen].data;
  1229. -    int success;
  1230. -    success = buf && skin_data_load(screen, data, buf, isfile);
  1231. -
  1232. -    if (!success ) /* load the default */
  1233. -    {  
  1234. -        const char default_fms[] =  "%s%?Ti<%Ti. |>%?Tn<%Tn|%Tf>\n"
  1235. -                                    "%Sx(Station:) %tf MHz\n"
  1236. -                                    "%?St(force fm mono)<%Sx(Force Mono)|%?ts<%Sx(Stereo)|%Sx(Mono)>>\n"
  1237. -                                    "%Sx(Mode:) %?tm<%Sx(Scan)|%Sx(Preset)>\n"
  1238. +    (void)screen;
  1239. +    static char default_fms[] =
  1240. +        "%s%?Ti<%Ti. |>%?Tn<%Tn|%Tf>\n"
  1241. +        "%Sx(Station:) %tf MHz\n"
  1242. +        "%?St(force fm mono)<%Sx(Force Mono)|%?ts<%Sx(Stereo)|%Sx(Mono)>>\n"
  1243. +        "%Sx(Mode:) %?tm<%Sx(Scan)|%Sx(Preset)>\n"
  1244.  #if CONFIG_CODEC != SWCODEC && !defined(SIMULATOR)
  1245. -                                    "%?Rr<%Sx(Time:) %Rh:%Rn:%Rs|%?St(prerecording time)<%pm|%Sx(Prerecord Time) %Rs>>\n"
  1246. +        "%?Rr<%Sx(Time:) %Rh:%Rn:%Rs|%?St(prerecording time)<%pm|%Sx(Prerecord Time) %Rs>>\n"
  1247.  #endif
  1248. -                                    "%pb\n"
  1249. +        "%pb\n"
  1250.  #ifdef HAVE_RDS_CAP
  1251. -                                    "\n%s%ty\n"
  1252. -                                    "%s%tz\n"
  1253. +        "\n%s%ty\n"
  1254. +        "%s%tz\n"
  1255.  #endif
  1256. -                                    ;
  1257. -        skin_data_load(screen, data, default_fms, false);
  1258. -    }
  1259. +        ;
  1260. +    return default_fms;
  1261.  }
  1262. +
  1263. +void fms_data_load(enum screen_type screen, const char *buf, bool isfile)
  1264. +{
  1265. +    skin_load(FM_SCREEN, screen, buf, isfile);
  1266. +}
  1267. +
  1268.  void fms_fix_displays(enum fms_exiting toggle_state)
  1269.  {
  1270.      int i;
  1271.      FOR_NB_SCREENS(i)
  1272.      {
  1273. +        struct wps_data *data = skin_get_gwps(FM_SCREEN, i)->data;
  1274.          if (toggle_state == FMS_ENTER)
  1275.          {
  1276. -            viewportmanager_theme_enable(i, skin_has_sbs(i, fms_skin[i].data), NULL);  
  1277. +            viewportmanager_theme_enable(i, skin_has_sbs(i, data), NULL);  
  1278.  #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
  1279. -            screens[i].backdrop_show(fms_skin[i].data->backdrop);
  1280. +            screens[i].backdrop_show(data->backdrop);
  1281.  #endif
  1282.              screens[i].clear_display();
  1283.              /* force statusbar/skin update since we just cleared the whole screen */
  1284. @@ -82,43 +79,26 @@ void fms_fix_displays(enum fms_exiting toggle_state)
  1285.  #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
  1286.              screens[i].backdrop_show(sb_get_backdrop(i));
  1287.  #endif
  1288. -            viewportmanager_theme_undo(i, skin_has_sbs(i, fms_skin[i].data));
  1289. +            viewportmanager_theme_undo(i, skin_has_sbs(i, data));
  1290.          }
  1291.      }
  1292.  #ifdef HAVE_TOUCHSCREEN
  1293. -    if (!fms_skin[SCREEN_MAIN].data->touchregions)
  1294. +    if (i==SCREEN_MAIN && !data->touchregions)
  1295.          touchscreen_set_mode(toggle_state == FMS_ENTER ?
  1296.                                TOUCHSCREEN_BUTTON : global_settings.touch_mode);
  1297.  #endif
  1298.  }
  1299.          
  1300.  
  1301. -void fms_skin_init(void)
  1302. -{
  1303. -    int i;
  1304. -    FOR_NB_SCREENS(i)
  1305. -    {
  1306. -#ifdef HAVE_ALBUMART
  1307. -        fms_skin_data[i].albumart = NULL;
  1308. -        fms_skin_data[i].playback_aa_slot = -1;
  1309. -#endif
  1310. -        fms_skin[i].data = &fms_skin_data[i];
  1311. -        fms_skin[i].display = &screens[i];
  1312. -        /* Currently no seperate wps_state needed/possible
  1313. -           so use the only available ( "global" ) one */
  1314. -        fms_skin[i].state = &wps_state;
  1315. -        fms_skin[i].sync_data = &fms_skin_sync_data;
  1316. -    }
  1317. -}
  1318. -
  1319.  int fms_do_button_loop(bool update_screen)
  1320.  {
  1321. -    int button = skin_wait_for_action(fms_skin, CONTEXT_FM,
  1322. +    int button = skin_wait_for_action(FM_SCREEN, CONTEXT_FM,
  1323.                                        update_screen ? TIMEOUT_NOBLOCK : HZ/5);
  1324.  #ifdef HAVE_TOUCHSCREEN
  1325.      int offset;
  1326.      if (button == ACTION_TOUCHSCREEN)
  1327. -        button = skin_get_touchaction(&fms_skin_data[SCREEN_MAIN], &offset);
  1328. +        button = skin_get_touchaction(skin_get_gwps(FM_SCREEN, SCREEN_MAIN)->data,
  1329. +                                      &offset);
  1330.      switch (button)
  1331.      {
  1332.          case ACTION_WPS_STOP:
  1333. @@ -143,5 +123,5 @@ int fms_do_button_loop(bool update_screen)
  1334.  
  1335.  struct gui_wps *fms_get(enum screen_type screen)
  1336.  {
  1337. -    return &fms_skin[screen];
  1338. +    return skin_get_gwps(FM_SCREEN, screen);
  1339.  }