? actions.diff
? h300
? tools/codepages
? tools/mkboot
? tools/rdf2binary
Index: apps/SOURCES
===================================================================
RCS file: /cvsroot/rockbox/apps/SOURCES,v
retrieving revision 1.46
diff -u -r1.46 SOURCES
--- apps/SOURCES	15 Aug 2006 08:14:45 -0000	1.46
+++ apps/SOURCES	15 Aug 2006 09:23:04 -0000
@@ -1,6 +1,7 @@
 #ifdef ROCKBOX_HAS_LOGF
 logfdisp.c
 #endif
+action.c
 alarm_menu.c
 abrepeat.c
 bookmark.c
@@ -81,3 +82,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	15 Aug 2006 09:23:04 -0000
@@ -0,0 +1,215 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   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;
+int soft_unlock_action = ACTION_NONE;
+bool allow_remote_actions = true;
+/*
+ * do_button_check is the worker function for get_default_action.
+ * returns ACTION_UNKNOWN or the requested return value from the list.
+ */
+inline int do_button_check(struct button_mapping *items, 
+                           int button, int last_button, int *start)
+{
+    int i = 0;
+    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;
+}
+
+inline int get_next_context(struct button_mapping *items, int i)
+{
+    while (items[i].button_code != BUTTON_NONE)
+        i++;
+    return (items[i].action_code == ACTION_NONE ) ? 
+            CONTEXT_STD : 
+            items[i].action_code;
+}
+/*
+ * 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..
+        the last item in the list "points" to the next context in a chain
+        so the "chain" is followed until the button is found.
+        putting ACTION_NONE will get CONTEXT_STD which is always the last list checked.
+        
+   Timeout can be TIMEOUT_NOBLOCK to return immediatly
+                  TIMEOUT_BLOCK   to wait for a button press
+                  Any number >0   to wait that many ticks for a press
+                  
+ */
+int get_action_worker(int context, int timeout,
+                      struct button_mapping* (*get_context_map)(int) )
+{
+    struct button_mapping *items = NULL;
+    int button;
+    int i=0;
+    int ret = ACTION_UNKNOWN;
+    if (timeout == TIMEOUT_NOBLOCK)
+        button = button_get(false);
+    else if  (timeout == TIMEOUT_BLOCK)
+        button = button_get(true);
+    else
+        button = button_get_w_tmo(timeout);
+
+    
+    if (button == BUTTON_NONE || button&SYS_EVENT)
+    {
+        return button;
+    }
+    
+    if (ignore_until_release == true)
+    {
+        if (button&BUTTON_REL)
+        {
+            ignore_until_release = false;
+        }
+        /*last_button = BUTTON_NONE; this is done by action_signalscreenchange() */
+        return ACTION_UNKNOWN; /* "safest" return value */
+    }
+    
+    if (soft_unlock_action != ACTION_NONE)
+    {
+        if ((button&BUTTON_REMOTE) && !allow_remote_actions)
+            return ACTION_NONE;
+    }
+    /*   logf("%x,%x",last_button,button); */
+    do 
+    {
+        /*     logf("context = %x",context); */
+#if (BUTTON_REMOTE != 0)
+        if (button&BUTTON_REMOTE)
+            context |= CONTEXT_REMOTE;
+#endif
+        if ((context&CONTEXT_CUSTOM) && get_context_map)
+            items = get_context_map(context);
+        else
+            items = get_context_mapping(context);
+        
+        ret = do_button_check(items,button,last_button,&i);
+        
+        if ((context == CONTEXT_STD)
+#if (BUTTON_REMOTE != 0)
+             || ((unsigned)context == (CONTEXT_STD|CONTEXT_REMOTE))
+#endif
+           ) break;
+        
+        if (ret == ACTION_UNKNOWN )
+        {
+            context = get_next_context(items,i);
+            i = 0;
+        }
+        else break;
+    } while (1);
+    /* DEBUGF("ret = %x\n",ret); */
+    
+    if (soft_unlock_action != ACTION_NONE)
+    {
+        if ((button&BUTTON_REMOTE) == 0)
+        {
+            if (soft_unlock_action == ret)
+            {
+                soft_unlock_action = ACTION_NONE;
+                ret = ACTION_NONE; /* no need to return the code */
+            }
+        }
+        else if (!allow_remote_actions)
+            ret = ACTION_NONE;
+    }
+    
+    last_button = button;
+    return ret;
+}
+
+int get_action(int context, int timeout)
+{
+    return get_action_worker(context,timeout,NULL);
+}
+
+int get_custom_action(int context,int timeout,
+                      struct button_mapping* (*get_context_map)(int))
+{
+    return get_action_worker(context,timeout,get_context_map);
+}
+
+bool action_userabort(int timeout)
+{
+    action_signalscreenchange();
+    int action = get_action_worker(CONTEXT_STD,timeout,NULL);
+    bool ret = (action == ACTION_STD_CANCEL);
+    action_signalscreenchange();
+    return ret;
+}
+
+void action_signalscreenchange(void)
+{
+    if ((last_button != BUTTON_NONE) && 
+         !(last_button&BUTTON_REL))
+    {
+        ignore_until_release = true;
+    }
+    last_button = BUTTON_NONE;
+}
+
+void action_setsoftwarekeylock(int unlock_action, bool allow_remote)
+{
+    soft_unlock_action = unlock_action;
+    allow_remote_actions = allow_remote;
+    last_button = BUTTON_NONE;
+}
Index: apps/action.h
===================================================================
RCS file: /cvsroot/rockbox/apps/action.h,v
retrieving revision 1.3
diff -u -r1.3 action.h
--- apps/action.h	23 Jun 2005 01:31:25 -0000	1.3
+++ apps/action.h	15 Aug 2006 09:23:04 -0000
@@ -19,11 +19,147 @@
 #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 LAST_ITEM_IN_LIST { ACTION_NONE, BUTTON_NONE, BUTTON_NONE }
+#define LAST_ITEM_IN_LIST__NEXTLIST(a) { a, BUTTON_NONE, BUTTON_NONE }
+
+#define TIMEOUT_BLOCK   -1
+#define TIMEOUT_NOBLOCK  0
+#define CONTEXT_REMOTE 0x80000000 /* | this against another context to get remote buttons for that context */
+#define CONTEXT_CUSTOM 0x40000000 /* | this against anything to get your context number */
+
+enum {
+    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, /* options style settings, like from menus */
+    CONTEXT_SETTINGSGRAPHICAL, /* screens like eq config and colour chooser */
+    
+    CONTEXT_YESNOSCREEN, /*NOTE: make sure your target has this and ACTION_YESNO_ACCEPT */
+    CONTEXT_BOOKMARKSCREEN, /*NOTE: requires the action_setting_* mappings also */
+    CONTEXT_QUICKSCREEN, /* uses ACTION_QS_ defines below */
+};
+
+
+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_OK,
+    ACTION_STD_CANCEL,
+    ACTION_STD_CONTEXT,
+    ACTION_STD_MENU,
+    ACTION_STD_QUICKSCREEN,
+    ACTION_STD_KEYLOCK, /* software keylock in wps screen, very optional
+                           use with action_setsoftwarekeylock */
+    
+    
+    /* 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 */
+    /* following code are for AB mode in wps, 
+       only needed if defined(AB_REPEAT_ENABLE) */
+    ACTION_WPSAB_SINGLE, /* No targets use this, but leave n just-in-case! */
+    ACTION_WPSAB_SETA,   /* either #define WPS_AB_SHARE_DIR_BUTTONS        */
+    ACTION_WPSAB_SETB,   /* OR implement ACTION_WPSAB_SET[AB]              */
+    ACTION_WPSAB_RESET,
+    
+    /* list and tree page up/down */    
+    ACTION_LISTTREE_PGUP,/* optional */
+    ACTION_LISTTREE_PGDOWN,/* optional */
+    ACTION_LISTTREE_RC_PGUP,/* optional */
+    ACTION_LISTTREE_RC_PGDOWN,/* optional */
+    
+    /* tree */ 
+    ACTION_TREE_PGLEFT,/* optional */
+    ACTION_TREE_PGRIGHT,/* optional */
+    ACTION_TREE_STOP,
+    ACTION_TREE_WPS,
+    
+    /* recording screen */
+    
+    /* main menu */
+    
+    /* id3db */
+    
+    /* list */
+    
+    /* settings */
+    ACTION_SETTINGS_INC,
+    ACTION_SETTINGS_INCREPEAT,
+    ACTION_SETTINGS_DEC,
+    ACTION_SETTINGS_DECREPEAT,
+    
+    /* yesno screen */
+    ACTION_YESNO_ACCEPT,
+    
+    /* bookmark screen */
+    ACTION_BMARK_DELETE,
+    
+    /* quickscreen */
+    ACTION_QS_LEFT,
+    ACTION_QS_RIGHT,
+    ACTION_QS_DOWN,
+    ACTION_QS_DOWNINV, /* why is this not called up?? :p */
+    
+};
+
+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 */
+/* get_context_map is a function which returns a button_mapping* depedning on the given context */
+/* custom button_mappings may "chain" to inbuilt CONTEXT's */
+int get_custom_action(int context,int timeout,
+                      struct button_mapping* (*get_context_map)(int));
+/* 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_CANCEL only (i.e user abort! */
+bool action_userabort(int timeout);
+
+/* on targets without hardware keylock, use this to to emulate keylock.
+   unlock_action is the action which will disaable the keylock
+   allow_remote should be true if you want the remote buttons to still be usable while locked */
+void action_setsoftwarekeylock(int unlock_action, bool allow_remote);
+
+/* 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 -r1.11 alarm_menu.c
--- apps/alarm_menu.c	20 Nov 2005 01:02:14 -0000	1.11
+++ apps/alarm_menu.c	15 Aug 2006 09:23:05 -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_OK:
             /* 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_CANCEL:
             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 -r1.50 bookmark.c
--- apps/bookmark.c	18 Jul 2006 19:11:56 -0000	1.50
+++ apps/bookmark.c	15 Aug 2006 09:23:06 -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_OK:
                     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_BOOKMARKSCREEN,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_OK:
                 /* User wants to use this bookmark */
 #ifdef HAVE_LCD_BITMAP
                 if (global_settings.statusbar)
@@ -645,11 +632,10 @@
                         screens[i].setmargins(0, 0);
                 }
 #endif
+                action_signalscreenchange();
                 return bookmark;
-#ifdef BOOKMARK_RC_DELETE
-            case BOOKMARK_RC_DELETE:
-#endif
-            case BOOKMARK_DELETE:
+
+            case ACTION_BMARK_DELETE:
                 /* User wants to delete this bookmark */
                 delete_bookmark(bookmark_file_name, bookmark_id);
                 bookmark_id_prev=-2;
