Index: apps/gui/gwps-common.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/gwps-common.c,v
retrieving revision 1.69
diff -u -p -r1.69 gwps-common.c
--- apps/gui/gwps-common.c	29 Dec 2006 19:17:03 -0000	1.69
+++ apps/gui/gwps-common.c	5 Jan 2007 14:19:02 -0000
@@ -179,13 +179,17 @@ bool wps_data_preload_tags(struct wps_da
 
         case 'P':
             /* progress bar image */
+        case 'S':
+            /* Progress slider */
         {
             int ret = 0;
             char *ptr = buf+2;
             char *pos = NULL;
             char imgname[MAX_PATH];
 
-            /* format: %P|filename.bmp| */
+            /* format: %P|filename.bmp|
+                    or %S|filename.bmp| */
+
             {
                 /* get filename */
                 pos = strchr(ptr, '|');
@@ -221,7 +225,7 @@ bool wps_data_preload_tags(struct wps_da
                      data->img_buf_free -= ret;
 
                      if (data->progressbar.bm.width <= LCD_WIDTH) {
-                          data->progressbar.have_bitmap_pb=true;
+                          data->progressbar.pb_type = c=='P' ? BITMAP : SLIDER;
                           return true;
                      } else
                           return false;
@@ -1823,7 +1824,7 @@ bool gui_wps_refresh(struct gui_wps *gwp
                 if (!data->progress_end)
                     data->progress_end=display->width;
                 
-                if (gwps->data->progressbar.have_bitmap_pb)
+                if (gwps->data->progressbar.pb_type == BITMAP)
                     gui_bitmap_scrollbar_draw(display, data->progressbar.bm,
                                         data->progress_start, sb_y, 
                                         data->progress_end-data->progress_start,
@@ -1831,6 +1846,12 @@ bool gui_wps_refresh(struct gui_wps *gwp
                                         state->id3->length?state->id3->length:1, 0,
                                         state->id3->length?state->id3->elapsed + state->ff_rewind_count:0,
                                         HORIZONTAL);
+                else if (gwps->data->progressbar.pb_type == SLIDER)
+                    slider_progressbar_draw(display, data->progressbar.bm,
+                                            data->progress_start, sb_y,
+                                            data->progress_end-data->progress_start,
+                                            state->id3->length?state->id3->length:1,
+                                            state->id3->length?state->id3->elapsed + state->ff_rewind_count:0);
                 else
                     gui_scrollbar_draw(display, data->progress_start, sb_y, 
                                         data->progress_end-data->progress_start,
@@ -2596,3 +2617,26 @@ void display_keylock_text(bool locked)
     gui_syncsplash(HZ, true, s);
 }
 
+#ifdef HAVE_LCD_BITMAP
+void slider_progressbar_draw(struct screen * screen, struct bitmap bm,
+                             int pb_x, int pb_y, int pb_width,
+                             long total_length, long progress)
+{
+    int slider_x = pb_x + (pb_width - bm.width) * progress / total_length;
+
+    screen->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
+    screen->fillrect(pb_x, pb_y, pb_width, bm.height);
+
+    screen->set_drawmode(DRMODE_FG);
+#if LCD_DEPTH > 1
+    if(bm.format == FORMAT_MONO) {
+#endif
+        screen->mono_bitmap(bm.data, slider_x, pb_y, bm.width, bm.height);
+#if LCD_DEPTH > 1
+    } else {
+        screen->transparent_bitmap((fb_data *)bm.data, slider_x,
+                                    pb_y, bm.width, bm.height);
+    }
+#endif
+}
+#endif
Index: apps/gui/gwps-common.h
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/gwps-common.h,v
retrieving revision 1.8
diff -u -p -r1.8 gwps-common.h
--- apps/gui/gwps-common.h	15 Aug 2006 12:27:05 -0000	1.8
+++ apps/gui/gwps-common.h	5 Jan 2007 14:19:02 -0000
@@ -23,6 +23,10 @@
 
 #include "gwps.h"
 
+void slider_progressbar_draw(struct screen * screen, struct bitmap bm,
+                             int pb_x, int pb_y, int pb_width,
+                             long total_length, long progress);
+
 void gui_wps_format_time(char* buf, int buf_size, long time);
 void fade(bool fade_in);
 void gui_wps_format(struct wps_data *data);
Index: apps/gui/gwps.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/gwps.c,v
retrieving revision 1.57
diff -u -p -r1.57 gwps.c
--- apps/gui/gwps.c	22 Dec 2006 05:19:55 -0000	1.57
+++ apps/gui/gwps.c	5 Jan 2007 14:19:03 -0000
@@ -674,7 +674,7 @@ static void wps_clear(struct wps_data *d
     }
     data->wps_sb_tag = false;
     data->show_sb_on_wps = false;
-    data->progressbar.have_bitmap_pb=false;
+    data->progressbar.pb_type = NORMAL;
 }
 #else
 #define wps_clear(a)
Index: apps/gui/gwps.h
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/gwps.h,v
retrieving revision 1.40
diff -u -p -r1.40 gwps.h
--- apps/gui/gwps.h	13 Dec 2006 11:52:21 -0000	1.40
+++ apps/gui/gwps.h	5 Jan 2007 14:19:03 -0000
@@ -39,6 +39,11 @@
 #define WPS_ALIGN_CENTER 64
 #define WPS_ALIGN_LEFT 128
 
+/* progressbar types */
+#define NORMAL 0
+#define BITMAP 1
+#define SLIDER 2
+
 /* wps_data*/
 
 #ifdef HAVE_LCD_BITMAP
@@ -53,7 +58,7 @@ struct gui_img{
 
 struct prog_img{ /*progressbar image*/
     struct bitmap bm;
-    bool have_bitmap_pb;
+    short pb_type;
 };
 #endif
 
