--- ./apps/gui/color_picker.c.orig	2006-03-23 05:28:08.000000000 +0100
+++ ./apps/gui/color_picker.c	2006-06-12 20:32:04.000000000 +0200
@@ -37,9 +37,9 @@
 #define SLIDER_DOWN      BUTTON_DOWN
 #define SLIDER_LEFT      BUTTON_LEFT
 #define SLIDER_RIGHT     BUTTON_RIGHT
-#define SLIDER_OK        BUTTON_ON
-#define SLIDER_OK2       BUTTON_SELECT
+#define SLIDER_OK        BUTTON_SELECT
 #define SLIDER_CANCEL    BUTTON_OFF
+#define SLIDER_QEXIT     BUTTON_MODE
 
 #define SLIDER_RC_UP     BUTTON_RC_REW
 #define SLIDER_RC_DOWN   BUTTON_RC_FF
@@ -55,6 +55,7 @@
 #define SLIDER_RIGHT     BUTTON_RIGHT
 #define SLIDER_OK        BUTTON_POWER
 #define SLIDER_CANCEL    BUTTON_A
+#define SLIDER_QEXIT     BUTTON_BUTTON_MENU
 
 #elif (CONFIG_KEYPAD == IPOD_4G_PAD)
 #define SLIDER_UP        BUTTON_LEFT
@@ -63,6 +64,7 @@
 #define SLIDER_RIGHT     BUTTON_SCROLL_FWD
 #define SLIDER_OK        BUTTON_SELECT
 #define SLIDER_CANCEL    BUTTON_MENU
+/*#define SLIDER_QEXIT     BUTTON_MENU don't know which to use */
 
 #elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
 #define SLIDER_UP        BUTTON_UP
@@ -71,6 +73,7 @@
 #define SLIDER_RIGHT     BUTTON_RIGHT
 #define SLIDER_OK        BUTTON_SELECT
 #define SLIDER_CANCEL    BUTTON_PLAY
+#define SLIDER_QEXIT     BUTTON_REC
 
 #endif
 
@@ -274,7 +277,11 @@
 #endif
                 exit = 1;
                 break;
-
+#ifdef SLIDER_QEXIT
+            case SLIDER_QEXIT:
+                exit = 2;
+                break;
+#endif
             default:
                 if(default_event_handler(button) == SYS_USB_CONNECTED) {
                     display->set_foreground(fgcolor);
@@ -284,6 +291,7 @@
         }
     }
     display->set_foreground(fgcolor);
-
+    if (exit == 2)
+        return true;
     return false;
 }
--- ./apps/gui/gwps.c.orig	2006-05-25 15:29:19.000000000 +0200
+++ ./apps/gui/gwps.c	2006-06-12 20:32:04.000000000 +0200
@@ -549,7 +549,8 @@
                 show_main_backdrop();
 #endif
                 if (main_menu())
-                    return true;
+                    if (menureturn(false) == MENU_ATTACHED_USB)
+                        return true;
 #ifdef HAVE_LCD_COLOR
                 show_wps_backdrop();
 #endif
--- ./apps/gui/select.c.orig	2005-12-07 16:37:21.000000000 +0100
+++ ./apps/gui/select.c	2006-06-12 20:32:04.000000000 +0200
@@ -130,6 +130,11 @@
             gui_syncselect_draw(select);
             sleep(HZ/2);
             return(false);
+#ifdef SELECT_QEXIT
+        case SELECT_QEXIT :
+            select->canceled = true;
+            return true;
+#endif
     }
     return(false);
 }
--- ./apps/gui/select.h.orig	2006-03-23 05:28:09.000000000 +0100
+++ ./apps/gui/select.h	2006-06-12 20:32:04.000000000 +0200
@@ -30,7 +30,7 @@
 #define SELECT_OK      BUTTON_SELECT
 #define SELECT_OK2     BUTTON_LEFT
 #define SELECT_CANCEL  BUTTON_OFF
-#define SELECT_CANCEL2 BUTTON_MODE
+#define SELECT_QEXIT   BUTTON_MODE
 
 #define SELECT_RC_INC      BUTTON_RC_FF
 #define SELECT_RC_DEC      BUTTON_RC_REW