@@ -658,54 +644,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.13
diff -u -r1.13 bookmark.h
--- apps/bookmark.h	3 Aug 2006 20:17:12 -0000	1.13
+++ apps/bookmark.h	15 Aug 2006 09:23:06 -0000
@@ -21,54 +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
-
-#elif CONFIG_KEYPAD == IRIVER_H10_PAD
-#define BOOKMARK_SELECT BUTTON_PLAY
-#define BOOKMARK_DELETE (BUTTON_FF | BUTTON_REPEAT)
-#define BOOKMARK_DOWN BUTTON_SCROLL_DOWN
-
-#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.192
diff -u -r1.192 debug_menu.c
--- apps/debug_menu.c	11 Aug 2006 17:39:34 -0000	1.192
+++ apps/debug_menu.c	15 Aug 2006 09:23:09 -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"
@@ -86,7 +86,6 @@
 bool dbg_os(void)
 {
     char buf[32];
-    int button;
     int i;
     int usage;
 
@@ -106,13 +105,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;
 }
@@ -134,20 +128,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_CANCEL:
+            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;
@@ -163,7 +158,6 @@
 bool dbg_audio_thread(void)
 {
     char buf[32];
-    int button;
     struct audio_debug d;
 
     lcd_setmargins(0, 0);
@@ -171,12 +165,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);
         
@@ -242,23 +232,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_CANCEL:
                 done = true;
                 break;
         }
-
+        action_signalscreenchange();
         line = 0;
         
         lcd_clear_display();
@@ -406,7 +395,6 @@
 {
 #if CONFIG_CPU == SH7034
     char buf[32];
-    int button;
     int usb_polarity;
     int pr_polarity;
     int bitmask = *(unsigned short*)0x20000fc;
@@ -494,13 +482,11 @@
 
     while(1)
     {
-        button = button_get(true);
-        if(button == SETTINGS_CANCEL)
+        if (action_userabort(TIMEOUT_BLOCK))
             return false;
     }
 #elif CONFIG_CPU == MCF5249 || CONFIG_CPU == MCF5250
     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 */
@@ -530,13 +516,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);
@@ -551,8 +535,7 @@
 
     while(1)
     {
-        button = button_get(true);
-        if(button == SETTINGS_CANCEL)
+        if (action_userabort(TIMEOUT_BLOCK))
             return false;
     }
 #endif /* CONFIG_CPU */
@@ -641,20 +624,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;
@@ -688,21 +672,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_CANCEL:
+                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;
@@ -874,13 +858,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);
@@ -940,13 +919,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;
@@ -962,7 +936,6 @@
     int adc_remotedetect;
 #endif
     char buf[128];
-    int button;
     int line;
     int battery_voltage;
     int batt_int, batt_frac;
@@ -1033,13 +1006,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
@@ -1049,7 +1017,6 @@
     unsigned int gpio_i, gpio_j, gpio_k, gpio_l;
 
     char buf[128];
-    int button;
     int line;
 
     lcd_setmargins(0, 0);
@@ -1091,13 +1058,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 */
@@ -1170,20 +1132,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_CANCEL:
+            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;
@@ -1219,43 +1182,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_OK:
+                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_CANCEL:
+                action_signalscreenchange();
+                return false;
         }
     }
 
@@ -1428,20 +1373,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_CANCEL:
+                action_signalscreenchange();
                 return false;
         }
     }
@@ -1498,41 +1443,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_CANCEL:
                 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_OK:
                 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_OK ) {
                         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;
 }
 
@@ -1548,7 +1492,7 @@
     static const unsigned char i_vmin[] = { 0, 1, 5, 10, 25, 35, 60, 100 };
     static const unsigned char i_vmax[] = { 1, 5, 10, 25, 35, 45, 80, 200 };
     static const unsigned char *kbit_units[] = { "kBit/s", "MBit/s", "GBit/s" };
-    static const unsigned char *nsec_units[] = { "ns", "µs", "ms" };
+    static const unsigned char *nsec_units[] = { "ns", "s", "ms" };
     
     card_name[6] = '\0';
 
@@ -1620,27 +1564,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_CANCEL:
                 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 */
@@ -1781,26 +1724,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_CANCEL:
                 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 */
@@ -1849,13 +1791,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;
@@ -1900,13 +1837,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;
@@ -1979,7 +1911,6 @@
 bool dbg_fm_radio(void)
 {
     char buf[32];
-    int button;
     bool fm_detected;
 
 #ifdef HAVE_LCD_BITMAP
@@ -2010,13 +1941,8 @@
 
         lcd_update();
         
-        button = button_get_w_tmo(HZ);
-
-        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.21
diff -u -r1.21 eq_menu.c
--- apps/eq_menu.c	14 Aug 2006 10:52:05 -0000	1.21
+++ apps/eq_menu.c	15 Aug 2006 09:23:09 -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"
@@ -49,73 +49,6 @@
 #include "wm8758.h"
 #endif
 
-/* 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
-
-#elif CONFIG_KEYPAD == IRIVER_H10_PAD
-
-#define EQ_BTN_DECREMENT    BUTTON_LEFT
-#define EQ_BTN_INCREMENT    BUTTON_RIGHT
-#define EQ_BTN_NEXT_BAND    BUTTON_SCROLL_DOWN
-#define EQ_BTN_PREV_BAND    BUTTON_SCROLL_UP
-#define EQ_BTN_CHANGE_MODE  BUTTON_PLAY
-#define EQ_BTN_EXIT         BUTTON_POWER
-
-#endif
-
 /* Various user interface limits and sizes */
 #define EQ_CUTOFF_MIN        20
 #define EQ_CUTOFF_MAX     22040
@@ -686,27 +619,19 @@
             screens[i].update();
         }
         
-        button = button_get(true);
+        button = get_action(CONTEXT_SETTINGSGRAPHICAL,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)
@@ -731,45 +656,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_OK:
             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_CANCEL:
             exit_request = true;
             result = false;
             break;
@@ -789,6 +696,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 -r1.10 logfdisp.c
--- apps/logfdisp.c	18 Jul 2006 16:03:36 -0000	1.10
+++ apps/logfdisp.c	15 Aug 2006 09:23:09 -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)
 
@@ -46,7 +38,6 @@
     int lines;
     int columns;
     int i;
-    int button;
 
     bool lcd = false; /* fixed atm */
     int index;
@@ -93,8 +84,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.185
diff -u -r1.185 main.c
--- apps/main.c	12 Aug 2006 15:18:25 -0000	1.185
+++ apps/main.c	15 Aug 2006 09:23:10 -0000
@@ -365,7 +365,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 -r1.152 main_menu.c
--- apps/main_menu.c	3 Jul 2006 22:32:23 -0000	1.152
+++ apps/main_menu.c	15 Aug 2006 09:23:10 -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_CANCEL:
                 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_OK:
                 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.103
diff -u -r1.103 menu.c
--- apps/menu.c	12 Aug 2006 13:40:48 -0000	1.103
+++ apps/menu.c	15 Aug 2006 09:23:10 -0000
@@ -40,6 +40,7 @@
 #include "talk.h"
 #include "lang.h"
 #include "misc.h"
+#include "action.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "icons.h"
@@ -124,13 +125,12 @@
 #endif
     bool exit = false;
     int key;
-    unsigned lastbutton = 0;
 
     gui_synclist_draw(&(menus[m].synclist));
     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
@@ -144,40 +144,13 @@
         if(gui_synclist_do_button(&(menus[m].synclist), key))
             menu_talk_selected(m);
         switch( key ) {
-            case MENU_ENTER | BUTTON_REL:
-                if (lastbutton != MENU_ENTER)
-                    break;
-#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_OK:
+                action_signalscreenchange();
                 return gui_synclist_get_sel_pos(&(menus[m].synclist));
 
 
-            case MENU_EXIT | BUTTON_REL:
-                if (lastbutton != MENU_EXIT)
-                    break;
-#ifdef MENU_EXIT2
-            case MENU_EXIT2:
-#endif
-#ifdef MENU_EXIT_MENU
-            case MENU_EXIT_MENU | BUTTON_REL:
-                /* This is important for the Ondio's */
-                if ((key == (MENU_EXIT_MENU | BUTTON_REL)) &&
-                    (lastbutton != MENU_EXIT_MENU))
-                    break;
-#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_MENU:
                 exit = true;
                 break;
 
@@ -187,9 +160,8 @@
                 break;
         }
         gui_syncstatusbar_draw(&statusbars, false);
-        if ( key )
-            lastbutton = key;
     }
+    action_signalscreenchange();
     return MENU_SELECTED_EXIT;
 }
 
Index: apps/onplay.c
===================================================================
RCS file: /cvsroot/rockbox/apps/onplay.c,v
retrieving revision 1.85
diff -u -r1.85 onplay.c
--- apps/onplay.c	12 Aug 2006 11:00:37 -0000	1.85
+++ apps/onplay.c	15 Aug 2006 09:23:11 -0000
@@ -815,11 +815,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.34
diff -u -r1.34 playback.h
--- apps/playback.h	13 Aug 2006 09:19:24 -0000	1.34
+++ apps/playback.h	15 Aug 2006 09:23:11 -0000
@@ -67,9 +67,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.166
diff -u -r1.166 playlist.c
--- apps/playlist.c	12 Aug 2006 11:00:37 -0000	1.166
+++ apps/playlist.c	15 Aug 2006 09:23:15 -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;
@@ -1888,7 +1889,7 @@
                                str(LANG_OFF_ABORT)
 #endif
                                );
