Index: apps/SOURCES
===================================================================
RCS file: /cvsroot/rockbox/apps/SOURCES,v
retrieving revision 1.45
diff -u -u -r1.45 SOURCES
--- apps/SOURCES	18 Jul 2006 13:54:12 -0000	1.45
+++ apps/SOURCES	31 Jul 2006 21:57:58 -0000
@@ -1,6 +1,7 @@
 #ifdef ROCKBOX_HAS_LOGF
 logfdisp.c
 #endif
+action.c
 alarm_menu.c
 abrepeat.c
 bookmark.c
@@ -82,3 +83,18 @@
 #endif
 metadata.c
 tagcache.c
+#if (CONFIG_KEYPAD == IRIVER_H100_PAD) \
+    || (CONFIG_KEYPAD == IRIVER_H300_PAD)
+keymaps/keymap-h1x0_h3x0.c
+#elif ((CONFIG_KEYPAD == IPOD_4G_PAD) \
+    || (CONFIG_KEYPAD == IPOD_3G_PAD))
+keymaps/keymap-ipod.c
+#elif CONFIG_KEYPAD == RECORDER_PAD
+keymaps/keymap-recorder.c
+#elif CONFIG_KEYPAD == ONDIO_PAD
+keymaps/keymap-ondio.c
+#elif CONFIG_KEYPAD == PLAYER_PAD
+keymaps/keymap-player.c
+#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
+keymaps/keymap-x5.c
+#endif
Index: apps/action.c
===================================================================
RCS file: apps/action.c
diff -N apps/action.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ apps/action.c	31 Jul 2006 21:57:58 -0000
@@ -0,0 +1,212 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ *
+ * Copyright (C) 2006 Jonathan Gordon
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "config.h"
+#include "button.h"
+#include "action.h"
+#include "kernel.h"
+#include "debug.h"
+
+bool ignore_until_release = false;
+int last_button = BUTTON_NONE;
+/*
+ * do_button_check is the worker function for get_default_action.
+ * returns ACTION_UNKNOWN or the requested return value from the list.
+ */
+int do_button_check(struct button_mapping *items, 
+                           int button, int last_button, int *start)
+{
+    int i = 0;//*start;
+    int ret = ACTION_UNKNOWN;
+    if (items == NULL)
+        return ACTION_UNKNOWN;
+
+    /* Special case to make the keymaps smaller */
+    if(button & BUTTON_REPEAT)
+        last_button &= ~BUTTON_REPEAT;
+    
+    while (items[i].button_code != BUTTON_NONE)
+    {
+        if (items[i].button_code == button) 
+        {
+            if (items[i].pre_button_code != BUTTON_NONE)
+            {
+                if ((items[i].pre_button_code == last_button) ||
+                     (items[i].button_code == last_button))
+                {
+                    ret = items[i].action_code;
+                    break;
+                }
+            }
+            else
+            {
+                ret = items[i].action_code;
+                break;
+            }
+        }
+        i++;
+    }
+    *start = i;
+    return ret;
+}
+
+/*
+ * int get_action_worker(int context, struct button_mapping *user_mappings,
+   int timeout)
+   This function searches the button list for the given context for the just
+   pressed button.
+   If there is a match it returns the value from the list.
+   If there is no match..
+        - If the target has a remote control AND the button was from the remote control
+          Then the context list for the remote is searched.
+        - If there is still no match (or it was from the main buttons)
+          The standard button list is checked
+        - If there is still no match ACTION_UNKNOWN is returned.
+        
+   Timeout can be TIMEOUT_NOBLOCK to return immediatly
+                  TIMEOUT_BLOCK   to wait for a button press
+                  Any number >1   to wait that many ticks for a press
+                  
+    user_mappings should be NULL unless conext == CONTEXT_CUSTOM
+ */
+int get_action_worker(int context, struct button_mapping *user_mappings, int timeout)
+{
+    static struct button_mapping *last_button_list = NULL;
+    struct button_mapping *items;
+    struct button_mapping *default_list = get_context_mapping(CONTEXT_STD);
+    static int last_i = 0;
+    int button;
+    int i=0, try = 0;
+    int ret = ACTION_UNKNOWN;
+    
+    if ((timeout == TIMEOUT_NOBLOCK) || (timeout == TIMEOUT_BLOCK))
+        button = button_get(timeout);
+    else
+        button = button_get_w_tmo(timeout);
+
+//    logf("btn: %08x", button);
+    
+    if (button == BUTTON_NONE || button&SYS_EVENT)
+    {
+//        last_button = button;
+        last_i=0;
+        last_button_list = NULL;
+        return button;
+    }
+    
+    
+    if (ignore_until_release == true)
+    {
+        if (button&BUTTON_REL)
+        {
+            ignore_until_release = false;
+        }
+        last_button = BUTTON_NONE;
+        return ACTION_UNKNOWN; /* "safest" return value */
+    }
+    
+    if (context == CONTEXT_CUSTOM)
+    {
+        items = user_mappings;
+    }
+    else
+    {
+        items = get_context_mapping(context);
+    }
+
+    if ((last_button == button) && (items == last_button_list))
+        i = last_i;
+    /*DEBUGF("last_button = %x\tbutton = %x\t",last_button,button); */
+#if (BUTTON_REMOTE != 0)
+#define TRY_COUNT 3
+#else 
+#define TRY_COUNT 2
+#endif
+    while ((ret == ACTION_UNKNOWN) && (try<TRY_COUNT))
+    {
+        /*DEBUGF("try %d, context = %d\n",try,context);*/
+        switch (try)
+        {
+            case 0: /* first try, use the requested list */
+                ret = do_button_check(items,button,last_button,&i);
+                break;
+#if (BUTTON_REMOTE != 0)
+            case 1:
+                if (button&BUTTON_REMOTE) /* if its a remote button try again with the remote context list */
+                {
+                    i = 0;
+                    ret = do_button_check(get_context_mapping(context|CONTEXT_REMOTE),
+                                            button,last_button,&i); 
+                }
+                else if (items != default_list) /* its not, use the standard list */
+                {
+                    i = 0;
+                    ret = do_button_check(default_list,button,last_button,&i);
+                    try = TRY_COUNT; /* dont try again */
+                }
+                break;
+            case 2: /* can only get here is it is a remote button */
+                i = 0;
+                ret = do_button_check(get_context_mapping(CONTEXT_STD|CONTEXT_REMOTE),
+                                      button,last_button,&i);
+                break;
+#else
+            case 1:
+                if (items != default_list) /* 2nd try, use the default list */
+                {
+                    i = 0;
+                    ret = do_button_check(default_list,button,last_button,&i);
+                }
+                break;
+#endif
+        }
+        try++;
+    } /* while (...) */
+    /* DEBUGF("ret = %x\n",ret); */
+    last_i = i;
+    last_button = button;
+    last_button_list = items;
+    return ret;
+}
+
+int get_action(int context, int timeout)
+{
+    return get_action_worker(context,NULL,timeout);
+}
+
+int get_custom_action(struct button_mapping *user_mappings, int timeout)
+{
+    return get_action_worker(CONTEXT_CUSTOM,user_mappings,timeout);
+}
+
+bool action_userabort(int timeout)
+{
+    bool ret = (get_action(CONTEXT_STD,timeout) == ACTION_STD_EXIT);
+    action_signalscreenchange();
+    return ret;
+}
+
+void action_signalscreenchange(void)
+{
+    if (!(last_button&BUTTON_REL)) {
+        ignore_until_release = true;
+    }
+}
Index: apps/action.h
===================================================================
RCS file: /cvsroot/rockbox/apps/action.h,v
retrieving revision 1.3
diff -u -u -r1.3 action.h
--- apps/action.h	23 Jun 2005 01:31:25 -0000	1.3
+++ apps/action.h	31 Jul 2006 21:57:58 -0000
@@ -19,11 +19,110 @@
 #define __ACTION_H__
 
 #include "stdbool.h"
+#include "button.h"
 
-#define CONTEXT_WPS                                     1
-#define CONTEXT_TREE                                    2
-#define CONTEXT_RECORD                                  3
-#define CONTEXT_MAINMENU                                4
-#define CONTEXT_ID3DB                                   5
+#define TIMEOUT_BLOCK   -1
+#define TIMEOUT_NOBLOCK  0
+#define CONTEXT_REMOTE 0x80000000 /* | this against another context to get remote buttons for that context */
+
+enum {
+    CONTEXT_CUSTOM = -1,
+    CONTEXT_STD = 0,
+    /* These CONTEXT_ values were here before me,
+    there values may have significance, so dont touch! */
+    CONTEXT_WPS = 1,
+    CONTEXT_TREE = 2, 
+    CONTEXT_RECORD = 3,
+    CONTEXT_MAINMENU = 4,
+    CONTEXT_ID3DB = 5,
+    /* Add new contexts here, no need to explicitly define a value for them */    
+    CONTEXT_LIST,
+    CONTEXT_SETTINGS,
+};
+
+
+enum {
+    
+    ACTION_NONE = BUTTON_NONE,
+    ACTION_UNKNOWN,
+    
+    /* standard actions, use these first */
+    ACTION_STD_PREV, 
+    ACTION_STD_PREVREPEAT,
+    ACTION_STD_NEXT,
+    ACTION_STD_NEXTREPEAT,
+    
+    ACTION_STD_ACCEPT,
+    ACTION_STD_CANCEL,
+    ACTION_STD_CONTEXT,
+    ACTION_STD_EXIT,
+    ACTION_STD_MENU,
+    ACTION_STD_SELECT,
+    ACTION_STD_QUICKSCREEN,
+    ACTION_STD_WPS,
+    
+    
+    /* code context actions */
+    
+    /* WPS codes */
+    ACTION_WPS_BROWSE,
+    ACTION_WPS_PLAY,
+    ACTION_WPS_SEEKBACK,
+    ACTION_WPS_SEEKFWD,
+    ACTION_WPS_STOPSEEK,
+    ACTION_WPS_SKIPNEXT,
+    ACTION_WPS_SKIPPREV,
+    ACTION_WPS_STOP,
+    ACTION_WPS_VOLDOWN,
+    ACTION_WPS_VOLUP,
+    ACTION_WPS_NEXTDIR,/* optional */
+    ACTION_WPS_PREVDIR,/* optional */
+    ACTION_WPS_PITCHSCREEN,/* optional */
+    ACTION_WPS_ID3SCREEN,/* optional */
+    ACTION_WPS_CONTEXT,
+    ACTION_WPS_QUICKSCREEN,/* optional */
+    ACTION_WPS_MENU, /*this should be the same as ACTION_STD_MENU */
+    
+    /* tree */ 
+    ACTION_TREE_PGUP,/* optional */
+    ACTION_TREE_PGDOWN,/* optional */
+    ACTION_TREE_PGLEFT,/* optional */
+    ACTION_TREE_PGRIGHT,/* optional */
+    ACTION_TREE_RC_PGUP,/* optional */
+    ACTION_TREE_RC_PGDOWN,/* optional */
+    
+    /* recording screen */
+    
+    /* main menu */
+    
+    /* id3db */
+    
+    /* list */
+    
+    /* settings */
+    ACTION_SETTINGS_INC,
+    ACTION_SETTINGS_INCREPEAT,
+    ACTION_SETTINGS_DEC,
+    ACTION_SETTINGS_DECREPEAT,
+    
+};
+
+struct button_mapping {
+    int action_code;
+    int button_code;
+    int pre_button_code;
+};
+/* use if you want to supply your own button mappings, PLUGINS ONLY */
+int get_custom_action(struct button_mapping *user_mappings, int timeout);
+/* use if one of the standard CONTEXT_ mappings will work (ALL the core should be using this! */
+int get_action(int context, int timeout);
+/* call this whenever you leave your button loop */
+void action_signalscreenchange(void);
+
+/* call this if you need to check for ACTION_STD_EXIT only (i.e user abort! */
+bool action_userabort(int timeout);
+
+/* no other code should need this apart from action.c */
+struct button_mapping* get_context_mapping(int context);
 
 #endif
Index: apps/alarm_menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/alarm_menu.c,v
retrieving revision 1.11
diff -u -u -r1.11 alarm_menu.c
--- apps/alarm_menu.c	20 Nov 2005 01:02:14 -0000	1.11
+++ apps/alarm_menu.c	31 Jul 2006 21:57:59 -0000
@@ -25,7 +25,7 @@
 #include "options.h"
 
 #include "lcd.h"
-#include "button.h"
+#include "action.h"
 #include "kernel.h"
 #include "sprintf.h"
 #include <string.h>
@@ -56,6 +56,7 @@
     int button;
     int i;
     bool update = true;
+    
 
     rtc_get_alarm(&h, &m);
 
@@ -84,10 +85,10 @@
             screens[i].puts(0, 1, buf);
             gui_textarea_update(&screens[i]);
         }
-        button = button_get_w_tmo(HZ);
+        button = get_action(CONTEXT_SETTINGS,HZ);
 
         switch(button) {
-        case BUTTON_PLAY:
+        case ACTION_STD_ACCEPT:
             /* prevent that an alarm occurs in the shutdown procedure */
             /* accept alarms only if they are in 2 minutes or more */
             tm = get_time();
@@ -106,8 +107,8 @@
             break;
 
          /* inc(m) */
-        case BUTTON_RIGHT:
-        case BUTTON_RIGHT | BUTTON_REPEAT:
+        case ACTION_SETTINGS_INC:
+        case ACTION_SETTINGS_INCREPEAT:
             m += 5;
             if (m == 60) {
                 h += 1;
@@ -118,8 +119,8 @@
             break;
 
          /* dec(m) */
-         case BUTTON_LEFT:
-         case BUTTON_LEFT | BUTTON_REPEAT:
+        case ACTION_SETTINGS_DEC:
+        case ACTION_SETTINGS_DECREPEAT:
              m -= 5;
              if (m == -5) {
                  h -= 1;
@@ -129,32 +130,25 @@
                  h = 23;
              break;
 
-#if CONFIG_KEYPAD == RECORDER_PAD
          /* inc(h) */
-         case BUTTON_UP:
-         case BUTTON_UP | BUTTON_REPEAT:
+         case ACTION_STD_NEXT:
+         case ACTION_STD_NEXTREPEAT:
              h = (h+1) % 24;
              break;
 
          /* dec(h) */
-         case BUTTON_DOWN:
-         case BUTTON_DOWN | BUTTON_REPEAT:
+        case ACTION_STD_PREV:
+        case ACTION_STD_NEXTREPEAT:
              h = (h+23) % 24;
              break;
-#endif
 
-#if CONFIG_KEYPAD == RECORDER_PAD
-        case BUTTON_OFF:
-#else
-        case BUTTON_STOP:
-        case BUTTON_MENU:
-#endif
+        case ACTION_STD_EXIT:
             rtc_enable_alarm(false);
             gui_syncsplash(HZ*2, true, str(LANG_ALARM_MOD_DISABLE));
             done = true;
             break;
 
-        case BUTTON_NONE:
+        case ACTION_NONE:
             gui_syncstatusbar_draw(&statusbars, false);
             break;
 
@@ -167,7 +161,7 @@
             break;
         }
     }
-
+    action_signalscreenchange();
     return false;
 }
 
Index: apps/bookmark.c
===================================================================
RCS file: /cvsroot/rockbox/apps/bookmark.c,v
retrieving revision 1.50
diff -u -u -r1.50 bookmark.c
--- apps/bookmark.c	18 Jul 2006 19:11:56 -0000	1.50
+++ apps/bookmark.c	31 Jul 2006 21:57:59 -0000
@@ -24,7 +24,7 @@
 
 #include "applimits.h"
 #include "lcd.h"
-#include "button.h"
+#include "action.h"
 #include "usb.h"
 #include "audio.h"
 #include "playlist.h"
@@ -458,30 +458,24 @@
         while(!done)
         {
             /* Wait for a key to be pushed */
-            key = button_get(true);
+            key = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
             switch(key)
             {
 #ifdef HAVE_LCD_BITMAP
-#ifdef BOOKMARK_RC_DOWN
-                case BOOKMARK_RC_DOWN:
-#endif
-                case BOOKMARK_DOWN:
+                case ACTION_STD_NEXT:
                     return bookmark_load(global_bookmark_file_name, false);
 #endif
-#ifdef SETTINGS_RC_OK
-                case SETTINGS_RC_OK:
-#endif
-                case SETTINGS_OK:
+                case ACTION_STD_SELECT:
                     return bookmark_load(global_bookmark_file_name, true);
 
                 default:
                     /* Handle sys events, ignore button releases & repeats */
-                    if (default_event_handler(key) ||
-                        !(key & (BUTTON_REPEAT|BUTTON_REL)))
+                    if (default_event_handler(key))
                         done = true;
                     break;
             }
         }
+        action_signalscreenchange();
         return false;
     }
 }
@@ -571,7 +565,6 @@
     int bookmark_id = 0;
     int bookmark_id_prev = -1;
     int key;
-    int lastkey = BUTTON_NONE;
     char* bookmark = NULL;
     int bookmark_count = 0;
 
@@ -605,6 +598,7 @@
             {
                 gui_syncsplash(HZ, true, str(LANG_BOOKMARK_LOAD_EMPTY));
                 remove(bookmark_file_name);
+                action_signalscreenchange();
                 return NULL;
             }
             else
@@ -621,17 +615,10 @@
         }
 
         /* waiting for the user to click a button */
-        key = button_get(true);
+        key = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
         switch(key)
         {
-#ifdef BOOKMARK_RC_SELECT
-            case BOOKMARK_RC_SELECT:
-#endif
-            case BOOKMARK_SELECT:
-#ifdef BOOKMARK_SELECT_PRE
-                if (lastkey != BOOKMARK_SELECT_PRE)
-                    break;
-#endif
+            case ACTION_STD_SELECT:
                 /* User wants to use this bookmark */
 #ifdef HAVE_LCD_BITMAP
                 if (global_settings.statusbar)
@@ -645,11 +632,9 @@
                         screens[i].setmargins(0, 0);
                 }
 #endif
+                action_signalscreenchange();
                 return bookmark;
-#ifdef BOOKMARK_RC_DELETE
-            case BOOKMARK_RC_DELETE:
-#endif
-            case BOOKMARK_DELETE:
+            case ACTION_STD_EXIT:
                 /* User wants to delete this bookmark */
                 delete_bookmark(bookmark_file_name, bookmark_id);
                 bookmark_id_prev=-2;
@@ -658,54 +643,32 @@
                     bookmark_id = bookmark_count -1;
                 break;
 
-#ifdef SETTINGS_RC_DEC
-            case SETTINGS_RC_DEC:
-            case SETTINGS_RC_DEC | BUTTON_REPEAT:
-#endif
-            case SETTINGS_DEC:
-            case SETTINGS_DEC | BUTTON_REPEAT:
+            case ACTION_SETTINGS_DEC:
                 bookmark_id--;
                 break;
 
-#ifdef SETTINGS_RC_DEC
-            case SETTINGS_RC_INC:
-            case SETTINGS_RC_INC | BUTTON_REPEAT:
-#endif
-            case SETTINGS_INC:
-            case SETTINGS_INC | BUTTON_REPEAT:
+            case ACTION_SETTINGS_INC:
                 bookmark_id++;
                 break;
 
-#ifdef SETTINGS_RC_CANCEL
-            case SETTINGS_RC_CANCEL:
-#endif
-#ifdef SETTINGS_RC_CANCEL2
-            case SETTINGS_RC_CANCEL2:
-#endif
-            case SETTINGS_CANCEL:
-#ifdef SETTINGS_CANCEL2
-            case SETTINGS_CANCEL2:
-#endif
-#ifdef SETTINGS_RC_OK2
-            case SETTINGS_RC_OK2:
-#endif
-#ifdef SETTINGS_OK2
-            case SETTINGS_OK2:
-#endif
+            case ACTION_STD_CANCEL:
 #ifdef HAVE_LCD_BITMAP
                 FOR_NB_SCREENS(i)
                     screens[i].setmargins(x, y);
 #endif
+                action_signalscreenchange();
                 return NULL;
 
             default:
                 if(default_event_handler(key) == SYS_USB_CONNECTED)
+                {
+                    action_signalscreenchange();
                     return NULL;
+                }
                 break;
         }
-        lastkey = key;
     }
-
+    action_signalscreenchange();
     return NULL;
 }
 
Index: apps/bookmark.h
===================================================================
RCS file: /cvsroot/rockbox/apps/bookmark.h,v
retrieving revision 1.12
diff -u -u -r1.12 bookmark.h
--- apps/bookmark.h	18 Jul 2006 19:11:56 -0000	1.12
+++ apps/bookmark.h	31 Jul 2006 21:57:59 -0000
@@ -21,49 +21,6 @@
 
 #include <stdbool.h>
 
-#if CONFIG_KEYPAD == ONDIO_PAD
-#define BOOKMARK_SELECT_PRE BUTTON_RIGHT
-#define BOOKMARK_SELECT (BUTTON_RIGHT | BUTTON_REL)
-#define BOOKMARK_DELETE (BUTTON_RIGHT | BUTTON_REPEAT)
-#define BOOKMARK_DOWN BUTTON_DOWN
-
-#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
-      (CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define BOOKMARK_SELECT BUTTON_SELECT
-#define BOOKMARK_DELETE (BUTTON_ON | BUTTON_SELECT)
-#define BOOKMARK_DOWN BUTTON_DOWN
-#define BOOKMARK_RC_SELECT BUTTON_RC_MENU
-#define BOOKMARK_RC_DELETE (BUTTON_RC_ON | BUTTON_RC_MENU)
-#define BOOKMARK_RC_DOWN BUTTON_RC_FF
-#define BOOKMARK_RC_EXIT BUTTON_RC_STOP
-
-#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
-#define BOOKMARK_SELECT BUTTON_SELECT
-#define BOOKMARK_DELETE (BUTTON_RIGHT | BUTTON_REPEAT)
-#define BOOKMARK_DOWN BUTTON_SCROLL_FWD
-
-#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
-#define BOOKMARK_SELECT BUTTON_SELECT
-#define BOOKMARK_DELETE (BUTTON_PLAY | BUTTON_SELECT)
-#define BOOKMARK_DOWN BUTTON_DOWN
-
-#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
-#define BOOKMARK_SELECT BUTTON_SELECT
-#define BOOKMARK_DELETE BUTTON_REC | BUTTON_REPEAT
-#define BOOKMARK_DOWN BUTTON_DOWN
-
-#elif CONFIG_KEYPAD == GIGABEAT_PAD
-#define BOOKMARK_SELECT BUTTON_MENU
-#define BOOKMARK_DELETE BUTTON_POWER
-#define BOOKMARK_DOWN BUTTON_A
-
-#else /* player, recorder, gmini */
-#define BOOKMARK_SELECT BUTTON_PLAY
-#define BOOKMARK_DELETE (BUTTON_ON | BUTTON_PLAY)
-#define BOOKMARK_DOWN BUTTON_DOWN
-
-#endif
-
 bool bookmark_load_menu(void);
 bool bookmark_autobookmark(void);
 bool bookmark_create_menu(void);
Index: apps/debug_menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/debug_menu.c,v
retrieving revision 1.189
diff -u -u -r1.189 debug_menu.c
--- apps/debug_menu.c	20 Jul 2006 12:19:31 -0000	1.189
+++ apps/debug_menu.c	31 Jul 2006 21:57:59 -0000
@@ -27,7 +27,7 @@
 #include "debug_menu.h"
 #include "kernel.h"
 #include "sprintf.h"
-#include "button.h"
+#include "action.h"
 #include "adc.h"
 #include "mas.h"
 #include "power.h"
@@ -83,7 +83,6 @@
 bool dbg_os(void)
 {
     char buf[32];
-    int button;
     int i;
     int usage;
 
@@ -103,13 +102,8 @@
 
         lcd_update();
 
-        button = button_get_w_tmo(HZ/10);
-
-        switch(button)
-        {
-            case SETTINGS_CANCEL:
-                return false;
-        }
+        if (action_userabort(TIMEOUT_BLOCK))
+            return false;
     }
     return false;
 }
@@ -131,20 +125,21 @@
         snprintf(buf, 32, "%d: %d%%  ", currval, usage);
         lcd_puts(0, 1, buf);
     