@@ -45,14 +45,14 @@
 #define SELECT_OK      BUTTON_PLAY
 #define SELECT_OK2     BUTTON_LEFT
 #define SELECT_CANCEL  BUTTON_OFF
-#define SELECT_CANCEL2 BUTTON_F1
+#define SELECT_QEXIT   BUTTON_F1
 
 #elif CONFIG_KEYPAD == PLAYER_PAD
 #define SELECT_INC     BUTTON_RIGHT
 #define SELECT_DEC     BUTTON_LEFT
 #define SELECT_OK      BUTTON_PLAY
 #define SELECT_CANCEL  BUTTON_STOP
-#define SELECT_CANCEL2 BUTTON_MENU
+#define SELECT_QEXIT   BUTTON_MENU
 
 #elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
 #define SELECT_INC     BUTTON_SCROLL_FWD
@@ -67,15 +67,15 @@
 #define SELECT_OK      BUTTON_RIGHT
 #define SELECT_OK2     BUTTON_LEFT
 #define SELECT_CANCEL  BUTTON_PLAY
-#define SELECT_CANCEL2 BUTTON_MODE
+#define SELECT_QEXIT   BUTTON_MODE
 
 #elif CONFIG_KEYPAD == ONDIO_PAD
 #define SELECT_INC     BUTTON_UP
 #define SELECT_DEC     BUTTON_DOWN
 #define SELECT_OK      BUTTON_RIGHT
 #define SELECT_OK2     BUTTON_LEFT
-#define SELECT_CANCEL  BUTTON_MENU
-#define SELECT_CANCEL2 BUTTON_OFF
+#define SELECT_CANCEL  BUTTON_OFF
+#define SELECT_QEXIT   BUTTON_MENU
 
 #elif CONFIG_KEYPAD == GMINI100_PAD
 #define SELECT_INC     BUTTON_UP
@@ -83,7 +83,7 @@
 #define SELECT_OK      BUTTON_PLAY
 #define SELECT_OK2     BUTTON_LEFT
 #define SELECT_CANCEL  BUTTON_OFF
-#define SELECT_CANCEL2 BUTTON_MENU
+#define SELECT_QEXIT   BUTTON_MENU
 
 #elif CONFIG_KEYPAD == IAUDIO_X5_PAD
 #define SELECT_INC     BUTTON_UP
@@ -92,14 +92,15 @@
 #define SELECT_OK2     BUTTON_LEFT
 #define SELECT_CANCEL  BUTTON_PLAY
 #define SELECT_CANCEL2 BUTTON_POWER
+#define SELECT_QEXIT   BUTTON_REC
 
 #elif CONFIG_KEYPAD == GIGABEAT_PAD
 #define SELECT_INC     BUTTON_UP
 #define SELECT_DEC     BUTTON_DOWN
-#define SELECT_OK      BUTTON_MENU
-#define SELECT_OK2     BUTTON_LEFT
+#define SELECT_OK      BUTTON_LEFT
 #define SELECT_CANCEL  BUTTON_A
 #define SELECT_CANCEL2 BUTTON_POWER
+#define SELECT_QEXIT   BUTTON_MENU
 
 #endif
 
--- ./apps/menu.c.orig	2005-12-05 23:44:41.000000000 +0100
+++ ./apps/menu.c	2006-06-12 20:32:04.000000000 +0200
@@ -40,6 +40,9 @@
 #include "talk.h"
 #include "lang.h"
 #include "misc.h"
+#include "splash.h"
+#include "audio.h"
+#include "playlist.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "icons.h"
@@ -63,6 +66,33 @@
 
 static struct menu menus[MAX_MENUS];
 static bool inuse[MAX_MENUS] = { false };