-                if (SETTINGS_CANCEL == button_get(false))
+                if (action_userabort(TIMEOUT_NOBLOCK))
                 {
                     /* FIXME: 
                      * Not sure how to implement this, somebody more familiar
@@ -2870,7 +2871,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')
@@ -3281,7 +3282,7 @@
         int seek;
 
         /* user abort */
-        if (button_get(false) == SETTINGS_CANCEL)
+        if (action_userabort(TIMEOUT_NOBLOCK))
         {
             result = -1;
             break;
@@ -3408,7 +3409,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 -r1.1 playlist_catalog.c
--- apps/playlist_catalog.c	18 Jul 2006 13:54:12 -0000	1.1
+++ apps/playlist_catalog.c	15 Aug 2006 09:23:15 -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_CANCEL:
                 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_OK:
                 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.52
diff -u -r1.52 playlist_viewer.c
--- apps/playlist_viewer.c	12 Aug 2006 13:40:48 -0000	1.52
+++ apps/playlist_viewer.c	15 Aug 2006 09:23:18 -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
@@ -614,7 +615,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;
@@ -661,7 +662,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 )
         {
@@ -669,7 +670,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
@@ -677,36 +678,11 @@
         }
         switch (button)
         {
-            case TREE_EXIT | BUTTON_REL:
-                if (lastbutton != TREE_EXIT)
-                    break;
-#ifdef TREE_RC_EXIT
-            case TREE_RC_EXIT:
-#endif
-#ifdef TREE_OFF
-            case TREE_OFF:
-#endif
+            case ACTION_STD_CANCEL:
                 exit = true;
                 break;
-
-#ifdef TREE_ENTER
-            case TREE_ENTER | BUTTON_REL:
-                if (lastbutton != TREE_ENTER)
-                    break;
-#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_OK:
+            {
                 struct playlist_entry * current_track =
                     playlist_buffer_get_track(&viewer.buffer,
                     viewer.selected_track);
@@ -744,14 +720,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;
@@ -774,14 +744,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;
@@ -795,7 +758,7 @@
                 gui_synclist_draw(&playlist_lists);
                 break;
 
-            case BUTTON_NONE:
+            case ACTION_NONE:
                 gui_syncstatusbar_draw(&statusbars, false);
                 break;
 
@@ -807,12 +770,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)
@@ -860,7 +823,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))
@@ -883,35 +846,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_CANCEL:
                 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_OK:
                 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)
@@ -922,6 +872,7 @@
                 break;
         }
     }
+    action_signalscreenchange();
     return ret;
 }
 
Index: apps/plugin.c
===================================================================
RCS file: /cvsroot/rockbox/apps/plugin.c,v
retrieving revision 1.180
diff -u -r1.180 plugin.c
--- apps/plugin.c	11 Aug 2006 14:10:34 -0000	1.180
+++ apps/plugin.c	15 Aug 2006 09:23:18 -0000
@@ -468,6 +468,11 @@
 #endif
 
     PREFIX(rmdir),
+    /* 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.190
diff -u -r1.190 plugin.h
--- apps/plugin.h	11 Aug 2006 14:10:34 -0000	1.190
+++ apps/plugin.h	15 Aug 2006 09:23:18 -0000
@@ -7,7 +7,7 @@
  *                     \/            \/     \/    \/            \/
  * $Id: plugin.h,v 1.190 2006-08-11 14:10:34 raenye Exp $
  *
- * Copyright (C) 2002 Björn Stenberg
+ * Copyright (C) 2002 Bjï¿½n Stenberg
  *
  * 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.
@@ -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"
@@ -104,7 +105,7 @@
 #define PLUGIN_MAGIC 0x526F634B /* RocK */
 
 /* increase this every time the api struct changes */
-#define PLUGIN_API_VERSION 28
+#define PLUGIN_API_VERSION 29
 
 /* update this to latest version if a change to the api struct breaks
    backwards compatibility (and please take the opportunity to sort in any
@@ -546,6 +547,12 @@
 #endif
 
     int (*PREFIX(rmdir))(const char *name);
+    /* action handling */
+    int (*get_custom_action)(int context,int timeout,
+                          struct button_mapping* (*get_context_map)(int));
+    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.160
diff -u -r1.160 screens.c
--- apps/screens.c	7 Aug 2006 21:24:19 -0000	1.160
+++ apps/screens.c	15 Aug 2006 09:23:19 -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,11 +309,7 @@
    2 if Off/Stop key was pressed
    3 if On key was pressed
    4 if USB was connected */
-#if (CONFIG_KEYPAD==IPOD_3G_PAD) || (CONFIG_KEYPAD==IPOD_4G_PAD)
-# define CHARGE_SCREEN_RESUME BUTTON_SELECT
-#else
-# define CHARGE_SCREEN_RESUME BUTTON_ON
-#endif
+   
 int charging_screen(void)
 {
     unsigned int button;
@@ -338,8 +334,8 @@
     {
         gui_syncstatusbar_draw(&statusbars, false);
         charging_display_info(true);
-        button = button_get_w_tmo(HZ/3);
-        if (button == CHARGE_SCREEN_RESUME)
+        button = get_action(CONTEXT_STD,HZ/3);
+        if (button == ACTION_STD_OK)
             rc = 2;
         else if (usb_detect())
             rc = 3;
@@ -350,6 +346,7 @@
 #ifdef HAVE_LCD_CHARCELLS
     logo_lock_patterns(false);
 #endif
+    action_signalscreenchange();
     return rc;
 }
 #endif /* CONFIG_CHARGING && !HAVE_POWEROFF_WHILE_CHARGING */
@@ -423,15 +420,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 +436,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 +450,7 @@
                 sound_set_pitch(pitch);
                 break;
 
-            case PITCH_RIGHT:
+            case ACTION_STD_NEXT:
                 if ( pitch < 1980 )
                 {
                     pitch += 20;
@@ -461,15 +458,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 +471,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_OK:
                 pitch = 1000;
                 sound_set_pitch( pitch );
                 break;
 
-            case PITCH_EXIT:
+            case ACTION_STD_CANCEL:
                 exit = true;
                 break;
 
@@ -504,6 +495,7 @@
     pcmbuf_set_low_latency(false);
 #endif
     lcd_setfont(FONT_UI);
+    action_signalscreenchange();
     return 0;
 }
 #endif
@@ -923,24 +915,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 +938,11 @@
                 say_time(cursorpos, tm);
                 break;
 
-            case SETTINGS_ACCEPT:
+            case ACTION_STD_OK:
                 done = true;
                 break;
 
-            case SETTINGS_CANCEL:
+            case ACTION_STD_CANCEL:
                 done = true;
                 tm->tm_year = -1;
                 break;
@@ -963,7 +953,7 @@
                 break;
         }
     }
-
+    action_signalscreenchange();
     lcd_set_drawmode(lastmode);
     return false;
 }
@@ -981,10 +971,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_CANCEL:
                 sys_poweroff();
                 break;
 
@@ -998,11 +988,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 +1116,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 +1143,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 +1170,6 @@
                 break;
         }
     }
+    action_signalscreenchange();
     return false;
 }
Index: apps/screens.h
===================================================================
RCS file: /cvsroot/rockbox/apps/screens.h,v
retrieving revision 1.29
diff -u -r1.29 screens.h
--- apps/screens.h	3 Aug 2006 20:17:14 -0000	1.29
+++ apps/screens.h	15 Aug 2006 09:23:19 -0000
@@ -22,51 +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
-#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
-#define PITCH_UP BUTTON_SCROLL_UP
-#define PITCH_DOWN BUTTON_SCROLL_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.404
diff -u -r1.404 settings.c
--- apps/settings.c	15 Aug 2006 08:14:45 -0000	1.404
+++ apps/settings.c	15 Aug 2006 09:23:21 -0000
@@ -24,7 +24,7 @@
 #include "config.h"
 #include "kernel.h"
 #include "thread.h"
-#include "button.h"
+#include "action.h"
 #include "settings.h"
 #include "disk.h"
 #include "panic.h"
@@ -612,6 +612,7 @@
     {2, S_O(eq_hw_band4_cutoff), 1, "eq hardware band 4 cutoff", "5.3kHz,6.9kHz,9kHz,11.7kHz" },
     {5|SIGNED, S_O(eq_hw_band4_gain), 12, "eq hardware band 4 gain", NULL },
 #endif
+    {1, S_O(hold_lr_for_scroll_in_list), true, "hold_lr_for_scroll_in_list", off_on },
 
     /* If values are just added to the end, no need to bump the version. */
     /* new stuff to be added at the end */
@@ -1797,7 +1798,7 @@
 #ifdef HAVE_LCD_BITMAP
     global_settings.kbd_file[0] = '\0';
 #endif
-
+    global_settings.hold_lr_for_scroll_in_list = true;
 }
 
 bool set_bool(const char* string, bool* variable )
@@ -1889,7 +1890,7 @@
                     struct value_setting_data *cb_data,
                     void (*function)(int))
 {
-    int button;
+    int action;
     bool done = false;
     struct gui_synclist lists;
     int oldvalue;
@@ -1916,11 +1917,11 @@
     while (!done)
     {
         
-        button = button_get(true);
-        if (button == BUTTON_NONE)
+        action = get_action(CONTEXT_LIST,TIMEOUT_BLOCK); 
+        if (action == ACTION_NONE)
             continue;
         
-        if (gui_synclist_do_button(&lists,button))
+        if (gui_synclist_do_button(&lists,action))
         {
             if (global_settings.talk_menu)
             {
@@ -1944,7 +1945,7 @@
                 *(bool*)variable = gui_synclist_get_sel_pos(&lists) ? true : false;
             else *(int*)variable = gui_synclist_get_sel_pos(&lists);
         }  
-        else if (button == SETTINGS_CANCEL)
+        else if (action == ACTION_STD_CANCEL)
         {
             gui_syncsplash(HZ/2,true,str(LANG_MENU_SETTING_CANCEL));
             if (cb_data->type == INT)
@@ -1952,11 +1953,11 @@
             else *(bool*)variable = (bool)oldvalue;
             done = true;
         }
-        else if (button == SETTINGS_OK)
+        else if (action == ACTION_STD_OK)
         {
             done = true;
         }
-        else if(default_event_handler(button) == SYS_USB_CONNECTED)
+        else if(default_event_handler(action) == SYS_USB_CONNECTED)
             return true;
         gui_syncstatusbar_draw(&statusbars, false);
         if ( function )
Index: apps/settings.h
===================================================================
RCS file: /cvsroot/rockbox/apps/settings.h,v
retrieving revision 1.230
diff -u -r1.230 settings.h
--- apps/settings.h	14 Aug 2006 10:52:05 -0000	1.230
+++ apps/settings.h	15 Aug 2006 09:23:22 -0000
@@ -45,115 +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
-
-#elif CONFIG_KEYPAD == IRIVER_H10_PAD
-#define SETTINGS_INC     BUTTON_SCROLL_UP
-#define SETTINGS_DEC     BUTTON_SCROLL_DOWN
-#define SETTINGS_OK      BUTTON_PLAY
-#define SETTINGS_OK2     BUTTON_LEFT
-#define SETTINGS_CANCEL  BUTTON_REW
-#define SETTINGS_PREV    BUTTON_LEFT
-#define SETTINGS_NEXT    BUTTON_RIGHT
-#define SETTINGS_ACCEPT  BUTTON_FF
-
-#endif
-
 /* data structures */
 
 #define BOOKMARK_NO  0
@@ -564,6 +455,7 @@
     int eq_hw_band4_cutoff;
     int eq_hw_band4_gain;
 #endif
+    bool hold_lr_for_scroll_in_list; /* hold L/R scrolls the list left/right */
 };
 
 enum optiontype { INT, BOOL };
Index: apps/tagtree.c
===================================================================
RCS file: /cvsroot/rockbox/apps/tagtree.c,v
retrieving revision 1.28
diff -u -r1.28 tagtree.c
--- apps/tagtree.c	14 Aug 2006 19:03:37 -0000	1.28
+++ apps/tagtree.c	15 Aug 2006 09:23:23 -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"
@@ -539,7 +540,7 @@
                        str(LANG_OFF_ABORT)
 #endif
                        );
-        if (SETTINGS_CANCEL == button_get(false))
+        if (action_userabort(TIMEOUT_NOBLOCK))
             return false;
         last_tick = current_tick;
         yield();
Index: apps/tree.c
===================================================================
RCS file: /cvsroot/rockbox/apps/tree.c,v
retrieving revision 1.425
diff -u -r1.425 tree.c
--- apps/tree.c	14 Aug 2006 18:19:56 -0000	1.425
+++ apps/tree.c	15 Aug 2006 09:23:24 -0000
@@ -72,6 +72,7 @@
 #include "splash.h"
 #include "buttonbar.h"
 #include "textarea.h"
+#include "action.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "widgets.h"
@@ -582,28 +583,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 | BUTTON_REL:
-                if (lastbutton != TREE_ENTER)
-                    break;
-#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_OK:
                 /* nothing to do if no files to display */
                 if ( numentries == 0 )
                     break;
@@ -618,31 +602,27 @@
                 restore = true;
                 break;
 
-            case TREE_EXIT | BUTTON_REL:
-                if (lastbutton != TREE_EXIT)
-                    break;
-#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;
                 }