-        button = button_get_w_tmo(HZ/10);
+        button = get_action(CONTEXT_SETTINGS,HZ/10);
 
         switch(button)
         {
-        case SETTINGS_CANCEL:
+        case ACTION_STD_EXIT:
+            action_signalscreenchange();
             return false;
 
-        case SETTINGS_DEC:
+        case ACTION_SETTINGS_DEC:
             currval--;
             if(currval < 0)
                 currval = num_threads-1;
             break;
 
-        case SETTINGS_INC:
+        case ACTION_SETTINGS_INC:
             currval++;
             if(currval > num_threads-1)
                 currval = 0;
@@ -160,7 +155,6 @@
 bool dbg_audio_thread(void)
 {
     char buf[32];
-    int button;
     struct audio_debug d;
 
     lcd_setmargins(0, 0);
@@ -168,12 +162,8 @@
     
     while(1)
     {
-        button = button_get_w_tmo(HZ/5);
-        switch(button)
-        {
-            case SETTINGS_CANCEL:
-                return false;
-        }
+        if (action_userabort(HZ/5))
+            return false;
 
         audio_get_debugdata(&d);
         
@@ -239,23 +229,22 @@
     
     lcd_setmargins(0, 0);
     lcd_setfont(FONT_SYSFIXED);
-    
     while(!done)
     {
-        button = button_get_w_tmo(HZ/5);
+        button = get_action(CONTEXT_STD,HZ/5);
         switch(button)
         {
-            case SETTINGS_NEXT:
+            case ACTION_STD_NEXT:
                 audio_next();
                 break;
-            case SETTINGS_PREV:
+            case ACTION_STD_PREV:
                 audio_prev();
                 break;
-            case SETTINGS_CANCEL:
+            case ACTION_STD_EXIT:
                 done = true;
                 break;
         }
-
+        action_signalscreenchange();
         line = 0;
         
         lcd_clear_display();
@@ -491,13 +480,11 @@
 
     while(1)
     {
-        button = button_get(true);
-        if(button == SETTINGS_CANCEL)
+        if (action_userabort(TIMEOUT_BLOCK))
             return false;
     }
 #elif CONFIG_CPU == MCF5249
     char buf[32];
-    int button;
     unsigned manu, id; /* flash IDs */
     bool got_id; /* flag if we managed to get the flash IDs */
     int oldmode;  /* saved memory guard mode */
@@ -527,13 +514,11 @@
 
     while(1)
     {
-        button = button_get(true);
-        if(button == SETTINGS_CANCEL)
+        if (action_userabort(TIMEOUT_BLOCK))
             return false;
     }
 #elif CONFIG_CPU == PP5020
     char buf[32];
-    int button;
 
     lcd_setmargins(0, 0);
     lcd_setfont(FONT_SYSFIXED);
@@ -548,8 +533,7 @@
 
     while(1)
     {
-        button = button_get(true);
-        if(button == SETTINGS_CANCEL)
+        if (action_userabort(TIMEOUT_BLOCK))
             return false;
     }
 #endif /* CONFIG_CPU */
@@ -638,20 +622,21 @@
         lcd_puts(0, 1, buf);
         lcd_update();
         
-        button = button_get(true);
+        button = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
 
         switch(button)
         {
-            case SETTINGS_CANCEL:
+            case ACTION_STD_CANCEL:
+                action_signalscreenchange();
                 return false;
 
-            case SETTINGS_DEC:
+            case ACTION_SETTINGS_DEC:
                 currval--;
                 if(currval < 0)
                     currval = 5;
                 break;
                 
-            case SETTINGS_INC:
+            case ACTION_SETTINGS_INC:
                 currval++;
                 if(currval > 5)
                     currval = 0;
@@ -685,21 +670,21 @@
         lcd_puts(0, 1, buf);
         lcd_update();
         
-        button = button_get(true);
+        button = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
 
         switch(button)
         {
-            case SETTINGS_OK:
-            case SETTINGS_CANCEL:
+            case ACTION_STD_EXIT:
+                action_signalscreenchange();
                 return false;
 
-            case SETTINGS_DEC:
+            case ACTION_SETTINGS_DEC:
                 partition--;
                 if (partition < 0)
                     partition = 3;
                 break;
                 
-            case SETTINGS_INC:
+            case ACTION_SETTINGS_INC:
                 partition++;
                 if (partition > 3)
                     partition = 0;
@@ -871,13 +856,8 @@
 
         lcd_update();
 
-        switch (button_get_w_tmo(HZ/10))
-        {
-            case SETTINGS_CANCEL:
-            case SETTINGS_OK2:
-                done = true;
-                break;
-        }
+        if (action_userabort(HZ/2))
+            return false;
     }
 #ifdef HAVE_SPDIF_POWER
     spdif_power_enable(global_settings.spdif_enable);
@@ -937,13 +917,8 @@
         lcd_puts(0, 7, buf);
 #endif
         lcd_update();
-        button = button_get_w_tmo(HZ/10);
-
-        switch(button)
-        {
-            case SETTINGS_CANCEL:
-                return false;
-        }
+        if (action_userabort(HZ/10))
+            return false;
     }
 #elif defined(CPU_COLDFIRE)
     unsigned int gpio_out;
@@ -959,7 +934,6 @@
     int adc_remotedetect;
 #endif
     char buf[128];
-    int button;
     int line;
     int battery_voltage;
     int batt_int, batt_frac;
@@ -1030,13 +1004,8 @@
 #endif
         
         lcd_update();
-        button = button_get_w_tmo(HZ/10);
-
-        switch(button)
-        {   /* quit on release to allow for reading the cancel button input */
-            case (SETTINGS_CANCEL|BUTTON_REL):  
-                return false;
-        }
+        if (action_userabort(HZ/10))
+            return false;
     }
 
 #elif CONFIG_CPU == PP5020
@@ -1046,7 +1015,6 @@
     unsigned int gpio_i, gpio_j, gpio_k, gpio_l;
 
     char buf[128];
-    int button;
     int line;
 
     lcd_setmargins(0, 0);
@@ -1088,13 +1056,8 @@
         lcd_puts(0, line++, buf);
 
         lcd_update();
-        button = button_get_w_tmo(HZ/10);
-
-        switch(button)
-        {
-            case SETTINGS_CANCEL:
-                return false;
-        }
+        if (action_userabort(HZ/10))
+            return false;
     }
 
 #endif /* CPU */
@@ -1167,20 +1130,21 @@
         snprintf(buf, 32, "Batt: %d.%02dV", batt_int, batt_frac);
         lcd_puts(0, 1, buf);
         
-        button = button_get_w_tmo(HZ/5);
+        button = get_action(CONTEXT_SETTINGS,HZ/5);
 
         switch(button)
         {
-        case SETTINGS_CANCEL:
+        case ACTION_STD_EXIT:
+            action_signalscreenchange();
             return false;
 
-        case SETTINGS_DEC:
+        case ACTION_SETTINGS_DEC:
             currval--;
             if(currval < 0)
                 currval = 10;
             break;
 
-        case SETTINGS_INC:
+        case ACTION_SETTINGS_INC:
             currval++;
             if(currval > 10)
                 currval = 0;
@@ -1216,43 +1180,25 @@
         lcd_puts(0, line++, buf);
 
         lcd_update();
-        button = button_get_w_tmo(HZ/10);
+        button = get_action(CONTEXT_STD,HZ/10);
 
         switch(button)
         {
-#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD)
-        case BUTTON_MENU:
-#else
-        case BUTTON_UP:
-#endif
-            cpu_boost(true);
-            break;
-#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD)
-        case BUTTON_PLAY:
-#else 
-        case BUTTON_DOWN:
-#endif
-            cpu_boost(false);
-            break;
+            case ACTION_STD_PREV:
+                cpu_boost(true);
+                break;
+            case ACTION_STD_NEXT:
+                cpu_boost(false);
+                break;
 
-#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
-    (CONFIG_KEYPAD == IRIVER_H300_PAD) || \
-    (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD)
-        case BUTTON_SELECT:
-#else
-        case BUTTON_PLAY:
-#endif
-            set_cpu_frequency(CPUFREQ_DEFAULT);
-            boost_counter = 0;
-            break;
+            case ACTION_STD_ACCEPT:
+                set_cpu_frequency(CPUFREQ_DEFAULT);
+                boost_counter = 0;
+                break;
 
-#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD)
-        case BUTTON_LEFT:
-#else
-        case SETTINGS_CANCEL:
-        case SETTINGS_OK2:
-#endif
-            return false;
+            case ACTION_STD_EXIT:
+                action_signalscreenchange();
+                return false;
         }
     }
 
@@ -1425,20 +1371,20 @@
         
         lcd_update();
         
-        switch(button_get_w_tmo(HZ/2))
+        switch(get_action(CONTEXT_SETTINGS,HZ/2))
         {
-            case SETTINGS_DEC:
+            case ACTION_SETTINGS_DEC:
                 if (view)
                     view--;
                 break;
                 
-            case SETTINGS_INC:
+            case ACTION_SETTINGS_INC:
                 if (view < 3)
                     view++;
                 break;
                 
-            case SETTINGS_OK:
-            case SETTINGS_CANCEL:
+            case ACTION_STD_EXIT:
+                action_signalscreenchange();
                 return false;
         }
     }
@@ -1495,41 +1441,40 @@
         lcd_update();
 
         /* Wait for a key to be pushed */
-        key = button_get_w_tmo(HZ);
+        key = get_action(CONTEXT_SETTINGS,HZ);
         switch(key) {
-            case SETTINGS_CANCEL:
+            case ACTION_STD_EXIT:
                 done = true;
                 break;
 
-            case SETTINGS_INC:
-            case SETTINGS_DEC:
+            case ACTION_SETTINGS_INC:
+            case ACTION_SETTINGS_DEC:
                 if (state == 1)
                     state = 2;
                 else
                     state = 1;
                 break;
 
-            case SETTINGS_OK:
+            case ACTION_STD_ACCEPT:
                 lcd_clear_display();
+                /*NOTE: this needs to be changed to sync splash! */
                 lcd_puts(0,0,"Clear time?");
                 lcd_puts(0,1,"PLAY = Yes");
                 lcd_update();
                 while (1) {
-                    key = button_get(true);
-                    if ( key == SETTINGS_OK ) {
+                    key = get_action(CONTEXT_STD,TIMEOUT_BLOCK);
+                    if ( key == ACTION_STD_ACCEPT ) {
                         if ( state == 1 )
                             global_settings.runtime = 0;
                         else
                             global_settings.topruntime = 0;
                         break;
                     }
-                    if (!(key & BUTTON_REL))  /* ignore button releases */
-                        break;
                 }
                 break;
         }
     }
-
+    action_signalscreenchange();
     return false;
 }
 
@@ -1617,27 +1562,26 @@
 
         lcd_update();
 
-        switch (button_get_w_tmo(HZ/2))
+        switch (get_action(CONTEXT_SETTINGS,HZ/2))
         {
-            case SETTINGS_OK:
-            case SETTINGS_CANCEL:
+            case ACTION_STD_EXIT:
                 done = true;
                 break;
                 
-            case SETTINGS_DEC:
+            case ACTION_SETTINGS_DEC:
                 currval--;
                 if (currval < 0)
                     currval = 3;
                 break;
 
-            case SETTINGS_INC:
+            case ACTION_SETTINGS_INC:
                 currval++;
                 if (currval > 3)
                     currval = 0;
                 break;
         }
     }
-
+    action_signalscreenchange();
     return false;
 }
 #else /* !HAVE_MMC */
@@ -1778,26 +1722,25 @@
         lcd_update();
 
         /* Wait for a key to be pushed */
-        key = button_get_w_tmo(HZ*5);
+        key = get_action(CONTEXT_SETTINGS,HZ/5);
         switch(key) {
-            case SETTINGS_OK:
-            case SETTINGS_CANCEL:
+            case ACTION_STD_EXIT:
                 done = true;
                 break;
 
-            case SETTINGS_DEC:
+            case ACTION_SETTINGS_DEC:
                 if (--page < 0)
                     page = max_page;
                 break;
                 
-            case SETTINGS_INC:
+            case ACTION_SETTINGS_INC:
                 if (++page > max_page)
                     page = 0;
                 break;
         }
         lcd_stop_scroll();
     }
-
+    action_signalscreenchange();
     return false;
 }
 #endif /* !HAVE_MMC */
@@ -1846,13 +1789,8 @@
 
         lcd_update();
 
-        switch (button_get_w_tmo(HZ/2))
-        {
-            case SETTINGS_OK:
-            case SETTINGS_CANCEL:
-                done = true;
-                break;
-        }
+        if (action_userabort(HZ/2))
+            return false;
     }
 
     return false;
@@ -1897,13 +1835,8 @@
 
         lcd_update();
 
-        switch (button_get_w_tmo(HZ/2))
-        {
-            case SETTINGS_OK:
-            case SETTINGS_CANCEL:
-                done = true;
-                break;
-        }
+        if (action_userabort(HZ/2))
+            return false;
     }
 
     return false;
@@ -1960,7 +1893,6 @@
 bool dbg_fm_radio(void)
 {
     char buf[32];
-    int button;
     bool fm_detected;
 
 #ifdef HAVE_LCD_BITMAP
@@ -1976,13 +1908,8 @@
         lcd_puts(0, 0, buf);
         lcd_update();
         
-        button = button_get(true);
-
-        switch(button)
-        {
-            case SETTINGS_CANCEL:
-                return false;
-        }
+        if (action_userabort(TIMEOUT_BLOCK))
+            return false;
     }
     return false;
 }
Index: apps/eq_menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/eq_menu.c,v
retrieving revision 1.18
diff -u -u -r1.18 eq_menu.c
--- apps/eq_menu.c	23 Jun 2006 12:14:07 -0000	1.18
+++ apps/eq_menu.c	31 Jul 2006 21:58:00 -0000
@@ -26,7 +26,7 @@
 #include "kernel.h"
 #include "lcd.h"
 #include "menu.h"
-#include "button.h"
+#include "action.h"
 #include "mp3_playback.h"
 #include "settings.h"
 #include "statusbar.h"
@@ -46,64 +46,6 @@
 #include "keyboard.h"
 #include "gui/scrollbar.h"
 
-/* Key definitions */
-#if (CONFIG_KEYPAD == IRIVER_H100_PAD || \
-     CONFIG_KEYPAD == IRIVER_H300_PAD)
-
-#define EQ_BTN_MODIFIER     BUTTON_ON
-#define EQ_BTN_DECREMENT    BUTTON_LEFT
-#define EQ_BTN_INCREMENT    BUTTON_RIGHT
-#define EQ_BTN_NEXT_BAND    BUTTON_DOWN
-#define EQ_BTN_PREV_BAND    BUTTON_UP
-#define EQ_BTN_CHANGE_MODE  BUTTON_SELECT
-#define EQ_BTN_EXIT         BUTTON_OFF
-
-#define EQ_BTN_RC_PREV_BAND     BUTTON_RC_REW
-#define EQ_BTN_RC_NEXT_BAND     BUTTON_RC_FF
-#define EQ_BTN_RC_DECREMENT     BUTTON_RC_SOURCE
-#define EQ_BTN_RC_INCREMENT     BUTTON_RC_BITRATE
-#define EQ_BTN_RC_CHANGE_MODE   BUTTON_RC_MENU
-#define EQ_BTN_RC_EXIT          BUTTON_RC_STOP
-
-#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
-      (CONFIG_KEYPAD == IPOD_3G_PAD)
-
-#define EQ_BTN_DECREMENT    BUTTON_SCROLL_BACK
-#define EQ_BTN_INCREMENT    BUTTON_SCROLL_FWD
-#define EQ_BTN_NEXT_BAND    BUTTON_RIGHT
-#define EQ_BTN_PREV_BAND    BUTTON_LEFT
-#define EQ_BTN_CHANGE_MODE  BUTTON_SELECT
-#define EQ_BTN_EXIT         BUTTON_MENU
-
-#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
-
-#define EQ_BTN_DECREMENT    BUTTON_LEFT
-#define EQ_BTN_INCREMENT    BUTTON_RIGHT
-#define EQ_BTN_NEXT_BAND    BUTTON_DOWN
-#define EQ_BTN_PREV_BAND    BUTTON_UP
-#define EQ_BTN_CHANGE_MODE  BUTTON_REC
-#define EQ_BTN_EXIT         BUTTON_SELECT
-
-#elif (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
-
-#define EQ_BTN_DECREMENT    BUTTON_LEFT
-#define EQ_BTN_INCREMENT    BUTTON_RIGHT
-#define EQ_BTN_NEXT_BAND    BUTTON_DOWN
-#define EQ_BTN_PREV_BAND    BUTTON_UP
-#define EQ_BTN_CHANGE_MODE  BUTTON_SELECT
-#define EQ_BTN_EXIT         BUTTON_PLAY
-
-#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
-
-#define EQ_BTN_DECREMENT    BUTTON_LEFT
-#define EQ_BTN_INCREMENT    BUTTON_RIGHT
-#define EQ_BTN_NEXT_BAND    BUTTON_DOWN
-#define EQ_BTN_PREV_BAND    BUTTON_UP
-#define EQ_BTN_CHANGE_MODE  BUTTON_SELECT
-#define EQ_BTN_EXIT         BUTTON_A
-
-#endif
-
 /* Various user interface limits and sizes */
 #define EQ_CUTOFF_MIN        20
 #define EQ_CUTOFF_MAX     22040
@@ -674,27 +616,19 @@
             screens[i].update();
         }
         
-        button = button_get(true);
+        button = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
 
         switch (button) {
-        case EQ_BTN_DECREMENT:
-        case EQ_BTN_DECREMENT | BUTTON_REPEAT:
-#ifdef EQ_BTN_RC_DECREMENT
-        case EQ_BTN_RC_DECREMENT:
-        case EQ_BTN_RC_DECREMENT | BUTTON_REPEAT:
-#endif
+        case ACTION_SETTINGS_DEC:
+            case ACTION_SETTINGS_DECREPEAT:
             *(setting) -= step;
             has_changed = true;
             if (*(setting) < min)
                 *(setting) = min;
             break;
 
-        case EQ_BTN_INCREMENT:
-        case EQ_BTN_INCREMENT | BUTTON_REPEAT:
-#ifdef EQ_BTN_RC_INCREMENT
-        case EQ_BTN_RC_INCREMENT:
-        case EQ_BTN_RC_INCREMENT | BUTTON_REPEAT:
-#endif
+        case ACTION_SETTINGS_INC:
+        case ACTION_SETTINGS_INCREPEAT:
             *(setting) += step;
             has_changed = true;
             if (*(setting) > max)
@@ -719,45 +653,27 @@
             break;
 #endif
 
-        case EQ_BTN_PREV_BAND:
-        case EQ_BTN_PREV_BAND | BUTTON_REPEAT:
-#ifdef EQ_BTN_RC_PREV_BAND
-        case EQ_BTN_RC_PREV_BAND:
-        case EQ_BTN_RC_PREV_BAND | BUTTON_REPEAT:
-#endif
+        case ACTION_STD_PREV:
+        case ACTION_STD_PREVREPEAT:
             current_band--;
             if (current_band < 0)
                 current_band = 4; /* wrap around */
             break;
 
-        case EQ_BTN_NEXT_BAND:
-        case EQ_BTN_NEXT_BAND | BUTTON_REPEAT:
-#ifdef EQ_BTN_RC_NEXT_BAND
-        case EQ_BTN_RC_NEXT_BAND:
-        case EQ_BTN_RC_NEXT_BAND | BUTTON_REPEAT:
-#endif
+        case ACTION_STD_NEXT:
+        case ACTION_STD_NEXTREPEAT:
             current_band++;
             if (current_band > 4)
                 current_band = 0; /* wrap around */
             break;
 
-        case EQ_BTN_CHANGE_MODE:
-        case EQ_BTN_CHANGE_MODE | BUTTON_REPEAT:
-#ifdef EQ_BTN_RC_CHANGE_MODE
-        case EQ_BTN_RC_CHANGE_MODE:
-        case EQ_BTN_RC_CHANGE_MODE | BUTTON_REPEAT:
-#endif
+        case ACTION_STD_SELECT:
             mode++;
             if (mode > Q)
                 mode = GAIN; /* wrap around */
             break;
 
-        case EQ_BTN_EXIT:
-        case EQ_BTN_EXIT | BUTTON_REPEAT:
-#ifdef EQ_BTN_RC_EXIT
-        case EQ_BTN_RC_EXIT:
-        case EQ_BTN_RC_EXIT | BUTTON_REPEAT:
-#endif
+        case ACTION_STD_EXIT:
             exit_request = true;
             result = false;
             break;
@@ -777,6 +693,7 @@
         }
     }
 
+    action_signalscreenchange();
     /* Reset screen settings */
     FOR_NB_SCREENS(i) {
         screens[i].setfont(FONT_UI);
Index: apps/logfdisp.c
===================================================================
RCS file: /cvsroot/rockbox/apps/logfdisp.c,v
retrieving revision 1.10
diff -u -u -r1.10 logfdisp.c
--- apps/logfdisp.c	18 Jul 2006 16:03:36 -0000	1.10
+++ apps/logfdisp.c	31 Jul 2006 21:58:00 -0000
@@ -24,20 +24,12 @@
 #include <timefuncs.h>
 #include <string.h>
 #include <kernel.h>
-#include <button.h>
+#include <action.h>
 
 #include <lcd.h>
 #include "menu.h"
 #include "logf.h"
 
-#if (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
-#define LOGF_BUTTON_QUIT BUTTON_MENU
-#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
-#define LOGF_BUTTON_QUIT BUTTON_POWER
-#else
-#define LOGF_BUTTON_QUIT BUTTON_OFF
-#endif
-
 #ifdef HAVE_LCD_BITMAP
 bool logfdisplay(void)
 
@@ -93,8 +85,7 @@
             lcd_puts(0, i, buffer);
         }
         lcd_update();
-        button = button_get_w_tmo(HZ/2);
-    } while(button != LOGF_BUTTON_QUIT);
+    } while(!action_userabort(HZ));
 
     return false;
 }
Index: apps/main.c
===================================================================
RCS file: /cvsroot/rockbox/apps/main.c,v
retrieving revision 1.178
diff -u -u -r1.178 main.c
--- apps/main.c	21 Jul 2006 08:42:27 -0000	1.178
+++ apps/main.c	31 Jul 2006 21:58:00 -0000
@@ -334,7 +334,7 @@
         lcd_puts(0, 1, str);
         lcd_puts(0, 3, "Press ON to debug");
         lcd_update();
-        while(!(button_get(true) & BUTTON_REL));
+        while(!(button_get(true) & BUTTON_REL)); /*DO NOT CHANGE TO ACTION SYSTEM */
         dbg_ports();
 #endif
         panicf("ata: %d", rc);
Index: apps/main_menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/main_menu.c,v
retrieving revision 1.152
diff -u -u -r1.152 main_menu.c
--- apps/main_menu.c	3 Jul 2006 22:32:23 -0000	1.152
+++ apps/main_menu.c	31 Jul 2006 21:58:00 -0000
@@ -24,7 +24,7 @@
 #include "tree.h"
 #include "lcd.h"
 #include "font.h"
-#include "button.h"
+#include "action.h"
 #include "kernel.h"
 #include "main_menu.h"
 #include "debug_menu.h"
@@ -237,48 +237,22 @@
 #endif
 
         /* Wait for a key to be pushed */
-        key = button_get_w_tmo(HZ*5);
+        key = get_action(CONTEXT_MAINMENU,HZ*5);
         switch(key) {
 
-            case SETTINGS_OK:
-#ifdef SETTINGS_RC_OK
-            case SETTINGS_RC_OK:
-#endif
-#ifdef SETTINGS_OK2
-            case SETTINGS_OK2:
-#endif
-#ifdef SETTINGS_RC_OK2
-            case SETTINGS_RC_OK2:
-#endif
-#ifdef SETTINGS_RC_CANCEL
-            case SETTINGS_RC_CANCEL:
-#endif
-            case SETTINGS_CANCEL:
+            case ACTION_STD_EXIT:
                 done = true;
                 break;
 
 #ifdef HAVE_LCD_CHARCELLS
-            case SETTINGS_INC:
-            case SETTINGS_DEC:
-#ifdef SETTINGS_RC_INC
-            case SETTINGS_RC_INC:
-#endif
-#ifdef SETTINGS_RC_DEC
-            case SETTINGS_RC_DEC:
-#endif
+            case ACTION_STD_NEXT:
+            case ACTION_STD_PREV:
                 page = (page == 0) ? 1 : 0;
                 break;
 #endif
 
 #ifndef SIMULATOR
-#ifdef SETTINGS_RC_ACCEPT
-            case SETTINGS_RC_ACCEPT:
-#endif
-#ifdef SETTINGS_ACCEPT
-            case SETTINGS_ACCEPT:
-#else
-            case SETTINGS_INC: /* Ondio */
-#endif
+            case ACTION_STD_SELECT:
                 gui_syncsplash(0, true, str(LANG_DIRCACHE_BUILDING));
                 fat_recalc_free(IF_MV(0));
 #ifdef HAVE_MULTIVOLUME
@@ -295,7 +269,7 @@
                 break;
         }
     }
-
+    action_signalscreenchange();
     return false;
 }
 
Index: apps/menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/menu.c,v
retrieving revision 1.102
diff -u -u -r1.102 menu.c
--- apps/menu.c	2 Jul 2006 12:28:26 -0000	1.102
+++ apps/menu.c	31 Jul 2006 21:58:00 -0000
@@ -40,6 +40,7 @@
 #include "talk.h"
 #include "lang.h"
 #include "misc.h"
