Index: apps/menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/menu.c,v
retrieving revision 1.101
diff -u -b -r1.101 menu.c
--- apps/menu.c	5 Dec 2005 22:44:41 -0000	1.101
+++ apps/menu.c	22 Jun 2006 02:50:29 -0000
@@ -40,6 +40,7 @@
 #include "talk.h"
 #include "lang.h"
 #include "misc.h"
+#include "lcd-remote.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "icons.h"
@@ -142,6 +143,43 @@
         /* If moved, "say" the entry under the cursor */
         if(gui_synclist_do_button(&(menus[m].synclist), key))
             menu_talk_selected(m);
+
+        /* If we find a remote-specific button, pretend that it's the
+         * corresponding button from the main keypad */
+#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
+        if (remote_type() == REMOTETYPE_H100_LCD)
+        {
+            switch (key)
+            {
+                case MENU_RC_ENTER2_H100:
+                case MENU_RC_ENTER3_H100:
+                    key = MENU_ENTER;
+                    break;
+                case MENU_RC_EXIT_H100:
+                case MENU_RC_EXIT2_H100:
+                    key = MENU_EXIT;
+                    break;
+                default:
+                    break;
+            }
+        }
+        else if (remote_type() == REMOTETYPE_H300_LCD)
+        {
+            switch (key)
+            {
+                case MENU_RC_ENTER2_H300:
+                    key = MENU_ENTER;
+                    break;
+                case MENU_RC_EXIT_H300:
+                case MENU_RC_EXIT2_H300:
+                    key = MENU_EXIT;
+                    break;
+                default:
+                    break;
+            }
+        }
+#endif
+
         switch( key ) {
             case MENU_ENTER:
 #ifdef MENU_ENTER2
Index: apps/menu.h
===================================================================
RCS file: /cvsroot/rockbox/apps/menu.h,v
retrieving revision 1.43
diff -u -b -r1.43 menu.h
--- apps/menu.h	17 May 2006 06:41:26 -0000	1.43
+++ apps/menu.h	22 Jun 2006 02:50:29 -0000
@@ -31,14 +31,20 @@
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_SELECT
 
-#define MENU_RC_EXIT        BUTTON_RC_STOP
+/* Remote-independent keys */
+#define MENU_RC_ENTER       BUTTON_RC_MENU
 #define MENU_RC_EXIT_MENU   BUTTON_RC_MODE
-#define MENU_RC_ENTER       BUTTON_RC_ON
-#define MENU_RC_ENTER2      BUTTON_RC_MENU
 
+/* Remote-specific keys */
+#define MENU_RC_ENTER2_H100 BUTTON_RC_ON
+#define MENU_RC_ENTER3_H100 BUTTON_RC_VOL_UP
+#define MENU_RC_ENTER2_H300 BUTTON_RC_FF
+#define MENU_RC_EXIT_H100   BUTTON_RC_STOP
+#define MENU_RC_EXIT2_H100  BUTTON_RC_VOL_DOWN
+#define MENU_RC_EXIT_H300   BUTTON_RC_REW
+#define MENU_RC_EXIT2_H300  BUTTON_RC_STOP
 
 #elif CONFIG_KEYPAD == RECORDER_PAD
-
 #define MENU_EXIT       BUTTON_LEFT
 #define MENU_EXIT2      BUTTON_OFF
 #define MENU_EXIT_MENU  BUTTON_F1
Index: apps/tree.c
===================================================================
RCS file: /cvsroot/rockbox/apps/tree.c,v
retrieving revision 1.408
diff -u -b -r1.408 tree.c
--- apps/tree.c	7 Jun 2006 20:42:42 -0000	1.408
+++ apps/tree.c	22 Jun 2006 02:50:31 -0000
@@ -582,6 +582,49 @@
         button = button_get_w_tmo(HZ/5);
         need_update = gui_synclist_do_button(&tree_lists, button);
 
+        /* If we find a remote-specific button, pretend that it's the
+         * corresponding button from the main keypad */
+#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
+        if (remote_type() == REMOTETYPE_H100_LCD)
+        {
+            switch (button)
+            {
+                case TREE_RC_EXIT_H100:
+                case TREE_RC_EXIT2_H100:
+                    button = TREE_EXIT;
+                    break;
+                case TREE_RC_ENTER_H100:
+                    button = TREE_ENTER;
+                    break;
+                case TREE_RC_CONTEXT_H100:
+                    button = TREE_CONTEXT;
+                    break;
+                default:
+                    break;
+            }
+        }
+        else if (remote_type() == REMOTETYPE_H300_LCD)
+        {
+            switch (button)
+            {
+                case TREE_RC_EXIT_H300:
+                    button = TREE_EXIT;
+                    break;
+                case TREE_RC_ENTER_H300:
+                    button = TREE_ENTER;
+                    break;
+                case TREE_RC_CONTEXT_H300:
+                    button = TREE_CONTEXT;
+                    break;
+                case TREE_RC_STOP_H300:
+                    button = TREE_OFF;
+                    break;
+                default:
+                    break;
+            }
+        }
+#endif
+
         switch ( button ) {
 #ifdef TREE_ENTER
             case TREE_ENTER:
Index: apps/tree.h
===================================================================
RCS file: /cvsroot/rockbox/apps/tree.h,v
retrieving revision 1.73
diff -u -b -r1.73 tree.h
--- apps/tree.h	10 Apr 2006 03:51:17 -0000	1.73
+++ apps/tree.h	22 Jun 2006 02:50:31 -0000
@@ -39,21 +39,27 @@
 #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
+/* Remote-independent keys */
 #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)
 
+/* Remote-specific keys */
+#define TREE_RC_EXIT_H100      BUTTON_RC_STOP
+#define TREE_RC_EXIT2_H100     BUTTON_RC_VOL_DOWN
+#define TREE_RC_EXIT_H300      BUTTON_RC_REW
+#define TREE_RC_ENTER_H100     BUTTON_RC_VOL_UP
+#define TREE_RC_ENTER_H300     BUTTON_RC_FF
+#define TREE_RC_CONTEXT_H100   (BUTTON_RC_ON | BUTTON_REPEAT)
+#define TREE_RC_CONTEXT_H300   (BUTTON_RC_MENU | BUTTON_REPEAT)
+#define TREE_RC_STOP_H300      BUTTON_RC_STOP
+
 #elif CONFIG_KEYPAD == RECORDER_PAD
 #define TREE_EXIT      BUTTON_LEFT
 #define TREE_ABORT     BUTTON_OFF
Index: apps/gui/list.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/list.c,v
retrieving revision 1.21
diff -u -b -r1.21 list.c
--- apps/gui/list.c	4 Jun 2006 17:14:17 -0000	1.21
+++ apps/gui/list.c	22 Jun 2006 02:50:46 -0000
@@ -30,6 +30,7 @@
 #include "scrollbar.h"
 #include "statusbar.h"
 #include "textarea.h"
+#include "lcd-remote.h"
 
 #ifdef HAVE_LCD_CHARCELLS
 #define SCROLL_LIMIT 1
@@ -601,6 +602,72 @@
 unsigned gui_synclist_do_button(struct gui_synclist * lists, unsigned button)
 {
     gui_synclist_limit_scroll(lists, true);
+
+    /* If we find a remote-specific button, pretend that it's the
+     * corresponding button from the main keypad */
+#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
+    if (remote_type() == REMOTETYPE_H100_LCD)
+    {
+        switch (button)
+        {
+            case LIST_RC_NEXT_H100:
+                button = LIST_NEXT;
+                break;
+            case LIST_RC_PREV_H100:
+                button = LIST_PREV;
+                break;
+            case LIST_RC_NEXT_H100_RPT:
+                button = LIST_NEXT | BUTTON_REPEAT;
+                break;
+            case LIST_RC_PREV_H100_RPT:
+                button = LIST_PREV | BUTTON_REPEAT;
+                break;
+            default:
+                break;
+        }
+    }
+    else if (remote_type() == REMOTETYPE_H300_LCD)
+    {
+        switch (button)
+        {
+            case LIST_RC_NEXT_H300:
+                button = LIST_NEXT;
+                break;
+            case LIST_RC_PREV_H300:
+                button = LIST_PREV;
+                break;
+            case LIST_RC_NEXT_H300_RPT:
+                button = LIST_NEXT | BUTTON_REPEAT;
+                break;
+            case LIST_RC_PREV_H300_RPT:
+                button = LIST_PREV | BUTTON_REPEAT;
+                break;
+            default:
+                break;
+        }
+    }
+    else if (remote_type() == REMOTETYPE_H300_NONLCD)
+    {
+        switch (button)
+        {
+            case LIST_RC_NEXT_H300NLCD:
+                button = LIST_NEXT;
+                break;
+            case LIST_RC_PREV_H300NLCD:
+                button = LIST_PREV;
+                break;
+            case LIST_RC_NEXT_H300NLCD_RPT:
+                button = LIST_NEXT | BUTTON_REPEAT;
+                break;
+            case LIST_RC_PREV_H300NLCD_RPT:
+                button = LIST_PREV | BUTTON_REPEAT;
+                break;
+            default:
+                break;
+        }
+    }
+#endif
+
     switch(button)
     {
         case LIST_PREV:
Index: apps/gui/list.h
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/list.h,v
retrieving revision 1.18
diff -u -b -r1.18 list.h
--- apps/gui/list.h	3 Apr 2006 08:51:08 -0000	1.18
+++ apps/gui/list.h	22 Jun 2006 02:50:46 -0000
@@ -36,14 +36,23 @@
 #define LIST_PGRIGHT   (BUTTON_ON | BUTTON_RIGHT)
 #define LIST_PGLEFT    (BUTTON_ON | BUTTON_LEFT)
 
-#ifdef CONFIG_REMOTE_KEYPAD
-#define LIST_RC_NEXT   BUTTON_RC_FF
-#define LIST_RC_PREV   BUTTON_RC_REW
+/* Remote-independent keys */
 #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 */
+
+/* Remote-specific keys */
+#define LIST_RC_NEXT_H100         BUTTON_RC_FF
+#define LIST_RC_NEXT_H300         BUTTON_RC_VOL_DOWN
+#define LIST_RC_NEXT_H300NLCD     BUTTON_RC_FF
+#define LIST_RC_PREV_H100         BUTTON_RC_REW
+#define LIST_RC_PREV_H300         BUTTON_RC_VOL_UP
+#define LIST_RC_PREV_H300NLCD     BUTTON_RC_REW
+#define LIST_RC_NEXT_H100_RPT     (BUTTON_RC_FF | BUTTON_REPEAT)
+#define LIST_RC_NEXT_H300_RPT     (BUTTON_RC_VOL_DOWN | BUTTON_REPEAT)
+#define LIST_RC_NEXT_H300NLCD_RPT (BUTTON_RC_FF | BUTTON_REPEAT)
+#define LIST_RC_PREV_H100_RPT     (BUTTON_RC_REW | BUTTON_REPEAT)
+#define LIST_RC_PREV_H300_RPT     (BUTTON_RC_VOL_UP | BUTTON_REPEAT)
+#define LIST_RC_PREV_H300NLCD_RPT (BUTTON_RC_REW | BUTTON_REPEAT)
 
 #elif CONFIG_KEYPAD == RECORDER_PAD
 #define LIST_NEXT      BUTTON_DOWN
Index: apps/gui/select.c
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/select.c,v
retrieving revision 1.10
diff -u -b -r1.10 select.c
--- apps/gui/select.c	7 Dec 2005 15:37:21 -0000	1.10
+++ apps/gui/select.c	22 Jun 2006 02:50:46 -0000
@@ -23,6 +23,7 @@
 #include "textarea.h"
 #include "screen_access.h"
 #include "kernel.h"
+#include "lcd-remote.h"
 
 
 void gui_select_init_numeric(struct gui_select * select,
@@ -77,6 +78,64 @@
 
 bool gui_syncselect_do_button(struct gui_select * select, int button)
 {
+    /* If we find a remote-specific button, pretend that it's the
+     * corresponding button from the main keypad */
+#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
+    if (remote_type() == REMOTETYPE_H100_LCD)
+    {
+        switch (button)
+        {
+            case SELECT_RC_OK2_H100:
+            case SELECT_RC_OK3_H100:
+                button = SELECT_OK;
+                break;
+            case SELECT_RC_CANCEL2_H100:
+                button = SELECT_CANCEL;
+                break;
+            case SELECT_RC_INC_H100:
+                button = SELECT_INC;
+                break;
+            case SELECT_RC_DEC_H100:
+                button = SELECT_DEC;
+                break;
+            case SELECT_RC_INC_H100_RPT:
+                button = SELECT_INC | BUTTON_REPEAT;
+                break;
+            case SELECT_RC_DEC_H100_RPT:
+                button = SELECT_DEC | BUTTON_REPEAT;
+                break;
+            default:
+                break;
+        }
+    }
+    else if (remote_type() == REMOTETYPE_H300_LCD)
+    {
+        switch (button)
+        {
+            case SELECT_RC_OK2_H300:
+                button = SELECT_OK;
+                break;
+            case SELECT_RC_CANCEL2_H300:
+                button = SELECT_CANCEL;
+                break;
+            case SELECT_RC_INC_H300:
+                button = SELECT_INC;
+                break;
+            case SELECT_RC_DEC_H300:
+                button = SELECT_DEC;
+                break;
+            case SELECT_RC_INC_H300_RPT:
+                button = SELECT_INC | BUTTON_REPEAT;
+                break;
+            case SELECT_RC_DEC_H300_RPT:
+                button = SELECT_DEC | BUTTON_REPEAT;
+                break;
+            default:
+                break;
+        }
+    }
+#endif
+
     switch(button)
     {
         case SELECT_INC | BUTTON_REPEAT :
Index: apps/gui/select.h
===================================================================
RCS file: /cvsroot/rockbox/apps/gui/select.h,v
retrieving revision 1.16
diff -u -b -r1.16 select.h
--- apps/gui/select.h	21 Mar 2006 02:23:27 -0000	1.16
+++ apps/gui/select.h	22 Jun 2006 02:50:46 -0000
@@ -32,12 +32,24 @@
 #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
+/* Remote-independent keys */
+#define SELECT_RC_OK           BUTTON_RC_MENU
+#define SELECT_RC_CANCEL       BUTTON_RC_MODE
+
+/* Remote-specific keys */
+#define SELECT_RC_OK2_H100     BUTTON_RC_ON
+#define SELECT_RC_OK3_H100     BUTTON_RC_VOL_DOWN
+#define SELECT_RC_OK2_H300     BUTTON_RC_REW
+#define SELECT_RC_CANCEL2_H100 BUTTON_RC_STOP
+#define SELECT_RC_CANCEL2_H300 BUTTON_RC_STOP
+#define SELECT_RC_INC_H100     BUTTON_RC_FF
+#define SELECT_RC_INC_H300     BUTTON_RC_VOL_UP
+#define SELECT_RC_DEC_H100     BUTTON_RC_REW
+#define SELECT_RC_DEC_H300     BUTTON_RC_VOL_DOWN
+#define SELECT_RC_INC_H100_RPT (BUTTON_RC_FF | BUTTON_REPEAT)
+#define SELECT_RC_INC_H300_RPT (BUTTON_RC_VOL_UP | BUTTON_REPEAT)
+#define SELECT_RC_DEC_H100_RPT (BUTTON_RC_REW | BUTTON_REPEAT)
+#define SELECT_RC_DEC_H300_RPT (BUTTON_RC_VOL_DOWN | BUTTON_REPEAT)
 
 #elif CONFIG_KEYPAD == RECORDER_PAD
 #define SELECT_INC     BUTTON_UP