-                /* if we are in /, nothing to do */
-                if (tc.dirlevel == 0 && !strcmp(currdir,"/"))
+                /* if we are in /, stop playback 
+                    (skip this and fall into tree_stop)*/
+                if (tc.dirlevel != 0 || strcmp(currdir,"/"))
+                {
+                    if (id3db)
+                        tagtree_exit(&tc);
+                    else
+                        if (ft_exit(&tc) == 3)
+                            exit_func = true;
+    
+                    restore = true;
                     break;
+                }
+                /* else fall through */
 
-                if (id3db)
-                    tagtree_exit(&tc);
-                else
-                    if (ft_exit(&tc) == 3)
-                        exit_func = true;
-
-                restore = true;
-                break;
-
-#ifdef TREE_OFF
-            case TREE_OFF:
+            case ACTION_TREE_STOP:
                 if (*tc.dirfilter < NUM_FILTER_MODES)
                 {
                     /* Stop the music if it is playing */
@@ -668,6 +648,7 @@
 #endif
                 }
                 break;
+                /* ??
 #if defined(CONFIG_CHARGING) && !defined(HAVE_POWEROFF_WHILE_CHARGING)
             case TREE_OFF | BUTTON_REPEAT:
                 if (charger_inserted()) {
@@ -676,25 +657,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;
@@ -707,18 +678,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_TREE_WPS:
                 /* don't enter wps from plugin browser etc */
                 if (*tc.dirfilter < NUM_FILTER_MODES)
                 {
@@ -733,12 +693,8 @@
                     }
                 }
                 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)
                 {
@@ -751,7 +707,6 @@
                 }
                 break;
 #endif
-
 #ifdef BUTTON_F3
             case BUTTON_F3:
                 /* don't enter f3 from plugin browser */
@@ -764,13 +719,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;
@@ -819,7 +768,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 */
@@ -939,7 +888,6 @@
             lastfilter = *tc.dirfilter;
             lastsortcase = global_settings.sort_case;
             restore = true;
-            button_clear_queue(); /* clear button queue */
         }
 
         if (exit_func)
@@ -1037,7 +985,7 @@
             }
         }
     }
-
+    action_signalscreenchange();
     return true;
 }
 
@@ -1049,7 +997,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.74
diff -u -r1.74 tree.h
--- apps/tree.h	3 Aug 2006 20:17:14 -0000	1.74
+++ apps/tree.h	15 Aug 2006 09:23:25 -0000
@@ -23,166 +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)
-
-#elif CONFIG_KEYPAD == IRIVER_H10_PAD
-
-#define TREE_EXIT      BUTTON_LEFT
-#define TREE_ABORT     BUTTON_LEFT
-#define TREE_ENTER     BUTTON_RIGHT
-#define TREE_RUN       (BUTTON_PLAY | BUTTON_REL)
-#define TREE_RUN_PRE   BUTTON_PLAY
-#define TREE_MENU      (BUTTON_REW | BUTTON_REL)
-#define TREE_MENU_PRE  BUTTON_REW
-#define TREE_WPS       (BUTTON_FF | BUTTON_REL)
-#define TREE_WPS_PRE   BUTTON_FF
-#define TREE_CONTEXT   (BUTTON_PLAY | BUTTON_SCROLL_UP)
-#define TREE_QUICK     (BUTTON_PLAY | BUTTON_SCROLL_DOWN)
-
-#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.10
diff -u -r1.10 color_picker.c
--- apps/gui/color_picker.c	3 Aug 2006 20:17:14 -0000	1.10
+++ apps/gui/color_picker.c	15 Aug 2006 09:23:26 -0000
@@ -29,64 +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
-
-#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
-#define SLIDER_UP        BUTTON_SCROLL_UP
-#define SLIDER_DOWN      BUTTON_SCROLL_DOWN
-#define SLIDER_LEFT      BUTTON_LEFT
-#define SLIDER_RIGHT     BUTTON_RIGHT
-#define SLIDER_OK        BUTTON_PLAY
-#define SLIDER_CANCEL    BUTTON_POWER
-
-#endif
-
 static const int max_val[3] = {LCD_MAX_RED,LCD_MAX_GREEN,LCD_MAX_BLUE};
 
 static void draw_screen(struct screen *display, char *title,
@@ -237,50 +184,30 @@
             draw_screen(&screens[i], title, rgb_val, newcolor, slider);
         }
         
-        button = button_get(true);
+        button = get_action(CONTEXT_SETTINGSGRAPHICAL,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_OK:
                 if ((banned_color!=-1) && (banned_color == newcolor))
                 {
                     gui_syncsplash(HZ*2,true,str(LANG_COLOR_UNACCEPTABLE));
@@ -290,10 +217,7 @@
                 exit = 1;
                 break;
 
-            case SLIDER_CANCEL:
-#ifdef HAVE_REMOTE_LCD
-            case SLIDER_RC_CANCEL:
-#endif
+            case ACTION_STD_CANCEL:
                 exit = 1;
                 break;
 
@@ -306,6 +230,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.59
diff -u -r1.59 gwps-common.c
--- apps/gui/gwps-common.c	5 Aug 2006 12:47:42 -0000	1.59
+++ apps/gui/gwps-common.c	15 Aug 2006 09:23:28 -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);
@@ -2319,19 +2320,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)
@@ -2415,12 +2415,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;
@@ -2445,9 +2440,9 @@
                 break;
         }
         if (!exit)
-            button = button_get(true);
+            button = get_action(CONTEXT_WPS,TIMEOUT_BLOCK);
     }
-
+    action_signalscreenchange();
     return usb;
 }
 
@@ -2547,7 +2542,7 @@
     return retcode;           
 }
 
-#ifdef WPS_KEYLOCK
+
 void display_keylock_text(bool locked)
 {
     char* s;
@@ -2569,11 +2564,3 @@
     gui_syncsplash(HZ, true, s);
 }
 
-void waitfor_nokey(void)
-{
-    /* wait until all keys are released */
-    while (button_get(false) != BUTTON_NONE)
-        yield();
-}
-#endif
-
Index: apps/gui/gwps-common.h
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/gwps-common.h,v
retrieving revision 1.7
diff -u -r1.7 gwps-common.h
--- apps/gui/gwps-common.h	1 Feb 2006 08:43:29 -0000	1.7
+++ apps/gui/gwps-common.h	15 Aug 2006 09:23:29 -0000
@@ -7,7 +7,7 @@
  *                     \/            \/     \/    \/            \/
  * $Id: gwps-common.h,v 1.7 2006-02-01 08:43:29 miipekk Exp $
  *
- * Copyright (C) 2002 Björn Stenberg
+ * Copyright (C) 2002 Bjï¿½n Stenberg
  *
  * 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.
@@ -35,9 +35,6 @@
 bool ffwd_rew(int button);
 bool wps_data_preload_tags(struct wps_data *data, char *buf,
                             const char *bmpdir, size_t bmpdirlen);
-#ifdef WPS_KEYLOCK
 void display_keylock_text(bool locked);
-void waitfor_nokey(void);
-#endif
 #endif
 
Index: apps/gui/gwps.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/gwps.c,v
retrieving revision 1.46
diff -u -r1.46 gwps.c
--- apps/gui/gwps.c	18 Jul 2006 15:12:49 -0000	1.46
+++ apps/gui/gwps.c	15 Aug 2006 09:23:29 -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,35 +183,10 @@
         /* 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);
-#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 &&
-            ! ((button < 0) ||
-               (button == BUTTON_NONE) ||
-               ((button & WPS_KEYLOCK) == WPS_KEYLOCK) ||
-               (button & BUTTON_REMOTE)
-                ))
-        {
-            if (!(button & BUTTON_REL))
-                display_keylock_text(true);
-            restore = true;
-            button = BUTTON_NONE;
-        }
+        button = get_action(CONTEXT_WPS,HZ/5);
 #endif
 
         /* Exit if audio has stopped playing. This can happen if using the
@@ -222,17 +194,14 @@
            from F1 */
         if (!audio_status())
             exit = true;
-
+            
         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 +214,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 +227,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 +258,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 +276,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 +292,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 +344,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 +370,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,25 +421,17 @@
 #endif
                 restore = true;
                 break;
-#endif /* WPS_MENU */
 
-#ifdef WPS_KEYLOCK
             /* key lock */
-            case WPS_KEYLOCK:
-            case WPS_KEYLOCK | BUTTON_REPEAT:
-                keys_locked = !keys_locked;
-                display_keylock_text(keys_locked);
+            case ACTION_STD_KEYLOCK:
+                action_setsoftwarekeylock(ACTION_STD_KEYLOCK,true);
+                display_keylock_text(true);
                 restore = true;
-                waitfor_nokey();
                 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,8 +447,8 @@
                 }
 #endif
                 restore = true;
-                lastbutton = 0;
                 break;
+#endif /* HAVE_QUICKSCREEN */
 
                 /* screen settings */
 #ifdef BUTTON_F3