+static int reason_return;
+
+int menureturn(int reason)
+{
+    if (reason)
+        reason_return=reason;
+    return reason_return;
+}
+
+static void start_resume(void)
+{
+    if ( global_settings.resume_index != -1 ) {
+        DEBUGF("Resume index %X offset %X\n",
+               global_settings.resume_index,
+               global_settings.resume_offset);
+
+        if (playlist_resume() != -1)
+        {
+            playlist_start(global_settings.resume_index,
+                global_settings.resume_offset);
+        }
+        else return;
+    }
+    else {
+        gui_syncsplash(HZ*2, true, str(LANG_NOTHING_TO_RESUME));
+    }
+}
 
 char * menu_get_itemname(int selected_item, void * data, char *buffer)
 {
@@ -160,21 +190,35 @@
 #ifdef MENU_EXIT2
             case MENU_EXIT2:
 #endif
-#ifdef MENU_EXIT_MENU
-            case MENU_EXIT_MENU:
-#endif
 #ifdef MENU_RC_EXIT
             case MENU_RC_EXIT:
 #endif
+                exit = true;
+                break;
+#ifdef MENU_EXIT_MENU
+            case MENU_EXIT_MENU:
 #ifdef MENU_RC_EXIT_MENU
             case MENU_RC_EXIT_MENU:
 #endif
-                exit = true;
+                return menureturn(MENU_SELECTED_QEXIT);
+#endif
+#ifdef MENU_STOP
+            case MENU_STOP:
+                if(audio_status()) {
+                    if (!global_settings.party_mode)
+                        audio_stop();
+                }
                 break;
-
+#endif
+#ifdef MENU_PLAY
+            case MENU_PLAY:
+                if (!audio_status() & AUDIO_STATUS_PLAY)
+                        start_resume();                
+                return menureturn(MENU_SELECTED_WPS);
+#endif
             default:
                 if(default_event_handler(key) == SYS_USB_CONNECTED)
-                    return MENU_ATTACHED_USB;
+                    return menureturn(MENU_ATTACHED_USB);
                 break;
         }
         gui_syncstatusbar_draw(&statusbars, false);
@@ -193,6 +237,8 @@
                 return false;
 
             case MENU_ATTACHED_USB:
+            case MENU_SELECTED_QEXIT:
+            case MENU_SELECTED_WPS:
                 return true;
 
             default:
--- ./apps/menu.h.orig	2006-05-25 15:29:17.000000000 +0200
+++ ./apps/menu.h	2006-06-12 20:32:04.000000000 +0200
@@ -26,10 +26,11 @@
 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
     (CONFIG_KEYPAD == IRIVER_H300_PAD)
 #define MENU_EXIT       BUTTON_LEFT
-#define MENU_EXIT2      BUTTON_OFF
 #define MENU_EXIT_MENU  BUTTON_MODE
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_SELECT
+#define MENU_STOP       BUTTON_OFF
+#define MENU_PLAY       BUTTON_ON
 
 #define MENU_RC_EXIT        BUTTON_RC_STOP
 #define MENU_RC_EXIT_MENU   BUTTON_RC_MODE
@@ -44,6 +45,8 @@
 #define MENU_EXIT_MENU  BUTTON_F1
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_PLAY
+#define MENU_STOP       BUTTON_OFF
+#define MENU_PLAY       BUTTON_ON
 
 #define MENU_RC_EXIT    BUTTON_RC_STOP
 #define MENU_RC_ENTER   BUTTON_RC_PLAY
@@ -52,6 +55,7 @@
 #define MENU_EXIT       BUTTON_STOP
 #define MENU_EXIT_MENU  BUTTON_MENU
 #define MENU_ENTER      BUTTON_PLAY
+#define MENU_PLAY       BUTTON_ON
 
 #define MENU_RC_EXIT    BUTTON_RC_STOP
 #define MENU_RC_ENTER   BUTTON_RC_PLAY
@@ -60,6 +64,8 @@
 #define MENU_EXIT       BUTTON_LEFT
 #define MENU_EXIT_MENU  BUTTON_MENU
 #define MENU_ENTER      BUTTON_RIGHT
+#define MENU_STOP       BUTTON_OFF
+/*#define MENU_PLAY       BUTTON_MENU not sure what to do here*/
 
 #elif CONFIG_KEYPAD == GMINI100_PAD
 #define MENU_EXIT       BUTTON_LEFT
