Index: ./apps/menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/menu.c,v
retrieving revision 1.102
diff -u -r1.102 menu.c
--- ./apps/menu.c	2 Jul 2006 12:28:26 -0000	1.102
+++ ./apps/menu.c	22 Jul 2006 14:34:33 -0000
@@ -40,6 +40,11 @@
 #include "talk.h"
 #include "lang.h"
 #include "misc.h"
+#include "splash.h"
+#include "audio.h"
+#include "playlist.h"
+#include "gwps-common.h"
+#include "bookmark.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "icons.h"
@@ -64,6 +69,34 @@
 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)
 {
     struct menu *local_menus=(struct menu *)data;
@@ -160,21 +193,40 @@
 #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:
+#endif
 #ifdef MENU_RC_EXIT_MENU
             case MENU_RC_EXIT_MENU:
 #endif
-                exit = true;
+                return menureturn(MENU_SELECTED_QEXIT);
+#ifdef MENU_STOP
+            case MENU_STOP:
+                if(audio_status()) {
+                    if (!global_settings.party_mode){
+                        if (global_settings.fade_on_stop)
+                            fade(0);
+                        bookmark_autobookmark();
+                        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 +245,8 @@
                 return false;
 
             case MENU_ATTACHED_USB:
+            case MENU_SELECTED_QEXIT:
+            case MENU_SELECTED_WPS:
                 return true;
 
             default:
Index: ./apps/menu.h
===================================================================
RCS file: /cvsroot/rockbox/apps/menu.h,v
retrieving revision 1.43
diff -u -r1.43 menu.h
--- ./apps/menu.h	17 May 2006 06:41:26 -0000	1.43
+++ ./apps/menu.h	22 Jul 2006 14:34:33 -0000
@@ -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
@@ -40,10 +41,11 @@
 #elif CONFIG_KEYPAD == RECORDER_PAD
 
 #define MENU_EXIT       BUTTON_LEFT
-#define MENU_EXIT2      BUTTON_OFF
 #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,7 +54,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 +62,7 @@
 #define MENU_EXIT       BUTTON_LEFT
 #define MENU_EXIT_MENU  BUTTON_MENU
 #define MENU_ENTER      BUTTON_RIGHT
+#define MENU_STOP       BUTTON_OFF
 
 #elif CONFIG_KEYPAD == GMINI100_PAD
 #define MENU_EXIT       BUTTON_LEFT
@@ -67,17 +70,19 @@
 #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)
 
-/* TODO: Check menu button assignments */
-
 #define MENU_NEXT       BUTTON_DOWN
 #define MENU_PREV       BUTTON_UP
 #define MENU_EXIT       BUTTON_LEFT
 #define MENU_EXIT_MENU  BUTTON_MENU
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_SELECT
+#define MENU_PLAY       BUTTON_PLAY
+
+/* TODO: Check menu button assignments */
 
 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
 
@@ -95,6 +100,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 +111,7 @@
 #define MENU_ENTER2     BUTTON_SELECT
 #define MENU_NEXT       BUTTON_DOWN
 #define MENU_PREV       BUTTON_UP
+#define MENU_PLAY       BUTTON_POWER
 
 #endif
 
@@ -123,6 +130,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);
@@ -135,5 +144,6 @@
 void menu_insert(int menu, int position, char *desc, bool (*function) (void));
 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__ */
Index: ./apps/tree.c
===================================================================
RCS file: /cvsroot/rockbox/apps/tree.c,v
retrieving revision 1.417
diff -u -r1.417 tree.c
--- ./apps/tree.c	18 Jul 2006 18:33:11 -0000	1.417
+++ ./apps/tree.c	22 Jul 2006 14:34:33 -0000
@@ -430,8 +430,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;
     }
@@ -522,6 +522,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;
@@ -640,30 +641,27 @@
 
 #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) {
-                            if (global_settings.fade_on_stop)
-                                fade(0);
-                            bookmark_autobookmark();
-                            audio_stop();
-                        }
+                if(audio_status()) {
+                    if (!global_settings.party_mode) {
+                        if (global_settings.fade_on_stop)
+                            fade(0);
+                        bookmark_autobookmark();
+                        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();
+                    }
+                    restore = true;
                     }
 #endif
-                }
                 break;
 #if defined(CONFIG_CHARGING) && !defined(HAVE_POWEROFF_WHILE_CHARGING)
             case TREE_OFF | BUTTON_REPEAT:
@@ -693,7 +691,16 @@
                     FOR_NB_SCREENS(i)
                         screens[i].stop_scroll();
                     if (main_menu())
-                        reload_dir = true;
+                        switch (menureturn(false)){
+                            case MENU_SELECTED_WPS:
+                                start_wps=true;
+                                break;
+                            case MENU_ATTACHED_USB:
+                                reload_dir = true;
+                                break;
+                            default:
+                                break;
+                        }
                     restore = true;
 
                     id3db = check_changed_id3mode(id3db);
@@ -701,7 +708,10 @@
                         reload_dir = true;
                 }
                 else /* use it as a quick exit instead */
+                {
+                    menureturn(MENU_SELECTED_QEXIT);
                     exit_func = true;
+                }
                 break;
 
             case TREE_WPS:
@@ -729,6 +739,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
@@ -872,7 +890,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;
                 }
@@ -1033,7 +1055,7 @@
         }
     }
 
-    return true;
+    return exit_menu;
 }
 
 static int plsize = 0;
@@ -1182,16 +1204,17 @@
 {
     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)
Index: ./apps/gui/gwps.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/gwps.c,v
retrieving revision 1.46
diff -u -r1.46 gwps.c
--- ./apps/gui/gwps.c	18 Jul 2006 15:12:49 -0000	1.46
+++ ./apps/gui/gwps.c	22 Jul 2006 14:34:33 -0000
@@ -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
