First step in revamping the USB event handling, paving the way for the upcoming SYS_POWER_OFF event


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4951 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/bookmark.c b/apps/bookmark.c
index 993ea7e..8d60de2 100644
--- a/apps/bookmark.c
+++ b/apps/bookmark.c
@@ -45,6 +45,7 @@
 #include "kernel.h"
 #include "sprintf.h"
 #include "talk.h"
+#include "misc.h"
 
 #define MAX_BOOKMARKS 10
 #define MAX_BOOKMARK_SIZE  350
@@ -277,12 +278,10 @@
                 done = true;
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-#ifdef HAVE_LCD_CHARCELLS
-                status_set_param(true);
-#endif
-                return false;
+            default:
+                if(default_event_handler(key) == SYS_USB_CONNECTED)
+                    return false;
+                break;
         }
     }
     return true;
@@ -511,25 +510,23 @@
 
         while(!done)
         {
+            button_clear_queue();
+            
             /* Wait for a key to be pushed */
-            while (button_get(false)); /* clear button queue */
             key = button_get(true);
             switch(key)
             {
-                default:
-                    return false;
 #ifdef HAVE_LCD_BITMAP
                 case BUTTON_DOWN:
                     return bookmark_load(global_bookmark_file_name, false);
 #endif
                 case BUTTON_PLAY:
                     return bookmark_load(global_bookmark_file_name, true);
-                case SYS_USB_CONNECTED:
-                    usb_screen();
-#ifdef HAVE_LCD_CHARCELLS
-                    status_set_param(true);
-#endif
-                    return true;
+
+                default:
+                    if(default_event_handler(key) == SYS_USB_CONNECTED)
+                        return true;
+                    return false;
             }
         }
         return true;
@@ -690,12 +687,6 @@
                 while (button_get(false)); /* clear button queue */
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-#ifdef HAVE_LCD_CHARCELLS
-                status_set_param(true);
-#endif
-                return NULL;
 #ifdef HAVE_RECORDER_KEYPAD
             case BUTTON_UP:
                 bookmark_id--;
@@ -726,6 +717,10 @@
             case BUTTON_STOP:
                 return NULL;
 #endif
+            default:
+                if(default_event_handler(key) == SYS_USB_CONNECTED)
+                    return NULL;
+                break;
         }
     }
 
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index b89b4e4..f7a96dc 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -46,6 +46,7 @@
 #include "dir.h"
 #include "panic.h"
 #include "screens.h"
+#include "misc.h"
 #ifdef HAVE_LCD_BITMAP
 #include "widgets.h"
 #include "peakmeter.h"
@@ -520,10 +521,11 @@
                 if (partition > 3)
                     partition = 0;
                 break;
-                
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                return true;
+
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                    return true;
+                break;
         }
     }
     return false;
diff --git a/apps/main_menu.c b/apps/main_menu.c
index 991a168..b3c70a2 100644
--- a/apps/main_menu.c
+++ b/apps/main_menu.c
@@ -249,9 +249,10 @@
                     state = 1;
                 break;
 #endif
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                return true;
+           default:
+               if(default_event_handler(key) == SYS_USB_CONNECTED)
+                   return true;
+               break;
         }
     }
 
diff --git a/apps/menu.c b/apps/menu.c
index 72e4289..5e8a512 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -34,6 +34,7 @@
 #include "screens.h"
 #include "talk.h"
 #include "lang.h"
+#include "misc.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "icons.h"
@@ -373,12 +374,10 @@
                 exit = true;
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-#ifdef HAVE_LCD_CHARCELLS
-                status_set_param(false);
-#endif
-                return MENU_ATTACHED_USB;
+            default:
+                if(default_event_handler(key) == SYS_USB_CONNECTED)
+                    return MENU_ATTACHED_USB;
+                break;
         }
         
         status_draw(false);
diff --git a/apps/misc.c b/apps/misc.c
index 16719ad..6d45a64 100644
--- a/apps/misc.c
+++ b/apps/misc.c
@@ -232,3 +232,14 @@
 #endif
     return false;
 }
+
+int default_event_handler(int button)
+{
+    switch(button)
+    {
+        case SYS_USB_CONNECTED:
+            usb_screen();
+            return SYS_USB_CONNECTED;
+    }
+    return 0;
+}
diff --git a/apps/misc.h b/apps/misc.h
index 7815bd2..097b6cc 100644
--- a/apps/misc.h
+++ b/apps/misc.h
@@ -40,5 +40,6 @@
 
 bool settings_parseline(char* line, char** name, char** value);
 bool clean_shutdown(void);