+#include "action.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "icons.h"
@@ -129,7 +130,7 @@
     gui_syncstatusbar_draw(&statusbars, true);
     menu_talk_selected(m);
     while (!exit) {
-        key = button_get_w_tmo(HZ/2);
+        key = get_action(CONTEXT_MAINMENU,HZ/2);
         /*
          * "short-circuit" the default keypresses by running the
          * callback function
@@ -143,32 +144,13 @@
         if(gui_synclist_do_button(&(menus[m].synclist), key))
             menu_talk_selected(m);
         switch( key ) {
-            case MENU_ENTER:
-#ifdef MENU_ENTER2
-            case MENU_ENTER2:
-#endif
-#ifdef MENU_RC_ENTER
-            case MENU_RC_ENTER:
-#endif
-#ifdef MENU_RC_ENTER2
-            case MENU_RC_ENTER2:
-#endif
+            case ACTION_STD_SELECT:
+                action_signalscreenchange();
                 return gui_synclist_get_sel_pos(&(menus[m].synclist));
 
-
-            case MENU_EXIT:
-#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
-#ifdef MENU_RC_EXIT_MENU
-            case MENU_RC_EXIT_MENU:
-#endif
+            case ACTION_STD_CANCEL:
+            case ACTION_STD_EXIT:
+            case ACTION_STD_MENU:
                 exit = true;
                 break;
 
@@ -179,6 +161,7 @@
         }
         gui_syncstatusbar_draw(&statusbars, false);
     }
+    action_signalscreenchange();
     return MENU_SELECTED_EXIT;
 }
 
Index: apps/onplay.c
===================================================================
RCS file: /cvsroot/rockbox/apps/onplay.c,v
retrieving revision 1.82
diff -u -u -r1.82 onplay.c
--- apps/onplay.c	25 Jul 2006 07:41:00 -0000	1.82
+++ apps/onplay.c	31 Jul 2006 21:58:00 -0000
@@ -813,11 +813,7 @@
 {
     (void)menu;
 
-    if (key == MENU_EXIT_MENU
-#ifdef MENU_RC_EXIT_MENU
-        || key == MENU_RC_EXIT_MENU
-#endif
-       )
+    if (key == ACTION_STD_MENU)
         exit_to_main = true;
 
     return key;
Index: apps/playback.h
===================================================================
RCS file: /cvsroot/rockbox/apps/playback.h,v
retrieving revision 1.32
diff -u -u -r1.32 playback.h
--- apps/playback.h	31 Jul 2006 06:12:53 -0000	1.32
+++ apps/playback.h	31 Jul 2006 21:58:00 -0000
@@ -62,9 +62,13 @@
 void audio_invalidate_tracks(void);
 void voice_init(void);
 
+#if CONFIG_CODEC == SWCODEC /* This #ifdef is better here than gui/gwps.c */
 extern void audio_next_dir(void);
 extern void audio_prev_dir(void);
-
+#else
+#define audio_next_dir() 
+#define audio_prev_dir()
+#endif
 void audio_preinit(void);
 
 #endif
Index: apps/playlist.c
===================================================================
RCS file: /cvsroot/rockbox/apps/playlist.c,v
retrieving revision 1.164
diff -u -u -r1.164 playlist.c
--- apps/playlist.c	18 Jul 2006 13:54:12 -0000	1.164
+++ apps/playlist.c	31 Jul 2006 21:58:01 -0000
@@ -70,6 +70,7 @@
 #include <string.h>
 #include "playlist.h"
 #include "file.h"
+#include "action.h"
 #include "dir.h"
 #include "sprintf.h"
 #include "debug.h"
@@ -1342,7 +1343,7 @@
         for (i=0; i<num_files; i++)
         {
             /* user abort */
-            if (button_get(false) == SETTINGS_CANCEL)
+            if (action_userabort(TIMEOUT_NOBLOCK))
             {
                 result = -1;
                 exit = true;
@@ -1440,7 +1441,7 @@
     {
         for (i=0; i<num_files; i++)
         {
-            if (button_get(false) == SETTINGS_CANCEL)
+            if (action_userabort(TIMEOUT_NOBLOCK))
             {
                 result = -2;
                 break;
@@ -2840,7 +2841,7 @@
     while ((max = read_line(fd, temp_buf, sizeof(temp_buf))) > 0)
     {
         /* user abort */
-        if (button_get(false) == SETTINGS_CANCEL)
+        if (action_userabort(TIMEOUT_NOBLOCK))
             break;
 
         if (temp_buf[0] != '#' && temp_buf[0] != '\0')
@@ -3251,7 +3252,7 @@
         int seek;
 
         /* user abort */
-        if (button_get(false) == SETTINGS_CANCEL)
+        if (action_userabort(TIMEOUT_NOBLOCK))
         {
             result = -1;
             break;
@@ -3378,7 +3379,7 @@
     for (i=0; i<num_files; i++)
     {
         /* user abort */
-        if (button_get(false) == SETTINGS_CANCEL)
+        if (action_userabort(TIMEOUT_NOBLOCK))
         {
             result = -1;
             break;
Index: apps/playlist_catalog.c
===================================================================
RCS file: /cvsroot/rockbox/apps/playlist_catalog.c,v
retrieving revision 1.1
diff -u -u -r1.1 playlist_catalog.c
--- apps/playlist_catalog.c	18 Jul 2006 13:54:12 -0000	1.1
+++ apps/playlist_catalog.c	31 Jul 2006 21:58:01 -0000
@@ -214,7 +214,6 @@
 {
     int result = -1;
     int num_playlists = 0;
-    int lastbutton = BUTTON_NONE;
     bool exit = false;
     char temp_buf[MAX_PATH];
     char* playlists[MAX_PLAYLISTS];
@@ -240,7 +239,7 @@
 
     while (!exit)
     {
-        int button = button_get_w_tmo(HZ/2);
+        int button = get_action(CONTEXT_LIST,HZ/2);
         char* sel_file;
 
         gui_synclist_do_button(&playlist_lists, button);
@@ -249,34 +248,11 @@
 
         switch (button)
         {
-            case TREE_EXIT:
-#ifdef TREE_RC_EXIT
-            case TREE_RC_EXIT:
-#endif
-#ifdef TREE_OFF
-            case TREE_OFF:
-#endif
+            case ACTION_STD_EXIT:
                 exit = true;
                 break;
 
-#ifdef TREE_ENTER
-            case TREE_ENTER:
-            case TREE_ENTER | BUTTON_REPEAT:
-#endif
-#ifdef TREE_RC_RUN
-            case TREE_RC_RUN:
-#endif
-            case TREE_RUN:
-#ifdef TREE_RUN_PRE
-                if (((button == TREE_RUN)
-#ifdef TREE_RC_RUN_PRE
-                    || (button == TREE_RC_RUN))
-                        && ((lastbutton != TREE_RC_RUN_PRE)
-#endif
-                    && (lastbutton != TREE_RUN_PRE)))
-                    break;
-#endif
-
+            case ACTION_STD_SELECT:
                 if (view)
                 {
                     /* In view mode, selecting a playlist starts playback */
@@ -298,13 +274,7 @@
                 exit = true;
                 break;
 
-            case TREE_CONTEXT:
-#ifdef TREE_CONTEXT2
-            case TREE_CONTEXT2:
-#endif
-#ifdef TREE_RC_CONTEXT
-            case TREE_RC_CONTEXT:
-#endif
+            case ACTION_STD_CONTEXT:
                 /* context menu only available in view mode */
                 if (view)
                 {
@@ -322,7 +292,7 @@
                 }
                 break;
 
-            case BUTTON_NONE:
+            case ACTION_NONE:
                 gui_syncstatusbar_draw(&statusbars, false);
                 break;
 
@@ -334,10 +304,8 @@
                 }
                 break;
         }
-
-        lastbutton = button;
     }
-
+    action_signalscreenchange();
     return result;
 }
 
Index: apps/playlist_viewer.c
===================================================================
RCS file: /cvsroot/rockbox/apps/playlist_viewer.c,v
retrieving revision 1.50
diff -u -u -r1.50 playlist_viewer.c
--- apps/playlist_viewer.c	2 Jul 2006 12:28:26 -0000	1.50
+++ apps/playlist_viewer.c	31 Jul 2006 21:58:02 -0000
@@ -48,6 +48,7 @@
 #include "statusbar.h"
 #include "splash.h"
 #include "playlist_menu.h"
+#include "action.h"
 
 /* Maximum number of tracks we can have loaded at one time */
 #define MAX_PLAYLIST_ENTRIES 200
@@ -616,7 +617,7 @@
 {
     bool ret = false;       /* return value */
     bool exit=false;        /* exit viewer */
-    int button, lastbutton = BUTTON_NONE;
+    int button;
     struct gui_synclist playlist_lists;
     if (!playlist_viewer_init(&viewer, filename, false))
         goto exit;
@@ -663,7 +664,7 @@
         }
 
         /* Timeout so we can determine if play status has changed */
-        button = button_get_w_tmo(HZ/2);
+        button = get_action(CONTEXT_TREE,HZ/2);
         int list_action;
         if( (list_action=gui_synclist_do_button(&playlist_lists, button))!=0 )
         {
@@ -671,7 +672,7 @@
             if(playlist_buffer_needs_reload(&viewer.buffer,
                 viewer.selected_track))
                 playlist_buffer_load_entries_screen(&viewer.buffer,
-                    list_action==LIST_NEXT?
+                    list_action==ACTION_STD_NEXT?
                         FORWARD
                         :
                         BACKWARD
@@ -679,33 +680,12 @@
         }
         switch (button)
         {
-            case TREE_EXIT:
-#ifdef TREE_RC_EXIT
-            case TREE_RC_EXIT:
-#endif
-#ifdef TREE_OFF
-            case TREE_OFF:
-#endif
+            case ACTION_STD_EXIT:
                 exit = true;
                 break;
 
-#ifdef TREE_ENTER
-            case TREE_ENTER:
-            case TREE_ENTER | BUTTON_REPEAT:
-#endif
-#ifdef TREE_RC_RUN
-            case TREE_RC_RUN:
-#endif
-            case TREE_RUN:
-#ifdef TREE_RUN_PRE
-                if (((button == TREE_RUN)
-#ifdef TREE_RC_RUN_PRE
-                    || (button == TREE_RC_RUN))
-                        && ((lastbutton != TREE_RC_RUN_PRE)
-#endif
-                    && (lastbutton != TREE_RUN_PRE)))
-                    break;
-#endif
+            case ACTION_STD_SELECT:
+            {
                 struct playlist_entry * current_track =
                     playlist_buffer_get_track(&viewer.buffer,
                     viewer.selected_track);
@@ -743,14 +723,8 @@
                 gui_synclist_draw(&playlist_lists);
 
                 break;
-
-            case TREE_CONTEXT:
-#ifdef TREE_CONTEXT2
-            case TREE_CONTEXT2:
-#endif
-#ifdef TREE_RC_CONTEXT
-            case TREE_RC_CONTEXT:
-#endif
+            }
+            case ACTION_STD_CONTEXT:
             {
                 /* ON+PLAY menu */
                 int ret;
@@ -773,14 +747,7 @@
                 gui_synclist_draw(&playlist_lists);
                 break;
             }
-#ifdef TREE_MENU_PRE
-            case TREE_MENU_PRE:
-#else
-            case TREE_MENU:
-#endif
-#ifdef TREE_RC_MENU
-            case TREE_RC_MENU:
-#endif
+            case ACTION_STD_MENU:
                 if (viewer_menu())
                 {
                     ret = true;
@@ -794,7 +761,7 @@
                 gui_synclist_draw(&playlist_lists);
                 break;
 
-            case BUTTON_NONE:
+            case ACTION_NONE:
                 gui_syncstatusbar_draw(&statusbars, false);
                 break;
 
@@ -806,12 +773,12 @@
                 }
                 break;
         }
-        lastbutton = button;
     }
 
 exit:
     if (viewer.playlist)
         playlist_close(viewer.playlist);
+    action_signalscreenchange();
     return ret;
 }
 char * playlist_search_callback_name(int selected_item, void * data, char *buffer)
@@ -859,7 +826,7 @@
                    str(LANG_OFF_ABORT)
 #endif
         );
-        if (SETTINGS_CANCEL == button_get(false))
+        if (action_userabort(TIMEOUT_NOBLOCK))
             return ret;
         playlist_get_track_info(viewer.playlist,i,&track);
         if (strcasestr(track.filename,search_str))
@@ -882,35 +849,22 @@
     gui_synclist_draw(&playlist_lists);
     while (!exit)
     {
-        button = button_get(true);
+        button = get_action(CONTEXT_LIST,TIMEOUT_BLOCK);
         if (gui_synclist_do_button(&playlist_lists, button))
             continue;
         switch (button)
         {
-            case TREE_EXIT:
-#ifdef TREE_RC_EXIT
-            case TREE_RC_EXIT:
-#endif
-#ifdef TREE_OFF
-            case TREE_OFF:
-#endif
+            case ACTION_STD_EXIT:
                 exit = true;
                 break;
 
-#ifdef TREE_ENTER
-            case TREE_ENTER:
-            case TREE_ENTER | BUTTON_REPEAT:
-#endif
-#ifdef TREE_RC_RUN
-            case TREE_RC_RUN:
-#endif
-            case TREE_RUN:
+            case ACTION_STD_SELECT:
                 playlist_start(
                     found_indicies[gui_synclist_get_sel_pos(&playlist_lists)]
                     ,0);
                 exit = 1;
             break;
-            case BUTTON_NONE:
+            case ACTION_NONE:
                 break;
             default:
                 if(default_event_handler(button) == SYS_USB_CONNECTED)
@@ -921,6 +875,7 @@
                 break;
         }
     }
+    action_signalscreenchange();
     return ret;
 }
 
Index: apps/plugin.c
===================================================================
RCS file: /cvsroot/rockbox/apps/plugin.c,v
retrieving revision 1.175
diff -u -u -r1.175 plugin.c
--- apps/plugin.c	28 Jul 2006 07:35:44 -0000	1.175
+++ apps/plugin.c	31 Jul 2006 21:58:02 -0000
@@ -462,6 +462,11 @@
     lcd_remote_bitmap_part,
     lcd_remote_bitmap,
 #endif
+    /* action handling */
+    get_custom_action,
+    get_action,
+    action_signalscreenchange,
+    action_userabort,
 };
 
 int plugin_load(const char* plugin, void* parameter)
Index: apps/plugin.h
===================================================================
RCS file: /cvsroot/rockbox/apps/plugin.h,v
retrieving revision 1.185
diff -u -u -r1.185 plugin.h
--- apps/plugin.h	28 Jul 2006 07:35:44 -0000	1.185
+++ apps/plugin.h	31 Jul 2006 21:58:02 -0000
@@ -38,6 +38,7 @@
 #include "dir.h"
 #include "kernel.h"
 #include "button.h"
+#include "action.h"
 #include "usb.h"
 #include "font.h"
 #include "system.h"
@@ -539,6 +540,11 @@
     void (*lcd_remote_bitmap)(const fb_remote_data *src, int x, int y, int width,
                               int height);
 #endif
+    /* action handling */
+    int (*get_custom_action)(struct button_mapping *user_mappings, int timeout);
+    int (*get_action)(int context, int timeout);
+    void (*action_signalscreenchange)(void);
+    bool (*action_userabort)(int timeout);
 };
 
 /* plugin header */
Index: apps/screens.c
===================================================================
RCS file: /cvsroot/rockbox/apps/screens.c,v
retrieving revision 1.159
diff -u -u -r1.159 screens.c
--- apps/screens.c	2 Jul 2006 16:18:58 -0000	1.159
+++ apps/screens.c	31 Jul 2006 21:58:02 -0000
@@ -21,7 +21,7 @@
 #include <string.h>
 #include <stdio.h>
 #include "backlight.h"
-#include "button.h"
+#include "action.h"
 #include "lcd.h"
 #include "lang.h"
 #include "icons.h"
@@ -309,10 +309,11 @@
    2 if Off/Stop key was pressed
    3 if On key was pressed
    4 if USB was connected */
+/* This needs to be moved to an action define */
 #if (CONFIG_KEYPAD==IPOD_3G_PAD) || (CONFIG_KEYPAD==IPOD_4G_PAD)
-# define CHARGE_SCREEN_RESUME BUTTON_SELECT
+# define CHARGE_SCREEN_RESUME ACTION_STD_SELECT
 #else
-# define CHARGE_SCREEN_RESUME BUTTON_ON
+# define CHARGE_SCREEN_RESUME ACTION_STD_ACCEPT
 #endif
 int charging_screen(void)
 {
@@ -338,7 +339,7 @@
     {
         gui_syncstatusbar_draw(&statusbars, false);
         charging_display_info(true);
-        button = button_get_w_tmo(HZ/3);
+        button = get_action(CONTEXT_STD,HZ/3);
         if (button == CHARGE_SCREEN_RESUME)
             rc = 2;
         else if (usb_detect())
@@ -350,6 +351,7 @@
 #ifdef HAVE_LCD_CHARCELLS
     logo_lock_patterns(false);
 #endif
+    action_signalscreenchange();
     return rc;
 }
 #endif /* CONFIG_CHARGING && !HAVE_POWEROFF_WHILE_CHARGING */
@@ -423,15 +425,15 @@
     {
         pitch_screen_draw(pitch);
 
-        button = button_get(true);
+        button = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
         switch (button) {
-            case PITCH_UP:
+            case ACTION_SETTINGS_INC:
                 if ( pitch < 2000 )
                     pitch++;
                 sound_set_pitch(pitch);
                 break;
 
-            case PITCH_UP | BUTTON_REPEAT:
+            case ACTION_SETTINGS_INCREPEAT:
                 if ( pitch < 1990 )
                     pitch += 10;
                 else
@@ -439,13 +441,13 @@
                 sound_set_pitch(pitch);
                 break;
 
-            case PITCH_DOWN:
+            case ACTION_SETTINGS_DEC:
                 if ( pitch > 500 )
                     pitch--;
                 sound_set_pitch(pitch);
                 break;
 
-            case PITCH_DOWN | BUTTON_REPEAT:
+            case ACTION_SETTINGS_DECREPEAT:
                 if ( pitch > 510 )
                     pitch -= 10;
                 else
@@ -453,7 +455,7 @@
                 sound_set_pitch(pitch);
                 break;
 
-            case PITCH_RIGHT:
+            case ACTION_STD_NEXT:
                 if ( pitch < 1980 )
                 {
                     pitch += 20;
@@ -461,15 +463,12 @@
 
                     pitch_screen_draw(pitch);
 
-                    while(button != (PITCH_RIGHT|BUTTON_REL))
-                        button = button_get(true);
-
                     pitch -= 20;
                     sound_set_pitch(pitch);
                 }
                 break;
 
-            case PITCH_LEFT:
+            case ACTION_STD_PREV:
                 if ( pitch > 520 )
                 {
                     pitch -= 20;
@@ -477,20 +476,17 @@
 
                     pitch_screen_draw(pitch);
 
-                    while(button != (PITCH_LEFT|BUTTON_REL))
-                        button = button_get(true);;
-
                     pitch += 20;
                     sound_set_pitch(pitch);
                 }
                 break;
 
-            case PITCH_RESET:
+            case ACTION_STD_ACCEPT:
                 pitch = 1000;
                 sound_set_pitch( pitch );
                 break;
 
-            case PITCH_EXIT:
+            case ACTION_STD_EXIT:
                 exit = true;
                 break;
 
@@ -504,6 +500,7 @@
     pcmbuf_set_low_latency(false);
 #endif
     lcd_setfont(FONT_UI);
+    action_signalscreenchange();
     return 0;
 }
 #endif
@@ -923,24 +920,22 @@
             say_time(cursorpos, tm);
         }
 
-        button = button_get_w_tmo(HZ/2);
+        button = get_action(CONTEXT_SETTINGS,HZ/2);
         switch ( button ) {
-            case SETTINGS_PREV:
+            case ACTION_STD_PREV:
                 cursorpos = (cursorpos + 6 - 1) % 6;
                 break;
-            case SETTINGS_NEXT:
+            case ACTION_STD_NEXT:
                 cursorpos = (cursorpos + 6 + 1) % 6;
                 break;
-            case SETTINGS_INC:
-            case SETTINGS_INC | BUTTON_REPEAT:
+            case ACTION_SETTINGS_INC:
                 *valptr = (*valptr + steps - min + 1) %
                     steps + min;
                 if(*valptr == 0)
                     *valptr = min;
                 say_time(cursorpos, tm);
                 break;
-            case SETTINGS_DEC:
-            case SETTINGS_DEC | BUTTON_REPEAT:
+            case ACTION_SETTINGS_DEC:
                 *valptr = (*valptr + steps - min - 1) %
                     steps + min;
                 if(*valptr == 0)
@@ -948,11 +943,11 @@
                 say_time(cursorpos, tm);
                 break;
 
-            case SETTINGS_ACCEPT:
+            case ACTION_STD_ACCEPT:
                 done = true;
                 break;
 
-            case SETTINGS_CANCEL:
+            case ACTION_STD_CANCEL:
                 done = true;
                 tm->tm_year = -1;
                 break;
@@ -963,7 +958,7 @@
                 break;
         }
     }
-
+    action_signalscreenchange();
     lcd_set_drawmode(lastmode);
     return false;
 }
@@ -981,10 +976,10 @@
 
     while(!done)
     {
-        button = button_get_w_tmo(HZ*2);
+        button = get_action(CONTEXT_STD,HZ*2);
         switch(button)
         {
-            case BUTTON_OFF:
+            case ACTION_STD_EXIT:
                 sys_poweroff();
                 break;
 
@@ -998,11 +993,14 @@
                    not have released the button yet.
                    We also ignore REPEAT events, since we don't want to
                    remove the splash when the user holds OFF to shut down. */
+                /* Is this still needed? commenting out so it compiles..
+                    CHECK ME!!
                 if(!(button & (BUTTON_REL | BUTTON_REPEAT)))
-                   done = true;
+                */   done = true;
                 break;
         }
     }
+    action_signalscreenchange();
     return false;
 }
 #endif
@@ -1123,9 +1121,12 @@
     gui_synclist_set_nb_items(&id3_lists, ID3_ITEMS*2);
     gui_synclist_draw(&id3_lists);
     while (true) {
-        key = button_get_w_tmo(HZ/2);
-        if(key!=BUTTON_NONE && !(key&BUTTON_REL) && !gui_synclist_do_button(&id3_lists, key))
+        key = get_action(CONTEXT_STD,HZ/2);
+        if(key!=ACTION_NONE && /* !(key&BUTTON_REL) && ?? */ !gui_synclist_do_button(&id3_lists, key))
+        {
+            action_signalscreenchange();
             return(default_event_handler(key) == SYS_USB_CONNECTED);
+        }
         gui_syncstatusbar_draw(&statusbars, false);
     }
 }
@@ -1147,29 +1148,24 @@
         snprintf(rating_text, sizeof(rating_text), "%d", id3->rating);
         lcd_puts(0, 1, (unsigned char *)rating_text);
         lcd_update();
-        button = button_get(true);
+        button = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
 
         switch(button)
         {
-            case SETTINGS_DEC:
+            case ACTION_SETTINGS_DEC:
                 if (id3->rating > 0)
                     id3->rating--;
                 else
                     id3->rating = 10;
                 break;
 
-            case SETTINGS_INC:
+            case ACTION_SETTINGS_INC:
                 if (id3->rating < 10)
                     id3->rating++;
                 else
                     id3->rating = 0;
                 break;
-            case SETTINGS_CANCEL:
-#ifdef SETTINGS_OK2
-            case SETTINGS_OK2:
-#endif
-                /* eat release event */
-                button_get(true);
+            case ACTION_STD_CANCEL:
                 exit = true;
                 break;
 
@@ -1179,5 +1175,6 @@
                 break;
         }
     }
+    action_signalscreenchange();
     return false;
 }
Index: apps/screens.h
===================================================================
RCS file: /cvsroot/rockbox/apps/screens.h,v
retrieving revision 1.28
diff -u -u -r1.28 screens.h
--- apps/screens.h	22 Mar 2006 02:18:44 -0000	1.28
+++ apps/screens.h	31 Jul 2006 21:58:02 -0000
@@ -22,44 +22,6 @@
 #include "config.h"
 #include "timefuncs.h"
 
-#if (CONFIG_KEYPAD == RECORDER_PAD) || (CONFIG_KEYPAD == IRIVER_H100_PAD) ||\
-    (CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define PITCH_UP BUTTON_UP
-#define PITCH_DOWN BUTTON_DOWN
-#define PITCH_RIGHT BUTTON_RIGHT
-#define PITCH_LEFT BUTTON_LEFT
-#define PITCH_EXIT BUTTON_OFF
-#define PITCH_RESET BUTTON_ON
-#elif (CONFIG_KEYPAD == ONDIO_PAD)
-#define PITCH_UP BUTTON_UP
-#define PITCH_DOWN BUTTON_DOWN
-#define PITCH_RIGHT BUTTON_RIGHT
-#define PITCH_LEFT BUTTON_LEFT
-#define PITCH_EXIT BUTTON_OFF
-#define PITCH_RESET BUTTON_MENU
-#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD)
-#define PITCH_UP BUTTON_SCROLL_FWD
-#define PITCH_DOWN BUTTON_SCROLL_BACK
-#define PITCH_RIGHT BUTTON_RIGHT
-#define PITCH_LEFT BUTTON_LEFT
-#define PITCH_EXIT BUTTON_SELECT
-#define PITCH_RESET BUTTON_MENU
-#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
-#define PITCH_UP BUTTON_UP
-#define PITCH_DOWN BUTTON_DOWN
-#define PITCH_RIGHT BUTTON_RIGHT
-#define PITCH_LEFT BUTTON_LEFT
-#define PITCH_EXIT BUTTON_SELECT
-#define PITCH_RESET BUTTON_A
-#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
-#define PITCH_UP BUTTON_UP
-#define PITCH_DOWN BUTTON_DOWN
-#define PITCH_RIGHT BUTTON_RIGHT
-#define PITCH_LEFT BUTTON_LEFT
-#define PITCH_EXIT BUTTON_PLAY
-#define PITCH_RESET BUTTON_POWER
-#endif
-
 struct screen;
 
 void usb_display_info(struct screen * display);
Index: apps/settings.c
===================================================================
RCS file: /cvsroot/rockbox/apps/settings.c,v
retrieving revision 1.397
diff -u -u -r1.397 settings.c
--- apps/settings.c	28 Jul 2006 12:45:58 -0000	1.397
+++ apps/settings.c	31 Jul 2006 21:58:04 -0000
@@ -28,7 +28,7 @@
 #include "disk.h"
 #include "panic.h"
 #include "debug.h"
-#include "button.h"
+#include "action.h"
 #include "usb.h"
 #include "backlight.h"
 #include "lcd.h"
@@ -1826,7 +1826,7 @@
     talk_unit(voice_unit, *variable);
     while (!select.validated)
     {
-        button = button_get_w_tmo(HZ/2);
+        button = get_action(CONTEXT_SETTINGS,HZ/2);
         if(gui_syncselect_do_button(&select, button))
         {
             *variable=select.options.option;
@@ -1841,11 +1841,13 @@
             *variable=oldvalue;
             if ( function )
                 function(*variable);
+            action_signalscreenchange();
             return false;
         }
         if(default_event_handler(button) == SYS_USB_CONNECTED)
             return true;
     }
+    action_signalscreenchange();
     return false;
 }
 
@@ -1888,7 +1890,7 @@
     while ( !select.validated )
     {
         gui_syncstatusbar_draw(&statusbars, true);
-        button = button_get_w_tmo(HZ/2);
+        button = get_action(CONTEXT_SETTINGS,HZ/2);
         select.options.limit_loop = false;
         if(gui_syncselect_do_button(&select, button))
         {
@@ -1907,11 +1909,13 @@
             set_type_fromint(type, variable, oldvalue);
             if ( function )
                 function(type_fromvoidptr(type, variable));
+            action_signalscreenchange();
             return false;
         }
         if(default_event_handler(button) == SYS_USB_CONNECTED)
             return true;
     }