@@ -611,17 +463,14 @@
                 {
                     gui_wps_set_margin(&gui_wps[i]);
                 }
-#endif
+#endif /* BUTTON_F3 */
                 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:
+#ifdef HAVE_PITCHSCREEN
+            case ACTION_WPS_PITCHSCREEN:
 #ifdef HAVE_LCD_COLOR
                 show_main_backdrop();
 #endif
@@ -632,17 +481,10 @@
 #endif
                 restore = true;
                 break;
-#endif
-#endif
+#endif /* HAVE_PITCHSCREEN */
 
 #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
+            case ACTION_WPSAB_SINGLE:
 /* 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)
@@ -661,20 +503,15 @@
                 }
                 ab_set_A_marker(wps_state.id3->elapsed);
                 break;
-#endif
 
 
-#ifdef WPS_AB_SET_A_MARKER
             /* set A marker for A-B repeat */
-            case WPS_AB_SET_A_MARKER:
+            case ACTION_WPSAB_SETA:
                 if (ab_repeat_mode_enabled())
                     ab_set_A_marker(wps_state.id3->elapsed);
                 break;
-#endif
-
-#ifdef WPS_AB_SET_B_MARKER
             /* set B marker for A-B repeat and jump to A */
-            case WPS_AB_SET_B_MARKER:
+            case ACTION_WPSAB_SETB:
                 if (ab_repeat_mode_enabled())
                 {
                     ab_set_B_marker(wps_state.id3->elapsed);
@@ -682,46 +519,24 @@
                     update_track = true;
                 }
                 break;
-#endif
-
-#ifdef WPS_AB_RESET_AB_MARKERS
             /* reset A&B markers */
-            case WPS_AB_RESET_AB_MARKERS:
+            case ACTION_WPSAB_RESET:
                 if (ab_repeat_mode_enabled())
                 {
                     ab_reset_markers();
                     update_track = true;
                 }
                 break;
-#endif
-
 #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
-                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
+            case ACTION_WPS_STOP:
                 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 +552,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 +594,7 @@
         }
 
         if (exit) {
+            action_signalscreenchange();
 #ifdef HAVE_LCD_CHARCELLS
             status_set_record(false);
             status_set_audio(false);
@@ -830,8 +646,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/list.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/list.c,v
retrieving revision 1.25
diff -u -r1.25 list.c
--- apps/gui/list.c	15 Aug 2006 08:14:46 -0000	1.25
+++ apps/gui/list.c	15 Aug 2006 09:23:30 -0000
@@ -26,6 +26,7 @@
 #include "settings.h"
 #include "kernel.h"
 
+#include "action.h"
 #include "screen_access.h"
 #include "list.h"
 #include "scrollbar.h"
@@ -668,106 +669,65 @@
     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:
-#if !(LIST_PGRIGHT & BUTTON_REPEAT)
-        case LIST_PGRIGHT | BUTTON_REPEAT:
-#endif
-#ifdef LIST_RC_PGRIGHT
-        case LIST_RC_PGRIGHT:
-        case LIST_RC_PGRIGHT | BUTTON_REPEAT:
-#endif
+#ifdef HAVE_LCD_BITMAP
+        case ACTION_TREE_PGRIGHT:
             gui_synclist_scroll_right(lists);
             gui_synclist_draw(lists);
-            return LIST_PGRIGHT;
-#endif
-
-#ifdef LIST_PGLEFT
-        case LIST_PGLEFT:
-#if !(LIST_PGLEFT & BUTTON_REPEAT)
-        case LIST_PGLEFT | BUTTON_REPEAT:
-#endif     
-#ifdef LIST_RC_PGLEFT
-        case LIST_RC_PGLEFT:
-        case LIST_RC_PGLEFT | BUTTON_REPEAT:
-#endif
+            return ACTION_TREE_PGRIGHT;
+        case ACTION_TREE_PGLEFT:
             gui_synclist_scroll_left(lists);
             gui_synclist_draw(lists);
-            return LIST_PGLEFT;
+            return ACTION_TREE_PGLEFT;
 #endif
 
 /* 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_LISTTREE_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_LISTTREE_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_LISTTREE_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
-
-#ifdef LIST_RC_PGDN
-        case LIST_RC_PGDN:
+            return ACTION_STD_NEXT;
+  
+        case ACTION_LISTTREE_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.23
diff -u -r1.23 list.h
--- apps/gui/list.h	15 Aug 2006 08:14:46 -0000	1.23
+++ apps/gui/list.h	15 Aug 2006 09:23:31 -0000
@@ -26,89 +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_RIGHT | BUTTON_REPEAT)
-#define LIST_PGLEFT    (BUTTON_LEFT  | BUTTON_REPEAT)
-
-#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_RIGHT | BUTTON_REPEAT)
-#define LIST_PGLEFT    (BUTTON_LEFT  | BUTTON_REPEAT)
-
-#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
-#define LIST_PGRIGHT   (BUTTON_RIGHT | BUTTON_REPEAT)
-#define LIST_PGLEFT    (BUTTON_LEFT  | BUTTON_REPEAT)
-
-#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
-#define LIST_NEXT      BUTTON_DOWN
-#define LIST_PREV      BUTTON_UP
-//#define LIST_PGRIGHT   (BUTTON_RIGHT | BUTTON_)
-//#define LIST_PGLEFT    (BUTTON_LEFT  | BUTTON_) Todo: define those
-  
-#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_RIGHT | BUTTON_REPEAT)
-#define LIST_PGLEFT    (BUTTON_LEFT  | BUTTON_REPEAT)
-
-#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
-#define LIST_NEXT      BUTTON_DOWN
-#define LIST_PREV      BUTTON_UP
-#define LIST_PGRIGHT   (BUTTON_RIGHT | BUTTON_REPEAT)
-#define LIST_PGLEFT    (BUTTON_LEFT  | BUTTON_REPEAT)
-
-#elif CONFIG_KEYPAD == GIGABEAT_PAD
-#define LIST_NEXT      BUTTON_DOWN
-#define LIST_PREV      BUTTON_UP
-#define LIST_PGRIGHT   (BUTTON_RIGHT | BUTTON_REPEAT)
-#define LIST_PGLEFT    (BUTTON_LEFT  | BUTTON_REPEAT)
-
-#elif CONFIG_KEYPAD == IRIVER_H10_PAD
-#define LIST_NEXT      BUTTON_SCROLL_DOWN
-#define LIST_PREV      BUTTON_SCROLL_UP
-#define LIST_PGRIGHT   (BUTTON_RIGHT | BUTTON_REPEAT)
-#define LIST_PGLEFT    (BUTTON_LEFT  | BUTTON_REPEAT)
-
-#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
@@ -388,8 +305,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/quickscreen.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/quickscreen.c,v
retrieving revision 1.13
diff -u -r1.13 quickscreen.c
--- apps/gui/quickscreen.c	11 Apr 2006 06:38:10 -0000	1.13
+++ apps/gui/quickscreen.c	15 Aug 2006 09:23:31 -0000
@@ -29,6 +29,7 @@
 #include "kernel.h"
 #include "misc.h"
 #include "statusbar.h"
+#include "action.h"
 
 void gui_quickscreen_init(struct gui_quickscreen * qs,
                           struct option_select *left_option,
@@ -128,59 +129,28 @@
 
     switch(button)
     {
-        case QUICKSCREEN_LEFT :
-        case QUICKSCREEN_LEFT | BUTTON_REPEAT :
-#ifdef QUICKSCREEN_RC_LEFT
-        case QUICKSCREEN_RC_LEFT :
-        case QUICKSCREEN_RC_LEFT | BUTTON_REPEAT :
-#endif
+        case ACTION_QS_LEFT:
             option_select_next(qs->left_option);
             return(true);
 
-        case QUICKSCREEN_BOTTOM :
-        case QUICKSCREEN_BOTTOM | BUTTON_REPEAT :
-#ifdef QUICKSCREEN_RC_BOTTOM
-        case QUICKSCREEN_RC_BOTTOM :
-        case QUICKSCREEN_RC_BOTTOM | BUTTON_REPEAT :
-#endif
+        case ACTION_QS_DOWN:
             option_select_next(qs->bottom_option);
             return(true);
 
-        case QUICKSCREEN_RIGHT :
-        case QUICKSCREEN_RIGHT | BUTTON_REPEAT :
-#ifdef QUICKSCREEN_RC_RIGHT
-        case QUICKSCREEN_RC_RIGHT :
-        case QUICKSCREEN_RC_RIGHT | BUTTON_REPEAT :
-#endif
+        case ACTION_QS_RIGHT:
             option_select_next(qs->right_option);
             return(true);
 
-#ifdef QUICKSCREEN_BOTTOM_INV
-        case QUICKSCREEN_BOTTOM_INV :
-        case QUICKSCREEN_BOTTOM_INV | BUTTON_REPEAT :
-#endif
-#ifdef QUICKSCREEN_RC_BOTTOM_INV
-        case QUICKSCREEN_RC_BOTTOM_INV :
-        case QUICKSCREEN_RC_BOTTOM_INV | BUTTON_REPEAT :
-#endif
-#if defined(QUICKSCREEN_RC_BOTTOM_INV) || defined(QUICKSCREEN_BOTTOM_INV)
+        case ACTION_QS_DOWNINV:
             option_select_prev(qs->bottom_option);
             return(true);
-#endif
     }
     return(false);
 }
-#ifdef BUTTON_REMOTE
-#define uncombine_button(key_read, combined_button) \
-    key_read & ~(combined_button & ~BUTTON_REMOTE)
-#else
-#define uncombine_button(key_read, combined_button) \
-    key_read & ~combined_button
-#endif
 
 bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter)
 {
-    int raw_key, button;
+    int button;
     /* To quit we need either :
      *  - a second press on the button that made us enter
      *  - an action taken while pressing the enter button,
@@ -188,9 +158,9 @@
     bool can_quit=false;
     gui_syncquickscreen_draw(qs);
     gui_syncstatusbar_draw(&statusbars, true);
+    action_signalscreenchange();
     while (true) {
-        raw_key = button_get(true);
-        button=uncombine_button(raw_key, button_enter);
+        button = get_action(CONTEXT_QUICKSCREEN,TIMEOUT_BLOCK);
         if(default_event_handler(button) == SYS_USB_CONNECTED)
             return(true);
         if(gui_quickscreen_do_button(qs, button))
@@ -200,23 +170,19 @@
                 qs->callback(qs);
             gui_syncquickscreen_draw(qs);
         }
-        else if(raw_key==button_enter)
+        else if(button==button_enter)
             can_quit=true;
-        if(raw_key==(button_enter | BUTTON_REL) && can_quit)
-            return(false);
-#ifdef QUICKSCREEN_QUIT
-        if(raw_key==QUICKSCREEN_QUIT
-#ifdef QUICKSCREEN_QUIT2
-           || raw_key==QUICKSCREEN_QUIT2
-#endif
-#if QUICKSCREEN_RC_QUIT
-           || raw_key==QUICKSCREEN_RC_QUIT
-#endif
-        )
-            return(false);
-#endif /* QUICKSCREEN_QUIT */
+            
+        if((button == button_enter) && can_quit)
+            break;
+            
+        if(button==ACTION_STD_CANCEL)
+            break;
+            
         gui_syncstatusbar_draw(&statusbars, false);
     }