+int default_event_handler(int button);
 
 #endif
diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c
index 4b9a3e3..e5d9549 100644
--- a/apps/playlist_viewer.c
+++ b/apps/playlist_viewer.c
@@ -32,6 +32,7 @@
 #include "tree.h"
 #include "onplay.h"
 #include "talk.h"
+#include "misc.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "widgets.h"
@@ -1045,15 +1046,17 @@
                 update = true;
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                ret = true;
-                goto exit;
-                break;
-
             case BUTTON_NONE:
                 status_draw(false);
                 break;
+
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                {
+                    ret = true;
+                    goto exit;
+                }
+                break;
         }
 
         if (update && !exit)
diff --git a/apps/recorder/keyboard.c b/apps/recorder/keyboard.c
index 32a1d8b..0331a57 100644
--- a/apps/recorder/keyboard.c
+++ b/apps/recorder/keyboard.c
@@ -28,6 +28,7 @@
 #include "status.h"
 #include "talk.h"
 #include "settings.h"
+#include "misc.h"
 
 #define KEYBOARD_LINES 4
 #define KEYBOARD_PAGES 3
@@ -89,6 +90,7 @@
     char outline[256];
     char c = 0;
     struct font* font = font_get(FONT_SYSFIXED);
+    int button;
 
     lcd_setfont(FONT_SYSFIXED);
     font_w = font->maxwidth;
@@ -193,8 +195,9 @@
 
         /* The default action is to redraw */
         redraw = true;
-        
-        switch ( button_get_w_tmo(HZ/2) ) {
+
+        button = button_get_w_tmo(HZ/2);
+        switch ( button ) {
 
             case BUTTON_OFF:
                 /* abort */
@@ -309,15 +312,16 @@
                     kbd_spellchar(text[editpos]);
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                lcd_setfont(FONT_SYSFIXED);
-                break;
-
             case BUTTON_NONE:
                 status_draw(false);
                 redraw = false;
                 break;
+
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                    lcd_setfont(FONT_SYSFIXED);
+                break;
+
         }
     }
     lcd_setfont(FONT_UI);
diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c
index 3684723..e26ac5b 100644
--- a/apps/recorder/radio.c
+++ b/apps/recorder/radio.c
@@ -416,13 +416,17 @@
                 /* Only accept USB connection when not recording */
                 if(mpeg_status() != MPEG_STATUS_RECORD)
                 {
-                    usb_screen();
+                    default_event_handler(SYS_USB_CONNECTED);
                     fmradio_set_status(0);
                     screen_freeze = true; /* Cosmetic: makes sure the
                                              radio screen doesn't redraw */
                     done = true;
                 }
                 break;
+                
+            default:
+                default_event_handler(button);
+                break;
         }
 
         peak_meter_peek();
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index a077c95..242351a 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -437,11 +437,15 @@
                 /* Only accept USB connection when not recording */
                 if(mpeg_status() != MPEG_STATUS_RECORD)
                 {
-                    usb_screen();
+                    default_event_handler(SYS_USB_CONNECTED);
                     done = true;
                     been_in_usb_mode = true;
                 }
                 break;
+                
+            default:
+                default_event_handler(button);
+                break;
         }
 
         peak_meter_peek();
@@ -622,6 +626,7 @@
     bool used = false;
     int w, h;
     char buf[32];
+    int button;
 
     lcd_setfont(FONT_SYSFIXED);
     lcd_getstringsize("A",&w,&h);
@@ -671,7 +676,8 @@
 
         lcd_update();
 
-        switch (button_get(true)) {
+        button = button_get(true);
+        switch (button) {
             case BUTTON_LEFT:
             case BUTTON_F2 | BUTTON_LEFT:
                 global_settings.rec_quality++;
@@ -706,9 +712,10 @@
                 used = true;
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                return true;
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                    return true;
+                break;
         }
     }
 
@@ -735,6 +742,7 @@
     bool exit = false;
     bool used = false;
     int w, h;