+    action_signalscreenchange();
     return false;
 }
 
Index: apps/settings.h
===================================================================
RCS file: /cvsroot/rockbox/apps/settings.h,v
retrieving revision 1.226
diff -u -u -r1.226 settings.h
--- apps/settings.h	25 Jul 2006 11:15:49 -0000	1.226
+++ apps/settings.h	31 Jul 2006 21:58:04 -0000
@@ -45,105 +45,6 @@
 
 #define MAX_FILENAME 20
 
-/* button definitions */
-#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
-  (CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define SETTINGS_INC     BUTTON_UP
-#define SETTINGS_DEC     BUTTON_DOWN
-#define SETTINGS_OK      BUTTON_SELECT
-#define SETTINGS_OK2     BUTTON_LEFT
-#define SETTINGS_CANCEL  BUTTON_OFF
-#define SETTINGS_CANCEL2 BUTTON_MODE
-#define SETTINGS_PREV    BUTTON_LEFT
-#define SETTINGS_NEXT    BUTTON_RIGHT
-#define SETTINGS_ACCEPT  BUTTON_ON
-
-#define SETTINGS_RC_INC     BUTTON_RC_FF
-#define SETTINGS_RC_DEC     BUTTON_RC_REW
-#define SETTINGS_RC_OK      BUTTON_RC_MENU
-#define SETTINGS_RC_OK2     BUTTON_RC_SOURCE
-#define SETTINGS_RC_CANCEL  BUTTON_RC_STOP
-#define SETTINGS_RC_CANCEL2 BUTTON_RC_MODE
-#define SETTINGS_RC_PREV    BUTTON_RC_SOURCE
-#define SETTINGS_RC_NEXT    BUTTON_RC_BITRATE
-#define SETTINGS_RC_ACCEPT  BUTTON_RC_ON
-
-#elif CONFIG_KEYPAD == RECORDER_PAD
-#define SETTINGS_INC     BUTTON_UP
-#define SETTINGS_DEC     BUTTON_DOWN
-#define SETTINGS_OK      BUTTON_PLAY
-#define SETTINGS_OK2     BUTTON_LEFT
-#define SETTINGS_CANCEL  BUTTON_OFF
-#define SETTINGS_CANCEL2 BUTTON_F1
-#define SETTINGS_PREV    BUTTON_LEFT
-#define SETTINGS_NEXT    BUTTON_RIGHT
-#define SETTINGS_ACCEPT  BUTTON_ON
-
-#elif CONFIG_KEYPAD == PLAYER_PAD
-#define SETTINGS_INC     BUTTON_RIGHT
-#define SETTINGS_DEC     BUTTON_LEFT
-#define SETTINGS_OK      BUTTON_PLAY
-#define SETTINGS_CANCEL  BUTTON_STOP
-#define SETTINGS_CANCEL2 BUTTON_MENU
-#define SETTINGS_ACCEPT  BUTTON_ON
-
-#elif CONFIG_KEYPAD == ONDIO_PAD
-#define SETTINGS_INC     BUTTON_UP
-#define SETTINGS_DEC     BUTTON_DOWN
-#define SETTINGS_OK      BUTTON_RIGHT
-#define SETTINGS_OK2     BUTTON_LEFT
-#define SETTINGS_CANCEL  BUTTON_MENU
-#define SETTINGS_CANCEL2 BUTTON_OFF
-
-#elif CONFIG_KEYPAD == GMINI100_PAD
-#define SETTINGS_INC     BUTTON_UP
-#define SETTINGS_DEC     BUTTON_DOWN
-#define SETTINGS_OK      BUTTON_PLAY
-#define SETTINGS_OK2     BUTTON_LEFT
-#define SETTINGS_CANCEL  BUTTON_OFF
-#define SETTINGS_CANCEL2 BUTTON_MENU
-#define SETTINGS_PREV    BUTTON_LEFT
-#define SETTINGS_NEXT    BUTTON_RIGHT
-#define SETTINGS_ACCEPT  BUTTON_MENU
-
-#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
-#define SETTINGS_INC     BUTTON_SCROLL_FWD
-#define SETTINGS_DEC     BUTTON_SCROLL_BACK
-#define SETTINGS_OK      BUTTON_SELECT
-#define SETTINGS_CANCEL  BUTTON_MENU
-#define SETTINGS_PREV    BUTTON_LEFT
-#define SETTINGS_NEXT    BUTTON_RIGHT
-#define SETTINGS_ACCEPT  BUTTON_PLAY
-
-#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
-#define SETTINGS_INC     BUTTON_UP
-#define SETTINGS_DEC     BUTTON_DOWN
-#define SETTINGS_OK      BUTTON_SELECT
-#define SETTINGS_CANCEL  BUTTON_PLAY
-#define SETTINGS_PREV    BUTTON_LEFT
-#define SETTINGS_NEXT    BUTTON_RIGHT
-
-#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
-#define SETTINGS_INC     BUTTON_UP
-#define SETTINGS_DEC     BUTTON_DOWN
-#define SETTINGS_OK      BUTTON_SELECT
-#define SETTINGS_OK2     BUTTON_LEFT
-#define SETTINGS_CANCEL  BUTTON_REC
-#define SETTINGS_PREV    BUTTON_LEFT
-#define SETTINGS_NEXT    BUTTON_RIGHT
-#define SETTINGS_ACCEPT  BUTTON_PLAY
-
-#elif CONFIG_KEYPAD == GIGABEAT_PAD
-#define SETTINGS_INC     BUTTON_UP
-#define SETTINGS_DEC     BUTTON_DOWN
-#define SETTINGS_OK      BUTTON_MENU
-#define SETTINGS_CANCEL  BUTTON_A
-#define SETTINGS_PREV    BUTTON_LEFT
-#define SETTINGS_NEXT    BUTTON_RIGHT
-#define SETTINGS_ACCEPT  BUTTON_SELECT
-
-#endif
-
 /* data structures */
 
 #define BOOKMARK_NO  0
Index: apps/tagtree.c
===================================================================
RCS file: /cvsroot/rockbox/apps/tagtree.c,v
retrieving revision 1.19
diff -u -u -r1.19 tagtree.c
--- apps/tagtree.c	26 Jul 2006 06:44:39 -0000	1.19
+++ apps/tagtree.c	31 Jul 2006 21:58:04 -0000
@@ -29,6 +29,7 @@
 #include "splash.h"
 #include "icons.h"
 #include "tree.h"
+#include "action.h"
 #include "settings.h"
 #include "tagcache.h"
 #include "tagtree.h"
@@ -524,7 +525,7 @@
                        str(LANG_OFF_ABORT)
 #endif
                        );
-        if (SETTINGS_CANCEL == button_get(false))
+        if (action_userabort(TIMEOUT_NOBLOCK))
             return false;
         last_tick = current_tick;
     }
Index: apps/tree.c
===================================================================
RCS file: /cvsroot/rockbox/apps/tree.c,v
retrieving revision 1.418
diff -u -u -r1.418 tree.c
--- apps/tree.c	25 Jul 2006 07:41:00 -0000	1.418
+++ apps/tree.c	31 Jul 2006 21:58:04 -0000
@@ -71,6 +71,7 @@
 #include "splash.h"
 #include "buttonbar.h"
 #include "textarea.h"
+#include "action.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "widgets.h"
@@ -581,27 +582,11 @@
             boot_changed = false;
         }
 #endif
-        button = button_get_w_tmo(HZ/5);
+        button = get_action(CONTEXT_TREE,HZ/5);
         need_update = gui_synclist_do_button(&tree_lists, button);
 
         switch ( button ) {
-#ifdef TREE_ENTER
-            case TREE_ENTER:
-            case TREE_ENTER | BUTTON_REPEAT:
-#endif
-#ifdef TREE_RC_RUN
-            case TREE_RC_RUN:
-#endif
-            case TREE_RUN:
-#ifdef TREE_RUN_PRE
-                if (((button == TREE_RUN)
-#ifdef TREE_RC_RUN_PRE
-                    || (button == TREE_RC_RUN))
-                        && ((lastbutton != TREE_RC_RUN_PRE)
-#endif
-                    && (lastbutton != TREE_RUN_PRE)))
-                    break;
-#endif
+            case ACTION_STD_SELECT:
                 /* nothing to do if no files to display */
                 if ( numentries == 0 )
                     break;
@@ -616,11 +601,7 @@
                 restore = true;
                 break;
 
-            case TREE_EXIT:
-            case TREE_EXIT | BUTTON_REPEAT:
-#ifdef TREE_RC_EXIT
-            case TREE_RC_EXIT:
-#endif
+            case ACTION_STD_CANCEL:
                 if (*tc.dirfilter > NUM_FILTER_MODES && tc.dirlevel < 1) {
                     exit_func = true;
                     break;
@@ -638,8 +619,8 @@
                 restore = true;
                 break;
 
-#ifdef TREE_OFF
-            case TREE_OFF:
+
+            case ACTION_STD_EXIT:
                 if (*tc.dirfilter < NUM_FILTER_MODES)
                 {
                     /* Stop the music if it is playing */
@@ -665,6 +646,7 @@
 #endif
                 }
                 break;
+                /* ??
 #if defined(CONFIG_CHARGING) && !defined(HAVE_POWEROFF_WHILE_CHARGING)
             case TREE_OFF | BUTTON_REPEAT:
                 if (charger_inserted()) {
@@ -673,25 +655,15 @@
                 }
                 break;
 #endif
-#endif /* TREE_OFF */
-            case TREE_MENU:
-#ifdef TREE_RC_MENU
-            case TREE_RC_MENU:
-#endif
-#ifdef TREE_MENU_PRE
-                if (lastbutton != TREE_MENU_PRE
-#ifdef TREE_RC_MENU_PRE
-                    && lastbutton != TREE_RC_MENU_PRE
-#endif
-                    )
-                    break;
-#endif
+                */
+            case ACTION_STD_MENU:
                 /* don't enter menu from plugin browser */
                 if (*tc.dirfilter < NUM_FILTER_MODES)
                 {
                     int i;
                     FOR_NB_SCREENS(i)
                         screens[i].stop_scroll();
+                    action_signalscreenchange();
                     if (main_menu())
                         reload_dir = true;
                     restore = true;
@@ -704,18 +676,7 @@
                     exit_func = true;
                 break;
 
-            case TREE_WPS:
-#ifdef TREE_RC_WPS
-            case TREE_RC_WPS:
-#endif
-#ifdef TREE_WPS_PRE
-                if ((lastbutton != TREE_WPS_PRE)
-#ifdef TREE_RC_WPS
-                    && (lastbutton != TREE_RC_WPS_PRE)
-#endif
-                    )
-                    break;
-#endif
+            case ACTION_STD_WPS:
                 /* don't enter wps from plugin browser etc */
                 if (*tc.dirfilter < NUM_FILTER_MODES)
                 {
@@ -731,11 +692,7 @@
                 }
                 break;
 
-#ifdef HAVE_QUICKSCREEN
-            case TREE_QUICK:
-#ifdef TREE_RC_QUICK
-            case TREE_RC_QUICK:
-#endif
+            case ACTION_STD_QUICKSCREEN:
                 /* don't enter f2 from plugin browser */
                 if (*tc.dirfilter < NUM_FILTER_MODES)
                 {
@@ -747,7 +704,6 @@
                     reload_dir = true;
                 }
                 break;
-#endif
 
 #ifdef BUTTON_F3
             case BUTTON_F3:
@@ -761,13 +717,7 @@
                 break;
 #endif
 
-            case TREE_CONTEXT:
-#ifdef TREE_RC_CONTEXT
-            case TREE_RC_CONTEXT:
-#endif
-#ifdef TREE_CONTEXT2
-            case TREE_CONTEXT2:
-#endif
+            case ACTION_STD_CONTEXT:
             {
                 int onplay_result;
                 int attr = 0;
@@ -816,7 +766,7 @@
                 break;
             }
 
-            case BUTTON_NONE:
+            case ACTION_NONE:
                 if (thumbnail_time != -1 &&
                     TIME_AFTER(current_tick, thumbnail_time))
                 {   /* a delayed hovering thumbnail is due now */
@@ -894,6 +844,8 @@
             FOR_NB_SCREENS(i)
                 screens[i].stop_scroll();
 
+            action_signalscreenchange();
+
             if (gui_wps_show() == SYS_USB_CONNECTED)
                 reload_dir = true;
 #ifdef HAVE_HOTSWAP
@@ -1034,7 +986,7 @@
             }
         }
     }
-
+    action_signalscreenchange();
     return true;
 }
 
@@ -1046,7 +998,7 @@
     DIRCACHED* dir;
 
     /* check for user abort */
-    if (button_get(false) == TREE_ABORT)
+    if (action_userabort(TIMEOUT_NOBLOCK))
         return true;
 
     dir = opendir_cached(dirname);
Index: apps/tree.h
===================================================================
RCS file: /cvsroot/rockbox/apps/tree.h,v
retrieving revision 1.73
diff -u -u -r1.73 tree.h
--- apps/tree.h	10 Apr 2006 03:51:17 -0000	1.73
+++ apps/tree.h	31 Jul 2006 21:58:04 -0000
@@ -23,152 +23,6 @@
 #include <applimits.h>
 #include <file.h>
 
-#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
-    (CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define TREE_EXIT      BUTTON_LEFT
-#define TREE_ABORT     BUTTON_OFF
-#define TREE_ENTER     BUTTON_RIGHT
-#define TREE_RUN       (BUTTON_SELECT | BUTTON_REL)
-#define TREE_RUN_PRE   BUTTON_SELECT
-#define TREE_MENU      ( BUTTON_MODE | BUTTON_REL)
-#define TREE_MENU_PRE  BUTTON_MODE
-#define TREE_OFF       BUTTON_OFF
-#define TREE_WPS       (BUTTON_ON | BUTTON_REL)
-#define TREE_WPS_PRE   BUTTON_ON
-#define TREE_CONTEXT   (BUTTON_SELECT | BUTTON_REPEAT)
-#define TREE_CONTEXT2  (BUTTON_ON | BUTTON_SELECT)
-#define TREE_QUICK     (BUTTON_MODE | BUTTON_REPEAT)
-
-/* Remote keys */
-#define TREE_RC_NEXT       BUTTON_RC_FF
-#define TREE_RC_PREV       BUTTON_RC_REW
-#define TREE_RC_PGUP       BUTTON_RC_SOURCE
-#define TREE_RC_PGDN       BUTTON_RC_BITRATE
-#define TREE_RC_EXIT       BUTTON_RC_STOP
-#define TREE_RC_RUN        (BUTTON_RC_MENU | BUTTON_REL)
-#define TREE_RC_RUN_PRE    BUTTON_RC_MENU
-#define TREE_RC_MENU       (BUTTON_RC_MODE | BUTTON_REL)
-#define TREE_RC_MENU_PRE   BUTTON_RC_MODE
-#define TREE_RC_WPS        (BUTTON_RC_ON | BUTTON_REL)
-#define TREE_RC_WPS_PRE    BUTTON_RC_ON
-#define TREE_RC_CONTEXT    (BUTTON_RC_ON | BUTTON_REPEAT)
-#define TREE_RC_QUICK      (BUTTON_RC_MODE | BUTTON_REPEAT)
-
-#elif CONFIG_KEYPAD == RECORDER_PAD
-#define TREE_EXIT      BUTTON_LEFT
-#define TREE_ABORT     BUTTON_OFF
-#define TREE_ENTER     BUTTON_RIGHT
-#define TREE_RUN       (BUTTON_PLAY | BUTTON_REL)
-#define TREE_RUN_PRE   BUTTON_PLAY
-#define TREE_MENU      BUTTON_F1
-#define TREE_OFF       BUTTON_OFF
-#define TREE_WPS       (BUTTON_ON | BUTTON_REL)
-#define TREE_WPS_PRE   BUTTON_ON
-#define TREE_CONTEXT   (BUTTON_PLAY | BUTTON_REPEAT)
-#define TREE_CONTEXT2  (BUTTON_ON | BUTTON_PLAY)
-#define TREE_QUICK     BUTTON_F2
-
-#define TREE_RC_NEXT   BUTTON_RC_RIGHT
-#define TREE_RC_PREV   BUTTON_RC_LEFT
-#define TREE_RC_EXIT   BUTTON_RC_STOP
-#define TREE_RC_RUN    BUTTON_RC_PLAY
-
-#elif CONFIG_KEYPAD == PLAYER_PAD
-#define TREE_EXIT      BUTTON_STOP
-#define TREE_ABORT     BUTTON_STOP
-#define TREE_RUN       (BUTTON_PLAY | BUTTON_REL)
-#define TREE_RUN_PRE   BUTTON_PLAY
-#define TREE_MENU      BUTTON_MENU
-#define TREE_WPS       (BUTTON_ON | BUTTON_REL)
-#define TREE_WPS_PRE   BUTTON_ON
-#define TREE_CONTEXT   (BUTTON_PLAY | BUTTON_REPEAT)
-#define TREE_CONTEXT2  (BUTTON_ON | BUTTON_PLAY)
-
-#define TREE_RC_NEXT   BUTTON_RC_RIGHT
-#define TREE_RC_PREV   BUTTON_RC_LEFT
-#define TREE_RC_EXIT   BUTTON_RC_STOP
-#define TREE_RC_RUN    BUTTON_RC_PLAY
-
-#elif CONFIG_KEYPAD == ONDIO_PAD
-#define TREE_EXIT      BUTTON_LEFT
-#define TREE_ABORT     BUTTON_OFF
-#define TREE_RUN       (BUTTON_RIGHT | BUTTON_REL)
-#define TREE_RUN_PRE   BUTTON_RIGHT
-#define TREE_MENU      (BUTTON_MENU | BUTTON_REPEAT)
-#define TREE_MENU_PRE  BUTTON_MENU
-#define TREE_OFF       BUTTON_OFF
-#define TREE_WPS       (BUTTON_MENU | BUTTON_REL)
-#define TREE_WPS_PRE   BUTTON_MENU
-#define TREE_CONTEXT   (BUTTON_RIGHT | BUTTON_REPEAT)
-
-#elif CONFIG_KEYPAD == GMINI100_PAD
-#define TREE_EXIT      BUTTON_LEFT
-#define TREE_ENTER     BUTTON_RIGHT
-#define TREE_RUN       (BUTTON_PLAY | BUTTON_REL)
-#define TREE_RUN_PRE   BUTTON_PLAY
-#define TREE_MENU      BUTTON_MENU
-#define TREE_WPS       (BUTTON_ON | BUTTON_REL)
-#define TREE_WPS_PRE   BUTTON_ON
-#define TREE_CONTEXT   (BUTTON_PLAY | BUTTON_REPEAT)
-#define TREE_CONTEXT2  (BUTTON_ON | BUTTON_PLAY)
-
-#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
-
-#define TREE_EXIT      BUTTON_LEFT
-#define TREE_ABORT     BUTTON_LEFT
-#define TREE_ENTER     BUTTON_RIGHT
-#define TREE_RUN       (BUTTON_SELECT | BUTTON_REL)
-#define TREE_RUN_PRE   BUTTON_SELECT
-#define TREE_MENU      (BUTTON_MENU | BUTTON_REL)
-#define TREE_MENU_PRE  BUTTON_MENU
-#define TREE_WPS       (BUTTON_PLAY | BUTTON_REL)
-#define TREE_WPS_PRE   BUTTON_PLAY
-#define TREE_CONTEXT   (BUTTON_SELECT | BUTTON_REPEAT)
-#define TREE_QUICK     (BUTTON_MENU | BUTTON_REPEAT)
-
-#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
-
-#define TREE_EXIT      BUTTON_LEFT
-#define TREE_ABORT     BUTTON_PLAY
-#define TREE_RUN       (BUTTON_RIGHT | BUTTON_REL)
-#define TREE_RUN_PRE   BUTTON_RIGHT
-#define TREE_MENU      (BUTTON_SELECT | BUTTON_REPEAT)
-#define TREE_MENU_PRE  BUTTON_SELECT
-#define TREE_WPS       (BUTTON_SELECT | BUTTON_REL)
-#define TREE_WPS_PRE   BUTTON_SELECT
-#define TREE_CONTEXT   (BUTTON_RIGHT | BUTTON_REPEAT)
-
-#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
-
-#define TREE_EXIT      BUTTON_LEFT
-#define TREE_ABORT     BUTTON_REC
-#define TREE_ENTER     BUTTON_RIGHT
-#define TREE_RUN       (BUTTON_SELECT | BUTTON_REL)
-#define TREE_RUN_PRE   BUTTON_SELECT
-#define TREE_MENU      (BUTTON_REC | BUTTON_REL)
-#define TREE_MENU_PRE  BUTTON_REC
-#define TREE_WPS       (BUTTON_PLAY | BUTTON_REL)
-#define TREE_WPS_PRE   BUTTON_PLAY
-#define TREE_CONTEXT   (BUTTON_SELECT | BUTTON_REPEAT)
-#define TREE_QUICK     (BUTTON_REC | BUTTON_REPEAT)
-
-#elif CONFIG_KEYPAD == GIGABEAT_PAD
-
-#define TREE_NEXT      BUTTON_DOWN
-#define TREE_PREV      BUTTON_UP
-#define TREE_EXIT      BUTTON_LEFT
-#define TREE_ABORT     BUTTON_A
-#define TREE_ENTER     BUTTON_RIGHT
-#define TREE_RUN       (BUTTON_SELECT | BUTTON_REL)
-#define TREE_RUN_PRE   BUTTON_SELECT
-#define TREE_MENU      (BUTTON_MENU | BUTTON_REL)
-#define TREE_MENU_PRE  BUTTON_MENU
-#define TREE_WPS       (BUTTON_POWER | BUTTON_REL)
-#define TREE_WPS_PRE   BUTTON_POWER
-#define TREE_CONTEXT   (BUTTON_SELECT | BUTTON_REPEAT)
-
-#endif
-
 struct entry {
     short attr; /* FAT attributes + file type flags */
     unsigned long time_write; /* Last write time */
Index: apps/gui/color_picker.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/color_picker.c,v
retrieving revision 1.9
diff -u -u -r1.9 color_picker.c
--- apps/gui/color_picker.c	28 Jul 2006 07:35:44 -0000	1.9
+++ apps/gui/color_picker.c	31 Jul 2006 21:58:04 -0000
@@ -29,55 +29,11 @@
 #include "scrollbar.h"
 #include "lang.h"
 #include "splash.h"
+#include "action.h"
 
 #define TEXT_MARGIN display->char_width+2
 #define SLIDER_START 20
 
-#if (CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define SLIDER_UP        BUTTON_UP
-#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_CANCEL    BUTTON_OFF
-
-#define SLIDER_RC_UP     BUTTON_RC_REW
-#define SLIDER_RC_DOWN   BUTTON_RC_FF
-#define SLIDER_RC_LEFT   BUTTON_RC_SOURCE
-#define SLIDER_RC_RIGHT  BUTTON_RC_BITRATE
-#define SLIDER_RC_OK     BUTTON_RC_ON
-#define SLIDER_RC_CANCEL BUTTON_RC_STOP
-
-#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
-#define SLIDER_UP        BUTTON_UP
-#define SLIDER_DOWN      BUTTON_DOWN
-#define SLIDER_LEFT      BUTTON_LEFT
-#define SLIDER_RIGHT     BUTTON_RIGHT
-#define SLIDER_OK        BUTTON_POWER
-#define SLIDER_CANCEL    BUTTON_A
-
-#elif (CONFIG_KEYPAD == IPOD_4G_PAD)
-#define SLIDER_UP        BUTTON_LEFT
-#define SLIDER_DOWN      BUTTON_RIGHT
-#define SLIDER_LEFT      BUTTON_SCROLL_BACK
-#define SLIDER_RIGHT     BUTTON_SCROLL_FWD
-#define SLIDER_OK        BUTTON_SELECT
-#define SLIDER_CANCEL    BUTTON_MENU
-
-#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
-#define SLIDER_UP        BUTTON_UP
-#define SLIDER_DOWN      BUTTON_DOWN
-#define SLIDER_LEFT      BUTTON_LEFT
-#define SLIDER_RIGHT     BUTTON_RIGHT
-#define SLIDER_OK        BUTTON_SELECT
-#define SLIDER_CANCEL    BUTTON_PLAY
-
-/* FIXME: chosen at will to make it compile */
-#define SLIDER_RC_OK     BUTTON_RC_PLAY
-#define SLIDER_RC_CANCEL BUTTON_RC_REC
-
-#endif
 
 static const int max_val[3] = {LCD_MAX_RED,LCD_MAX_GREEN,LCD_MAX_BLUE};
 
@@ -229,50 +185,30 @@
             draw_screen(&screens[i], title, rgb_val, newcolor, slider);
         }
         
-        button = button_get(true);
+        button = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
         switch (button)
         {
-            case SLIDER_UP:
-#ifdef SLIDER_RC_UP
-            case SLIDER_RC_UP:
-#endif
+            case ACTION_STD_PREV:
                 slider = (slider+2)%3;
                 break;
 
-            case SLIDER_DOWN:
-#ifdef SLIDER_RC_DOWN
-            case SLIDER_RC_DOWN:
-#endif
+            case ACTION_STD_NEXT:
                 slider = (slider+1)%3;
                 break;
 
-            case SLIDER_RIGHT:
-            case SLIDER_RIGHT|BUTTON_REPEAT:
-#ifdef SLIDER_RC_RIGHT
-            case SLIDER_RC_RIGHT:
-            case SLIDER_RC_RIGHT|BUTTON_REPEAT:
-#endif
+            case ACTION_SETTINGS_INC:
+            case ACTION_SETTINGS_INCREPEAT:
                 if (rgb_val[slider] < max_val[slider])
                     rgb_val[slider]++;
                 break;
 
-            case SLIDER_LEFT:
-            case SLIDER_LEFT|BUTTON_REPEAT:
-#ifdef SLIDER_RC_LEFT
-            case SLIDER_RC_LEFT:
-            case SLIDER_RC_LEFT|BUTTON_REPEAT:
-#endif
+            case ACTION_SETTINGS_DEC:
+            case ACTION_SETTINGS_DECREPEAT:
                 if (rgb_val[slider] > 0)
                     rgb_val[slider]--;
                 break;
 
-            case SLIDER_OK:
-#ifdef HAVE_REMOTE_LCD
-            case SLIDER_RC_OK:
-#endif
-#ifdef SLIDER_OK2
-            case SLIDER_OK2:
-#endif
+            case ACTION_STD_ACCEPT:
                 if ((banned_color!=-1) && (banned_color == newcolor))
                 {
                     gui_syncsplash(HZ*2,true,str(LANG_COLOR_UNACCEPTABLE));
@@ -282,10 +218,7 @@
                 exit = 1;
                 break;
 
-            case SLIDER_CANCEL:
-#ifdef HAVE_REMOTE_LCD
-            case SLIDER_RC_CANCEL:
-#endif
+            case ACTION_STD_EXIT:
                 exit = 1;
                 break;
 
@@ -298,6 +231,6 @@
         }
     }
     display->set_foreground(fgcolor);
-
+    action_signalscreenchange();
     return false;
 }