+    action_signalscreenchange();
+    return false;
 }
 
 #endif /* HAVE_QUICKSCREEN */
Index: apps/gui/quickscreen.h
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/quickscreen.h,v
retrieving revision 1.6
diff -u -r1.6 quickscreen.h
--- apps/gui/quickscreen.h	3 Aug 2006 20:17:14 -0000	1.6
+++ apps/gui/quickscreen.h	15 Aug 2006 09:23:31 -0000
@@ -27,42 +27,6 @@
 #include "option_select.h"
 #include "screen_access.h"
 
-#define QUICKSCREEN_LEFT        BUTTON_LEFT
-#define QUICKSCREEN_RIGHT       BUTTON_RIGHT
-
-#if (CONFIG_KEYPAD == RECORDER_PAD)
-#define QUICKSCREEN_BOTTOM     BUTTON_DOWN
-#define QUICKSCREEN_BOTTOM_INV BUTTON_UP
-#define QUICKSCREEN_QUIT       BUTTON_F3
-#define QUICKSCREEN_QUIT2      BUTTON_OFF
-#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define QUICKSCREEN_BOTTOM     BUTTON_DOWN
-#define QUICKSCREEN_BOTTOM_INV BUTTON_UP
-#define QUICKSCREEN_QUIT  BUTTON_MODE
-#define QUICKSCREEN_QUIT2 BUTTON_OFF
-#define QUICKSCREEN_RC_QUIT     BUTTON_RC_MODE
-#ifdef CONFIG_REMOTE_KEYPAD
-#define QUICKSCREEN_RC_LEFT        BUTTON_RC_REW
-#define QUICKSCREEN_RC_BOTTOM      BUTTON_RC_VOL_DOWN
-#define QUICKSCREEN_RC_BOTTOM_INV  BUTTON_RC_VOL_UP
-#define QUICKSCREEN_RC_RIGHT       BUTTON_RC_FF
-#endif
-#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD)
-#define QUICKSCREEN_BOTTOM BUTTON_PLAY
-#define QUICKSCREEN_QUIT   BUTTON_MENU
-#define QUICKSCREEN_QUIT2  BUTTON_SELECT
-#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
-#define QUICKSCREEN_BOTTOM     BUTTON_DOWN
-#define QUICKSCREEN_BOTTOM_INV BUTTON_UP
-#define QUICKSCREEN_QUIT       BUTTON_REC
-#define QUICKSCREEN_QUIT2      BUTTON_POWER
-#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
-#define QUICKSCREEN_BOTTOM     BUTTON_SCROLL_DOWN
-#define QUICKSCREEN_BOTTOM_INV BUTTON_SCROLL_UP
-#define QUICKSCREEN_QUIT       BUTTON_REW
-#define QUICKSCREEN_QUIT2      BUTTON_POWER
-#endif
-
 struct gui_quickscreen;
 /*
  * Callback function called each time the quickscreen gets modified
Index: apps/gui/select.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/select.c,v
retrieving revision 1.10
diff -u -r1.10 select.c
--- apps/gui/select.c	7 Dec 2005 15:37:21 -0000	1.10
+++ apps/gui/select.c	15 Aug 2006 09:23:31 -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_OK:
+        case ACTION_STD_PREV: /*NOTE: this is in CONTEXT_SETTINGS ! */
             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:
             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.18
diff -u -r1.18 select.h
--- apps/gui/select.h	3 Aug 2006 20:17:14 -0000	1.18
+++ apps/gui/select.h	15 Aug 2006 09:23:31 -0000
@@ -23,104 +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
-
-#elif CONFIG_KEYPAD == IRIVER_H10_PAD
-#define SELECT_INC     BUTTON_SCROLL_UP
-#define SELECT_DEC     BUTTON_SCROLL_DOWN
-#define SELECT_OK      BUTTON_PLAY
-#define SELECT_OK2     BUTTON_RIGHT
-#define SELECT_CANCEL  BUTTON_POWER
-#define SELECT_CANCEL2 BUTTON_LEFT
-
-#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 -r1.4 yesno.c
--- apps/gui/yesno.c	21 Jan 2006 23:43:57 -0000	1.4
+++ apps/gui/yesno.c	15 Aug 2006 09:23:31 -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,
@@ -54,7 +55,7 @@
     gui_textarea_put_message(yn->display, message, 0);
     return(true);
 }
-
+#include "debug.h"
 enum yesno_res gui_syncyesno_run(struct text_message * main_message,
                                  struct text_message * yes_message,
                                  struct text_message * no_message)