+    int button;
     char *src_str[] =
     {
         str(LANG_RECORDING_SRC_MIC),
@@ -760,7 +768,8 @@
 
         lcd_update();
 
-        switch (button_get(true)) {
+        button = button_get(true);
+        switch (button) {
             case BUTTON_LEFT:
             case BUTTON_F3 | BUTTON_LEFT:
                 global_settings.rec_source++;
@@ -779,9 +788,10 @@
                 used = true;
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                return true;
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                    return true;
+                break;
         }
     }
 
diff --git a/apps/screens.c b/apps/screens.c
index 4d48372..80b8484 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -288,6 +288,7 @@
    2 if USB was connected */
 int on_screen(void)
 {
+    int button;
     static int pitch = 1000;
     bool exit = false;
     bool used = false;
@@ -329,7 +330,8 @@
 
         /* use lastbutton, so the main loop can decide whether to
            exit to browser or not */
-        switch (button_get(true)) {
+        button = button_get(true);
+        switch (button) {
             case BUTTON_UP:
             case BUTTON_ON | BUTTON_UP:
             case BUTTON_ON | BUTTON_UP | BUTTON_REPEAT:
@@ -407,9 +409,10 @@
                 used = true;
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                return 2;
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                    return 2;
+                break;
         }
     }
 
@@ -606,10 +609,11 @@
 
             case BUTTON_OFF | BUTTON_REPEAT:
                 return false;
-                
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                return true;
+
+            default:
+                if(default_event_handler(key) == SYS_USB_CONNECTED)
+                    return true;
+                break;
         }
     }
 
@@ -1082,9 +1086,10 @@
                 tm->tm_year = -1;
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                return true;
+            default:
+                if (default_event_handler(button) == SYS_USB_CONNECTED)
+                    return true;
+                break;
         }
     }
 
@@ -1112,6 +1117,9 @@
                 break;
 
             default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                    return true;
+                
                 /* Return if any other button was pushed, or if there
                    was a timeout. We ignore RELEASE events, since we may
                    have been called by a button down event, and the user might
diff --git a/apps/settings.c b/apps/settings.c
index 31d9232..83d6971 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -1362,10 +1362,10 @@
                 done = true;
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                return true;
-
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                    return true;
+                break;
         }
         if(*variable > max )
             *variable = max;
@@ -1492,9 +1492,10 @@
                 done = true;
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                return true;
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                    return true;
+                break;
         }
 
         if ( function && button != BUTTON_NONE) {
diff --git a/apps/settings_menu.c b/apps/settings_menu.c
index 5da733c..1141361 100644
--- a/apps/settings_menu.c
+++ b/apps/settings_menu.c
@@ -43,6 +43,7 @@
 #include "screens.h"
 #include "talk.h"
 #include "timefuncs.h"
+#include "misc.h"
 #ifdef HAVE_LCD_BITMAP
 #include "peakmeter.h"
 #endif
@@ -1037,6 +1038,7 @@
 {
     bool done=false;
     int line;
+    int button;
  
     lcd_clear_display();
 
@@ -1052,7 +1054,8 @@
     lcd_update();
      
     while(!done) {
-        switch(button_get(true)) {
+        button = button_get(true);
+        switch(button) {
         case BUTTON_PLAY:
             settings_reset();
             settings_apply();
@@ -1071,9 +1074,9 @@
             done = true;
             break;
 
-        case SYS_USB_CONNECTED:
-            usb_screen();
-            return true;
+        default:
+            if(default_event_handler(button) == SYS_USB_CONNECTED)
+                return true;
         }
     }
 
diff --git a/apps/sound_menu.c b/apps/sound_menu.c
index 4c9087e..6f62ce2 100644
--- a/apps/sound_menu.c
+++ b/apps/sound_menu.c
@@ -33,6 +33,7 @@
 #include "lang.h"
 #include "sprintf.h"
 #include "talk.h"
+#include "misc.h"
 
 static char *fmt[] =
 {
@@ -56,6 +57,7 @@
     char str[32];
     int talkunit = UNIT_INT;
     int steps;
+    int button;
 
     unit = mpeg_sound_unit(setting);
     numdec = mpeg_sound_numdecimals(setting);
@@ -99,7 +101,8 @@
         lcd_update();
 
         changed = false;
-        switch( button_get_w_tmo(HZ/2) ) {
+        button = button_get_w_tmo(HZ/2);
+        switch( button ) {
 #ifdef HAVE_RECORDER_KEYPAD
             case BUTTON_UP:
             case BUTTON_UP | BUTTON_REPEAT:
@@ -136,9 +139,10 @@
                 done = true;
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                return true;
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                    return true;
+                break;
         }
         if (changed) {
             mpeg_sound_set(setting, *variable);
diff --git a/apps/tree.c b/apps/tree.c
index 72a2261..9ce5a9c 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -56,6 +56,7 @@
 #include "action.h"
 #include "talk.h"
 #include "filetypes.h"
+#include "misc.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "widgets.h"
@@ -599,7 +600,7 @@
 #endif
 
     if (usb_detect()) {
-        usb_screen();
+        default_event_handler(SYS_USB_CONNECTED);
         return false;
     }
     
@@ -635,13 +636,8 @@
             case BUTTON_ON | BUTTON_REPEAT:
                 break;
 #endif
-
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                stop = true;
-                break;
-
             default:
+                default_event_handler(button);
                 stop = true;
                 break;
         }
@@ -940,6 +936,7 @@
 #ifndef SIMULATOR
         if (boot_changed) {
             bool stop = false;
+            int button;
 
             lcd_clear_display();
             lcd_puts(0,0,str(LANG_BOOT_CHANGED));
@@ -950,18 +947,15 @@
             lcd_update();
 #endif
             while (!stop) {
-                switch (button_get(true)) {
+                button = button_get(true);
+                switch (button) {
                     case BUTTON_PLAY:
                         rolo_load("/" BOOTFILE);
                         stop = true;
                         break;
 
-                    case SYS_USB_CONNECTED:
-                        usb_screen();
-                        stop = true;
-                        break;
-
                     default:
+                        default_event_handler(button);
                         stop = true;
                         break;
                  }
@@ -1372,11 +1366,6 @@
 #endif
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                reload_root = true;
-                break;
-
             case BUTTON_NONE:
                 if (thumbnail_time != -1 &&
                     TIME_AFTER(current_tick, thumbnail_time))
@@ -1393,6 +1382,11 @@
                 }
                 status_draw(false);
                 break;
+
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                    reload_root = true;
+                break;
         }
 
         if ( button )
diff --git a/apps/wps.c b/apps/wps.c
index 8943a4d..86ce4b0 100644
--- a/apps/wps.c
+++ b/apps/wps.c
@@ -48,6 +48,8 @@
 #endif
 #include "lang.h"
 #include "bookmark.h"
+#include "misc.h"
+
 #define FF_REWIND_MAX_PERCENT 3 /* cap ff/rewind step size at max % of file */ 
                                 /* 3% of 30min file == 54s step size */
 #define MIN_FF_REWIND_STEP 500