Index: apps/gui/gwps-common.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/gwps-common.c,v
retrieving revision 1.56
diff -u -u -r1.56 gwps-common.c
--- apps/gui/gwps-common.c	18 Jul 2006 12:59:16 -0000	1.56
+++ apps/gui/gwps-common.c	31 Jul 2006 21:58:05 -0000
@@ -52,6 +52,7 @@
 #include "backdrop.h"
 #endif
 #include "dsp.h"
+#include "action.h"
 
 #ifdef HAVE_LCD_CHARCELLS
 static bool draw_player_progress(struct gui_wps *gwps);
@@ -2292,19 +2293,18 @@
     bool usb = false;
     int i = 0;
 
+    if (button == ACTION_NONE)
+    {
+        status_set_ffmode(0);
+        return usb;
+    }
     while (!exit)
     {
         switch ( button )
         {
-            case WPS_FFWD:
-#ifdef WPS_RC_FFWD 
-            case WPS_RC_FFWD:
-#endif
+            case ACTION_WPS_SEEKFWD:
                  direction = 1;
-            case WPS_REW:
-#ifdef WPS_RC_REW
-            case WPS_RC_REW:
-#endif
+            case ACTION_WPS_SEEKBACK:
                 if (wps_state.ff_rewind)
                 {
                     if (direction == 1)
@@ -2388,12 +2388,7 @@
 
                 break;
 
-            case WPS_PREV:
-            case WPS_NEXT: 
-#ifdef WPS_RC_PREV
-            case WPS_RC_PREV:
-            case WPS_RC_NEXT:
-#endif
+            case ACTION_WPS_STOPSEEK:
                 wps_state.id3->elapsed = wps_state.id3->elapsed+ff_rewind_count;
                 audio_ff_rewind(wps_state.id3->elapsed);
                 ff_rewind_count = 0;
@@ -2418,9 +2413,9 @@
                 break;
         }
         if (!exit)
-            button = button_get(true);
+            button = get_action(CONTEXT_WPS,TIMEOUT_BLOCK);
     }
-
+    action_signalscreenchange();
     return usb;
 }
 
@@ -2541,7 +2536,7 @@
 #endif
     gui_syncsplash(HZ, true, s);
 }
-
+/* is this function still needed? */
 void waitfor_nokey(void)
 {
     /* wait until all keys are released */
Index: apps/gui/gwps.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/gwps.c,v
retrieving revision 1.46
diff -u -u -r1.46 gwps.c
--- apps/gui/gwps.c	18 Jul 2006 15:12:49 -0000	1.46
+++ apps/gui/gwps.c	31 Jul 2006 21:58:05 -0000
@@ -25,7 +25,7 @@
 #include "lcd.h"
 #include "font.h"
 #include "backlight.h"
-#include "button.h"
+#include "action.h"
 #include "kernel.h"
 #include "tree.h"
 #include "debug.h"
@@ -84,14 +84,11 @@
 
 long gui_wps_show(void)
 {
-    long button = 0, lastbutton = 0;
-    bool ignore_keyup = true;
+    long button = 0;
     bool restore = false;
     long restoretimer = 0; /* timer to delay screen redraw temporarily */
     bool exit = false;
     bool update_track = false;
-    unsigned long right_lastclick = 0;
-    unsigned long left_lastclick = 0;
     int i;
 
     wps_state_init();
@@ -163,8 +160,8 @@
             long next_big_refresh = current_tick + HZ / 5;
             button = BUTTON_NONE;
             while (TIME_BEFORE(current_tick, next_big_refresh)) {
-                button = button_get(false);
-                if (button != BUTTON_NONE) {
+                button = get_action(CONTEXT_WPS,TIMEOUT_NOBLOCK);
+                if (button != ACTION_NONE) {
                     break;
                 }
                 peak_meter_peek();
@@ -186,21 +183,12 @@
         /* The peak meter is disabled
            -> no additional screen updates needed */
         else {
-            button = button_get_w_tmo(HZ/5);
+            button = get_action(CONTEXT_WPS,HZ/5);
         }
 #else
-        button = button_get_w_tmo(HZ/5);
+        button = get_action(CONTEXT_WPS,HZ/5);
 #endif
 
-        /* discard first event if it's a button release */
-        if (button && ignore_keyup)
-        {
-            ignore_keyup = false;
-            /* Negative events are system events */
-            if (button >= 0 && button & BUTTON_REL )
-                continue;
-        }
-
 #ifdef WPS_KEYLOCK
         /* ignore non-remote buttons when keys are locked */
         if (keys_locked &&
@@ -222,17 +210,16 @@
            from F1 */
         if (!audio_status())
             exit = true;
-
+#ifdef HAVE_DIR_NAVIGATION
+#undef HAVE_DIR_NAVIGATION
+#endif /* for testing */
         switch(button)
         {
-#ifdef WPS_CONTEXT
-            case WPS_CONTEXT:
-#ifdef WPS_RC_CONTEXT
-            case WPS_RC_CONTEXT:
-#endif
+            case ACTION_WPS_CONTEXT:
 #ifdef HAVE_LCD_COLOR
                 show_main_backdrop();
 #endif
+                action_signalscreenchange();
                 onplay(wps_state.id3->path, TREE_ATTR_MPA, CONTEXT_WPS);
 #ifdef HAVE_LCD_COLOR
                 show_wps_backdrop();
@@ -245,20 +232,8 @@
 #endif
                 restore = true;
                 break;
-#endif
 
-#ifdef WPS_RC_BROWSE
-            case WPS_RC_BROWSE:
-#endif
-            case WPS_BROWSE:
-#ifdef WPS_BROWSE_PRE
-                if ((lastbutton != WPS_BROWSE_PRE)
-#ifdef WPS_RC_BROWSE_PRE
-                    && (lastbutton != WPS_RC_BROWSE_PRE)
-#endif
-                    )
-                    break;
-#endif
+            case ACTION_WPS_BROWSE:
 #ifdef HAVE_LCD_CHARCELLS
                 status_set_record(false);
                 status_set_audio(false);
@@ -270,26 +245,14 @@
                 if (global_settings.browse_current &&
                     wps_state.current_track_path[0] != '\0')
                     set_current_file(wps_state.current_track_path);
-
+                action_signalscreenchange();
                 return 0;
                 break;
 
                 /* play/pause */
-            case WPS_PAUSE:
-#ifdef WPS_PAUSE_PRE
-                if (lastbutton != WPS_PAUSE_PRE)
-                    break;
-#endif
-#ifdef WPS_RC_PAUSE
-            case WPS_RC_PAUSE:
+            case ACTION_WPS_PLAY:
                 if (global_settings.party_mode)
                     break;
-#ifdef WPS_RC_PAUSE_PRE
-                if ((button == WPS_RC_PAUSE) &&
-                    (lastbutton != WPS_RC_PAUSE_PRE))
-                    break;
-#endif
-#endif
                 if ( wps_state.paused )
                 {
                     wps_state.paused = false;
@@ -313,12 +276,7 @@
                 break;
 
                 /* volume up */
-            case WPS_INCVOL:
-            case WPS_INCVOL | BUTTON_REPEAT:
-#ifdef WPS_RC_INCVOL
-            case WPS_RC_INCVOL:
-            case WPS_RC_INCVOL | BUTTON_REPEAT:
-#endif
+            case ACTION_WPS_VOLUP:
             {
                 global_settings.volume++;
                 bool res = false;
@@ -336,12 +294,7 @@
                 break;
 
                 /* volume down */
-            case WPS_DECVOL:
-            case WPS_DECVOL | BUTTON_REPEAT:
-#ifdef WPS_RC_DECVOL
-            case WPS_RC_DECVOL:
-            case WPS_RC_DECVOL | BUTTON_REPEAT:
-#endif
+            case ACTION_WPS_VOLDOWN:
             {
                 global_settings.volume--;
                 setvol();
@@ -357,59 +310,18 @@
                 }
             }
                 break;
-
                 /* fast forward / rewind */
-#ifdef WPS_RC_FFWD
-            case WPS_RC_FFWD:
-#endif
-            case WPS_FFWD:
-                if (global_settings.party_mode)
-                    break;
-
-#ifdef HAVE_DIR_NAVIGATION
-                if (current_tick - right_lastclick < HZ)
-                {
-                    audio_next_dir();
-                    right_lastclick = 0;
-                    break;
-                }
-#endif
-
-#ifdef WPS_RC_REW
-            case WPS_RC_REW:
-#endif
-            case WPS_REW:
+            case ACTION_WPS_SEEKFWD:
+            case ACTION_WPS_SEEKBACK:
                 if (global_settings.party_mode)
                     break;
-
-#ifdef HAVE_DIR_NAVIGATION
-                if (current_tick - left_lastclick < HZ)
-                {
-                    audio_prev_dir();
-                    left_lastclick = 0;
-                    break;
-                }
-#endif
-
                 ffwd_rew(button);
                 break;
 
                 /* prev / restart */
-            case WPS_PREV:
-#ifdef WPS_PREV_PRE
-                if (lastbutton != WPS_PREV_PRE)
-                    break;
-#endif
-#ifdef WPS_RC_PREV
-            case WPS_RC_PREV:
+            case ACTION_WPS_SKIPPREV:
                 if (global_settings.party_mode)
                     break;
-#ifdef WPS_RC_PREV_PRE
-                if ((button == WPS_RC_PREV) && (lastbutton != WPS_RC_PREV_PRE))
-                    break;
-#endif
-#endif
-                left_lastclick = current_tick;
                 update_track = true;
 
 #ifdef AB_REPEAT_ENABLE
@@ -450,61 +362,10 @@
                 }
                 break;
 
-#ifdef WPS_NEXT_DIR
-#ifdef WPS_RC_NEXT_DIR
-            case WPS_RC_NEXT_DIR:
-#endif
-            case WPS_NEXT_DIR:
-                if (global_settings.party_mode)
-                    break;
-#if defined(AB_REPEAT_ENABLE) && defined(WPS_AB_SHARE_DIR_BUTTONS)
-                if (ab_repeat_mode_enabled())
-                {
-                    ab_set_B_marker(wps_state.id3->elapsed);
-                    ab_jump_to_A_marker();
-                    update_track = true;
-                }
-                else
-#endif
-                {
-                    audio_next_dir();
-                }
-                break;
-#endif
-#ifdef WPS_PREV_DIR
-#ifdef WPS_RC_PREV_DIR
-            case WPS_RC_PREV_DIR:
-#endif
-            case WPS_PREV_DIR:
-                if (global_settings.party_mode)
-                    break;
-#if defined(AB_REPEAT_ENABLE) && defined(WPS_AB_SHARE_DIR_BUTTONS)
-                if (ab_repeat_mode_enabled())
-                    ab_set_A_marker(wps_state.id3->elapsed);
-                else
-#endif
-                {
-                    audio_prev_dir();
-                }
-                break;
-#endif
-
                 /* next */
-            case WPS_NEXT:
-#ifdef WPS_NEXT_PRE
-                if (lastbutton != WPS_NEXT_PRE)
-                    break;
-#endif
-#ifdef WPS_RC_NEXT
-            case WPS_RC_NEXT:
+            case ACTION_WPS_SKIPNEXT:
                 if (global_settings.party_mode)
                     break;
-#ifdef WPS_RC_NEXT_PRE
-                if ((button == WPS_RC_NEXT) && (lastbutton != WPS_RC_NEXT_PRE))
-                    break;
-#endif
-#endif
-                right_lastclick = current_tick;
                 update_track = true;
 
 #ifdef AB_REPEAT_ENABLE
@@ -527,27 +388,44 @@
 
                 audio_next();
                 break;
-
-#ifdef WPS_MENU
-            /* menu key functions */
-            case WPS_MENU:
-#ifdef WPS_MENU_PRE
-                if (lastbutton != WPS_MENU_PRE)
+                /* next / prev directories */
+            case ACTION_WPS_NEXTDIR:
+                if (global_settings.party_mode)
                     break;
+#if defined(AB_REPEAT_ENABLE) && defined(WPS_AB_SHARE_DIR_BUTTONS)
+                if (ab_repeat_mode_enabled())
+                {
+                    ab_set_B_marker(wps_state.id3->elapsed);
+                    ab_jump_to_A_marker();
+                    update_track = true;
+                }
+                else
 #endif
-#ifdef WPS_RC_MENU
-            case WPS_RC_MENU:
-#ifdef WPS_RC_MENU_PRE
-                if ((button == WPS_RC_MENU) && (lastbutton != WPS_RC_MENU_PRE))
+                {
+                    audio_next_dir();
+                }
+                break;
+            case ACTION_WPS_PREVDIR:
+                if (global_settings.party_mode)
                     break;
+#if defined(AB_REPEAT_ENABLE) && defined(WPS_AB_SHARE_DIR_BUTTONS)
+                if (ab_repeat_mode_enabled())
+                    ab_set_A_marker(wps_state.id3->elapsed);
+                else
 #endif
-#endif
+                {
+                    audio_prev_dir();
+                }
+                break;
+            /* menu key functions */
+            case ACTION_WPS_MENU:
                 FOR_NB_SCREENS(i)
                     gui_wps[i].display->stop_scroll();
 
 #ifdef HAVE_LCD_COLOR
                 show_main_backdrop();
 #endif
+                action_signalscreenchange();
                 if (main_menu())
                     return true;
 #ifdef HAVE_LCD_COLOR
@@ -561,7 +439,6 @@
 #endif
                 restore = true;
                 break;
-#endif /* WPS_MENU */
 
 #ifdef WPS_KEYLOCK
             /* key lock */
@@ -574,12 +451,9 @@
                 break;
 #endif
 
+
 #ifdef HAVE_QUICKSCREEN
-                /* play settings */
-            case WPS_QUICK:
-#ifdef WPS_RC_QUICK
-            case WPS_RC_QUICK:
-#endif
+            case ACTION_WPS_QUICKSCREEN:
 #ifdef HAVE_LCD_COLOR
                 show_main_backdrop();
 #endif
@@ -595,9 +469,8 @@
                 }
 #endif
                 restore = true;
-                lastbutton = 0;
                 break;
-
+#endif
                 /* screen settings */
 #ifdef BUTTON_F3
             case BUTTON_F3:
@@ -613,15 +486,11 @@
                 }
 #endif
                 restore = true;
-                lastbutton = 0;
                 break;
 #endif
 
                 /* pitch screen */
-#if CONFIG_KEYPAD == RECORDER_PAD || CONFIG_KEYPAD == IRIVER_H100_PAD \
-    || CONFIG_KEYPAD == IRIVER_H300_PAD
-            case BUTTON_ON | BUTTON_UP:
-            case BUTTON_ON | BUTTON_DOWN:
+            case ACTION_WPS_PITCHSCREEN:
 #ifdef HAVE_LCD_COLOR
                 show_main_backdrop();
 #endif
@@ -632,17 +501,11 @@
 #endif
                 restore = true;
                 break;
-#endif
-#endif
 
 #ifdef AB_REPEAT_ENABLE
 
 #ifdef WPS_AB_SINGLE
             case WPS_AB_SINGLE:
-#ifdef WPS_AB_SINGLE_PRE
-                if (lastbutton != WPS_AB_SINGLE_PRE)
-                    break;
-#endif
 /* If we are using the menu option to enable ab_repeat mode, don't do anything
  * when it's disabled */
 #if (AB_REPEAT_ENABLE == 1)
@@ -698,30 +561,13 @@
 #endif /* AB_REPEAT_ENABLE */
 
                 /* stop and exit wps */
-#ifdef WPS_EXIT
-            case WPS_EXIT:
-# ifdef WPS_EXIT_PRE
-                if ((lastbutton & ~BUTTON_REPEAT) != WPS_EXIT_PRE)
-                    break;
-# endif
+            case ACTION_WPS_STOP:
                 if (global_settings.party_mode)
                     break;
                 exit = true;
-#ifdef WPS_RC_EXIT
-            case WPS_RC_EXIT:
-#ifdef WPS_RC_EXIT_PRE
-                if ((lastbutton & ~BUTTON_REPEAT) != WPS_RC_EXIT_PRE)
-                     break;
-#endif
-                if (global_settings.party_mode)
-                    break;
-                exit = true;
-#endif
                 break;
-#endif
 
-#ifdef WPS_ID3
-            case WPS_ID3:
+            case ACTION_WPS_ID3SCREEN:
 #ifdef HAVE_LCD_COLOR
                 show_main_backdrop();
 #endif
@@ -737,10 +583,10 @@
 #endif
                 restore = true;
                 break;
-#endif
 
-            case BUTTON_NONE: /* Timeout */
+            case ACTION_NONE: /* Timeout */
                 update_track = true;
+                ffwd_rew(button); /* hopefully fix the ffw/rwd bug */
                 break;
 
             case SYS_POWEROFF:
@@ -779,6 +625,7 @@
         }
 
         if (exit) {
+            action_signalscreenchange();
 #ifdef HAVE_LCD_CHARCELLS
             status_set_record(false);
             status_set_audio(false);
@@ -830,8 +677,6 @@
                     gui_wps_refresh(&gui_wps[i], 0, WPS_REFRESH_NON_STATIC);
             }
         }
-        if (button != BUTTON_NONE)
-            lastbutton = button;
     }
     return 0; /* unreachable - just to reduce compiler warnings */
 }
Index: apps/gui/gwps.h
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/gwps.h,v
retrieving revision 1.35
diff -u -u -r1.35 gwps.h
--- apps/gui/gwps.h	21 May 2006 11:00:02 -0000	1.35
+++ apps/gui/gwps.h	31 Jul 2006 21:58:06 -0000
@@ -24,262 +24,6 @@
 #include "id3.h"
 #include "playlist.h"
 