@@ -67,6 +73,7 @@
 #define MENU_EXIT_MENU  BUTTON_MENU
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_PLAY
+#define MENU_PLAY       BUTTON_ON
 
 #elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
 
@@ -78,6 +85,7 @@
 #define MENU_EXIT_MENU  BUTTON_MENU
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_SELECT
+#define MENU_PLAY       BUTTON_PLAY
 
 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
 
@@ -95,6 +103,7 @@
 #define MENU_EXIT_MENU  BUTTON_REC
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_SELECT
+#define MENU_PLAY       BUTTON_PLAY
 
 #elif CONFIG_KEYPAD == GIGABEAT_PAD
 
@@ -105,6 +114,7 @@
 #define MENU_ENTER2     BUTTON_SELECT
 #define MENU_NEXT       BUTTON_DOWN
 #define MENU_PREV       BUTTON_UP
+#define MENU_PLAY       BUTTON_POWER
 
 #endif
 
@@ -123,6 +133,8 @@
 int menu_show(int m);
 #define MENU_ATTACHED_USB -1
 #define MENU_SELECTED_EXIT -2
+#define MENU_SELECTED_QEXIT -3
+#define MENU_SELECTED_WPS -4
 
 bool menu_run(int menu);
 int menu_cursor(int menu);
@@ -136,4 +148,5 @@
 void menu_set_cursor(int menu, int position);
 void menu_talk_selected(int m);
 
+int menureturn(int reason);/*used to return the reason for leaving the menu*/
 #endif /* End __MENU_H__ */
--- ./apps/settings.c.orig	2006-06-07 01:40:16.000000000 +0200
+++ ./apps/settings.c	2006-06-12 20:32:04.000000000 +0200
@@ -73,6 +73,7 @@
 #include "statusbar.h"
 #include "splash.h"
 #include "list.h"
+#include "menu.h"
 #ifdef HAVE_LCD_COLOR
 #include "backdrop.h"
 #endif
@@ -1800,6 +1801,7 @@
 {
     int button;
     int oldvalue=*variable;
+    bool qexit = false;
     struct gui_select select;
     gui_select_init_numeric(&select, (char *)string, *variable, min, max, step, unit,
                             formatter);
@@ -1810,6 +1812,8 @@
         button = button_get_w_tmo(HZ/2);
         if(gui_syncselect_do_button(&select, button))
         {
+            if (select.canceled)
+                qexit = true;
             *variable=select.options.option;
             gui_syncselect_draw(&select);
             talk_unit(voice_unit, *variable);
@@ -1822,10 +1826,12 @@
             *variable=oldvalue;
             if ( function )
                 function(*variable);
+            if (qexit)
+                return menureturn(MENU_SELECTED_QEXIT);
             return false;
         }
         if(default_event_handler(button) == SYS_USB_CONNECTED)
-            return true;
+            return menureturn(MENU_ATTACHED_USB);
     }
     return false;
 }
@@ -1858,6 +1864,7 @@
 {
     int button;
     int oldvalue;
+    bool qexit = false;
     /* oldvalue=*variable; */
     oldvalue=get_int_fromtype(type, variable);
     struct gui_select select;
@@ -1873,6 +1880,8 @@
         select.options.limit_loop = false;
         if(gui_syncselect_do_button(&select, button))
         {
+            if (select.canceled)
+                qexit = true;
             /* *variable = gui_select_get_selected(&select) */
             set_type_fromint(type, variable, select.options.option);
             gui_syncselect_draw(&select);
@@ -1888,6 +1897,8 @@
             set_type_fromint(type, variable, oldvalue);
             if ( function )
                 function(type_fromvoidptr(type, variable));
+            if (qexit)
+                return true;
             return false;
         }
         if(default_event_handler(button) == SYS_USB_CONNECTED)
--- ./apps/tree.c.orig	2006-06-08 16:03:57.000000000 +0200
+++ ./apps/tree.c	2006-06-12 20:34:38.000000000 +0200
@@ -428,8 +428,8 @@
         {
             playlist_start(global_settings.resume_index,
                 global_settings.resume_offset);
-
-            start_wps = true;
+            if (*tc.dirfilter < NUM_FILTER_MODES)
+                start_wps = true;
         }
         else return;
     }