@@ -296,9 +298,9 @@
                 exit = true;
                 break;
 
-            case SYS_USB_CONNECTED: 
-                usb_screen();
-                return true;
+            default:
+                if(default_event_handler(button) ==  SYS_USB_CONNECTED)
+                    return true;
                 break;
         }
     }
@@ -419,11 +421,12 @@
                 exit = true;
                 break;
 
-            case SYS_USB_CONNECTED:
-                status_set_ffmode(0);
-                usb_screen();
-                usb = true;
-                exit = true;
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED) {
+                    status_set_ffmode(0);
+                    usb = true;
+                    exit = true;
+                }
                 break;
         }
         if (!exit)
@@ -511,10 +514,12 @@
                 while (button_get(false)); /* clear button queue */
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                keys_locked = false;
-                return true;
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED) {
+                    keys_locked = false;
+                    return true;
+                }
+                break;
         }
 
         if (keys_locked) {
@@ -754,19 +759,20 @@
         if (button && ignore_keyup)
         {
             ignore_keyup = false;
-            if (button & BUTTON_REL && button != SYS_USB_CONNECTED)
+            /* Negative events are system events */
+            if (button >= 0 && button & BUTTON_REL )
                 continue;
         }
         
         /* ignore non-remote buttons when keys are locked */
         if (keys_locked &&
+            ! ((button < 0) ||
 #ifdef HAVE_RECORDER_KEYPAD
-            ! ((button & BUTTON_F1) ||
+               (button & BUTTON_F1) ||
 #else
-            ! ((button & BUTTON_MENU) ||
+               (button & BUTTON_MENU) ||
 #endif
-               (button == BUTTON_NONE) ||
-               (button == SYS_USB_CONNECTED)
+               (button == BUTTON_NONE)
 #ifdef BUTTON_REMOTE
                || (button & BUTTON_REMOTE)
 #endif
@@ -970,13 +976,14 @@
                 exit = true;
                 break;
 
-            case SYS_USB_CONNECTED:
-                usb_screen();
-                return SYS_USB_CONNECTED;
-
             case BUTTON_NONE: /* Timeout */
                 update_track = true;
                 break;
+
+            default:
+                if(default_event_handler(button) == SYS_USB_CONNECTED)
+                    return SYS_USB_CONNECTED;
+                break;
         }
 
         if (update_track)