-
-/* button definitions */
-#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
-    (CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define WPS_NEXT       (BUTTON_RIGHT | BUTTON_REL)
-#define WPS_NEXT_PRE   BUTTON_RIGHT
-#define WPS_PREV       (BUTTON_LEFT | BUTTON_REL)
-#define WPS_PREV_PRE   BUTTON_LEFT
-#define WPS_FFWD       (BUTTON_RIGHT | BUTTON_REPEAT)
-#define WPS_REW        (BUTTON_LEFT | BUTTON_REPEAT)
-#define WPS_INCVOL     BUTTON_UP
-#define WPS_DECVOL     BUTTON_DOWN
-#define WPS_PAUSE      (BUTTON_ON | BUTTON_REL)
-#define WPS_PAUSE_PRE  BUTTON_ON
-#define WPS_MENU       (BUTTON_MODE | BUTTON_REL)
-#define WPS_MENU_PRE   BUTTON_MODE
-#define WPS_BROWSE     (BUTTON_SELECT | BUTTON_REL)
-#define WPS_BROWSE_PRE BUTTON_SELECT
-#define WPS_EXIT       (BUTTON_OFF | BUTTON_REL)
-#define WPS_EXIT_PRE   BUTTON_OFF
-#define WPS_ID3        (BUTTON_MODE | BUTTON_ON)
-#define WPS_CONTEXT    (BUTTON_SELECT | BUTTON_REPEAT)
-#define WPS_QUICK      (BUTTON_MODE | BUTTON_REPEAT)
-#define WPS_NEXT_DIR   (BUTTON_RIGHT | BUTTON_ON)
-#define WPS_PREV_DIR   (BUTTON_LEFT | BUTTON_ON)
-
-#define WPS_RC_NEXT_DIR   BUTTON_RC_BITRATE
-#define WPS_RC_PREV_DIR   BUTTON_RC_SOURCE
-#define WPS_RC_NEXT    (BUTTON_RC_FF | BUTTON_REL)
-#define WPS_RC_NEXT_PRE BUTTON_RC_FF
-#define WPS_RC_PREV    (BUTTON_RC_REW | BUTTON_REL)
-#define WPS_RC_PREV_PRE BUTTON_RC_REW
-#define WPS_RC_FFWD    (BUTTON_RC_FF | BUTTON_REPEAT)
-#define WPS_RC_REW     (BUTTON_RC_REW | BUTTON_REPEAT)
-#define WPS_RC_PAUSE   BUTTON_RC_ON
-#define WPS_RC_INCVOL  BUTTON_RC_VOL_UP
-#define WPS_RC_DECVOL  BUTTON_RC_VOL_DOWN
-#define WPS_RC_EXIT     (BUTTON_RC_STOP | BUTTON_REL)
-#define WPS_RC_EXIT_PRE BUTTON_RC_STOP
-#define WPS_RC_MENU    (BUTTON_RC_MODE | BUTTON_REL)
-#define WPS_RC_MENU_PRE BUTTON_RC_MODE
-#define WPS_RC_BROWSE  (BUTTON_RC_MENU | BUTTON_REL)
-#define WPS_RC_BROWSE_PRE BUTTON_RC_MENU
-#define WPS_RC_CONTEXT    (BUTTON_RC_MENU | BUTTON_REPEAT)
-#define WPS_RC_QUICK      (BUTTON_RC_MODE | BUTTON_REPEAT)
-
-#ifdef AB_REPEAT_ENABLE
-#define WPS_AB_SHARE_DIR_BUTTONS
-#define WPS_AB_RESET_AB_MARKERS (BUTTON_ON | BUTTON_SELECT)
-#endif
-
-#define HAVE_DIR_NAVIGATION
-
-#elif CONFIG_KEYPAD == RECORDER_PAD
-#define WPS_NEXT       (BUTTON_RIGHT | BUTTON_REL)
-#define WPS_NEXT_PRE   BUTTON_RIGHT
-#define WPS_PREV       (BUTTON_LEFT | BUTTON_REL)
-#define WPS_PREV_PRE   BUTTON_LEFT
-#define WPS_FFWD       (BUTTON_RIGHT | BUTTON_REPEAT)
-#define WPS_REW        (BUTTON_LEFT | BUTTON_REPEAT)
-#define WPS_INCVOL     BUTTON_UP
-#define WPS_DECVOL     BUTTON_DOWN
-#define WPS_PAUSE_PRE  BUTTON_PLAY
-#define WPS_PAUSE      (BUTTON_PLAY | BUTTON_REL)
-#define WPS_MENU       (BUTTON_F1 | BUTTON_REL)
-#define WPS_MENU_PRE   BUTTON_F1
-#define WPS_BROWSE     (BUTTON_ON | BUTTON_REL)
-#define WPS_BROWSE_PRE BUTTON_ON
-#define WPS_EXIT       BUTTON_OFF
-#define WPS_KEYLOCK    (BUTTON_F1 | BUTTON_DOWN)
-#define WPS_ID3        (BUTTON_F1 | BUTTON_ON)
-#define WPS_CONTEXT    (BUTTON_PLAY | BUTTON_REPEAT)
-#define WPS_QUICK      BUTTON_F2
-
-#ifdef AB_REPEAT_ENABLE
-#define WPS_AB_SET_A_MARKER     (BUTTON_ON | BUTTON_LEFT)
-#define WPS_AB_SET_B_MARKER     (BUTTON_ON | BUTTON_RIGHT)
-#define WPS_AB_RESET_AB_MARKERS (BUTTON_ON | BUTTON_OFF)
-#endif
-
-#define WPS_RC_NEXT    BUTTON_RC_RIGHT
-#define WPS_RC_PREV    BUTTON_RC_LEFT
-#define WPS_RC_PAUSE   BUTTON_RC_PLAY
-#define WPS_RC_INCVOL  BUTTON_RC_VOL_UP
-#define WPS_RC_DECVOL  BUTTON_RC_VOL_DOWN
-#define WPS_RC_EXIT    BUTTON_RC_STOP
-
-#elif CONFIG_KEYPAD == PLAYER_PAD
-#define WPS_NEXT       (BUTTON_RIGHT | BUTTON_REL)
-#define WPS_NEXT_PRE   BUTTON_RIGHT
-#define WPS_PREV       (BUTTON_LEFT | BUTTON_REL)
-#define WPS_PREV_PRE   BUTTON_LEFT
-#define WPS_FFWD       (BUTTON_RIGHT | BUTTON_REPEAT)
-#define WPS_REW        (BUTTON_LEFT | BUTTON_REPEAT)
-#define WPS_INCVOL     (BUTTON_MENU | BUTTON_RIGHT)
-#define WPS_DECVOL     (BUTTON_MENU | BUTTON_LEFT)
-#define WPS_PAUSE_PRE  BUTTON_PLAY
-#define WPS_PAUSE      (BUTTON_PLAY | BUTTON_REL)
-#define WPS_MENU       (BUTTON_MENU | BUTTON_REL)
-#define WPS_MENU_PRE   BUTTON_MENU
-#define WPS_BROWSE     (BUTTON_ON | BUTTON_REL)
-#define WPS_BROWSE_PRE BUTTON_ON
-#define WPS_EXIT       BUTTON_STOP
-#define WPS_KEYLOCK    (BUTTON_MENU | BUTTON_STOP)
-#define WPS_ID3        (BUTTON_MENU | BUTTON_ON)
-#define WPS_CONTEXT    (BUTTON_PLAY | BUTTON_REPEAT)
-
-#ifdef AB_REPEAT_ENABLE
-#define WPS_AB_SET_A_MARKER     (BUTTON_ON | BUTTON_LEFT)
-#define WPS_AB_SET_B_MARKER     (BUTTON_ON | BUTTON_RIGHT)
-#define WPS_AB_RESET_AB_MARKERS (BUTTON_ON | BUTTON_STOP)
-#endif
-
-#define WPS_RC_NEXT    BUTTON_RC_RIGHT
-#define WPS_RC_PREV    BUTTON_RC_LEFT
-#define WPS_RC_PAUSE   BUTTON_RC_PLAY
-#define WPS_RC_INCVOL  BUTTON_RC_VOL_UP
-#define WPS_RC_DECVOL  BUTTON_RC_VOL_DOWN
-#define WPS_RC_EXIT    BUTTON_RC_STOP
-
-#elif CONFIG_KEYPAD == ONDIO_PAD
-#define WPS_NEXT       (BUTTON_RIGHT | BUTTON_REL)
-#define WPS_NEXT_PRE   BUTTON_RIGHT
-#define WPS_PREV       (BUTTON_LEFT | BUTTON_REL)
-#define WPS_PREV_PRE   BUTTON_LEFT
-#define WPS_FFWD       (BUTTON_RIGHT | BUTTON_REPEAT)
-#define WPS_REW        (BUTTON_LEFT | BUTTON_REPEAT)
-#define WPS_INCVOL     BUTTON_UP
-#define WPS_DECVOL     BUTTON_DOWN
-#define WPS_PAUSE      BUTTON_OFF
-/* #define WPS_MENU Ondio can't have both main menu and context menu in wps */
-#define WPS_BROWSE     (BUTTON_MENU | BUTTON_REL)
-#define WPS_BROWSE_PRE BUTTON_MENU
-#define WPS_KEYLOCK    (BUTTON_MENU | BUTTON_DOWN)
-#define WPS_EXIT       (BUTTON_OFF | BUTTON_REPEAT)
-#define WPS_CONTEXT    (BUTTON_MENU | BUTTON_REPEAT)
-
-#elif CONFIG_KEYPAD == GMINI100_PAD
-#define WPS_NEXT       (BUTTON_RIGHT | BUTTON_REL)
-#define WPS_NEXT_PRE   BUTTON_RIGHT
-#define WPS_PREV       (BUTTON_LEFT | BUTTON_REL)
-#define WPS_PREV_PRE   BUTTON_LEFT
-#define WPS_FFWD       (BUTTON_RIGHT | BUTTON_REPEAT)
-#define WPS_REW        (BUTTON_LEFT | BUTTON_REPEAT)
-#define WPS_INCVOL     BUTTON_UP
-#define WPS_DECVOL     BUTTON_DOWN
-#define WPS_PAUSE      BUTTON_PLAY
-#define WPS_MENU       (BUTTON_MENU | BUTTON_REL)
-#define WPS_MENU_PRE   BUTTON_MENU
-#define WPS_BROWSE     (BUTTON_ON | BUTTON_REL)
-#define WPS_BROWSE_PRE BUTTON_ON
-#define WPS_EXIT       BUTTON_OFF
-#define WPS_KEYLOCK    (BUTTON_MENU | BUTTON_DOWN)
-#define WPS_ID3        (BUTTON_MENU | BUTTON_ON)
-
-#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
-
-/* TODO: Check WPS button assignments */
-
-#define WPS_NEXT       (BUTTON_RIGHT | BUTTON_REL)
-#define WPS_NEXT_PRE   BUTTON_RIGHT
-#define WPS_PREV       (BUTTON_LEFT | BUTTON_REL)
-#define WPS_PREV_PRE   BUTTON_LEFT
-#define WPS_FFWD       (BUTTON_RIGHT | BUTTON_REPEAT)
-#define WPS_REW        (BUTTON_LEFT | BUTTON_REPEAT)
-#define WPS_INCVOL     BUTTON_SCROLL_FWD
-#define WPS_DECVOL     BUTTON_SCROLL_BACK
-#define WPS_PAUSE      BUTTON_PLAY | BUTTON_REL
-#define WPS_MENU       (BUTTON_MENU | BUTTON_REL)
-#define WPS_MENU_PRE   BUTTON_MENU
-#define WPS_BROWSE     (BUTTON_SELECT | BUTTON_REL)
-#define WPS_BROWSE_PRE BUTTON_SELECT
-#define WPS_EXIT       (BUTTON_PLAY | BUTTON_REPEAT)
-#define WPS_CONTEXT    (BUTTON_SELECT | BUTTON_REPEAT)
-#define WPS_QUICK      (BUTTON_MENU | BUTTON_REPEAT)
-
-#define WPS_NEXT_DIR   (BUTTON_SELECT | BUTTON_RIGHT)
-#define WPS_PREV_DIR   (BUTTON_SELECT | BUTTON_LEFT)
-
-#ifdef AB_REPEAT_ENABLE
-#define WPS_AB_SET_A_MARKER     (BUTTON_MENU | BUTTON_LEFT)
-#define WPS_AB_SET_B_MARKER     (BUTTON_MENU | BUTTON_RIGHT)
-#define WPS_AB_RESET_AB_MARKERS (BUTTON_LEFT | BUTTON_RIGHT)
-#endif
-
-#define HAVE_DIR_NAVIGATION
-
-#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
-
-/* TODO: Check WPS button assignments */
-
-#define WPS_NEXT       (BUTTON_RIGHT | BUTTON_REL)
-#define WPS_NEXT_PRE   BUTTON_RIGHT
-#define WPS_PREV       (BUTTON_LEFT | BUTTON_REL)
-#define WPS_PREV_PRE   BUTTON_LEFT
-#define WPS_FFWD       (BUTTON_RIGHT | BUTTON_REPEAT)
-#define WPS_REW        (BUTTON_LEFT | BUTTON_REPEAT)
-#define WPS_INCVOL     BUTTON_UP
-#define WPS_DECVOL     BUTTON_DOWN
-#define WPS_PAUSE      BUTTON_PLAY
-/* #define WPS_MENU    iFP7xx can't have both main menu and context menu in wps */
-#define WPS_BROWSE     (BUTTON_SELECT | BUTTON_REL)
-#define WPS_BROWSE_PRE BUTTON_SELECT
-#define WPS_EXIT       (BUTTON_PLAY | BUTTON_REPEAT)
-#define WPS_CONTEXT    (BUTTON_SELECT | BUTTON_REPEAT)
-
-#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
-
-/* TODO: Check WPS button assignments */
-
-#define WPS_NEXT       (BUTTON_RIGHT | BUTTON_REL)
-#define WPS_NEXT_PRE   BUTTON_RIGHT
-#define WPS_PREV       (BUTTON_LEFT | BUTTON_REL)
-#define WPS_PREV_PRE   BUTTON_LEFT
-#define WPS_FFWD       (BUTTON_RIGHT | BUTTON_REPEAT)
-#define WPS_REW        (BUTTON_LEFT | BUTTON_REPEAT)
-#define WPS_INCVOL     BUTTON_UP
-#define WPS_DECVOL     BUTTON_DOWN
-#define WPS_PAUSE      BUTTON_PLAY
-#define WPS_MENU       (BUTTON_REC|BUTTON_REL)
-#define WPS_MENU_PRE   BUTTON_REC
-#define WPS_BROWSE     (BUTTON_SELECT | BUTTON_REL)
-#define WPS_BROWSE_PRE BUTTON_SELECT
-#define WPS_EXIT       (BUTTON_PLAY | BUTTON_REPEAT)
-#define WPS_CONTEXT    (BUTTON_SELECT | BUTTON_REPEAT)
-#define WPS_QUICK      (BUTTON_REC | BUTTON_REPEAT)
-
-#define HAVE_DIR_NAVIGATION
-
-#elif CONFIG_KEYPAD == GIGABEAT_PAD
-
-#define WPS_NEXT       (BUTTON_RIGHT | BUTTON_REL)
-#define WPS_NEXT_PRE   BUTTON_RIGHT
-#define WPS_PREV       (BUTTON_LEFT | BUTTON_REL)
-#define WPS_PREV_PRE   BUTTON_LEFT
-#define WPS_FFWD       (BUTTON_RIGHT | BUTTON_REPEAT)
-#define WPS_REW        (BUTTON_LEFT | BUTTON_REPEAT)
-#define WPS_INCVOL     BUTTON_UP
-#define WPS_DECVOL     BUTTON_DOWN
-#define WPS_PAUSE      (BUTTON_POWER | BUTTON_REL)
-#define WPS_PAUSE_PRE  BUTTON_POWER
-#define WPS_MENU       (BUTTON_MENU | BUTTON_REL)
-#define WPS_MENU_PRE   BUTTON_MENU
-#define WPS_BROWSE     (BUTTON_SELECT | BUTTON_REL)
-#define WPS_BROWSE_PRE BUTTON_SELECT
-#define WPS_EXIT       BUTTON_A
-#define WPS_ID3        (BUTTON_MENU | BUTTON_POWER)
-#define WPS_CONTEXT    (BUTTON_SELECT | BUTTON_REPEAT)
-#define WPS_QUICK      (BUTTON_MENU | BUTTON_REPEAT)
-#define WPS_NEXT_DIR   (BUTTON_RIGHT | BUTTON_POWER)
-#define WPS_PREV_DIR   (BUTTON_LEFT | BUTTON_POWER)
-
-#define HAVE_DIR_NAVIGATION
-
-#endif
-
 /* constants used in line_type and as refresh_mode for wps_refresh */
 #define WPS_REFRESH_STATIC          1    /* line doesn't change over time */
 #define WPS_REFRESH_DYNAMIC         2    /* line may change (e.g. time flag) */
Index: apps/gui/list.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/list.c,v
retrieving revision 1.23
diff -u -u -r1.23 list.c
--- apps/gui/list.c	2 Jul 2006 16:18:59 -0000	1.23
+++ apps/gui/list.c	31 Jul 2006 21:58:06 -0000
@@ -25,6 +25,7 @@
 #include "settings.h"
 #include "kernel.h"
 
+#include "action.h"
 #include "screen_access.h"
 #include "list.h"
 #include "scrollbar.h"
@@ -618,102 +619,62 @@
     gui_synclist_limit_scroll(lists, true);
     switch(button)
     {
-        case LIST_PREV:
-#ifdef LIST_RC_PREV
-        case LIST_RC_PREV:
-#endif
+        case ACTION_STD_PREV:
             gui_synclist_limit_scroll(lists, false);
-
-        case LIST_PREV | BUTTON_REPEAT:
-#ifdef LIST_RC_PREV
-        case LIST_RC_PREV | BUTTON_REPEAT:
-#endif
+        case ACTION_STD_PREVREPEAT:
             gui_synclist_select_previous(lists);
             gui_synclist_draw(lists);
             yield();
-            return LIST_PREV;
+            return ACTION_STD_PREV;
 
-        case LIST_NEXT:
-#ifdef LIST_RC_NEXT
-        case LIST_RC_NEXT:
-#endif
+        case ACTION_STD_NEXT:
             gui_synclist_limit_scroll(lists, false);
-
-        case LIST_NEXT | BUTTON_REPEAT:
-#ifdef LIST_RC_NEXT
-
-        case LIST_RC_NEXT | BUTTON_REPEAT:
-#endif
+        case ACTION_STD_NEXTREPEAT:
             gui_synclist_select_next(lists);
             gui_synclist_draw(lists);
             yield();
-            return LIST_NEXT;
+            return ACTION_STD_NEXT;
 
-#ifdef LIST_PGRIGHT
-        case LIST_PGRIGHT:
-        case LIST_PGRIGHT | BUTTON_REPEAT:
-#ifdef LIST_RC_PGRIGHT
-        case LIST_RC_PGRIGHT:
-        case LIST_RC_PGRIGHT | BUTTON_REPEAT:
-#endif
+        case ACTION_TREE_PGRIGHT:
             gui_synclist_scroll_right(lists);
             gui_synclist_draw(lists);
-            return LIST_PGRIGHT;
-#endif
+            return ACTION_TREE_PGRIGHT;
 
-#ifdef LIST_PGLEFT
-        case LIST_PGLEFT:
-        case LIST_PGLEFT | BUTTON_REPEAT:
-#ifdef LIST_RC_PGLEFT
-        case LIST_RC_PGLEFT:
-        case LIST_RC_PGLEFT | BUTTON_REPEAT:
-#endif
+        case ACTION_TREE_PGLEFT:
             gui_synclist_scroll_left(lists);
             gui_synclist_draw(lists);
-            return LIST_PGLEFT;
-#endif
+            return ACTION_TREE_PGLEFT;
 
 /* for pgup / pgdown, we are obliged to have a different behaviour depending on the screen
  * for which the user pressed the key since for example, remote and main screen doesn't
  * have the same number of lines*/
-#ifdef LIST_PGUP
-        case LIST_PGUP:
+        case ACTION_TREE_PGUP:
             gui_synclist_limit_scroll(lists, false);
-        case LIST_PGUP | BUTTON_REPEAT:
             gui_synclist_select_previous_page(lists, SCREEN_MAIN);
             gui_synclist_draw(lists);
             yield();
-            return LIST_NEXT;
-#endif
-
-#ifdef LIST_RC_PGUP
-        case LIST_RC_PGUP:
+            return ACTION_STD_NEXT;
+            
+        case ACTION_TREE_PGDOWN:
             gui_synclist_limit_scroll(lists, false);
-        case LIST_RC_PGUP | BUTTON_REPEAT:
-            gui_synclist_select_previous_page(lists, SCREEN_REMOTE);
+            gui_synclist_select_next_page(lists, SCREEN_MAIN);
             gui_synclist_draw(lists);
             yield();
-            return LIST_NEXT;
-#endif
-
-#ifdef LIST_PGDN
-        case LIST_PGDN:
+            return ACTION_STD_PREV;
+#if (REMOTE_BUTTON != 0 )
+        case ACTION_TREE_RC_PGUP:
             gui_synclist_limit_scroll(lists, false);
-        case LIST_PGDN | BUTTON_REPEAT:
-            gui_synclist_select_next_page(lists, SCREEN_MAIN);
+            gui_synclist_select_previous_page(lists, SCREEN_REMOTE);
             gui_synclist_draw(lists);
             yield();
-            return LIST_PREV;
-#endif
+            return ACTION_STD_NEXT;
 
-#ifdef LIST_RC_PGDN
-        case LIST_RC_PGDN:
+        case ACTION_TREE_RC_PGDOWN:
             gui_synclist_limit_scroll(lists, false);
-        case LIST_RC_PGDN | BUTTON_REPEAT:
             gui_synclist_select_next_page(lists, SCREEN_REMOTE);
             gui_synclist_draw(lists);
             yield();
-            return LIST_PREV;
+            return ACTION_STD_PREV;
 #endif
     }
     return 0;
Index: apps/gui/list.h
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/list.h,v
retrieving revision 1.20
diff -u -u -r1.20 list.h
--- apps/gui/list.h	2 Jul 2006 12:28:27 -0000	1.20
+++ apps/gui/list.h	31 Jul 2006 21:58:06 -0000
@@ -26,75 +26,6 @@
 
 #define SCROLLBAR_WIDTH  6
 
-/* Key assignement */
-#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
-    (CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define LIST_NEXT      BUTTON_DOWN
-#define LIST_PREV      BUTTON_UP
-#define LIST_PGUP      (BUTTON_ON | BUTTON_UP)
-#define LIST_PGDN      (BUTTON_ON | BUTTON_DOWN)
-#define LIST_PGRIGHT   (BUTTON_ON | BUTTON_RIGHT)
-#define LIST_PGLEFT    (BUTTON_ON | BUTTON_LEFT)
-
-#ifdef CONFIG_REMOTE_KEYPAD
-#define LIST_RC_NEXT   BUTTON_RC_FF
-#define LIST_RC_PREV   BUTTON_RC_REW
-#define LIST_RC_PGUP   BUTTON_RC_SOURCE
-#define LIST_RC_PGDN   BUTTON_RC_BITRATE
-#define LIST_RC_PGRIGHT (BUTTON_RC_VOL_UP)
-#define LIST_RC_PGLEFT (BUTTON_RC_VOL_DOWN)
-#endif /* CONFIG_REMOTE_KEYPAD */
-
-#elif CONFIG_KEYPAD == RECORDER_PAD
-#define LIST_NEXT      BUTTON_DOWN
-#define LIST_PREV      BUTTON_UP
-#define LIST_PGUP      (BUTTON_ON | BUTTON_UP)
-#define LIST_PGDN      (BUTTON_ON | BUTTON_DOWN)
-#define LIST_PGRIGHT   (BUTTON_ON | BUTTON_RIGHT)
-#define LIST_PGLEFT    (BUTTON_ON | BUTTON_LEFT)
-
-#define LIST_RC_NEXT   BUTTON_RC_RIGHT
-#define LIST_RC_PREV   BUTTON_RC_LEFT
-
-#elif CONFIG_KEYPAD == PLAYER_PAD
-#define LIST_NEXT      BUTTON_RIGHT
-#define LIST_PREV      BUTTON_LEFT
-
-#define LIST_RC_NEXT   BUTTON_RC_RIGHT
-#define LIST_RC_PREV   BUTTON_RC_LEFT
-
-#elif CONFIG_KEYPAD == ONDIO_PAD
-#define LIST_NEXT      BUTTON_DOWN
-#define LIST_PREV      BUTTON_UP
-#define LIST_PGRIGHT   (BUTTON_MENU | BUTTON_RIGHT)
-#define LIST_PGLEFT    (BUTTON_MENU | BUTTON_LEFT)
-
-#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
-#define LIST_NEXT      BUTTON_SCROLL_FWD
-#define LIST_PREV      BUTTON_SCROLL_BACK
-
-#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
-#define LIST_NEXT      BUTTON_DOWN
-#define LIST_PREV      BUTTON_UP
-  
-#elif CONFIG_KEYPAD == GMINI100_PAD
-#define LIST_NEXT      BUTTON_DOWN
-#define LIST_PREV      BUTTON_UP
-#define LIST_PGUP      (BUTTON_ON | BUTTON_UP)
-#define LIST_PGDN      (BUTTON_ON | BUTTON_DOWN)
-#define LIST_PGRIGHT   (BUTTON_ON | BUTTON_RIGHT)
-#define LIST_PGLEFT    (BUTTON_ON | BUTTON_LEFT)
-
-#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
-#define LIST_NEXT      BUTTON_DOWN
-#define LIST_PREV      BUTTON_UP
-
-#elif CONFIG_KEYPAD == GIGABEAT_PAD
-#define LIST_NEXT      BUTTON_DOWN
-#define LIST_PREV      BUTTON_UP
-
-#endif
-
 /*
  * The gui_list is based on callback functions, if you want the list
  * to display something you have to provide it a function that
@@ -368,8 +299,8 @@
  *  - lists : the synchronized lists
  *  - button : the keycode of a pressed button
  * returned value :
- *  - LIST_NEXT when moving forward (next item or pgup)
- *  - LIST_PREV when moving backward (previous item or pgdown)
+ *  - ACTION_STD_NEXT when moving forward (next item or pgup)
+ *  - ACTION_STD_PREV when moving backward (previous item or pgdown)
  */
 extern unsigned gui_synclist_do_button(struct gui_synclist * lists, unsigned button);
 
Index: apps/gui/select.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/select.c,v
retrieving revision 1.10
diff -u -u -r1.10 select.c
--- apps/gui/select.c	7 Dec 2005 15:37:21 -0000	1.10
+++ apps/gui/select.c	31 Jul 2006 21:58:06 -0000
@@ -23,6 +23,7 @@
 #include "textarea.h"
 #include "screen_access.h"
 #include "kernel.h"
+#include "action.h"
 
 
 void gui_select_init_numeric(struct gui_select * select,
@@ -79,56 +80,28 @@
 {
     switch(button)
     {
-        case SELECT_INC | BUTTON_REPEAT :
-#ifdef SELECT_RC_INC
-        case SELECT_RC_INC | BUTTON_REPEAT :
-#endif
+        case ACTION_SETTINGS_INCREPEAT:
             select->options.limit_loop = true;
-        case SELECT_INC :
-#ifdef SELECT_RC_INC
-        case SELECT_RC_INC :
-#endif
+        case ACTION_SETTINGS_INC:
             option_select_next(&select->options);
             return(true);
 
-        case SELECT_DEC | BUTTON_REPEAT :
-#ifdef SELECT_RC_DEC
-        case SELECT_RC_DEC | BUTTON_REPEAT :
-#endif
+        case ACTION_SETTINGS_DECREPEAT:
             select->options.limit_loop = true;
-        case SELECT_DEC :
-#ifdef SELECT_RC_DEC
-        case SELECT_RC_DEC :
-#endif
+        case ACTION_SETTINGS_DEC:
             option_select_prev(&select->options);
             return(true);
 
-        case SELECT_OK :
-#ifdef SELECT_RC_OK
-        case SELECT_RC_OK :
-#endif
-#ifdef SELECT_RC_OK2
-        case SELECT_RC_OK2 :
-#endif
-#ifdef SELECT_OK2
-        case SELECT_OK2 :
-#endif
+        case ACTION_STD_ACCEPT:
             select->validated=true;
             return(false);
 
-        case SELECT_CANCEL :
-#ifdef SELECT_CANCEL2
-        case SELECT_CANCEL2 :
-#endif 
-#ifdef SELECT_RC_CANCEL
-        case SELECT_RC_CANCEL :
-#endif
-#ifdef SELECT_RC_CANCEL2
-        case SELECT_RC_CANCEL2 :
-#endif
+        case ACTION_STD_CANCEL:
+        case ACTION_STD_EXIT:
             select->canceled = true;
             gui_syncselect_draw(select);
             sleep(HZ/2);
+            action_signalscreenchange();
             return(false);
     }
     return(false);
Index: apps/gui/select.h
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/select.h,v
retrieving revision 1.17
diff -u -u -r1.17 select.h
--- apps/gui/select.h	22 Jun 2006 06:38:57 -0000	1.17
+++ apps/gui/select.h	31 Jul 2006 21:58:06 -0000
@@ -23,96 +23,6 @@
 #include "settings.h"
 #include "option_select.h"
 
-#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
-  (CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define SELECT_INC     BUTTON_UP
-#define SELECT_DEC     BUTTON_DOWN
-#define SELECT_OK      BUTTON_SELECT
-#define SELECT_OK2     BUTTON_LEFT
-#define SELECT_CANCEL  BUTTON_OFF
-#define SELECT_CANCEL2 BUTTON_MODE
-
-#define SELECT_RC_INC      BUTTON_RC_FF
-#define SELECT_RC_DEC      BUTTON_RC_REW
-#define SELECT_RC_OK       BUTTON_RC_ON
-#define SELECT_RC_OK2      BUTTON_RC_MENU
-#define SELECT_RC_CANCEL   BUTTON_RC_STOP
-#define SELECT_RC_CANCEL2  BUTTON_RC_MODE
-
-#elif CONFIG_KEYPAD == RECORDER_PAD
-#define SELECT_INC     BUTTON_UP
-#define SELECT_DEC     BUTTON_DOWN
-#define SELECT_OK      BUTTON_PLAY
-#define SELECT_OK2     BUTTON_LEFT
-#define SELECT_CANCEL  BUTTON_OFF
-#define SELECT_CANCEL2 BUTTON_F1
-
-#define SELECT_RC_INC      BUTTON_RC_RIGHT
-#define SELECT_RC_DEC      BUTTON_RC_LEFT
-#define SELECT_RC_OK       BUTTON_RC_PLAY
-#define SELECT_RC_CANCEL   BUTTON_RC_STOP
-
-#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_RC_INC      BUTTON_RC_RIGHT
-#define SELECT_RC_DEC      BUTTON_RC_LEFT
-#define SELECT_RC_OK       BUTTON_RC_PLAY
-#define SELECT_RC_CANCEL   BUTTON_RC_STOP
-
-#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
-#define SELECT_INC     BUTTON_SCROLL_FWD
-#define SELECT_DEC     BUTTON_SCROLL_BACK
-#define SELECT_OK      BUTTON_SELECT
-#define SELECT_OK2     BUTTON_LEFT
-#define SELECT_CANCEL  BUTTON_MENU
-
-#elif CONFIG_KEYPAD == IRIVER_IFP7XX_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_PLAY
-#define SELECT_CANCEL2 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
-
-#elif CONFIG_KEYPAD == GMINI100_PAD
-#define SELECT_INC     BUTTON_UP
-#define SELECT_DEC     BUTTON_DOWN
-#define SELECT_OK      BUTTON_PLAY
-#define SELECT_OK2     BUTTON_LEFT
-#define SELECT_CANCEL  BUTTON_OFF
-#define SELECT_CANCEL2 BUTTON_MENU
-
-#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
-#define SELECT_INC     BUTTON_UP
-#define SELECT_DEC     BUTTON_DOWN
-#define SELECT_OK      BUTTON_SELECT
-#define SELECT_OK2     BUTTON_LEFT
-#define SELECT_CANCEL  BUTTON_PLAY
-#define SELECT_CANCEL2 BUTTON_POWER
-
-#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_CANCEL  BUTTON_A
-#define SELECT_CANCEL2 BUTTON_POWER
-
-#endif
-
 struct gui_select
 {
     bool canceled;
Index: apps/gui/yesno.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/yesno.c,v
retrieving revision 1.4
diff -u -u -r1.4 yesno.c
--- apps/gui/yesno.c	21 Jan 2006 23:43:57 -0000	1.4
+++ apps/gui/yesno.c	31 Jul 2006 21:58:06 -0000
@@ -3,6 +3,7 @@
 #include "kernel.h"
 #include "misc.h"
 #include "lang.h"
+#include "action.h"
 
 void gui_yesno_init(struct gui_yesno * yn,
                     struct text_message * main_message,
@@ -72,23 +73,19 @@
     }
     while (result==-1)
     {
-        button = button_get(true);
+        button = get_action(CONTEXT_STD,TIMEOUT_BLOCK);
         switch (button)
         {
-            case YESNO_OK:
-#ifdef YESNO_RC_OK
-            case YESNO_RC_OK:
-#endif
+            case ACTION_STD_ACCEPT:
                 result=YESNO_YES;
                 break;
 
             default:
                 if(default_event_handler(button) == SYS_USB_CONNECTED)
                     return(YESNO_USB);
-                if(!(button & BUTTON_REL))
-                    result=YESNO_NO;
         }
     }
+    action_signalscreenchange();
     FOR_NB_SCREENS(i)
         result_displayed=gui_yesno_draw_result(&(yn[i]), result);
     if(result_displayed)
Index: apps/gui/yesno.h
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/yesno.h,v
retrieving revision 1.7
diff -u -u -r1.7 yesno.h
--- apps/gui/yesno.h	24 Feb 2006 15:42:50 -0000	1.7
+++ apps/gui/yesno.h	31 Jul 2006 21:58:06 -0000
@@ -4,38 +4,6 @@
 #include "screen_access.h"
 #include "textarea.h"
 
-#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
-    (CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define YESNO_OK       BUTTON_SELECT
-#define YESNO_RC_OK    BUTTON_RC_MENU
-
-#elif CONFIG_KEYPAD == RECORDER_PAD
-#define YESNO_OK       BUTTON_PLAY
-#define YESNO_RC_OK    BUTTON_RC_PLAY
-
-#elif CONFIG_KEYPAD == PLAYER_PAD
-#define YESNO_OK       BUTTON_PLAY
-#define YESNO_RC_OK    BUTTON_RC_PLAY
-
-#elif CONFIG_KEYPAD == ONDIO_PAD
-#define YESNO_OK       BUTTON_RIGHT
-
-#elif CONFIG_KEYPAD == GMINI100_PAD
-#define YESNO_OK       BUTTON_PLAY
-
-#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
-#define YESNO_OK       BUTTON_PLAY
-
-#elif (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
-#define YESNO_OK       BUTTON_RIGHT
-
-#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
-#define YESNO_OK       BUTTON_RIGHT
-
-#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
-#define YESNO_OK       BUTTON_RIGHT
-
-#endif
 enum yesno_res
 {
     YESNO_YES,
Index: apps/keymaps/keymap-h1x0_h3x0.c
===================================================================
RCS file: apps/keymaps/keymap-h1x0_h3x0.c
diff -N apps/keymaps/keymap-h1x0_h3x0.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ apps/keymaps/keymap-h1x0_h3x0.c	31 Jul 2006 21:58:06 -0000
@@ -0,0 +1,282 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ *
+ * Copyright (C) 2006 Jonathan Gordon
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/* Button Code Definitions for iriver h100/h300 target */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "config.h"
+#include "action.h"
+#include "button.h"
+#include "lcd-remote.h" /* for remote_type() */
+
+#define LAST_ITEM_IN_LIST { ACTION_NONE, BUTTON_NONE, BUTTON_NONE }
+/* 
+ * The format of the list is as follows
+ * { Action Code,   Button code,    Prereq button code } 
+ * if there's no need to check the previous button's value, use BUTTON_NONE
+ * Insert LAST_ITEM_IN_LIST at the end of each mapping 
+ */
+
+struct button_mapping button_context_standard[]  = {
+    { ACTION_STD_PREV,          BUTTON_UP,                  BUTTON_NONE },
+    { ACTION_STD_PREVREPEAT,    BUTTON_UP|BUTTON_REPEAT,    BUTTON_UP },
+    { ACTION_STD_NEXT,          BUTTON_DOWN,                BUTTON_NONE },
+    { ACTION_STD_NEXTREPEAT,    BUTTON_DOWN|BUTTON_REPEAT,  BUTTON_DOWN },
+    
+    { ACTION_STD_ACCEPT,        BUTTON_ON|BUTTON_REL,       BUTTON_ON },
+    { ACTION_STD_CANCEL,        BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_STD_CANCEL,        BUTTON_LEFT|BUTTON_REPEAT,  BUTTON_LEFT },
+    { ACTION_STD_CONTEXT,       BUTTON_SELECT|BUTTON_REPEAT,BUTTON_SELECT },
+    { ACTION_STD_EXIT,          BUTTON_OFF,                 BUTTON_NONE },
+    { ACTION_STD_QUICKSCREEN,      BUTTON_MODE|BUTTON_REPEAT,  BUTTON_MODE }, 
+    { ACTION_STD_MENU,          BUTTON_MODE|BUTTON_REL,     BUTTON_MODE },
+    { ACTION_STD_SELECT,        BUTTON_SELECT|BUTTON_REL,   BUTTON_SELECT },
+    { ACTION_STD_SELECT,        BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_STD_SELECT,        BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_standard */
+
+struct button_mapping button_context_standard_h100lcdremote[]  = {
+    { ACTION_STD_PREV,          BUTTON_RC_REW,                  BUTTON_NONE },
+    { ACTION_STD_PREVREPEAT,    BUTTON_RC_REW|BUTTON_REPEAT,    BUTTON_RC_REW },
+    { ACTION_STD_NEXT,          BUTTON_RC_FF,                   BUTTON_NONE },
+    { ACTION_STD_NEXTREPEAT,    BUTTON_RC_FF|BUTTON_REPEAT,     BUTTON_RC_FF },
+    
+    { ACTION_STD_ACCEPT,        BUTTON_RC_ON|BUTTON_REL,        BUTTON_RC_ON },
+    { ACTION_STD_CONTEXT,       BUTTON_RC_MENU|BUTTON_REPEAT,   BUTTON_RC_MENU },
+    { ACTION_STD_EXIT,          BUTTON_RC_STOP,                 BUTTON_NONE },
+    { ACTION_STD_QUICKSCREEN,      BUTTON_RC_MODE|BUTTON_REPEAT,   BUTTON_RC_MODE },
+    { ACTION_STD_MENU,          BUTTON_RC_MODE|BUTTON_REL,      BUTTON_RC_MODE },
+    { ACTION_STD_SELECT,        BUTTON_RC_MENU|BUTTON_REL,      BUTTON_RC_MENU },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_standard_h100lcdremote */
+
+struct button_mapping button_context_standard_h300lcdremote[]  = {
+    { ACTION_STD_PREV,          BUTTON_RC_VOL_UP,                   BUTTON_NONE },
+    { ACTION_STD_PREVREPEAT,    BUTTON_RC_VOL_UP|BUTTON_REPEAT,     BUTTON_RC_VOL_UP },
+    { ACTION_STD_NEXT,          BUTTON_RC_VOL_DOWN,                 BUTTON_NONE },
+    { ACTION_STD_NEXTREPEAT,    BUTTON_RC_VOL_DOWN|BUTTON_REPEAT,   BUTTON_RC_VOL_DOWN },
+    
+    { ACTION_STD_ACCEPT,        BUTTON_RC_ON|BUTTON_REL,            BUTTON_RC_ON },
+    { ACTION_STD_CANCEL,        BUTTON_RC_REW,                      BUTTON_NONE },
+    { ACTION_STD_CANCEL,        BUTTON_RC_REW|BUTTON_REPEAT,        BUTTON_RC_REW },
+    { ACTION_STD_CONTEXT,       BUTTON_RC_MENU|BUTTON_REPEAT,       BUTTON_RC_MENU },
+    { ACTION_STD_EXIT,          BUTTON_RC_STOP,                     BUTTON_NONE },
+    { ACTION_STD_QUICKSCREEN,      BUTTON_RC_MODE|BUTTON_REPEAT,       BUTTON_RC_MODE },
+    { ACTION_STD_MENU,          BUTTON_RC_MODE|BUTTON_REL,          BUTTON_RC_MODE },
+    { ACTION_STD_SELECT,        BUTTON_RC_MENU|BUTTON_REL,          BUTTON_RC_MENU },
+    { ACTION_STD_SELECT,        BUTTON_RC_FF,                       BUTTON_NONE },
+    { ACTION_STD_SELECT,        BUTTON_RC_FF|BUTTON_REPEAT,         BUTTON_NONE},
+    
+    LAST_ITEM_IN_LIST
+
+}; /* button_context_standard */
+
+
+struct button_mapping button_context_wps[]  = {
+    { ACTION_WPS_PLAY,          BUTTON_ON|BUTTON_REL,           BUTTON_ON },
+    { ACTION_WPS_SKIPNEXT,      BUTTON_RIGHT|BUTTON_REL,        BUTTON_RIGHT },
+    { ACTION_WPS_SKIPPREV,      BUTTON_LEFT|BUTTON_REL,         BUTTON_LEFT },
+    { ACTION_WPS_SEEKBACK,      BUTTON_LEFT|BUTTON_REPEAT,      BUTTON_LEFT },
+    { ACTION_WPS_SEEKFWD,       BUTTON_RIGHT|BUTTON_REPEAT,     BUTTON_RIGHT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_LEFT|BUTTON_REL,         BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_RIGHT|BUTTON_REL,         BUTTON_RIGHT|BUTTON_REPEAT },
+    { ACTION_WPS_STOP,          BUTTON_OFF,                     BUTTON_NONE },
+    { ACTION_WPS_VOLDOWN,       BUTTON_DOWN|BUTTON_REL,                    BUTTON_DOWN },
+    { ACTION_WPS_VOLDOWN,       BUTTON_DOWN|BUTTON_REPEAT,      BUTTON_DOWN },
+    { ACTION_WPS_VOLUP,         BUTTON_UP|BUTTON_REL,                      BUTTON_UP },
+    { ACTION_WPS_VOLUP,         BUTTON_UP|BUTTON_REPEAT,        BUTTON_UP },
+    { ACTION_WPS_PITCHSCREEN,   BUTTON_ON|BUTTON_REPEAT,        BUTTON_ON },
+    { ACTION_WPS_QUICKSCREEN,   BUTTON_MODE|BUTTON_REPEAT,      BUTTON_MODE },
+    { ACTION_WPS_MENU,          BUTTON_MODE|BUTTON_REL,         BUTTON_MODE },
+    { ACTION_WPS_CONTEXT,       BUTTON_SELECT|BUTTON_REPEAT,    BUTTON_SELECT },
+    { ACTION_WPS_BROWSE,        BUTTON_SELECT|BUTTON_REL,       BUTTON_SELECT },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_wps */
+
+struct button_mapping button_context_wps_h100lcdremote[]  = {
+    { ACTION_WPS_PLAY,              BUTTON_RC_ON|BUTTON_REL,            BUTTON_RC_ON },
+    { ACTION_WPS_SKIPNEXT,          BUTTON_RC_FF|BUTTON_REL,            BUTTON_RC_FF },
+    { ACTION_WPS_SEEKFWD,           BUTTON_RC_FF|BUTTON_REPEAT,         BUTTON_RC_FF },
+    { ACTION_WPS_SKIPPREV,          BUTTON_RC_REW|BUTTON_REL,           BUTTON_RC_REW },
+    { ACTION_WPS_SEEKBACK,          BUTTON_RC_REW|BUTTON_REPEAT,        BUTTON_RC_REW },
+    { ACTION_WPS_STOP,              BUTTON_RC_STOP,                     BUTTON_NONE },
+    { ACTION_WPS_VOLDOWN,           BUTTON_RC_VOL_DOWN,                 BUTTON_NONE },
+    { ACTION_WPS_VOLDOWN,           BUTTON_RC_VOL_DOWN|BUTTON_REPEAT,   BUTTON_RC_VOL_DOWN },
+    { ACTION_WPS_VOLUP,             BUTTON_RC_VOL_UP,                   BUTTON_NONE },
+    { ACTION_WPS_VOLUP,             BUTTON_RC_VOL_UP|BUTTON_REPEAT,     BUTTON_RC_VOL_UP },
+    { ACTION_WPS_NEXTDIR,           BUTTON_RC_BITRATE,                  BUTTON_NONE },
+    { ACTION_WPS_PREVDIR,           BUTTON_RC_SOURCE,                   BUTTON_NONE },
+    { ACTION_WPS_PITCHSCREEN,       BUTTON_RC_ON|BUTTON_REPEAT,         BUTTON_RC_ON },
+    { ACTION_WPS_QUICKSCREEN,       BUTTON_RC_MODE|BUTTON_REPEAT,       BUTTON_RC_MODE },
+    { ACTION_WPS_MENU,              BUTTON_RC_MODE|BUTTON_REL,          BUTTON_RC_MODE },
+    { ACTION_WPS_CONTEXT,           BUTTON_RC_MENU|BUTTON_REPEAT,       BUTTON_RC_MENU },
+    { ACTION_WPS_BROWSE,            BUTTON_RC_MENU|BUTTON_REL,          BUTTON_RC_MENU },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_wps_h100lcdremote */
+
+/* the mapping of the 2 LCD remotes in the WPS screen should be the same */
+struct button_mapping *button_context_wps_h300lcdremote =
+                                button_context_wps_h100lcdremote;
+
+struct button_mapping button_context_listtree[]  = {
+    { ACTION_TREE_PGUP,     BUTTON_ON|BUTTON_UP,                    BUTTON_ON },
+    { ACTION_TREE_PGUP,     BUTTON_UP|BUTTON_REL,                   BUTTON_ON|BUTTON_UP },
+    { ACTION_TREE_PGUP,     BUTTON_ON|BUTTON_UP|BUTTON_REPEAT,      BUTTON_ON|BUTTON_UP },
+    { ACTION_TREE_PGDOWN,   BUTTON_ON|BUTTON_DOWN,                  BUTTON_ON|BUTTON_UP },
+    { ACTION_TREE_PGDOWN,   BUTTON_DOWN|BUTTON_REL,                 BUTTON_ON|BUTTON_DOWN },
+    { ACTION_TREE_PGDOWN,   BUTTON_ON|BUTTON_DOWN|BUTTON_REPEAT,    BUTTON_ON|BUTTON_DOWN },
+    { ACTION_TREE_PGLEFT,   BUTTON_ON|BUTTON_LEFT,                  BUTTON_ON },
+    { ACTION_TREE_PGLEFT,   BUTTON_LEFT|BUTTON_REL,                 BUTTON_ON|BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,   BUTTON_ON|BUTTON_LEFT,                  BUTTON_LEFT|BUTTON_REL },
+    { ACTION_TREE_PGLEFT,   BUTTON_ON|BUTTON_LEFT|BUTTON_REPEAT,    BUTTON_ON|BUTTON_LEFT },
+    { ACTION_TREE_PGRIGHT,  BUTTON_ON|BUTTON_RIGHT,                 BUTTON_ON },
+    { ACTION_TREE_PGRIGHT,  BUTTON_RIGHT|BUTTON_REL,                BUTTON_ON|BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,  BUTTON_ON|BUTTON_RIGHT,                 BUTTON_RIGHT|BUTTON_REL },
+    { ACTION_TREE_PGRIGHT,  BUTTON_ON|BUTTON_RIGHT|BUTTON_REPEAT,   BUTTON_ON|BUTTON_RIGHT },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_listtree */
+
+struct button_mapping button_context_listtree_h100lcdremote[]  = {
+    { ACTION_TREE_PGUP,     BUTTON_RC_SOURCE,                    BUTTON_NONE },
+    { ACTION_TREE_PGUP,     BUTTON_RC_SOURCE|BUTTON_REPEAT,      BUTTON_RC_SOURCE },
+    { ACTION_TREE_PGDOWN,   BUTTON_RC_BITRATE,                   BUTTON_NONE },
+    { ACTION_TREE_PGDOWN,   BUTTON_RC_BITRATE|BUTTON_REPEAT,     BUTTON_RC_BITRATE },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_listtree_h100lcdremote */
+
+/* FIXME: the same as h100 ?? */
+struct button_mapping button_context_listtree_h300lcdremote[]  = {
+    { ACTION_TREE_PGUP,     BUTTON_RC_SOURCE,                    BUTTON_NONE },
+    { ACTION_TREE_PGUP,     BUTTON_RC_SOURCE|BUTTON_REPEAT,      BUTTON_RC_SOURCE },
+    { ACTION_TREE_PGDOWN,   BUTTON_RC_BITRATE,                   BUTTON_NONE },
+    { ACTION_TREE_PGDOWN,   BUTTON_RC_BITRATE|BUTTON_REPEAT,     BUTTON_RC_BITRATE },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_listtree_h300lcdremote */
+
+
+struct button_mapping button_context_settings[]  = {
+    { ACTION_SETTINGS_INC,          BUTTON_UP,                      BUTTON_NONE },
+    { ACTION_SETTINGS_INCREPEAT,    BUTTON_UP|BUTTON_REPEAT,        BUTTON_UP },
+    { ACTION_SETTINGS_DEC,          BUTTON_DOWN,                    BUTTON_NONE },
+    { ACTION_SETTINGS_DECREPEAT,    BUTTON_DOWN|BUTTON_REPEAT,      BUTTON_DOWN },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_settings */
+
+struct button_mapping button_context_settings_h100lcdremote[]  = {
+    { ACTION_SETTINGS_INC,          BUTTON_RC_BITRATE,                  BUTTON_NONE },
+    { ACTION_SETTINGS_INCREPEAT,    BUTTON_RC_BITRATE|BUTTON_REPEAT,    BUTTON_RC_BITRATE },
+    { ACTION_SETTINGS_DEC,          BUTTON_RC_SOURCE,                   BUTTON_NONE },
+    { ACTION_SETTINGS_DECREPEAT,    BUTTON_RC_SOURCE|BUTTON_REPEAT,     BUTTON_RC_SOURCE },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_settings_h100lcdremote */
+
+struct button_mapping button_context_settings_h300lcdremote[]  = {
+    { ACTION_SETTINGS_INC,          BUTTON_RC_VOL_UP,                  BUTTON_NONE },
+    { ACTION_SETTINGS_INCREPEAT,    BUTTON_RC_VOL_UP|BUTTON_REPEAT,    BUTTON_RC_VOL_UP },
+    { ACTION_SETTINGS_DEC,          BUTTON_RC_VOL_DOWN,                   BUTTON_NONE },
+    { ACTION_SETTINGS_DECREPEAT,    BUTTON_RC_VOL_DOWN|BUTTON_REPEAT,     BUTTON_RC_VOL_DOWN },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_settings_h300lcdremote */
+
+
+/* the actual used tables */
+static struct button_mapping 
+        *remote_button_context_std = button_context_standard_h100lcdremote, 
+        *remote_button_context_wps = button_context_wps_h100lcdremote,
+        *remote_button_context_listtree = button_context_listtree_h100lcdremote,
+        *remote_button_context_settings = button_context_settings_h100lcdremote;
+static int _remote_type = 0;
+
+static void remap_remote(void)
+{
+    _remote_type = remote_type();
+    switch(_remote_type)
+    {
+        case REMOTETYPE_UNPLUGGED:
+                    remote_button_context_std = NULL;
+                    remote_button_context_wps = NULL;
+                    remote_button_context_listtree = NULL;
+                    remote_button_context_settings = NULL;
+                    break;
+        case REMOTETYPE_H100_LCD:
+                    remote_button_context_std = button_context_standard_h100lcdremote;
+                    remote_button_context_wps = button_context_wps_h100lcdremote;
+                    remote_button_context_listtree = button_context_listtree_h100lcdremote;
+                    remote_button_context_settings = button_context_settings_h100lcdremote;
+                    break;
+        case REMOTETYPE_H300_LCD:
+                    remote_button_context_std = button_context_standard_h300lcdremote;
+                    remote_button_context_wps = button_context_wps_h300lcdremote;
+                    remote_button_context_listtree = button_context_listtree_h300lcdremote;
+                    remote_button_context_settings = button_context_settings_h300lcdremote;
+                    break;
+        case REMOTETYPE_H300_NONLCD: /* FIXME: add its tables */        
+                    remote_button_context_std = button_context_standard_h300lcdremote;
+                    remote_button_context_wps = button_context_wps_h300lcdremote;
+                    remote_button_context_listtree = button_context_listtree_h300lcdremote;
+                    remote_button_context_settings = button_context_settings_h300lcdremote;
+                    break;
+    }
+}
+
+struct button_mapping* get_context_mapping(int context)
+{
+    if((context&CONTEXT_REMOTE)&&(remote_type() != _remote_type))
+        remap_remote();
+    
+    switch (context)
+    {
+        case CONTEXT_STD:
+            return button_context_standard;
+        case CONTEXT_STD|CONTEXT_REMOTE:
+            return remote_button_context_std;
+        case CONTEXT_WPS:
+            return button_context_wps;
+        case CONTEXT_WPS|CONTEXT_REMOTE:
+            return remote_button_context_wps;
+            
+        case CONTEXT_TREE:
+        case CONTEXT_LIST:
+        case CONTEXT_MAINMENU:
+            return button_context_listtree;
+        
+        case CONTEXT_TREE|CONTEXT_REMOTE:
+        case CONTEXT_LIST|CONTEXT_REMOTE:
+        case CONTEXT_MAINMENU|CONTEXT_REMOTE:
+            return remote_button_context_listtree;
+
+        case CONTEXT_SETTINGS:
+            return button_context_settings;
+        case CONTEXT_SETTINGS|CONTEXT_REMOTE:
+            return remote_button_context_settings;
+    } 
+    return button_context_standard;
+}
Index: apps/keymaps/keymap-ipod.c
===================================================================
RCS file: apps/keymaps/keymap-ipod.c
diff -N apps/keymaps/keymap-ipod.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ apps/keymaps/keymap-ipod.c	31 Jul 2006 21:58:06 -0000
@@ -0,0 +1,104 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ *
+ * Copyright (C) 2006 Jonathan Gordon
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/* Button Code Definitions for ipod target */
+
+#include "config.h"
+#include "action.h"
+#include "button.h"
+
+#define LAST_ITEM_IN_LIST { ACTION_NONE, BUTTON_NONE, BUTTON_NONE }
+/* 
+ * The format of the list is as follows
+ * { Action Code,   Button code,    Prereq button code } 
+ * if there's no need to check the previous button's value, use BUTTON_NONE
+ * Insert LAST_ITEM_IN_LIST at the end of each mapping 
+ */
+
+struct button_mapping button_context_standard[]  = {
+    { ACTION_STD_PREV,          BUTTON_SCROLL_BACK,                 BUTTON_NONE },
+    { ACTION_STD_PREVREPEAT,    BUTTON_SCROLL_BACK|BUTTON_REPEAT,   BUTTON_SCROLL_BACK },
+    { ACTION_STD_NEXT,          BUTTON_SCROLL_FWD,                  BUTTON_NONE },
+    { ACTION_STD_NEXTREPEAT,    BUTTON_SCROLL_FWD|BUTTON_REPEAT,    BUTTON_SCROLL_FWD },
+    { ACTION_STD_CANCEL,        BUTTON_LEFT,                        BUTTON_NONE },
+    { ACTION_STD_CANCEL,    BUTTON_LEFT|BUTTON_REPEAT,          BUTTON_LEFT },
+    { ACTION_STD_SELECT,    BUTTON_RIGHT,                       BUTTON_NONE },
+    { ACTION_STD_SELECT,    BUTTON_RIGHT|BUTTON_REPEAT,         BUTTON_RIGHT },
+
+    { ACTION_STD_ACCEPT,    BUTTON_PLAY|BUTTON_REL,     BUTTON_PLAY },
+    { ACTION_STD_SELECT,    BUTTON_SELECT|BUTTON_REL,   BUTTON_SELECT },
+    { ACTION_STD_MENU,      BUTTON_MENU|BUTTON_REL,         BUTTON_MENU },
+    { ACTION_STD_QUICKSCREEN,  BUTTON_MENU|BUTTON_REPEAT,      BUTTON_MENU },
+    { ACTION_STD_CONTEXT,   BUTTON_SELECT|BUTTON_REPEAT,    BUTTON_SELECT },
+    { ACTION_STD_EXIT,      BUTTON_PLAY|BUTTON_REPEAT,      BUTTON_PLAY },
+
+    LAST_ITEM_IN_LIST
+}; /* button_context_standard */
+
+struct button_mapping button_context_wps[]  = {
+    { ACTION_WPS_PLAY,      BUTTON_PLAY|BUTTON_REL,         BUTTON_PLAY },
+    { ACTION_WPS_SKIPNEXT,  BUTTON_RIGHT,                   BUTTON_NONE },
+    { ACTION_WPS_SKIPPREV,  BUTTON_LEFT,                    BUTTON_NONE },
+    { ACTION_WPS_SEEKBACK,  BUTTON_LEFT|BUTTON_REPEAT,      BUTTON_LEFT },
+    { ACTION_WPS_SEEKFWD,   BUTTON_RIGHT|BUTTON_REPEAT,     BUTTON_RIGHT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_LEFT|BUTTON_REL,         BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_RIGHT|BUTTON_REL,         BUTTON_RIGHT|BUTTON_REPEAT },
+    { ACTION_WPS_STOP,      BUTTON_PLAY|BUTTON_REPEAT,      BUTTON_PLAY },
+    { ACTION_WPS_VOLDOWN,   BUTTON_SCROLL_FWD,                    BUTTON_NONE },
+    { ACTION_WPS_VOLDOWN,   BUTTON_SCROLL_FWD|BUTTON_REPEAT,      BUTTON_SCROLL_FWD },
+    { ACTION_WPS_VOLUP,     BUTTON_SCROLL_BACK,                      BUTTON_NONE },
+    { ACTION_WPS_VOLUP,     BUTTON_SCROLL_BACK|BUTTON_REPEAT,        BUTTON_SCROLL_BACK },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_wps */
+
+struct button_mapping button_context_settings[]  = {
+    { ACTION_SETTINGS_INC,      BUTTON_SCROLL_BACK,         BUTTON_NONE },
+    { ACTION_SETTINGS_INCREPEAT, BUTTON_SCROLL_BACK|BUTTON_REPEAT,  BUTTON_SCROLL_BACK },
+    { ACTION_SETTINGS_DEC,      BUTTON_SCROLL_FWD,          BUTTON_NONE },
+    { ACTION_SETTINGS_DECREPEAT, BUTTON_SCROLL_FWD|BUTTON_REPEAT,  BUTTON_SCROLL_FWD },
+    { ACTION_STD_PREV,          BUTTON_LEFT,                  BUTTON_NONE },
+    { ACTION_STD_PREVREPEAT,    BUTTON_LEFT|BUTTON_REPEAT,    BUTTON_LEFT },
+    { ACTION_STD_NEXT,          BUTTON_RIGHT,                BUTTON_NONE },
+    { ACTION_STD_NEXTREPEAT,    BUTTON_RIGHT|BUTTON_REPEAT,  BUTTON_RIGHT },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_listtree */
+
+
+/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
+struct button_mapping* get_context_mapping(int context)
+{
+    switch (context)
+    {
+        case CONTEXT_STD:
+            return button_context_standard;
+        case CONTEXT_WPS:
+            return button_context_wps;
+            
+        case CONTEXT_TREE:
+        case CONTEXT_LIST:
+        case CONTEXT_MAINMENU:
+            break;
+        case CONTEXT_SETTINGS:
+            return button_context_settings;
+        default:
+            return button_context_standard;
+    } 
+    return button_context_standard;
+}
Index: apps/keymaps/keymap-newtarget.c
===================================================================
RCS file: apps/keymaps/keymap-newtarget.c
diff -N apps/keymaps/keymap-newtarget.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ apps/keymaps/keymap-newtarget.c	31 Jul 2006 21:58:06 -0000
@@ -0,0 +1,77 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ *
+ * Copyright (C) 200
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/* Button Code Definitions for <new> target */
+
+#include "config.h"
+#include "action.h"
+#include "button.h"
+
+#define LAST_ITEM_IN_LIST { ACTION_NONE,BUTTON_NONE,BUTTON_NONE }
+/* {Action Code,    Button code,    Prereq button code } */
+
+/**
+    This file is where all button mappings are defined.
+    In ../action.h there is an enum with all the used ACTION_ codes.
+    Ideally All the ACTION_STD_* and ACTION_WPS_* codes should be defined somehwere in this file.
+
+    Remeber to make a copy of this file and rename it to keymap-<targetname>.c and add it to apps/SOURCES
+
+    Good luck and thanks for porting a new target! :D
+
+**/
+
+/* 
+ * The format of the list is as follows
+ * { Action Code,   Button code,    Prereq button code } 
+ * if there's no need to check the previous button's value, use BUTTON_NONE
+ * Insert LAST_ITEM_IN_LIST at the end of each mapping 
+ */
+struct button_mapping button_context_standard[]  = {
+
+    LAST_ITEM_IN_LIST
+}; /* button_context_standard */
+
+struct button_mapping button_context_wps[]  = {
+
+    LAST_ITEM_IN_LIST
+}; /* button_context_wps */
+
+
+
+/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
+struct button_mapping* get_context_mapping(int context)
+{
+    switch (context)
+    {
+        case CONTEXT_STD:
+            return button_context_standard;
+        case CONTEXT_WPS:
+            return button_context_wps;
+            
+        case CONTEXT_TREE:
+        case CONTEXT_LIST:
+        case CONTEXT_MAINMENU:
+            
+        case CONTEXT_SETTINGS:
+        case CONTEXT_SETTINGS|CONTEXT_REMOTE:
+        default:
+            return button_context_standard;
+    } 
+    return button_context_standard;
+}
Index: apps/keymaps/keymap-ondio.c
===================================================================
RCS file: apps/keymaps/keymap-ondio.c
diff -N apps/keymaps/keymap-ondio.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ apps/keymaps/keymap-ondio.c	31 Jul 2006 21:58:06 -0000
@@ -0,0 +1,103 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ *
+ * Copyright (C) 2006 Jonathan Gordon
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/* *
+ * Button Code Definitions for archos ondio fm/sp targets
+ *
+ * \TODO test!
+ */
+
+#include "config.h"
+#include "action.h"
+#include "button.h"
+
+#define LAST_ITEM_IN_LIST { ACTION_NONE, BUTTON_NONE, BUTTON_NONE }
+
+struct button_mapping button_context_standard[]  = {
+    { ACTION_STD_PREV,       BUTTON_UP,                  BUTTON_NONE },
+    { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT,    BUTTON_UP },
+    { ACTION_STD_NEXT,       BUTTON_DOWN,                BUTTON_NONE },
+    { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT,  BUTTON_DOWN },
+
+    { ACTION_STD_CONTEXT,    BUTTON_MENU|BUTTON_REPEAT,  BUTTON_MENU },    
+    { ACTION_STD_CANCEL,     BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_STD_ACCEPT,     BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT },
+    { ACTION_STD_MENU,       BUTTON_MENU|BUTTON_REL,     BUTTON_MENU },
+    { ACTION_STD_EXIT,       BUTTON_OFF,                 BUTTON_NONE },
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping button_context_wps[]  = {
+    { ACTION_WPS_PLAY,      BUTTON_OFF|BUTTON_REL,       BUTTON_OFF },
+    { ACTION_WPS_SKIPNEXT,      BUTTON_RIGHT,        BUTTON_NONE },
+    { ACTION_WPS_SKIPPREV,      BUTTON_LEFT,         BUTTON_NONE },
+    { ACTION_WPS_SEEKBACK,      BUTTON_LEFT|BUTTON_REPEAT,      BUTTON_LEFT },
+    { ACTION_WPS_SEEKFWD,       BUTTON_RIGHT|BUTTON_REPEAT,     BUTTON_RIGHT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_LEFT|BUTTON_REL,         BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_RIGHT|BUTTON_REL,         BUTTON_RIGHT|BUTTON_REPEAT },
+    { ACTION_WPS_STOP,      BUTTON_OFF|BUTTON_REPEAT,    BUTTON_OFF },
+    { ACTION_WPS_VOLDOWN,   BUTTON_DOWN,                BUTTON_NONE },
+    { ACTION_WPS_VOLDOWN,   BUTTON_DOWN|BUTTON_REPEAT,  BUTTON_DOWN },
+    { ACTION_WPS_VOLUP,     BUTTON_UP,                  BUTTON_NONE },
+    { ACTION_WPS_VOLUP,     BUTTON_UP|BUTTON_REPEAT,    BUTTON_UP },
+    { ACTION_WPS_BROWSE,    BUTTON_MENU|BUTTON_REL,     BUTTON_MENU },
+    { ACTION_WPS_MENU,      BUTTON_MENU|BUTTON_REPEAT,  BUTTON_MENU },
+    { ACTION_WPS_CONTEXT,   BUTTON_MENU|BUTTON_OFF,      BUTTON_MENU }, /* this may trigger ACTION_WPS_BROWSE so may need changing */
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping button_context_settings[] = {
+    { ACTION_SETTINGS_INC,          BUTTON_UP,                  BUTTON_NONE },
+    { ACTION_SETTINGS_INCREPEAT,    BUTTON_UP|BUTTON_REPEAT,    BUTTON_UP },
+    { ACTION_SETTINGS_DEC,          BUTTON_DOWN,                BUTTON_NONE },
+    { ACTION_SETTINGS_DECREPEAT,    BUTTON_DOWN|BUTTON_REPEAT,  BUTTON_DOWN },
+    { ACTION_STD_NEXT,              BUTTON_MENU,                BUTTON_NONE },
+    { ACTION_STD_ACCEPT,            BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_STD_CANCEL,            BUTTON_LEFT,                BUTTON_NONE },
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping button_context_tlm[] = {
+    { ACTION_STD_SELECT,     BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT },
+    
+    LAST_ITEM_IN_LIST
+}; 
+struct button_mapping* get_context_mapping( int context )
+{
+    switch( context )
+    {
+        case CONTEXT_STD:
+            return button_context_standard;
+            
+        case CONTEXT_WPS:
+            return button_context_wps;
+
+        case CONTEXT_SETTINGS:
+            return button_context_settings;
+
+        case CONTEXT_TREE:
+        case CONTEXT_LIST:
+        case CONTEXT_MAINMENU:
+            return button_context_tlm;
+        default:
+            return button_context_standard;
+    }
+}
Index: apps/keymaps/keymap-player.c
===================================================================
RCS file: apps/keymaps/keymap-player.c
diff -N apps/keymaps/keymap-player.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ apps/keymaps/keymap-player.c	31 Jul 2006 21:58:06 -0000
@@ -0,0 +1,99 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ *
+ * Copyright (C) 2006 Jonathan Gordon
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/* *
+ * Button Code Definitions for archos player targets
+ *
+ * \TODO test!
+ */
+
+#include "config.h"
+#include "action.h"
+#include "button.h"
+
+#define LAST_ITEM_IN_LIST { ACTION_NONE, BUTTON_NONE, BUTTON_NONE }
+
+struct button_mapping button_context_standard[]  = {
+    { ACTION_STD_PREV,       BUTTON_LEFT,                 BUTTON_NONE },
+    { ACTION_STD_PREVREPEAT, BUTTON_LEFT|BUTTON_REPEAT,   BUTTON_LEFT },
+    { ACTION_STD_NEXT,       BUTTON_RIGHT,                BUTTON_NONE },
+    { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT|BUTTON_REPEAT,  BUTTON_RIGHT },
+
+    { ACTION_STD_CONTEXT,    BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },    
+    { ACTION_STD_CANCEL,     BUTTON_OFF|BUTTON_REL,     BUTTON_OFF },
+    { ACTION_STD_SELECT,     BUTTON_PLAY|BUTTON_REL,    BUTTON_PLAY },
+    { ACTION_STD_ACCEPT,     BUTTON_ON|BUTTON_REL,      BUTTON_ON },
+    { ACTION_STD_MENU,       BUTTON_MENU|BUTTON_REL,    BUTTON_MENU },
+    { ACTION_STD_EXIT,       BUTTON_OFF|BUTTON_REPEAT,  BUTTON_OFF },
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping button_context_wps[]  = {
+    { ACTION_WPS_PLAY,      BUTTON_PLAY,                BUTTON_NONE },
+    { ACTION_WPS_SKIPNEXT,      BUTTON_RIGHT,        BUTTON_NONE },
+    { ACTION_WPS_SKIPPREV,      BUTTON_LEFT,         BUTTON_NONE },
+    { ACTION_WPS_SEEKBACK,      BUTTON_LEFT|BUTTON_REPEAT,      BUTTON_LEFT },
+    { ACTION_WPS_SEEKFWD,       BUTTON_RIGHT|BUTTON_REPEAT,     BUTTON_RIGHT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_LEFT|BUTTON_REL,         BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_RIGHT|BUTTON_REL,         BUTTON_RIGHT|BUTTON_REPEAT },
+    { ACTION_WPS_STOP,      BUTTON_STOP,                BUTTON_NONE },
+    
+    { ACTION_WPS_VOLDOWN,   BUTTON_MENU|BUTTON_STOP,                BUTTON_MENU },
+    { ACTION_WPS_VOLDOWN,   BUTTON_MENU|BUTTON_STOP|BUTTON_REPEAT,  BUTTON_MENU|BUTTON_STOP },
+    { ACTION_WPS_VOLUP,     BUTTON_MENU|BUTTON_PLAY,                  BUTTON_MENU },
+    { ACTION_WPS_VOLUP,     BUTTON_MENU|BUTTON_PLAY|BUTTON_REPEAT,    BUTTON_MENU|BUTTON_PLAY },
+    
+    { ACTION_WPS_BROWSE,    BUTTON_ON|BUTTON_REL,     BUTTON_ON },
+    { ACTION_WPS_MENU,      BUTTON_MENU|BUTTON_REL,     BUTTON_MENU },
+    { ACTION_WPS_CONTEXT,   BUTTON_ON|BUTTON_REPEAT,      BUTTON_ON },
+    { ACTION_WPS_ID3SCREEN, BUTTON_MENU|BUTTON_ON,     BUTTON_MENU },
+    
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping button_context_settings[] = {
+    { ACTION_SETTINGS_INC,          BUTTON_LEFT,                  BUTTON_NONE },
+    { ACTION_SETTINGS_INCREPEAT,    BUTTON_LEFT|BUTTON_REPEAT,    BUTTON_LEFT },
+    { ACTION_SETTINGS_DEC,          BUTTON_RIGHT,                BUTTON_NONE },
+    { ACTION_SETTINGS_DECREPEAT,    BUTTON_RIGHT|BUTTON_REPEAT,  BUTTON_RIGHT },
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping* get_context_mapping( int context )
+{
+    switch( context )
+    {
+        case CONTEXT_STD:
+            return button_context_standard;
+            
+        case CONTEXT_WPS:
+            return button_context_wps;
+
+        case CONTEXT_SETTINGS:
+            return button_context_settings;
+
+        case CONTEXT_TREE:
+        case CONTEXT_LIST:
+        case CONTEXT_MAINMENU:
+        default:
+            return button_context_standard;
+    }
+}
Index: apps/keymaps/keymap-recorder.c
===================================================================
RCS file: apps/keymaps/keymap-recorder.c
diff -N apps/keymaps/keymap-recorder.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ apps/keymaps/keymap-recorder.c	31 Jul 2006 21:58:06 -0000
@@ -0,0 +1,102 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ *
+ * Copyright (C) 2006 Antoine Cellerier <dionoea @t videolan d.t org>
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/* *
+ * Button Code Definitions for archos recorder target
+ *
+ * \TODO handle F3
+ */
+
+#include "config.h"
+#include "action.h"
+#include "button.h"
+
+#define LAST_ITEM_IN_LIST { ACTION_NONE, BUTTON_NONE, BUTTON_NONE }
+
+struct button_mapping button_context_standard[]  = {
+    { ACTION_STD_PREV,       BUTTON_UP,                  BUTTON_NONE },
+    { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT,    BUTTON_UP },
+    { ACTION_STD_NEXT,       BUTTON_DOWN,                BUTTON_NONE },
+    { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT,  BUTTON_DOWN },
+
+    { ACTION_STD_ACCEPT,     BUTTON_ON,                  BUTTON_NONE },
+    { ACTION_STD_SELECT,     BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_STD_SELECT,     BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
+
+    { ACTION_STD_SELECT,     BUTTON_PLAY|BUTTON_REL,     BUTTON_PLAY },
+    { ACTION_STD_MENU,       BUTTON_F1,                  BUTTON_NONE },
+    { ACTION_STD_QUICKSCREEN,   BUTTON_F2,                  BUTTON_NONE }, 
+    { ACTION_STD_CONTEXT,    BUTTON_PLAY|BUTTON_REPEAT,  BUTTON_PLAY },
+    { ACTION_STD_EXIT,       BUTTON_OFF,                 BUTTON_NONE },
+    { ACTION_STD_CANCEL,     BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_STD_CANCEL,     BUTTON_LEFT|BUTTON_REPEAT,  BUTTON_LEFT },
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping button_context_wps[]  = {
+    { ACTION_WPS_PLAY,        BUTTON_PLAY,                BUTTON_NONE },
+    { ACTION_WPS_SKIPNEXT,    BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_WPS_SKIPPREV,    BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_WPS_SEEKBACK,    BUTTON_LEFT|BUTTON_REPEAT,  BUTTON_LEFT },
+    { ACTION_WPS_SEEKFWD,     BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_LEFT|BUTTON_REL,         BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_RIGHT|BUTTON_REL,         BUTTON_RIGHT|BUTTON_REPEAT },
+    { ACTION_WPS_STOP,        BUTTON_OFF,                 BUTTON_NONE },
+    { ACTION_WPS_VOLDOWN,     BUTTON_DOWN,                BUTTON_NONE },
+    { ACTION_WPS_VOLDOWN,     BUTTON_DOWN|BUTTON_REPEAT,  BUTTON_DOWN },
+    { ACTION_WPS_VOLUP,       BUTTON_UP,                  BUTTON_NONE },
+    { ACTION_WPS_VOLUP,       BUTTON_UP|BUTTON_REPEAT,    BUTTON_UP },
+    { ACTION_WPS_MENU,        BUTTON_F1,                  BUTTON_NONE },
+    { ACTION_WPS_CONTEXT,     BUTTON_PLAY|BUTTON_REPEAT,  BUTTON_PLAY },
+    { ACTION_WPS_QUICKSCREEN, BUTTON_F2,                  BUTTON_NONE },
+    { ACTION_WPS_BROWSE,      BUTTON_ON|BUTTON_REL,       BUTTON_ON   },
+    { ACTION_WPS_ID3SCREEN,   BUTTON_F1|BUTTON_ON,        BUTTON_F1 },
+    { ACTION_WPS_PITCHSCREEN, BUTTON_ON|BUTTON_UP,        BUTTON_ON },
+    { ACTION_WPS_PITCHSCREEN, BUTTON_ON|BUTTON_DOWN,      BUTTON_ON },
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping button_context_settings[] = {
+    { ACTION_SETTINGS_INC,          BUTTON_UP,                  BUTTON_NONE },
+    { ACTION_SETTINGS_INCREPEAT,    BUTTON_UP|BUTTON_REPEAT,    BUTTON_UP },
+    { ACTION_SETTINGS_DEC,          BUTTON_DOWN,                BUTTON_NONE },
+    { ACTION_SETTINGS_DECREPEAT,    BUTTON_DOWN|BUTTON_REPEAT,  BUTTON_DOWN },
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping* get_context_mapping( int context )
+{
+    switch( context )
+    {
+        case CONTEXT_WPS:
+            return button_context_wps;
+
+        case CONTEXT_SETTINGS:
+            return button_context_settings;
+
+        case CONTEXT_STD:
+        case CONTEXT_TREE:
+        case CONTEXT_LIST:
+        case CONTEXT_MAINMENU:
+        default:
+            return button_context_standard;
+    }
+}
Index: apps/keymaps/keymap-x5.c
===================================================================
RCS file: apps/keymaps/keymap-x5.c
diff -N apps/keymaps/keymap-x5.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ apps/keymaps/keymap-x5.c	31 Jul 2006 21:58:06 -0000
@@ -0,0 +1,104 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ *
+ * Copyright (C) 2006 Jonathan Gordon
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/* *
+ * Button Code Definitions for iaudio x5 targets
+ *
+ * \TODO test!
+ */
+
+#include "config.h"
+#include "action.h"
+#include "button.h"
+
+#define LAST_ITEM_IN_LIST { ACTION_NONE, BUTTON_NONE, BUTTON_NONE }
+
+struct button_mapping button_context_standard[]  = {
+    { ACTION_STD_PREV,       BUTTON_UP,                  BUTTON_NONE },
+    { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT,    BUTTON_UP },
+    { ACTION_STD_NEXT,       BUTTON_DOWN,                BUTTON_NONE },
+    { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT,  BUTTON_DOWN },
+    
+    { ACTION_STD_CONTEXT,    BUTTON_SELECT|BUTTON_REPEAT,   BUTTON_SELECT },    
+    { ACTION_STD_CANCEL,     BUTTON_LEFT,                   BUTTON_NONE },
+    { ACTION_STD_SELECT,     BUTTON_RIGHT,                  BUTTON_NONE },
+    { ACTION_STD_SELECT,     BUTTON_SELECT|BUTTON_REL,      BUTTON_SELECT },
+    { ACTION_STD_ACCEPT,     BUTTON_SELECT,                 BUTTON_NONE },
+    { ACTION_STD_MENU,       BUTTON_REC|BUTTON_REL,         BUTTON_REC },
+    { ACTION_STD_QUICKSCREEN,BUTTON_REC|BUTTON_REPEAT,      BUTTON_REC },
+    { ACTION_STD_EXIT,       BUTTON_POWER,                  BUTTON_NONE },
+    { ACTION_STD_WPS,        BUTTON_PLAY,                   BUTTON_NONE },
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping button_context_wps[]  = {
+    { ACTION_WPS_PLAY,      BUTTON_PLAY|BUTTON_REL,                BUTTON_PLAY },
+    { ACTION_WPS_SKIPNEXT,      BUTTON_RIGHT|BUTTON_REL,        BUTTON_RIGHT },
+    { ACTION_WPS_SKIPPREV,      BUTTON_LEFT|BUTTON_REL,         BUTTON_LEFT },
+    { ACTION_WPS_SEEKBACK,      BUTTON_LEFT|BUTTON_REPEAT,      BUTTON_LEFT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_LEFT|BUTTON_REL,         BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_WPS_SEEKFWD,       BUTTON_RIGHT|BUTTON_REPEAT,     BUTTON_RIGHT },
+    { ACTION_WPS_STOPSEEK,      BUTTON_RIGHT|BUTTON_REL,        BUTTON_RIGHT|BUTTON_REPEAT },
+    { ACTION_WPS_STOP,      BUTTON_PLAY|BUTTON_REPEAT,                BUTTON_PLAY },
+    
+    { ACTION_WPS_VOLDOWN,       BUTTON_DOWN,                    BUTTON_NONE },
+    { ACTION_WPS_VOLDOWN,       BUTTON_DOWN|BUTTON_REPEAT,      BUTTON_DOWN },
+    { ACTION_WPS_VOLDOWN,       BUTTON_DOWN|BUTTON_REPEAT,      BUTTON_DOWN|BUTTON_REPEAT },
+    { ACTION_WPS_VOLUP,         BUTTON_UP,                      BUTTON_NONE },
+    { ACTION_WPS_VOLUP,         BUTTON_UP|BUTTON_REPEAT,        BUTTON_UP },
+    { ACTION_WPS_VOLUP,         BUTTON_UP|BUTTON_REPEAT,        BUTTON_UP|BUTTON_REPEAT },
+    
+    { ACTION_WPS_BROWSE,    BUTTON_SELECT|BUTTON_REL,     BUTTON_SELECT },
+    { ACTION_WPS_MENU,      BUTTON_REC|BUTTON_REL,         BUTTON_REC },
+    { ACTION_WPS_CONTEXT,   BUTTON_SELECT|BUTTON_REPEAT,  BUTTON_SELECT },
+    { ACTION_WPS_QUICKSCREEN,BUTTON_REC|BUTTON_REPEAT,        BUTTON_REC },
+    
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping button_context_settings[] = {
+    { ACTION_SETTINGS_INC,          BUTTON_UP,                  BUTTON_NONE },
+    { ACTION_SETTINGS_INCREPEAT,    BUTTON_UP|BUTTON_REPEAT,    BUTTON_NONE },
+    { ACTION_SETTINGS_DEC,          BUTTON_DOWN,                BUTTON_NONE },
+    { ACTION_SETTINGS_DECREPEAT,    BUTTON_DOWN|BUTTON_REPEAT,  BUTTON_NONE },
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping* get_context_mapping( int context )
+{
+    switch( context )
+    {
+        case CONTEXT_STD:
+            return button_context_standard;
+            
+        case CONTEXT_WPS:
+            return button_context_wps;
+
+        case CONTEXT_SETTINGS:
+            return button_context_settings;
+
+        case CONTEXT_TREE:
+        case CONTEXT_LIST:
+        case CONTEXT_MAINMENU:
+        default:
+            return button_context_standard;
+    }
+}
Index: apps/recorder/radio.c
===================================================================
RCS file: /cvsroot/rockbox/apps/recorder/radio.c,v
retrieving revision 1.101
diff -u -u -r1.101 radio.c
--- apps/recorder/radio.c	25 Jul 2006 12:51:33 -0000	1.101
+++ apps/recorder/radio.c	31 Jul 2006 21:58:07 -0000
@@ -1359,6 +1359,7 @@
 int handle_radio_presets_cb(int key, int m)
 {
     (void)m;
+#if 0 /* this screen needs fixing! */
     switch(key)
     {
 #ifdef FM_PRESET_ADD
@@ -1372,7 +1373,7 @@
 #ifdef FM_PRESET
         case FM_PRESET:
             menu_draw(m);
-            key = MENU_EXIT; /* Fake an exit */
+            key = ACTION_STD_EXIT; /* Fake an exit */
             break;
 #endif
 #endif
@@ -1409,21 +1410,11 @@
         case MENU_ENTER2 | BUTTON_REL:
 #endif
         case MENU_ENTER | BUTTON_REL:
-            key = MENU_ENTER; /* fake enter for short press */
+            key = ACTION_STD_SELECT; /* fake enter for short press */
             break;
             
 /* ignore down events */
-#ifdef MENU_RC_ENTER
-        case MENU_RC_ENTER:
-#endif
-#ifdef MENU_RC_ENTER2
-        case MENU_RC_ENTER2:
-#endif
-
-#ifdef MENU_ENTER2
-        case MENU_ENTER2:
-#endif
-        case MENU_ENTER: 
+        case ACTION_STD_SELECT: 
             /* Ignore the release events */
 #ifdef FM_PRESET_ADD
         case FM_PRESET_ADD | BUTTON_REL:
@@ -1434,6 +1425,7 @@
             key = BUTTON_NONE;
             break;
     }
+#endif    
     return key;
 }
 
@@ -1611,6 +1603,7 @@
 int radio_menu_cb(int key, int m)
 {
     (void)m;
+#if 0 /* this screen needs fixing! */
     switch(key)
     {
 #if (CONFIG_KEYPAD != IRIVER_H100_PAD) && (CONFIG_KEYPAD != IRIVER_H300_PAD) && (CONFIG_KEYPAD != IAUDIO_X5_PAD)
@@ -1631,7 +1624,7 @@
         key = MENU_ENTER; /* fake downpress, next menu doesn't like release */
         break;
     }
-
+#endif
     return key;
 }
 