@@ -72,23 +73,21 @@
     }
     while (result==-1)
     {
-        button = button_get(true);
+        button = get_action(CONTEXT_YESNOSCREEN,TIMEOUT_BLOCK);
+        DEBUGF("button=%x\n",button);
         switch (button)
         {
-            case YESNO_OK:
-#ifdef YESNO_RC_OK
-            case YESNO_RC_OK:
-#endif
+            case ACTION_YESNO_ACCEPT:
                 result=YESNO_YES;
                 break;
 
             default:
                 if(default_event_handler(button) == SYS_USB_CONNECTED)
                     return(YESNO_USB);
-                if(!(button & BUTTON_REL))
-                    result=YESNO_NO;
+                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.8
diff -u -r1.8 yesno.h
--- apps/gui/yesno.h	3 Aug 2006 20:17:14 -0000	1.8
+++ apps/gui/yesno.h	15 Aug 2006 09:23:31 -0000
@@ -4,41 +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
-
-#elif (CONFIG_KEYPAD == IRIVER_H10_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	15 Aug 2006 09:23:32 -0000
@@ -0,0 +1,386 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   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() */
+#include "settings.h"
+
+/* 
+ * 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 
+ */
+
+/* CONTEXT_CUSTOM's used in this file...
+
+CONTEXT_CUSTOM|CONTEXT_TREE = the standard list/tree defines (without directions)
+
+
+*/
+
+
+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_CANCEL,        BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_STD_CANCEL,        BUTTON_OFF,                 BUTTON_NONE },
+    { ACTION_STD_CONTEXT,       BUTTON_SELECT|BUTTON_REPEAT,BUTTON_SELECT },
+    { ACTION_STD_QUICKSCREEN,   BUTTON_MODE|BUTTON_REPEAT,  BUTTON_MODE }, 
+    { ACTION_STD_MENU,          BUTTON_MODE|BUTTON_REL,     BUTTON_MODE },
+    { ACTION_STD_OK,            BUTTON_SELECT|BUTTON_REL,   BUTTON_SELECT },
+    { ACTION_STD_OK,            BUTTON_RIGHT,               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_NEXTDIR,       BUTTON_ON|BUTTON_RIGHT,         BUTTON_ON },
+    { ACTION_WPS_PREVDIR,       BUTTON_ON|BUTTON_LEFT,          BUTTON_ON },
+    { 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 },
+    { ACTION_WPSAB_RESET,       BUTTON_ON|BUTTON_SELECT,        BUTTON_ON },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_wps */
+   
+struct button_mapping button_context_listtree[]  = {
+    { ACTION_LISTTREE_PGUP,         BUTTON_ON|BUTTON_UP,                    BUTTON_ON },
+    { ACTION_LISTTREE_PGUP,         BUTTON_UP|BUTTON_REL,                   BUTTON_ON|BUTTON_UP },
+    { ACTION_LISTTREE_PGUP,         BUTTON_ON|BUTTON_UP|BUTTON_REPEAT,      BUTTON_ON|BUTTON_UP },
+    { ACTION_LISTTREE_PGDOWN,       BUTTON_ON|BUTTON_DOWN,                  BUTTON_ON|BUTTON_UP },
+    { ACTION_LISTTREE_PGDOWN,       BUTTON_DOWN|BUTTON_REL,                 BUTTON_ON|BUTTON_DOWN },
+    { ACTION_LISTTREE_PGDOWN,       BUTTON_ON|BUTTON_DOWN|BUTTON_REPEAT,    BUTTON_ON|BUTTON_DOWN },  
+    LAST_ITEM_IN_LIST
+}; /* button_context_listtree */
+
+struct button_mapping button_context_tree[]  = {
+    { ACTION_TREE_WPS,          BUTTON_ON|BUTTON_REL,                   BUTTON_ON },   
+    LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
+}; /* button_context_listtree */
+
+struct button_mapping button_context_listtree_scroll_with_combo[]  = {
+    { ACTION_NONE,              BUTTON_ON,                              BUTTON_NONE }, 
+    { 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__NEXTLIST(CONTEXT_CUSTOM|1),
+};
+
+struct button_mapping button_context_listtree_scroll_without_combo[]  = {
+    { ACTION_NONE,              BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_STD_CANCEL,        BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REPEAT,  BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_NONE,              BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_STD_OK,            BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT|BUTTON_REPEAT },    
+    LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
+};
+
+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_NONE,                  BUTTON_LEFT,                    BUTTON_NONE },
+    { ACTION_NONE,                  BUTTON_RIGHT,                   BUTTON_NONE },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_settings */
+
+struct button_mapping button_context_settingsgraphical[]  = {
+    { ACTION_SETTINGS_INC,          BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_SETTINGS_INCREPEAT,    BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
+    { ACTION_SETTINGS_DEC,          BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_SETTINGS_DECREPEAT,    BUTTON_LEFT|BUTTON_REPEAT,  BUTTON_LEFT },
+    { 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 },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_settingsgraphical */
+
+struct button_mapping button_context_yesno[]  = {
+    { ACTION_YESNO_ACCEPT,          BUTTON_SELECT,                  BUTTON_NONE },
+    { ACTION_YESNO_ACCEPT,          BUTTON_RC_ON,                   BUTTON_NONE },
+    LAST_ITEM_IN_LIST
+}; /* button_context_settings_yesno */
+
+struct button_mapping button_context_bmark[]  = {
+    { ACTION_BMARK_DELETE,      BUTTON_REC,    BUTTON_NONE },
+    { ACTION_STD_OK,            BUTTON_SELECT,   BUTTON_NONE },
+    LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGSGRAPHICAL),
+}; /* button_context_settings_bmark */
+
+struct button_mapping button_context_quickscreen[]  = {
+    { ACTION_QS_DOWNINV,    BUTTON_UP,                      BUTTON_NONE },
+    { ACTION_QS_DOWNINV,    BUTTON_UP|BUTTON_REPEAT,        BUTTON_UP },
+    { ACTION_QS_DOWN,       BUTTON_DOWN,                    BUTTON_NONE },
+    { ACTION_QS_DOWN,       BUTTON_DOWN|BUTTON_REPEAT,      BUTTON_DOWN },
+    { ACTION_QS_LEFT,       BUTTON_LEFT,                    BUTTON_NONE },
+    { ACTION_QS_LEFT,       BUTTON_LEFT|BUTTON_REPEAT,      BUTTON_LEFT },
+    { ACTION_QS_RIGHT,      BUTTON_RIGHT,                   BUTTON_NONE },
+    { ACTION_QS_RIGHT,      BUTTON_RIGHT|BUTTON_REPEAT,     BUTTON_RIGHT },
+    { ACTION_STD_CANCEL,    BUTTON_MODE,                    BUTTON_NONE },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_quickscreen */
+/*****************************************************************************
+ *    Remote control mappings 
+ *****************************************************************************/
+ 
+ 
+/*********   H100 LCD remote ******/
+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_OK,            BUTTON_RC_ON|BUTTON_REL,        BUTTON_RC_ON },
+    { ACTION_STD_CONTEXT,       BUTTON_RC_MENU|BUTTON_REPEAT,   BUTTON_RC_MENU },
+    { ACTION_STD_CANCEL,        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_OK,            BUTTON_RC_MENU|BUTTON_REL,      BUTTON_RC_MENU },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_standard_h100lcdremote */
+
+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 */
+
+struct button_mapping button_context_listtree_h100lcdremote[]  = {
+    { ACTION_LISTTREE_PGUP,     BUTTON_RC_SOURCE,                    BUTTON_NONE },
+    { ACTION_LISTTREE_PGUP,     BUTTON_RC_SOURCE|BUTTON_REPEAT,      BUTTON_RC_SOURCE },
+    { ACTION_LISTTREE_PGDOWN,   BUTTON_RC_BITRATE,                   BUTTON_NONE },
+    { ACTION_LISTTREE_PGDOWN,   BUTTON_RC_BITRATE|BUTTON_REPEAT,     BUTTON_RC_BITRATE },
+    { ACTION_TREE_WPS,      BUTTON_RC_ON|BUTTON_REL,             BUTTON_RC_ON },
+    { ACTION_TREE_STOP,     BUTTON_RC_STOP,                      BUTTON_NONE },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_listtree_h100lcdremote */
+/* Not needed? _std_ actions seem to be fine */
+struct button_mapping button_context_settings_h100lcdremote[]  = { 
+    LAST_ITEM_IN_LIST
+};/*  button_context_settings_h100lcdremote */
+
+
+/*********   H300 LCD remote ******/
+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_OK,            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_CANCEL,        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_OK,            BUTTON_RC_MENU|BUTTON_REL,          BUTTON_RC_MENU },
+    { ACTION_STD_OK,            BUTTON_RC_FF,                       BUTTON_NONE },
+    { ACTION_STD_OK,            BUTTON_RC_FF|BUTTON_REPEAT,         BUTTON_NONE},
+    
+    LAST_ITEM_IN_LIST
+
+}; /* button_context_standard */
+
+/* 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;
+
+/* FIXME: the same as h100 ?? */
+struct button_mapping *button_context_listtree_h300lcdremote  = 
+                                button_context_listtree_h100lcdremote;
+/* FIXME: the same as h100 ?? */
+
+struct button_mapping *button_context_settings_h300lcdremote  = 
+                                button_context_settings_h100lcdremote; 
+/* FIXME: non lcd remotes need mappings.. ?? */
+
+
+
+
+
+
+/* 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_remote(int context)
+{
+    if(remote_type() != _remote_type)
+        remap_remote();
+    context ^= CONTEXT_REMOTE;
+    
+    switch (context)
+    {
+        case CONTEXT_STD:
+        case CONTEXT_MAINMENU:
+        case CONTEXT_SETTINGS:
+            return remote_button_context_std;
+        case CONTEXT_WPS:
+            return remote_button_context_wps;
+                    
+        case CONTEXT_TREE:
+        case CONTEXT_LIST:
+            return remote_button_context_listtree;
+
+            
+        case CONTEXT_YESNOSCREEN:            
+        case CONTEXT_BOOKMARKSCREEN:
+            ; /* fall out of the switch */            
+    } 
+    return remote_button_context_std;
+}
+
+struct button_mapping* get_context_mapping(int context)
+{
+    if (context&CONTEXT_REMOTE)
+        return get_context_mapping_remote(context);
+    
+    switch (context)
+    {
+        case CONTEXT_STD:
+        case CONTEXT_MAINMENU:
+            return button_context_standard;
+        case CONTEXT_WPS:
+            return button_context_wps;
+            
+        case CONTEXT_LIST:
+            return button_context_listtree;
+        case CONTEXT_TREE:
+            if (global_settings.hold_lr_for_scroll_in_list)
+                return button_context_listtree_scroll_without_combo;
+            else return button_context_listtree_scroll_with_combo;
+        case CONTEXT_CUSTOM|1:
+            return button_context_tree;
+        case CONTEXT_SETTINGSGRAPHICAL:
+            return button_context_settingsgraphical;
+        
+        case CONTEXT_SETTINGS:
+            return button_context_settings;
+            
+        case CONTEXT_YESNOSCREEN:
+            return button_context_yesno;
+            
+        case CONTEXT_BOOKMARKSCREEN:
+            return button_context_bmark;
+        case CONTEXT_QUICKSCREEN:
+            return button_context_quickscreen;
+    } 
+    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	15 Aug 2006 09:23:32 -0000
@@ -0,0 +1,151 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   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"
+
+
+/* 
+ * 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 
+ */
+ 
+/* CONTEXT_CUSTOM's used in this file...
+
+CONTEXT_CUSTOM|1 = the standard list/tree defines (without directions)
+
+
+*/
+
+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_OK,            BUTTON_RIGHT,                       BUTTON_NONE },
+
+    { ACTION_STD_OK,            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_CANCEL,        BUTTON_PLAY|BUTTON_REPEAT,          BUTTON_PLAY },
+
+    LAST_ITEM_IN_LIST
+}; /* button_context_standard */
+struct button_mapping button_context_tree[]  = {
+    { ACTION_TREE_WPS,          BUTTON_PLAY|BUTTON_REL,      BUTTON_PLAY },
+    { ACTION_TREE_STOP,         BUTTON_PLAY|BUTTON_REPEAT,   BUTTON_PLAY },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_tree */
+
+struct button_mapping button_context_tree_scroll_lr[]  = {
+    { ACTION_NONE,              BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_STD_CANCEL,        BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REPEAT,  BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_NONE,              BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_STD_OK,            BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT|BUTTON_REPEAT },    
+    LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
+};
+
+struct button_mapping button_context_wps[]  = {
+    { ACTION_WPS_PLAY,      BUTTON_PLAY|BUTTON_REL,         BUTTON_PLAY },
+    { ACTION_WPS_STOP,      BUTTON_PLAY|BUTTON_REPEAT,      BUTTON_PLAY },
+    { 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_SKIPNEXT,  BUTTON_RIGHT|BUTTON_REL,        BUTTON_RIGHT },
+    { ACTION_WPS_SEEKFWD,   BUTTON_RIGHT|BUTTON_REPEAT,     BUTTON_RIGHT },
+    { ACTION_WPS_STOPSEEK,  BUTTON_RIGHT|BUTTON_REL,        BUTTON_RIGHT|BUTTON_REPEAT },
+    { ACTION_WPS_VOLDOWN,   BUTTON_SCROLL_BACK,                 BUTTON_NONE },
+    { ACTION_WPS_VOLDOWN,   BUTTON_SCROLL_BACK|BUTTON_REPEAT,   BUTTON_SCROLL_BACK },
+    { ACTION_WPS_VOLUP,     BUTTON_SCROLL_FWD,                  BUTTON_NONE },
+    { ACTION_WPS_VOLUP,     BUTTON_SCROLL_FWD|BUTTON_REPEAT,    BUTTON_SCROLL_FWD },
+    { ACTION_WPS_BROWSE,    BUTTON_SELECT|BUTTON_REL,           BUTTON_SELECT },
+    { ACTION_WPS_CONTEXT,   BUTTON_SELECT|BUTTON_REPEAT,        BUTTON_SELECT },
+    { ACTION_WPS_MENU,          BUTTON_MENU|BUTTON_REL,         BUTTON_MENU },
+    { ACTION_WPS_QUICKSCREEN,   BUTTON_MENU|BUTTON_REPEAT,      BUTTON_MENU },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_wps */
+
+struct button_mapping button_context_settings[]  = {
+    { ACTION_SETTINGS_INC,          BUTTON_SCROLL_FWD,         BUTTON_NONE },
+    { ACTION_SETTINGS_INCREPEAT,    BUTTON_SCROLL_FWD|BUTTON_REPEAT,  BUTTON_SCROLL_FWD },
+    { ACTION_SETTINGS_DEC,          BUTTON_SCROLL_BACK,          BUTTON_NONE },
+    { ACTION_SETTINGS_DECREPEAT,    BUTTON_SCROLL_BACK|BUTTON_REPEAT,  BUTTON_SCROLL_BACK },
+    { 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_CANCEL,            BUTTON_MENU|BUTTON_REL,      BUTTON_MENU }, /* rel so bmark screen works */
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_settings */
+
+struct button_mapping button_context_yesno[]  = {
+    { ACTION_YESNO_ACCEPT,          BUTTON_PLAY,                  BUTTON_NONE },
+    LAST_ITEM_IN_LIST
+}; /* button_context_settings_yesno */
+
+struct button_mapping button_context_bmark[]  = {
+    { ACTION_BMARK_DELETE,          BUTTON_MENU|BUTTON_REPEAT,       BUTTON_MENU },
+    LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS),
+}; /* button_context_settings_bmark */
+
+/* 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:
+            if (global_settings.hold_lr_for_scroll_in_list)
+                return button_context_tree_scroll_lr;
+            /* else fall through to CUSTOM|1 */
+        case CONTEXT_CUSTOM|1:
+            return button_context_tree;
+            
+        case CONTEXT_LIST:
+        case CONTEXT_MAINMENU:
+            break;
+        case CONTEXT_SETTINGS:
+        case CONTEXT_SETTINGSGRAPHICAL:
+            return button_context_settings;
+        case CONTEXT_YESNOSCREEN:
+            return button_context_yesno;
+        case CONTEXT_BOOKMARKSCREEN:
+            return button_context_bmark;
+        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	15 Aug 2006 09:23:32 -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	15 Aug 2006 09:23:33 -0000
@@ -0,0 +1,135 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   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"
+#include "settings.h"
+
+/* CONTEXT_CUSTOM's used in this file...
+
+CONTEXT_CUSTOM|1 = the standard list/tree defines (without directions)
+
+
+*/
+
+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_OK,         BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT },
+    { ACTION_STD_MENU,       BUTTON_MENU|BUTTON_REL,     BUTTON_MENU },
+    { ACTION_STD_CANCEL,     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_OK,                BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_STD_CANCEL,            BUTTON_LEFT,                BUTTON_NONE },
+
+    LAST_ITEM_IN_LIST
+};
+struct button_mapping button_context_tree[]  = {
+    { ACTION_TREE_WPS,    BUTTON_OFF|BUTTON_REL,        BUTTON_OFF },
+    { ACTION_TREE_STOP,   BUTTON_OFF|BUTTON_REPEAT,     BUTTON_OFF },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_listtree */
+struct button_mapping button_context_tree_scroll_lr[]  = {
+    { ACTION_NONE,              BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_STD_CANCEL,        BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REPEAT,  BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_NONE,              BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_STD_OK,            BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT|BUTTON_REPEAT },    
+    LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
+};
+
+struct button_mapping button_context_yesno[] = {
+    { ACTION_YESNO_ACCEPT,     BUTTON_RIGHT,    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_YESNOSCREEN:
+            return button_context_yesno;
+            
+        case CONTEXT_TREE:
+            if (global_settings.hold_lr_for_scroll_in_list)
+                return button_context_tree_scroll_lr;
+            /* else fall through to CUSTOM|1 */
+        case CONTEXT_CUSTOM|1:
+            return button_context_tree;
+            
+        case CONTEXT_LIST:
+        case CONTEXT_MAINMENU:
+        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	15 Aug 2006 09:23:33 -0000
@@ -0,0 +1,136 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   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"
+#include "settings.h"
+
+/* CONTEXT_CUSTOM's used in this file...
+
+CONTEXT_CUSTOM|1 = the standard list/tree defines (without directions)
+
+
+*/
+
+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_STOP,                BUTTON_NONE },
+    { ACTION_STD_OK,         BUTTON_PLAY,               BUTTON_NONE },
+    { ACTION_STD_OK,         BUTTON_ON|BUTTON_REL,      BUTTON_ON },
+    { ACTION_STD_MENU,       BUTTON_MENU|BUTTON_REL,    BUTTON_MENU },
+
+    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 button_context_tree[]  = {
+    { ACTION_TREE_WPS,    BUTTON_PLAY,     BUTTON_NONE },
+    { ACTION_TREE_STOP,   BUTTON_STOP,     BUTTON_NONE },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_listtree */
+struct button_mapping button_context_tree_scroll_lr[]  = {
+    { ACTION_NONE,              BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_STD_CANCEL,        BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REPEAT,  BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_NONE,              BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_STD_OK,            BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT|BUTTON_REPEAT },    
+    LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
+};
+
+struct button_mapping button_context_yesno[]  = {
+    { ACTION_YESNO_ACCEPT,          BUTTON_PLAY,                  BUTTON_NONE },
+    LAST_ITEM_IN_LIST
+}; /* button_context_settings_yesno */
+
+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_YESNOSCREEN:
+            return button_context_yesno;
+
+        case CONTEXT_TREE:
+            if (global_settings.hold_lr_for_scroll_in_list)
+                return button_context_tree_scroll_lr;
+            /* else fall through to CUSTOM|1 */
+        case CONTEXT_CUSTOM|1:
+            return button_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	15 Aug 2006 09:23:33 -0000
@@ -0,0 +1,141 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   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"
+#include "settings.h"
+
+/* CONTEXT_CUSTOM's used in this file...
+
+CONTEXT_CUSTOM|1 = the standard list/tree defines (without directions)
+
+
+*/
+
+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_OK,     BUTTON_ON,                  BUTTON_NONE },
+    { ACTION_STD_OK,     BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_STD_OK,     BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
+
+    { ACTION_STD_OK,     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_CANCEL,       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 button_context_tree[]  = {
+    { ACTION_TREE_WPS,     BUTTON_PLAY,    BUTTON_NONE },
+    { ACTION_TREE_STOP,    BUTTON_OFF,     BUTTON_NONE },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_listtree */
+struct button_mapping button_context_tree_scroll_lr[]  = {
+    { ACTION_NONE,              BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_STD_CANCEL,        BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REPEAT,  BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_NONE,              BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_STD_OK,            BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT|BUTTON_REPEAT },    
+    LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
+};
+
+struct button_mapping button_context_yesno[] = {
+    { ACTION_YESNO_ACCEPT,     BUTTON_PLAY,    BUTTON_NONE },
+    
+    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_YESNOSCREEN:
+            return button_context_yesno;
+            
+        case CONTEXT_TREE:
+            if (global_settings.hold_lr_for_scroll_in_list)
+                return button_context_tree_scroll_lr;
+            /* else fall through to CUSTOM|1 */
+        case CONTEXT_CUSTOM|1:
+            return button_context_tree;
+            
+        case CONTEXT_STD:
+        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	15 Aug 2006 09:23:33 -0000
@@ -0,0 +1,141 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   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"
+#include "settings.h"
+
+/* CONTEXT_CUSTOM's used in this file...
+
+CONTEXT_CUSTOM|1 = the standard list/tree defines (without directions)
+
+
+*/
+
+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_OK,         BUTTON_RIGHT,                  BUTTON_NONE },
+    { ACTION_STD_OK,         BUTTON_SELECT|BUTTON_REL,      BUTTON_SELECT },
+    { ACTION_STD_OK,         BUTTON_PLAY,                   BUTTON_NONE },
+    { ACTION_STD_MENU,       BUTTON_REC|BUTTON_REL,         BUTTON_REC },
+    { ACTION_STD_QUICKSCREEN,BUTTON_REC|BUTTON_REPEAT,      BUTTON_REC },
+    { ACTION_STD_CANCEL,     BUTTON_POWER,                  BUTTON_NONE },
+
+    LAST_ITEM_IN_LIST
+};
+
+struct button_mapping button_context_wps[]  = {
+    { ACTION_WPS_PLAY,      BUTTON_PLAY|BUTTON_REL,         BUTTON_PLAY },
+    { ACTION_WPS_STOP,      BUTTON_PLAY|BUTTON_REPEAT,      BUTTON_PLAY },
+    { 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_SKIPNEXT,  BUTTON_RIGHT|BUTTON_REL,        BUTTON_RIGHT },
+    { ACTION_WPS_SEEKFWD,   BUTTON_RIGHT|BUTTON_REPEAT,     BUTTON_RIGHT },
+    { ACTION_WPS_STOPSEEK,  BUTTON_RIGHT|BUTTON_REL,        BUTTON_RIGHT|BUTTON_REPEAT },
+    
+    { 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_SELECT|BUTTON_REL,       BUTTON_SELECT },
+    { ACTION_WPS_CONTEXT,       BUTTON_SELECT|BUTTON_REPEAT,    BUTTON_SELECT },
+    { ACTION_WPS_MENU,          BUTTON_REC|BUTTON_REL,          BUTTON_REC },
+    { 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 },
+    { ACTION_STD_PREV,              BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_STD_CANCEL,            BUTTON_REC,                 BUTTON_NONE },
+
+    LAST_ITEM_IN_LIST
+};
+struct button_mapping button_context_tree[]  = {
+    { ACTION_NONE,        BUTTON_PLAY,                BUTTON_NONE },
+    { ACTION_TREE_WPS,    BUTTON_PLAY|BUTTON_REL,     BUTTON_PLAY },
+    { ACTION_TREE_STOP,   BUTTON_PLAY|BUTTON_REPEAT,  BUTTON_PLAY },
+    
+    LAST_ITEM_IN_LIST
+}; /* button_context_listtree */
+struct button_mapping button_context_tree_scroll_lr[]  = {
+    { ACTION_NONE,              BUTTON_LEFT,                BUTTON_NONE },
+    { ACTION_STD_CANCEL,        BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REPEAT,  BUTTON_LEFT },
+    { ACTION_TREE_PGLEFT,       BUTTON_LEFT|BUTTON_REL,     BUTTON_LEFT|BUTTON_REPEAT },
+    { ACTION_NONE,              BUTTON_RIGHT,               BUTTON_NONE },
+    { ACTION_STD_OK,            BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
+    { ACTION_TREE_PGRIGHT,      BUTTON_RIGHT|BUTTON_REL,    BUTTON_RIGHT|BUTTON_REPEAT },    
+    LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
+};
+
+struct button_mapping button_context_yesno[]  = {
+    { ACTION_YESNO_ACCEPT,          BUTTON_SELECT,              BUTTON_NONE },
+    LAST_ITEM_IN_LIST
+}; /* button_context_settings_yesno */
+
+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_YESNOSCREEN:
+            return button_context_yesno;
+            
+        case CONTEXT_TREE:
+            if (global_settings.hold_lr_for_scroll_in_list)
+                return button_context_tree_scroll_lr;
+            /* else fall through to CUSTOM|1 */
+        case CONTEXT_CUSTOM|1:
+            return button_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 -r1.101 radio.c
--- apps/recorder/radio.c	25 Jul 2006 12:51:33 -0000	1.101
+++ apps/recorder/radio.c	15 Aug 2006 09:23:36 -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;
 }
 
Index: firmware/drivers/lcd-h100-remote.c
===================================================================
RCS file: /cvsroot/rockbox/firmware/drivers/lcd-h100-remote.c,v
retrieving revision 1.58
diff -u -r1.58 lcd-h100-remote.c
--- firmware/drivers/lcd-h100-remote.c	28 Jul 2006 13:35:36 -0000	1.58
+++ firmware/drivers/lcd-h100-remote.c	15 Aug 2006 09:23:38 -0000
@@ -519,7 +519,12 @@
     if (cs_countdown == 0)
         CS_HI;
 }
-#endif /* !SIMULATOR */
+#else 
+int remote_type(void)
+{
+    return REMOTETYPE_UNPLUGGED;
+}
+#endif/* !SIMULATOR */
 
 /* LCD init */
 #ifdef SIMULATOR