@@ -520,6 +520,7 @@
     bool lastsortcase = global_settings.sort_case;
     bool need_update = true;
     bool exit_func = false;
+    bool exit_menu = false;
     long thumbnail_time = -1; /* for delaying a thumbnail */
 
     unsigned lastbutton = 0;
@@ -638,26 +639,23 @@
 
 #ifdef TREE_OFF
             case TREE_OFF:
-                if (*tc.dirfilter < NUM_FILTER_MODES)
-                {
                     /* Stop the music if it is playing */
-                    if(audio_status()) {
-                        if (!global_settings.party_mode)
-                            audio_stop();
-                    }
+                if(audio_status()) {
+                    if (!global_settings.party_mode)
+                        audio_stop();
+                }
 #if defined(CONFIG_CHARGING) && \
     (CONFIG_KEYPAD == RECORDER_PAD) && !defined(HAVE_SW_POWEROFF)
-                    else {
-                        if (!charger_inserted()) {
-                            if(shutdown_screen())
-                                reload_dir = true;
-                        } else {
-                            charging_splash();
-                        }
-                        restore = true;
+                else if (*tc.dirfilter < NUM_FILTER_MODES){
+                    if (!charger_inserted()) {
+                        if(shutdown_screen())
+                            reload_dir = true;
+                    } else {
+                        charging_splash();
                     }
-#endif
+                    restore = true;
                 }
+#endif
                 break;
 #if defined(CONFIG_CHARGING) && !defined(HAVE_POWEROFF_WHILE_CHARGING)
             case TREE_OFF | BUTTON_REPEAT:
@@ -687,15 +685,26 @@
                     FOR_NB_SCREENS(i)
                         screens[i].stop_scroll();
                     if (main_menu())
-                        reload_dir = true;
+                        switch (menureturn(false)){
+                            case MENU_SELECTED_WPS:
+                                start_wps=true;
+                            case MENU_ATTACHED_USB:
+                                reload_dir = true;
+                                break;
+                            default:
+                                break;
+                        }
                     restore = true;
-
                     id3db = check_changed_id3mode(id3db);
                     if(id3db)
                         reload_dir = true;
                 }
                 else /* use it as a quick exit instead */
+                    {
+                    menureturn(MENU_SELECTED_QEXIT);
+                    exit_menu = true;
                     exit_func = true;
+                    }
                 break;
 
             case TREE_WPS:
@@ -723,6 +732,14 @@
                         restore = true;
                     }
                 }
+                else
+                {
+                    if (!audio_status() & AUDIO_STATUS_PLAY)
+                        start_resume(false);
+                    menureturn(MENU_SELECTED_WPS);
+                    exit_menu = true;
+                    exit_func = true;
+                }
                 break;
 
 #ifdef HAVE_QUICKSCREEN
@@ -866,7 +883,11 @@
                     if(*tc.dirfilter > NUM_FILTER_MODES)
                         /* leave sub-browsers after usb, doing otherwise
                            might be confusing to the user */
+                        {
+                        menureturn(MENU_ATTACHED_USB);
+                        exit_menu = true;
                         exit_func = true;
+                        }
                     else
                         reload_dir = true;
                 }
@@ -1026,8 +1047,9 @@
             }
         }
     }
-
-    return true;
+    if (exit_menu)
+        return true;
+    return false;
 }
 
 static int plsize = 0;
@@ -1175,17 +1197,17 @@
 bool rockbox_browse(const char *root, int dirfilter)
 {
     static struct tree_context backup;
-
+    bool rtrn;
     backup = tc;
     reload_dir = true;
     memcpy(tc.currdir, root, sizeof(tc.currdir));
     start_wps = false;
     tc.dirfilter = &dirfilter;
 
-    dirbrowse();
+    rtrn=dirbrowse();
 
     tc = backup;
-    return false;
+    return rtrn;
 }
 
 void tree_init(void)
