Move target-simulating specific keymaps out of button-sdl.c into a file per
keypad.

Copyright is restored for each keymap according to git blame.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26615 a1c6a512-1295-4272-9138-f99709370657
diff --git a/firmware/target/hosted/sdl/button-sdl.c b/firmware/target/hosted/sdl/button-sdl.c
index 20dcf63..2f971d7 100644
--- a/firmware/target/hosted/sdl/button-sdl.c
+++ b/firmware/target/hosted/sdl/button-sdl.c
@@ -29,10 +29,12 @@
 #include "kernel.h"
 #include "backlight.h"
 #include "misc.h"
-#include "sim_tasks.h"
 #include "button-sdl.h"
 #include "backlight.h"
-
+#ifdef SIMULATOR
+#include "sim_tasks.h"
+#include "buttonmap.h"
+#endif
 #include "debug.h"
 
 #ifdef HAVE_TOUCHSCREEN
@@ -63,8 +65,6 @@
 }
 #endif
 
-static int xy2button(int x, int y);
-
 struct event_queue button_queue;
 
 static int btn = 0;    /* Hopefully keeps track of currently pressed keys... */
@@ -196,77 +196,6 @@
         return;
     switch (key)
     {
-
-#ifdef HAVE_TOUCHSCREEN
-    case BUTTON_TOUCHSCREEN:
-        switch (touchscreen_get_mode())
-        {
-            case TOUCHSCREEN_POINT:
-                new_btn = BUTTON_TOUCHSCREEN;
-                break;
-            case TOUCHSCREEN_BUTTON:
-            {
-                static int touchscreen_buttons[3][3] = {
-                    {BUTTON_TOPLEFT, BUTTON_TOPMIDDLE, BUTTON_TOPRIGHT},
-                    {BUTTON_MIDLEFT, BUTTON_CENTER, BUTTON_MIDRIGHT},
-                    {BUTTON_BOTTOMLEFT, BUTTON_BOTTOMMIDDLE, BUTTON_BOTTOMRIGHT},
-                };
-                int px_x = ((mouse_coords&0xffff0000)>>16);
-                int px_y = ((mouse_coords&0x0000ffff));
-                new_btn = touchscreen_buttons[px_y/(LCD_HEIGHT/3)][px_x/(LCD_WIDTH/3)];
-                break;
-            }
-        }
-        break;
-    case SDLK_KP7:
-    case SDLK_7:
-        new_btn = BUTTON_TOPLEFT;
-        break;
-    case SDLK_KP8:
-    case SDLK_8:
-    case SDLK_UP:
-        new_btn = BUTTON_TOPMIDDLE;
-        break;
-    case SDLK_KP9:
-    case SDLK_9:
-        new_btn = BUTTON_TOPRIGHT;
-        break;
-    case SDLK_KP4:
-    case SDLK_u:
-    case SDLK_LEFT:
-        new_btn = BUTTON_MIDLEFT;
-        break;
-    case SDLK_KP5:
-    case SDLK_i:
-        new_btn = BUTTON_CENTER;
-        break;
-    case SDLK_KP6:
-    case SDLK_o:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_MIDRIGHT;
-        break;
-    case SDLK_KP1:
-    case SDLK_j:
-        new_btn = BUTTON_BOTTOMLEFT;
-        break;
-    case SDLK_KP2:
-    case SDLK_k:
-    case SDLK_DOWN:
-        new_btn = BUTTON_BOTTOMMIDDLE;
-        break;
-    case SDLK_KP3:
-    case SDLK_l:
-        new_btn = BUTTON_BOTTOMRIGHT;
-        break;
-    case SDLK_F4:
-        if(pressed)
-        {
-            touchscreen_set_mode(touchscreen_get_mode() == TOUCHSCREEN_POINT ? TOUCHSCREEN_BUTTON : TOUCHSCREEN_POINT);
-            printf("Touchscreen mode: %s\n", touchscreen_get_mode() == TOUCHSCREEN_POINT ? "TOUCHSCREEN_POINT" : "TOUCHSCREEN_BUTTON");
-        }
-        break;
-            
-#endif
     case USB_KEY:
         if (!pressed)
         {
@@ -298,1116 +227,7 @@
         }
         return;
 #endif
-        
-#if CONFIG_KEYPAD == GIGABEAT_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_F8:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-    case SDLK_a:
-        new_btn = BUTTON_A;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_KP_PERIOD:
-    case SDLK_INSERT:
-        new_btn = BUTTON_MENU;
-        break;
-    case SDLK_KP9:
-        new_btn = BUTTON_VOL_UP;
-        break;
-    case SDLK_KP3:
-        new_btn = BUTTON_VOL_DOWN;
-        break;
 
-#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_F8:
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_KP7:
-        new_btn = BUTTON_BACK;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_KP9:
-    case SDLK_KP_PERIOD:
-    case SDLK_INSERT:
-        new_btn = BUTTON_MENU;
-        break;
-
-#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_F8:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-    case SDLK_a:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP_DIVIDE:
-    case SDLK_F1:
-        new_btn = BUTTON_REC;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-
-#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
-    case SDLK_KP4:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_LEFT:
-        new_btn = BUTTON_RC_REW;
-        break;
-    case SDLK_KP6:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RC_FF;
-        break;
-    case SDLK_KP8:
-        new_btn = BUTTON_VOL_UP;
-        break;
-    case SDLK_UP:
-        new_btn = BUTTON_RC_VOL_UP;
-        break;
-    case SDLK_KP2:
-        new_btn = BUTTON_VOL_DOWN;
-        break;
-    case SDLK_DOWN:
-        new_btn = BUTTON_RC_VOL_DOWN;
-        break;
-    case SDLK_KP_PERIOD:
-        new_btn = BUTTON_MODE;
-        break;
-    case SDLK_INSERT:
-        new_btn = BUTTON_RC_MODE;
-        break;
-    case SDLK_KP_DIVIDE:
-        new_btn = BUTTON_REC;
-        break;
-    case SDLK_F1:
-        new_btn = BUTTON_RC_REC;
-        break;
-    case SDLK_KP5:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_SPACE:
-        new_btn = BUTTON_RC_PLAY;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-        new_btn = BUTTON_RC_MENU;
-        break;
-
-#elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
-   || (CONFIG_KEYPAD == IPOD_4G_PAD)
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_SCROLL_BACK;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_SCROLL_FWD;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_F8:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_KP_PERIOD:
-    case SDLK_INSERT:
-        new_btn = BUTTON_MENU;
-        break;
-
-#elif CONFIG_KEYPAD == IRIVER_H10_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_SCROLL_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_SCROLL_DOWN;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_F8:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP_DIVIDE:
-    case SDLK_F1:
-        new_btn = BUTTON_REW;
-        break;
-    case SDLK_KP_MULTIPLY:
-    case SDLK_F2:
-        new_btn = BUTTON_FF;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_PLAY;
-        break;
-
-#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
-    case SDLK_t:
-        if(pressed)
-            switch(_remote_type)
-            {
-                case REMOTETYPE_UNPLUGGED: 
-                    _remote_type=REMOTETYPE_H100_LCD;
-                    DEBUGF("Changed remote type to H100\n");
-                    break;
-                case REMOTETYPE_H100_LCD:
-                    _remote_type=REMOTETYPE_H300_LCD;
-                    DEBUGF("Changed remote type to H300\n");
-                    break;
-                case REMOTETYPE_H300_LCD:
-                    _remote_type=REMOTETYPE_H300_NONLCD;
-                    DEBUGF("Changed remote type to H300 NON-LCD\n");
-                    break;
-                case REMOTETYPE_H300_NONLCD:
-                    _remote_type=REMOTETYPE_UNPLUGGED;
-                    DEBUGF("Changed remote type to none\n");
-                    break;
-            }
-        break;
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_F8:
-        new_btn = BUTTON_ON;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-    case SDLK_a:
-        new_btn = BUTTON_OFF;
-        break;
-    case SDLK_KP_DIVIDE:
-    case SDLK_F1:
-        new_btn = BUTTON_REC;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_KP_PERIOD:
-    case SDLK_INSERT:
-        new_btn = BUTTON_MODE;
-        break;
-
-#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_F8:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-    case SDLK_a:
-       new_btn = BUTTON_EQ;
-       break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_KP_PERIOD:
-    case SDLK_INSERT:
-        new_btn = BUTTON_MODE;
-        break;
-
-#elif CONFIG_KEYPAD == ONDIO_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-    case SDLK_a:
-        new_btn = BUTTON_OFF;
-        break;
-    case SDLK_KP_PERIOD:
-    case SDLK_INSERT:
-        new_btn = BUTTON_MENU;
-        break;
-
-#elif CONFIG_KEYPAD == PLAYER_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_STOP;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_F8:
-        new_btn = BUTTON_ON;
-        break;
-    case SDLK_KP_PERIOD:
-    case SDLK_INSERT:
-        new_btn = BUTTON_MENU;
-        break;
-
-#elif CONFIG_KEYPAD == RECORDER_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_F8:
-        new_btn = BUTTON_ON;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-    case SDLK_a:
-        new_btn = BUTTON_OFF;
-        break;
-    case SDLK_KP_DIVIDE:
-    case SDLK_F1:
-        new_btn = BUTTON_F1;
-        break;
-    case SDLK_KP_MULTIPLY:
-    case SDLK_F2:
-        new_btn = BUTTON_F2;
-        break;
-    case SDLK_KP_MINUS:
-    case SDLK_F3:
-        new_btn = BUTTON_F3;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_PLAY;
-        break;
-
-#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_F8:
-        new_btn = BUTTON_ON;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-    case SDLK_a:
-        new_btn = BUTTON_OFF;
-        break;
-    case SDLK_KP_DIVIDE:
-    case SDLK_F1:
-        new_btn = BUTTON_F1;
-        break;
-    case SDLK_KP_MULTIPLY:
-    case SDLK_F2:
-        new_btn = BUTTON_F2;
-        break;
-    case SDLK_KP_MINUS:
-    case SDLK_F3:
-        new_btn = BUTTON_F3;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-
-#elif CONFIG_KEYPAD == SANSA_E200_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_SCROLL_BACK;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_SCROLL_FWD;
-        break;
-    case SDLK_KP9:
-    case SDLK_PAGEUP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP3:
-    case SDLK_PAGEDOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP1:
-    case SDLK_HOME:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP7:
-    case SDLK_END:
-        new_btn = BUTTON_REC;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-
-#elif CONFIG_KEYPAD == SANSA_C200_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP3:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP1:
-        new_btn = BUTTON_REC;
-        break;
-    case SDLK_KP5:
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_KP7:
-        new_btn = BUTTON_VOL_DOWN;
-        break;
-    case SDLK_KP9:
-        new_btn = BUTTON_VOL_UP;
-        break;
-        
-#elif CONFIG_KEYPAD == MROBE500_PAD
-    case SDLK_F9:
-        new_btn = BUTTON_RC_HEART;
-        break;
-    case SDLK_F10:
-        new_btn = BUTTON_RC_MODE;
-        break;
-    case SDLK_F11:
-        new_btn = BUTTON_RC_VOL_DOWN;
-        break;
-    case SDLK_F12:
-        new_btn = BUTTON_RC_VOL_UP;
-        break;
-    case SDLK_MINUS:
-    case SDLK_LESS:
-    case SDLK_LEFTBRACKET:
-    case SDLK_KP_DIVIDE:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_PLUS:
-    case SDLK_GREATER:
-    case SDLK_RIGHTBRACKET:
-    case SDLK_KP_MULTIPLY:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_PAGEUP:
-        new_btn = BUTTON_RC_PLAY;
-        break;
-    case SDLK_PAGEDOWN:
-        new_btn = BUTTON_RC_DOWN;
-        break;
-    case SDLK_F8:
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_POWER;
-        break;
-#elif CONFIG_KEYPAD == MROBE100_PAD
-    case SDLK_F9:
-        new_btn = BUTTON_RC_HEART;
-        break;
-    case SDLK_F10:
-        new_btn = BUTTON_RC_MODE;
-        break;
-    case SDLK_F11:
-        new_btn = BUTTON_RC_VOL_DOWN;
-        break;
-    case SDLK_F12:
-        new_btn = BUTTON_RC_VOL_UP;
-        break;
-    case SDLK_LEFT:
-        new_btn = BUTTON_RC_FF;
-        break;
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RC_REW;
-        break;
-    case SDLK_UP:
-        new_btn = BUTTON_RC_PLAY;
-        break;
-    case SDLK_DOWN:
-        new_btn = BUTTON_RC_DOWN;
-        break;
-    case SDLK_KP1:
-        new_btn = BUTTON_DISPLAY;
-        break;
-    case SDLK_KP7:
-        new_btn = BUTTON_MENU;
-        break;
-    case SDLK_KP9:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_KP4:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_KP_MULTIPLY:
-    case SDLK_F8:
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_POWER;
-        break;
-    
-#elif CONFIG_KEYPAD == COWON_D2_PAD
-    case SDLK_KP_MULTIPLY:
-    case SDLK_F8:
-    case SDLK_ESCAPE:
-    case SDLK_BACKSPACE:
-    case SDLK_DELETE:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_EQUALS:
-        new_btn = BUTTON_PLUS;
-        break;
-    case SDLK_KP_MINUS:
-    case SDLK_MINUS:
-        new_btn = BUTTON_MINUS;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-    case SDLK_SPACE:
-    case SDLK_INSERT:
-        new_btn = BUTTON_MENU;
-        break;
-#elif CONFIG_KEYPAD == IAUDIO67_PAD
-    case SDLK_UP:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_DOWN:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_LEFT:
-        new_btn = BUTTON_STOP;
-        break;
-    case SDLK_RETURN:
-    case SDLK_KP_ENTER:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_PLUS:
-        new_btn = BUTTON_VOLUP;
-        break;
-    case SDLK_MINUS:
-        new_btn = BUTTON_VOLDOWN;
-        break;
-    case SDLK_SPACE:
-        new_btn = BUTTON_MENU;
-        break;
-    case SDLK_BACKSPACE:
-        new_btn = BUTTON_POWER;
-        break;
-#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
-    case SDLK_KP1:
-        new_btn = BUTTON_BACK;
-        break;
-    case SDLK_KP3:
-        new_btn = BUTTON_MENU;
-        break;
-    case SDLK_KP7:
-        new_btn = BUTTON_CUSTOM;
-        break;
-    case SDLK_KP9:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_KP_MULTIPLY:
-    case SDLK_F8:
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_POWER;
-        break;
-#elif CONFIG_KEYPAD == CREATIVEZV_PAD
-    case SDLK_KP1:
-        new_btn = BUTTON_PREV;
-        break;
-    case SDLK_KP3:
-        new_btn = BUTTON_NEXT;
-        break;
-    case SDLK_KP7:
-        new_btn = BUTTON_BACK;
-        break;
-    case SDLK_p:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_KP9:
-        new_btn = BUTTON_MENU;
-        break;
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_KP_MULTIPLY:
-    case SDLK_F8:
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_z:
-        new_btn = BUTTON_VOL_DOWN;
-        break;
-    case SDLK_s:
-        new_btn = BUTTON_VOL_UP;
-
-#elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
-    case SDLK_KP1:
-        new_btn = BUTTON_PREV;
-        break;
-    case SDLK_KP3:
-        new_btn = BUTTON_NEXT;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-    case SDLK_a:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_KP_PERIOD:
-    case SDLK_INSERT:
-        new_btn = BUTTON_MENU;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-#elif CONFIG_KEYPAD == SANSA_FUZE_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_SCROLL_BACK;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_SCROLL_FWD;
-        break;
-    case SDLK_PAGEUP:
-    case SDLK_KP9:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_PAGEDOWN:
-    case SDLK_KP3:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP_MINUS:
-    case SDLK_KP1:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP_MULTIPLY:
-        new_btn = BUTTON_HOME;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-        new_btn = BUTTON_SELECT;
-        break;
-#elif CONFIG_KEYPAD == SANSA_CLIP_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    
-    case SDLK_INSERT:
-    case SDLK_KP_MULTIPLY:
-        new_btn = BUTTON_HOME;
-        break;
-    case SDLK_SPACE:
-    case SDLK_KP5:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_PAGEDOWN:
-    case SDLK_KP3:
-        new_btn = BUTTON_VOL_DOWN;
-        break;
-    case SDLK_PAGEUP:
-    case SDLK_KP9:
-        new_btn = BUTTON_VOL_UP;
-        break;
-    case SDLK_ESCAPE:
-    case SDLK_KP1:
-        new_btn = BUTTON_POWER;
-        break;
-#elif CONFIG_KEYPAD == SANSA_M200_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_PLUS:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP5:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_KP7:
-        new_btn = BUTTON_VOL_DOWN;
-        break;
-    case SDLK_KP9:
-        new_btn = BUTTON_VOL_UP;
-        break;
-#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP1:
-        new_btn = BUTTON_MENU;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_KP7:
-        new_btn = BUTTON_PREV;
-        break;
-    case SDLK_KP9:
-        new_btn = BUTTON_NEXT;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_PAGEUP:
-        new_btn = BUTTON_VOL_UP;
-        break;
-    case SDLK_PAGEDOWN:
-        new_btn = BUTTON_VOL_DOWN;
-        break;
-#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP5:
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_KP7:
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP1:
-        new_btn = BUTTON_PLAYLIST;
-        break;
-    case SDLK_KP9:
-        new_btn = BUTTON_VOL_UP;
-        break;
-    case SDLK_KP3:
-        new_btn = BUTTON_VOL_DOWN;
-        break;
-    case SDLK_KP_MINUS:
-        new_btn = BUTTON_MENU;
-        break;
-    case SDLK_KP_PLUS:
-        new_btn = BUTTON_VIEW;
-        break;
-#elif CONFIG_KEYPAD == ONDAVX747_PAD
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP_PLUS:
-    case SDLK_PLUS:
-    case SDLK_GREATER:
-    case SDLK_RIGHTBRACKET:
-    case SDLK_KP_MULTIPLY:
-        new_btn = BUTTON_VOL_UP;
-        break;
-    case SDLK_KP_MINUS:
-    case SDLK_MINUS:
-    case SDLK_LESS:
-    case SDLK_LEFTBRACKET:
-    case SDLK_KP_DIVIDE:
-        new_btn = BUTTON_VOL_DOWN;
-        break;
-    case SDLK_KP_ENTER:
-    case SDLK_RETURN:
-        new_btn = BUTTON_MENU;
-        break;
-#elif CONFIG_KEYPAD == ONDAVX777_PAD
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_POWER;
-        break;
-#elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_LEFT;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_RIGHT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP5:
-    case SDLK_KP_ENTER:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_KP9:
-    case SDLK_PAGEUP:
-        new_btn = BUTTON_FFWD;
-        break;
-#ifdef SAMSUNG_YH820
-    case SDLK_KP7:
-#else
-    case SDLK_KP3:
-#endif
-    case SDLK_PAGEDOWN:
-        new_btn = BUTTON_REW;
-        break;
-    case SDLK_KP_PLUS:
-        new_btn = BUTTON_REC;
-        break;
-#elif CONFIG_KEYPAD == MINI2440_PAD
-    /* no keymap, touchscreen */
-#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
-    case SDLK_KP4:
-    case SDLK_LEFT:
-        new_btn = BUTTON_PREV;
-        break;
-    case SDLK_KP6:
-    case SDLK_RIGHT:
-        new_btn = BUTTON_NEXT;
-        break;
-    case SDLK_KP8:
-    case SDLK_UP:
-        new_btn = BUTTON_UP;
-        break;
-    case SDLK_KP2:
-    case SDLK_DOWN:
-        new_btn = BUTTON_DOWN;
-        break;
-    case SDLK_KP7:
-        new_btn = BUTTON_MENU;
-        break;
-    case SDLK_KP9:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_KP5:
-        new_btn = BUTTON_OK;
-        break;
-    case SDLK_KP_DIVIDE:
-        new_btn = BUTTON_CANCEL;
-        break;
-    case SDLK_KP_PLUS:
-        new_btn = BUTTON_POWER;
-        break;
-    case SDLK_KP_MULTIPLY:
-        new_btn = BUTTON_REC;
-        break;
-
-#elif CONFIG_KEYPAD == MPIO_HD200_PAD
-    case SDLK_UP:
-        new_btn = BUTTON_PREV;
-        break;
-    case SDLK_DOWN:
-        new_btn = BUTTON_NEXT;
-        break;
-    case SDLK_SPACE:
-        new_btn = BUTTON_SELECT;
-        break;
-    case SDLK_RETURN:
-        new_btn = BUTTON_PLAY;
-        break;
-    case SDLK_LEFT:
-        new_btn = BUTTON_VOL_DOWN;
-        break;
-    case SDLK_RIGHT:
-        new_btn = BUTTON_VOL_UP;
-        break;
-    case SDLK_ESCAPE:
-        new_btn = BUTTON_REC;
-        break;
-    
-#else
-#error No keymap defined!
-#endif /* CONFIG_KEYPAD */
     case SDLK_KP0:
     case SDLK_F5:
         if(pressed)
@@ -1416,8 +236,14 @@
             return;
         }
         break;
+    default:
+#ifdef HAVE_TOUCHSCREEN
+        new_btn = key_to_touch(key);
+        if (!new_btn)
+#endif
+            new_btn = key_to_button(key);
+        break;
     }
-    
     /* Call to make up for scrollwheel target implementation.  This is
      * not handled in the main button.c driver, but on the target
      * implementation (look at button-e200.c for example if you are trying to 
@@ -1513,477 +339,3 @@
     tick_add_task(mouse_tick_task);
 #endif
 }
-
-/* Button maps: simulated key, x, y, radius, name */
-/* Run sim with --mapping to get coordinates      */
-/* or --debugbuttons to check                     */
-/* The First matching button is returned          */
-struct button_map {
-    int button, x, y, radius;
-    char *description;
-};
-
-#ifdef SANSA_FUZE
-struct button_map bm[] = {
-    { SDLK_KP8,          70, 265, 35, "Scroll Back" },
-    { SDLK_KP9,         141, 255, 31, "Play" },
-    { SDLK_KP_MULTIPLY, 228, 267, 18, "Home" },
-    { SDLK_LEFT,         69, 329, 31, "Left" },
-    { SDLK_SPACE,       141, 330, 20, "Select" },
-    { SDLK_RIGHT,       214, 331, 23, "Right" },
-    { SDLK_KP3,         142, 406, 30, "Menu" },
-    { SDLK_DOWN,        221, 384, 24, "Scroll Fwd" },
-    { SDLK_KP_MINUS,    270, 299, 25, "Power" },
-    { SDLK_h,           269, 358, 26, "Hold" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (SANSA_CLIP)
-struct button_map bm[] = {
-    { SDLK_KP_MULTIPLY, 165, 158,  17, "Home" },
-    { SDLK_KP5,         102, 230,  29, "Select" },
-    { SDLK_KP8,         100, 179,  25, "Play" },
-    { SDLK_KP4,          53, 231,  21, "Left" },
-    { SDLK_KP6,         147, 232,  19, "Right" },
-    { SDLK_KP2,         105, 275,  22, "Menu" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (SANSA_C200) || defined(SANSA_C200V2)
-struct button_map bm[] = {
-    
-    { SDLK_KP7,      84,   7, 21, "Vol Down" },
-    { SDLK_KP9,     158,   7, 20, "Vol Up" },
-    { SDLK_KP1,     173, 130, 27, "Record" },
-    { SDLK_KP5,     277,  75, 21, "Select" },
-    { SDLK_KP4,     233,  75, 24, "Left" },
-    { SDLK_KP6,     313,  74, 18, "Right" },
-    { SDLK_KP8,     276,  34, 15, "Play" },
-    { SDLK_KP2,     277, 119, 17, "Down" },
-    { SDLK_KP3,     314, 113, 19, "Menu" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (SANSA_E200V2) || defined(SANSA_E200)
-struct button_map bm[] = {
-    { SDLK_KP7,         5,  92, 18, "Record" },
-    { SDLK_KP9,       128, 295, 43, "Play" },
-    { SDLK_KP4,        42, 380, 33, "Left" },
-    { SDLK_KP5,       129, 378, 36, "Select" },
-    { SDLK_KP6,       218, 383, 30, "Right" },
-    { SDLK_KP3,       129, 461, 29, "Down" },
-    { SDLK_KP1,        55, 464, 20, "Menu" },
-    { SDLK_KP8,        92, 338, 17, "Scroll Back" },
-    { SDLK_KP2,       167, 342, 17, "Scroll Fwd"  },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (SANSA_M200V4)
-struct button_map bm[] = {
-    { SDLK_KP_PLUS, 54,  14, 16, "Power" },
-    { SDLK_KP7,     96,  13, 12, "Vol Down" },
-    { SDLK_KP9,    139,  14, 14, "Vol Up" },
-    { SDLK_KP5,    260,  82, 20, "Select" },
-    { SDLK_KP8,    258,  35, 30, "Play" },
-    { SDLK_KP4,    214,  84, 25, "Left" },
-    { SDLK_KP6,    300,  83, 24, "Right" },
-    { SDLK_KP2,    262, 125, 28, "Repeat" },
-    { SDLK_h,      113, 151, 21, "Hold" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (IPOD_VIDEO)
-struct button_map bm[] = {
-    { SDLK_KP_PERIOD,  174, 350, 35, "Menu" },
-    { SDLK_KP8,        110, 380, 33, "Scroll Back" },
-    { SDLK_KP2,        234, 377, 34, "Scroll Fwd" },
-    { SDLK_KP4,         78, 438, 47, "Left" },
-    { SDLK_KP5,        172, 435, 43, "Select" },
-    { SDLK_KP6,        262, 438, 52, "Right" },
-    { SDLK_KP_PLUS,    172, 519, 43, "Play" },
-    { 0, 0, 0 , 0, "None" }
-};
-#elif defined (IPOD_MINI) || defined(IPOD_MINI2G)
-struct button_map bm[] = {
-    { SDLK_KP5,       92, 267, 29, "Select" },
-    { SDLK_KP4,       31, 263, 37, "Left" },
-    { SDLK_KP6,      150, 268, 33, "Right" },
-    { SDLK_KP_PERIOD, 93, 209, 30, "Menu" },
-    { SDLK_KP_PLUS,   93, 324, 25, "Play" },
-    { SDLK_KP8,       53, 220, 29, "Scroll Back" },
-    { SDLK_KP2,      134, 219, 31, "Scroll Fwd" },
-    { 0, 0, 0 , 0, "None" }
-};
-#elif defined (IPOD_3G)
-struct button_map bm[] = {
-    { SDLK_KP5,       108, 296, 26, "Select" },
-    { SDLK_KP8,        70, 255, 26, "Scroll Back" },
-    { SDLK_KP2,       149, 256, 28, "Scroll Fwd" },
-    { SDLK_KP4,        27, 186, 22, "Left" },
-    { SDLK_KP_PERIOD,  82, 185, 22, "Menu" },
-    { SDLK_KP_PERIOD, 133, 185, 21, "Play" },
-    { SDLK_KP6,       189, 188, 21, "Right" },
-    { 0, 0, 0 , 0, "None" }
-};
-#elif defined (IPOD_4G)
-struct button_map bm[] = {
-    { SDLK_KP5,        96, 269, 27, "Select" },
-    { SDLK_KP4,        39, 267, 30, "Left" },
-    { SDLK_KP6,       153, 270, 27, "Right" },
-    { SDLK_KP_PERIOD,  96, 219, 30, "Menu" },
-    { SDLK_KP_PLUS,    95, 326, 27, "Play" },
-    { SDLK_KP8,        57, 233, 29, "Scroll Back" },
-    { SDLK_KP2,       132, 226, 29, "Scroll Fwd" },
-    { 0, 0, 0 , 0, "None" }
-};
-#elif defined (IPOD_COLOR) 
-struct button_map bm[] = {
-    { SDLK_KP5,        128, 362, 35, "Select" },
-    { SDLK_KP4,         55, 358, 38, "Left" },
-    { SDLK_KP6,        203, 359, 39, "Right" },
-    { SDLK_KP_PERIOD,  128, 282, 34, "Menu" },
-    { SDLK_KP_PLUS,    129, 439, 41, "Play" },
-    { SDLK_KP8,         76, 309, 34, "Scroll Back" },
-    { SDLK_KP2,        182, 311, 45, "Scroll Fwd" },
-    { 0, 0, 0 , 0, "None" }
-};
-#elif defined (IPOD_1G2G) 
-struct button_map bm[] = {
-    { SDLK_KP5,       112, 265, 31, "Select" },
-    { SDLK_KP8,        74, 224, 28, "Scroll Back" },
-    { SDLK_KP2,       146, 228, 28, "Scroll Fwd" },
-    /* Dummy button to make crescent shape */
-    { SDLK_y,         112, 265, 76, "None" },
-    { SDLK_KP8,        74, 224, 28, "Scroll Back" },
-    { SDLK_KP2,       146, 228, 28, "Scroll Fwd" },
-    { SDLK_KP6,       159, 268, 64, "Right" },
-    { SDLK_KP4,        62, 266, 62, "Left" },
-    { SDLK_KP_PERIOD, 111, 216, 64, "Menu" },
-    { SDLK_KP_PLUS,   111, 326, 55, "Down" },
-    { 0, 0, 0 , 0, "None" }
-};
-#elif defined (IPOD_NANO) 
-struct button_map bm[] = {
-    { SDLK_KP5,       98, 316, 37, "Select" },
-    { SDLK_KP4,       37, 312, 28, "Left" },
-    { SDLK_KP6,      160, 313, 25, "Right" },
-    { SDLK_KP_PERIOD,102, 256, 23, "Menu" },
-    { SDLK_KP_PLUS,   99, 378, 28, "Play" },
-    { SDLK_KP8,       58, 272, 24, "Scroll Back" },
-    { SDLK_KP2,      141, 274, 22, "Scroll Fwd" },
-    { 0, 0, 0 , 0, "None" }
-};
-#elif defined (IPOD_NANO2G) 
-struct button_map bm[] = {
-    { SDLK_KP5,       118, 346, 37, "Select" },
-    { SDLK_KP4,        51, 345, 28, "Left" },
-    { SDLK_KP6,       180, 346, 26, "Right" },
-    { SDLK_KP_PERIOD, 114, 286, 23, "Menu" },
-    { SDLK_KP_PLUS,   115, 412, 27, "Down" },
-    { SDLK_KP8,        67, 303, 28, "Scroll Back" },
-    { SDLK_KP2,       163, 303, 27, "Scroll Fwd" },
-    { 0, 0, 0 , 0, "None" }
-};
-#elif defined (COWON_D2)
-struct button_map bm[] = {
-    { SDLK_DELETE,     51, 14, 17, "Power" },
-    { SDLK_h,         138, 14, 16, "Hold" },
-    { SDLK_MINUS,     320, 14, 10, "Minus" },
-    { SDLK_INSERT,    347, 13, 13, "Menu" },
-    { SDLK_KP_PLUS,   374, 14, 12, "Plus" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (IAUDIO_M3)
-struct button_map bm[] = {
-    { SDLK_KP5,         256,  72, 29, "Play" },
-    { SDLK_KP6,         255, 137, 28, "Right" },
-    { SDLK_KP4,         257, 201, 26, "Left" },
-    { SDLK_KP8,         338,  31, 27, "Up" },
-    { SDLK_KP2,         339,  92, 23, "Down" },
-    { SDLK_KP_PERIOD,   336,  50, 23, "Mode" },
-    { SDLK_KP_DIVIDE,   336, 147, 23, "Rec" },
-    { SDLK_h,           336, 212, 30, "Hold" },
-    /* remote */
-    { SDLK_SPACE,       115, 308, 20, "RC Play" },
-    { SDLK_RIGHT,        85, 308, 20, "RC Rew" },
-    { SDLK_LEFT,        143, 308, 20, "RC FF" },
-    { SDLK_UP,          143, 498, 20, "RC Up" },
-    { SDLK_DOWN,         85, 498, 20, "RC Down" },
-    { SDLK_INSERT,      212, 308, 30, "RC Mode" },
-    { SDLK_F1,          275, 308, 25, "RC Rec" },
-    { SDLK_KP_ENTER,    115, 498, 20, "RC Menu" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (IAUDIO_M5)
-struct button_map bm[] = {
-    { SDLK_KP_ENTER,  333,  41, 17, "Enter" },
-    { SDLK_h,         334,  74, 21, "Hold" },
-    { SDLK_KP_DIVIDE, 333, 142, 24, "Record" },
-    { SDLK_KP_PLUS,   332, 213, 20, "Play" },
-    { SDLK_KP5,       250, 291, 19, "Select" },
-    { SDLK_KP8,       249, 236, 32, "Up" },
-    { SDLK_KP4,       194, 292, 29, "Left" },
-    { SDLK_KP6,       297, 290, 27, "Right" },
-    { SDLK_KP2,       252, 335, 28, "Down" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (IAUDIO_7)
-struct button_map bm[] = {  
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (IAUDIO_X5)
-struct button_map bm[] = {
-    { SDLK_KP_ENTER,  275,  38, 17, "Power" },
-    { SDLK_h,         274,  83, 16, "Hold" },
-    { SDLK_KP_DIVIDE, 276, 128, 22, "Record" },
-    { SDLK_KP_PLUS,   274, 186, 22, "Play" },
-    { SDLK_KP5,       200, 247, 16, "Select" },
-    { SDLK_KP8,       200, 206, 16, "Up" },
-    { SDLK_KP4,       163, 248, 19, "Left" },
-    { SDLK_KP6,       225, 247, 24, "Right" },
-    { SDLK_KP2,       199, 279, 20, "Down" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (ARCHOS_PLAYER)
-struct button_map bm[] = {
-    { SDLK_KP_PLUS,   79, 252, 23, "On" },
-    { SDLK_KP_PERIOD, 81, 310, 20, "Menu" },
-    { SDLK_KP8,      154, 237, 28, "Play" },
-    { SDLK_KP4,      121, 282, 23, "Left" },
-    { SDLK_KP6,      187, 282, 22, "Right" },
-    { SDLK_KP2,      157, 312, 20, "Down" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (ARCHOS_RECORDER)
-struct button_map bm[] = {
-    { SDLK_F1,        94, 205, 22, "F1" },
-    { SDLK_F2,       136, 204, 21, "F2" },
-    { SDLK_F3,       174, 204, 24, "F3" },
-    { SDLK_KP_PLUS,   75, 258, 19, "On" },
-    { SDLK_KP_ENTER,  76, 307, 15, "Off" },
-    { SDLK_KP5,      151, 290, 20, "Select" },
-    { SDLK_KP8,      152, 251, 23, "Up" },
-    { SDLK_KP4,      113, 288, 26, "Left" },
-    { SDLK_KP6,      189, 291, 23, "Right" },
-    { SDLK_KP2,      150, 327, 27, "Down" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (ARCHOS_FMRECORDER) || defined (ARCHOS_RECORDERV2)
-struct button_map bm[] = {
-    { SDLK_F1,         88, 210, 28, "F1" },
-    { SDLK_F2,        144, 212, 28, "F2" },
-    { SDLK_F3,        197, 212, 28, "F3" },
-    { SDLK_KP5,       144, 287, 21, "Select" },
-    { SDLK_KP_PLUS,    86, 320, 13, "Menu" },
-    { SDLK_KP_ENTER,  114, 347, 13, "Stop" },
-    { SDLK_y,         144, 288, 31, "None" },
-    { SDLK_KP8,       144, 259, 25, "Up" },
-    { SDLK_KP2,       144, 316, 31, "Down" },
-    { SDLK_KP6,       171, 287, 32, "Right" },
-    { SDLK_KP4,       117, 287, 31, "Left" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (ARCHOS_ONDIOSP) || defined (ARCHOS_ONDIOFM)
-struct button_map bm[] = {
-    { SDLK_KP_ENTER,  75, 23, 30, "Enter" },
-    { SDLK_KP8,       75, 174, 33, "KP8" },
-    { SDLK_KP4,       26, 186, 48, "KP4" },
-    { SDLK_KP6,      118, 196, 32, "KP6" },
-    { SDLK_KP2,       75, 234, 16, "KP2" },
-    { SDLK_KP_PERIOD, 54, 250, 24, "Period" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (IRIVER_H10)
-struct button_map bm[] = {
-    { SDLK_KP_PLUS,       38,  70, 37, "Power" },
-    { SDLK_KP4,          123, 194, 26, "Cancel" },
-    { SDLK_KP6,          257, 195, 34, "Select" },
-    { SDLK_KP8,          190, 221, 28, "Up" },
-    { SDLK_KP2,          192, 320, 27, "Down" },
-    { SDLK_KP_DIVIDE,    349,  49, 20, "Rew" },
-    { SDLK_KP5,          349,  96, 20, "Play" },
-    { SDLK_KP_MULTIPLY,  350, 141, 23, "FF" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (IRIVER_H10_5GB)
-struct button_map bm[] = {
-    { SDLK_KP_PLUS,      34,  76, 23, "Power" },
-    { SDLK_KP4,         106, 222, 28, "Cancel" },
-    { SDLK_KP6,         243, 220, 31, "Select" },
-    { SDLK_KP8,         176, 254, 34, "Up" },
-    { SDLK_KP2,         175, 371, 35, "Down" },
-    { SDLK_KP_DIVIDE,   319,  63, 26, "Rew" },
-    { SDLK_KP5,         320, 124, 26, "Play" },
-    { SDLK_KP_MULTIPLY, 320, 181, 32, "FF" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (IRIVER_H120) || defined (IRIVER_H100)
-struct button_map bm[] = {
-    { SDLK_KP_DIVIDE,   46, 162, 13, "Record" },
-    { SDLK_KP_PLUS,    327,  36, 16, "Play" },
-    { SDLK_KP_ENTER,   330,  99, 18, "Stop" },
-    { SDLK_KP_PERIOD,  330, 163, 18, "AB" },
-    { SDLK_KP5,        186, 227, 27, "5" },
-    { SDLK_KP8,        187, 185, 19, "8" },
-    { SDLK_KP4,        142, 229, 23, "4" },
-    { SDLK_KP6,        231, 229, 22, "6" },
-    { SDLK_KP2,        189, 272, 28, "2" },
-/* Remote Buttons */
-    { SDLK_KP_ENTER,   250, 404, 20, "Stop" },
-    { SDLK_SPACE,      285, 439, 29, "Space" },
-    { SDLK_h,          336, 291, 24, "Hold" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (IRIVER_H300)
-struct button_map bm[] = {
-    { SDLK_KP_PLUS,     56, 335, 20, "Play" },
-    { SDLK_KP8,        140, 304, 29, "Up" },
-    { SDLK_KP_DIVIDE,  233, 331, 23, "Record" },
-    { SDLK_KP_ENTER,    54, 381, 24, "Stop" },
-    { SDLK_KP4,        100, 353, 17, "Left" },
-    { SDLK_KP5,        140, 351, 19, "Navi" },
-    { SDLK_KP6,        185, 356, 19, "Right" },
-    { SDLK_KP_PERIOD,  230, 380, 20, "AB" },
-    { SDLK_KP2,        142, 402, 24, "Down" },
-    { SDLK_KP_ENTER,   211, 479, 21, "Stop" },
-    { SDLK_KP_PLUS,    248, 513, 29, "Play" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (MROBE_500)
-struct button_map bm[] = {
-    { SDLK_KP9,     171, 609, 9, "Play" },
-    { SDLK_KP4,     158, 623, 9, "Left" },
-    { SDLK_KP6,     184, 622, 9, "Right" },
-    { SDLK_KP7,     171, 638, 11, "Menu" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (MROBE_100)
-struct button_map bm[] = {
-    { SDLK_KP7,      80, 233, 30, "Menu" },
-    { SDLK_KP8,     138, 250, 19, "Up" },
-    { SDLK_KP9,     201, 230, 27, "Play" },
-    { SDLK_KP4,      63, 305, 25, "Left" },
-    { SDLK_KP5,     125, 309, 28, "Select" },
-    { SDLK_KP6,     200, 307, 35, "Right" },
-    { SDLK_KP1,      52, 380, 32, "Display" },
-    { SDLK_KP2,     125, 363, 30, "Down" },
-    { SDLK_KP9,     168, 425, 10, "Play" },
-    { SDLK_KP4,     156, 440, 11, "Left" },
-    { SDLK_KP6,     180, 440, 13, "Right" },
-    { SDLK_KP7,     169, 452, 10, "Menu" },
-    { SDLK_KP_MULTIPLY, 222, 15, 16, "Power" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (GIGABEAT_F)
-struct button_map bm[] = {
-    { SDLK_KP_PLUS,    361, 187, 22, "Power" },
-    { SDLK_KP_PERIOD,  361, 270, 17, "Menu" },
-    { SDLK_KP9,        365, 345, 26, "Vol Up" },
-    { SDLK_KP3,        363, 433, 25, "Vol Down" },
-    { SDLK_KP_ENTER,   365, 520, 19, "A" },
-    { SDLK_KP8,        167, 458, 35, "Up" },
-    { SDLK_KP4,         86, 537, 29, "Left" },
-    { SDLK_KP5,        166, 536, 30, "Select" },
-    { SDLK_KP6,        248, 536, 30, "Right" },
-    { SDLK_KP2,        169, 617, 28, "Down" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (GIGABEAT_S)
-struct button_map bm[] = {
-    { SDLK_KP_PLUS, 416, 383, 23, "Play" },
-    { SDLK_KP7,     135, 442, 46, "Back" },
-    { SDLK_KP9,     288, 447, 35, "Menu" },
-    { SDLK_KP8,     214, 480, 32, "Up" },
-    { SDLK_KP4,     128, 558, 33, "Left" },
-    { SDLK_KP5,     214, 556, 34, "Select" },
-    { SDLK_KP6,     293, 558, 35, "Right" },
-    { SDLK_KP2,     214, 637, 38, "Down" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (SAMSUNG_YH820)
-struct button_map bm[] = {
-    { SDLK_KP_PLUS, 330,  53, 23, "Record" },
-    { SDLK_KP7,     132, 208, 21, "Left" },
-    { SDLK_KP5,     182, 210, 18, "Play" },
-    { SDLK_KP9,     234, 211, 22, "Right" },
-    { SDLK_KP8,     182, 260, 15, "Up" },
-    { SDLK_KP4,     122, 277, 29, "Menu" },
-    { SDLK_KP6,     238, 276, 25, "Select" },
-    { SDLK_KP2,     183, 321, 24, "Down" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (SAMSUNG_YH920) || defined (SAMSUNG_YH925)
-struct button_map bm[] = {
-    { SDLK_KP9,     370,  32, 15, "FF" },
-    { SDLK_KP5,     369,  84, 25, "Play" },
-    { SDLK_KP5,     367, 125, 27, "Play" },
-    { SDLK_KP3,     369, 188, 17, "Rew" },
-    { SDLK_KP_PLUS, 370, 330, 30, "Record" },
-    { SDLK_KP4,     146, 252, 32, "Menu" },
-    { SDLK_KP8,     204, 226, 27, "Up" },
-    { SDLK_KP6,     257, 250, 34, "Select" },
-    { SDLK_KP2,     205, 294, 35, "Down" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (ONDA_VX747) || defined (ONDA_VX747P)
-struct button_map bm[] = {
-    { SDLK_MINUS,   113, 583, 28, "Minus" },
-    { SDLK_PLUS,    227, 580, 28, "Plus" },
-    { SDLK_RETURN,  171, 583, 34, "Menu" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (PHILIPS_SA9200)
-struct button_map bm[] = {
-    { SDLK_KP_ENTER,  25, 155, 33, "Power" },
-    { SDLK_PAGEUP,   210,  98, 31, "Vol Up" },
-    { SDLK_PAGEDOWN, 210, 168, 34, "Vol Down" },
-    { SDLK_KP7,       40, 249, 26, "Prev" },
-    { SDLK_KP8,      110, 247, 22, "Up" },
-    { SDLK_KP9,      183, 249, 31, "Next" },
-    { SDLK_KP4,       45, 305, 25, "Left" },
-    { SDLK_KP5,      111, 304, 24, "Play" },
-    { SDLK_KP6,      183, 304, 21, "Right" },
-    { SDLK_KP1,       43, 377, 21, "Menu" },
-    { SDLK_KP2,      112, 371, 24, "Down" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (CREATIVE_ZVM) || defined (CREATIVE_ZVM60GB) || \
-    defined (CREATIVE_ZV)
-struct button_map bm[] = {
-    { SDLK_KP7,      52, 414, 35, "Custom" },
-    { SDLK_KP8,     185, 406, 55, "Up" },
-    { SDLK_KP9,     315, 421, 46, "Play" },
-    { SDLK_KP4,     122, 500, 41, "Left" },
-    { SDLK_KP6,     247, 493, 49, "Right" },
-    { SDLK_KP1,      58, 577, 49, "Back" },
-    { SDLK_KP2,     186, 585, 46, "Down" },
-    { SDLK_KP3,     311, 569, 47, "Menu" },
-    { 0, 0, 0, 0, "None" }
-};
-#elif defined (MPIO_HD200)
-struct button_map bm[] = {
-    { SDLK_ESCAPE,  369, 257, 20, "Rec" },
-    { SDLK_RETURN,  369, 305, 20, "Play/Stop" },
-    { SDLK_UP,      353, 168,  10, "Rew" },
-    { SDLK_DOWN,    353, 198,  10, "FF" },
-    { SDLK_SPACE,   353, 186,  10, "Select" },
-    { SDLK_LEFT,     123, 67, 20, "Vol Down" },
-    { SDLK_RIGHT,     206, 67, 20, "Vol Up" },
-    { SDLK_h,     369, 402, 30, "Hold" },
-    { 0, 0, 0, 0, "None" }
-};
-#else
-struct button_map bm[] = {
-    { 0, 0, 0, 0, ""}
-};
-#endif
-
-static int xy2button( int x, int y)
-{
-    int i;
-    extern bool debug_buttons;
-    
-    for ( i = 0; bm[i].button; i++ )
-        /* check distance from center of button < radius */
-        if ( ( (x-bm[i].x)*(x-bm[i].x) ) + ( ( y-bm[i].y)*(y-bm[i].y) ) < bm[i].radius*bm[i].radius ) {
-            if (debug_buttons) 
-                printf("Button: %s\n", bm[i].description );
-            return bm[i].button;
-        }
-    return 0;
-}
diff --git a/uisimulator/buttonmap/SOURCES b/uisimulator/buttonmap/SOURCES
new file mode 100644
index 0000000..4d99093
--- /dev/null
+++ b/uisimulator/buttonmap/SOURCES
@@ -0,0 +1,68 @@
+#ifdef SIMULATOR
+buttonmaps.c
+#ifdef HAVE_TOUCHSCREEN
+touchscreen.c
+#endif
+#if CONFIG_KEYPAD == GIGABEAT_PAD
+gigabeat.c
+#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
+gigabeat-s.c
+#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
+iaudio-x5m5.c
+#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
+iaudio-m3.c
+#elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
+   || (CONFIG_KEYPAD == IPOD_4G_PAD)
+ipod.c
+#elif CONFIG_KEYPAD == IRIVER_H10_PAD
+iriver-h10.c
+#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
+iriver-h100_h300.c
+#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
+iriver-ifp7xx.c
+#elif CONFIG_KEYPAD == ONDIO_PAD
+archos-ondio.c
+#elif CONFIG_KEYPAD == PLAYER_PAD
+archos-player.c
+#elif CONFIG_KEYPAD == RECORDER_PAD
+archos-recorder.c
+#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
+archos-av300.c           
+#elif CONFIG_KEYPAD == SANSA_C200_PAD
+sansa-c200.c
+#elif CONFIG_KEYPAD == SANSA_CLIP_PAD
+sansa-clip.c              
+#elif CONFIG_KEYPAD == SANSA_E200_PAD
+sansa-e200.c
+#elif CONFIG_KEYPAD == SANSA_FUZE_PAD
+sansa-fuze.c
+#elif CONFIG_KEYPAD == SANSA_M200_PAD
+sansa-m200.c
+#elif CONFIG_KEYPAD == MROBE500_PAD
+mrobe500.c
+#elif CONFIG_KEYPAD == MROBE100_PAD
+mrobe100.c
+#elif CONFIG_KEYPAD == COWON_D2_PAD
+cowon-d2.c
+#elif CONFIG_KEYPAD == IAUDIO67_PAD
+iaudio-6_7.c
+#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
+creative-zvm.c
+#elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
+meizu-m6sl.c
+#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
+gogear-sa9200.c
+#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
+gogear-hdd1630.c
+#elif CONFIG_KEYPAD == ONDAVX747_PAD
+onda-vx747.c
+#elif CONFIG_KEYPAD == ONDAVX777_PAD
+onda-vx777.c
+#elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
+samsung-yh820_yh925.c
+#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
+pbell-vibe500.c
+#elif CONFIG_KEYPAD == MPIO_HD200_PAD
+mpio-hd200.c
+#endif
+#endif /* SIMULATOR */
diff --git a/uisimulator/buttonmap/archos-av300.c b/uisimulator/buttonmap/archos-av300.c
new file mode 100644
index 0000000..5f09f7f
--- /dev/null
+++ b/uisimulator/buttonmap/archos-av300.c
@@ -0,0 +1,81 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2007 Dave Chapman
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_F8:
+            new_btn = BUTTON_ON;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+        case SDLK_a:
+            new_btn = BUTTON_OFF;
+            break;
+        case SDLK_KP_DIVIDE:
+        case SDLK_F1:
+            new_btn = BUTTON_F1;
+            break;
+        case SDLK_KP_MULTIPLY:
+        case SDLK_F2:
+            new_btn = BUTTON_F2;
+            break;
+        case SDLK_KP_MINUS:
+        case SDLK_F3:
+            new_btn = BUTTON_F3;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+    }
+    return new_btn;
+}
+
+
+struct button_map bm[] = {
+    { 0, 0, 0, 0, "None" }
+};
+
diff --git a/uisimulator/buttonmap/archos-ondio.c b/uisimulator/buttonmap/archos-ondio.c
new file mode 100644
index 0000000..f92715c
--- /dev/null
+++ b/uisimulator/buttonmap/archos-ondio.c
@@ -0,0 +1,69 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2006 Dan Everton
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+        case SDLK_a:
+            new_btn = BUTTON_OFF;
+            break;
+        case SDLK_KP_PERIOD:
+        case SDLK_INSERT:
+            new_btn = BUTTON_MENU;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP_ENTER,  75, 23, 30, "Enter" },
+    { SDLK_KP8,       75, 174, 33, "KP8" },
+    { SDLK_KP4,       26, 186, 48, "KP4" },
+    { SDLK_KP6,      118, 196, 32, "KP6" },
+    { SDLK_KP2,       75, 234, 16, "KP2" },
+    { SDLK_KP_PERIOD, 54, 250, 24, "Period" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/archos-player.c b/uisimulator/buttonmap/archos-player.c
new file mode 100644
index 0000000..3524e7b
--- /dev/null
+++ b/uisimulator/buttonmap/archos-player.c
@@ -0,0 +1,68 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2006 Dan Everton
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_STOP;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_F8:
+            new_btn = BUTTON_ON;
+            break;
+        case SDLK_KP_PERIOD:
+        case SDLK_INSERT:
+            new_btn = BUTTON_MENU;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP_PLUS,   79, 252, 23, "On" },
+    { SDLK_KP_PERIOD, 81, 310, 20, "Menu" },
+    { SDLK_KP8,      154, 237, 28, "Play" },
+    { SDLK_KP4,      121, 282, 23, "Left" },
+    { SDLK_KP6,      187, 282, 22, "Right" },
+    { SDLK_KP2,      157, 312, 20, "Down" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/archos-recorder.c b/uisimulator/buttonmap/archos-recorder.c
new file mode 100644
index 0000000..cdf98c0
--- /dev/null
+++ b/uisimulator/buttonmap/archos-recorder.c
@@ -0,0 +1,104 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2006 Dan Everton
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "config.h"
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_F8:
+            new_btn = BUTTON_ON;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+        case SDLK_a:
+            new_btn = BUTTON_OFF;
+            break;
+        case SDLK_KP_DIVIDE:
+        case SDLK_F1:
+            new_btn = BUTTON_F1;
+            break;
+        case SDLK_KP_MULTIPLY:
+        case SDLK_F2:
+            new_btn = BUTTON_F2;
+            break;
+        case SDLK_KP_MINUS:
+        case SDLK_F3:
+            new_btn = BUTTON_F3;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_PLAY;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+#if defined (ARCHOS_RECORDER)
+    { SDLK_F1,        94, 205, 22, "F1" },
+    { SDLK_F2,       136, 204, 21, "F2" },
+    { SDLK_F3,       174, 204, 24, "F3" },
+    { SDLK_KP_PLUS,   75, 258, 19, "On" },
+    { SDLK_KP_ENTER,  76, 307, 15, "Off" },
+    { SDLK_KP5,      151, 290, 20, "Select" },
+    { SDLK_KP8,      152, 251, 23, "Up" },
+    { SDLK_KP4,      113, 288, 26, "Left" },
+    { SDLK_KP6,      189, 291, 23, "Right" },
+    { SDLK_KP2,      150, 327, 27, "Down" },
+#elif defined (ARCHOS_FMRECORDER) || defined (ARCHOS_RECORDERV2)
+    { SDLK_F1,         88, 210, 28, "F1" },
+    { SDLK_F2,        144, 212, 28, "F2" },
+    { SDLK_F3,        197, 212, 28, "F3" },
+    { SDLK_KP5,       144, 287, 21, "Select" },
+    { SDLK_KP_PLUS,    86, 320, 13, "Menu" },
+    { SDLK_KP_ENTER,  114, 347, 13, "Stop" },
+    { SDLK_y,         144, 288, 31, "None" },
+    { SDLK_KP8,       144, 259, 25, "Up" },
+    { SDLK_KP2,       144, 316, 31, "Down" },
+    { SDLK_KP6,       171, 287, 32, "Right" },
+#endif
+    { SDLK_KP4,       117, 287, 31, "Left" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/buttonmap.h b/uisimulator/buttonmap/buttonmap.h
new file mode 100644
index 0000000..d5b951a
--- /dev/null
+++ b/uisimulator/buttonmap/buttonmap.h
@@ -0,0 +1,42 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2010 by Fred Bauer
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#ifndef __BUTTONMAP_H__
+#define __BUTTONMAP_H__
+/* Button maps: simulated key, x, y, radius, name */
+/* Run sim with --mapping to get coordinates      */
+/* or --debugbuttons to check                     */
+/* The First matching button is returned          */
+struct button_map {
+    int button, x, y, radius;
+    char *description;
+};
+
+extern struct button_map bm[];
+
+int xy2button( int x, int y);
+
+int key_to_button(int keyboard_button);
+#ifdef HAVE_TOUCHSCREEN
+int key_to_touch(int keyboard_button);
+#endif
+
+#endif /* __BUTTONMAP_H__ */
diff --git a/uisimulator/buttonmap/buttonmaps.c b/uisimulator/buttonmap/buttonmaps.c
new file mode 100644
index 0000000..b015a26
--- /dev/null
+++ b/uisimulator/buttonmap/buttonmaps.c
@@ -0,0 +1,40 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2010 by Fred Bauer
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include <stdbool.h>
+#include <stdio.h>
+#include "buttonmap.h"
+#include "config.h"
+
+int xy2button( int x, int y)
+{
+    int i;
+    extern bool debug_buttons;
+    
+    for ( i = 0; bm[i].button; i++ )
+        /* check distance from center of button < radius */
+        if ( ( (x-bm[i].x)*(x-bm[i].x) ) + ( ( y-bm[i].y)*(y-bm[i].y) ) < bm[i].radius*bm[i].radius ) {
+            if (debug_buttons) 
+                printf("Button: %s\n", bm[i].description );
+            return bm[i].button;
+        }
+    return 0;
+}
diff --git a/uisimulator/buttonmap/cowon-d2.c b/uisimulator/buttonmap/cowon-d2.c
new file mode 100644
index 0000000..f08905e
--- /dev/null
+++ b/uisimulator/buttonmap/cowon-d2.c
@@ -0,0 +1,64 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 Rob Purchase
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP_MULTIPLY:
+        case SDLK_F8:
+        case SDLK_ESCAPE:
+        case SDLK_BACKSPACE:
+        case SDLK_DELETE:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_EQUALS:
+            new_btn = BUTTON_PLUS;
+            break;
+        case SDLK_KP_MINUS:
+        case SDLK_MINUS:
+            new_btn = BUTTON_MINUS;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+        case SDLK_SPACE:
+        case SDLK_INSERT:
+            new_btn = BUTTON_MENU;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_DELETE,     51, 14, 17, "Power" },
+    { SDLK_h,         138, 14, 16, "Hold" },
+    { SDLK_MINUS,     320, 14, 10, "Minus" },
+    { SDLK_INSERT,    347, 13, 13, "Menu" },
+    { SDLK_KP_PLUS,   374, 14, 12, "Plus" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/creative-zv.c b/uisimulator/buttonmap/creative-zv.c
new file mode 100644
index 0000000..2adc938
--- /dev/null
+++ b/uisimulator/buttonmap/creative-zv.c
@@ -0,0 +1,92 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 Maurus Cuelenaere
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP1:
+            new_btn = BUTTON_PREV;
+            break;
+        case SDLK_KP3:
+            new_btn = BUTTON_NEXT;
+            break;
+        case SDLK_KP7:
+            new_btn = BUTTON_BACK;
+            break;
+        case SDLK_p:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_KP9:
+            new_btn = BUTTON_MENU;
+            break;
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_KP_MULTIPLY:
+        case SDLK_F8:
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_z:
+            new_btn = BUTTON_VOL_DOWN;
+            break;
+        case SDLK_s:
+            new_btn = BUTTON_VOL_UP;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP7,      52, 414, 35, "Custom" },
+    { SDLK_KP8,     185, 406, 55, "Up" },
+    { SDLK_KP9,     315, 421, 46, "Play" },
+    { SDLK_KP4,     122, 500, 41, "Left" },
+    { SDLK_KP6,     247, 493, 49, "Right" },
+    { SDLK_KP1,      58, 577, 49, "Back" },
+    { SDLK_KP2,     186, 585, 46, "Down" },
+    { SDLK_KP3,     311, 569, 47, "Menu" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/creative-zvm.c b/uisimulator/buttonmap/creative-zvm.c
new file mode 100644
index 0000000..0efbccc
--- /dev/null
+++ b/uisimulator/buttonmap/creative-zvm.c
@@ -0,0 +1,83 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 Maurus Cuelenaere
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP1:
+            new_btn = BUTTON_BACK;
+            break;
+        case SDLK_KP3:
+            new_btn = BUTTON_MENU;
+            break;
+        case SDLK_KP7:
+            new_btn = BUTTON_CUSTOM;
+            break;
+        case SDLK_KP9:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_KP_MULTIPLY:
+        case SDLK_F8:
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_POWER;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP7,      52, 414, 35, "Custom" },
+    { SDLK_KP8,     185, 406, 55, "Up" },
+    { SDLK_KP9,     315, 421, 46, "Play" },
+    { SDLK_KP4,     122, 500, 41, "Left" },
+    { SDLK_KP6,     247, 493, 49, "Right" },
+    { SDLK_KP1,      58, 577, 49, "Back" },
+    { SDLK_KP2,     186, 585, 46, "Down" },
+    { SDLK_KP3,     311, 569, 47, "Menu" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/gigabeat-s.c b/uisimulator/buttonmap/gigabeat-s.c
new file mode 100644
index 0000000..98a8489
--- /dev/null
+++ b/uisimulator/buttonmap/gigabeat-s.c
@@ -0,0 +1,79 @@
+n/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 by Will Robertson
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_F8:
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_KP7:
+            new_btn = BUTTON_BACK;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_KP9:
+        case SDLK_KP_PERIOD:
+        case SDLK_INSERT:
+            new_btn = BUTTON_MENU;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP_PLUS, 416, 383, 23, "Play" },
+    { SDLK_KP7,     135, 442, 46, "Back" },
+    { SDLK_KP9,     288, 447, 35, "Menu" },
+    { SDLK_KP8,     214, 480, 32, "Up" },
+    { SDLK_KP4,     128, 558, 33, "Left" },
+    { SDLK_KP5,     214, 556, 34, "Select" },
+    { SDLK_KP6,     293, 558, 35, "Right" },
+    { SDLK_KP2,     214, 637, 38, "Down" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/gigabeat.c b/uisimulator/buttonmap/gigabeat.c
new file mode 100644
index 0000000..02055cf
--- /dev/null
+++ b/uisimulator/buttonmap/gigabeat.c
@@ -0,0 +1,90 @@
+n/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2006 by Barry Wardell
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_F8:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+        case SDLK_a:
+            new_btn = BUTTON_A;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_KP_PERIOD:
+        case SDLK_INSERT:
+            new_btn = BUTTON_MENU;
+            break;
+        case SDLK_KP9:
+            new_btn = BUTTON_VOL_UP;
+            break;
+        case SDLK_KP3:
+            new_btn = BUTTON_VOL_DOWN;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP_PLUS,    361, 187, 22, "Power" },
+    { SDLK_KP_PERIOD,  361, 270, 17, "Menu" },
+    { SDLK_KP9,        365, 345, 26, "Vol Up" },
+    { SDLK_KP3,        363, 433, 25, "Vol Down" },
+    { SDLK_KP_ENTER,   365, 520, 19, "A" },
+    { SDLK_KP8,        167, 458, 35, "Up" },
+    { SDLK_KP4,         86, 537, 29, "Left" },
+    { SDLK_KP5,        166, 536, 30, "Select" },
+    { SDLK_KP6,        248, 536, 30, "Right" },
+    { SDLK_KP2,        169, 617, 28, "Down" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/gogear-hdd1630.c b/uisimulator/buttonmap/gogear-hdd1630.c
new file mode 100644
index 0000000..fea4e56
--- /dev/null
+++ b/uisimulator/buttonmap/gogear-hdd1630.c
@@ -0,0 +1,77 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2009 Mark Arigo
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_KP7:
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP1:
+            new_btn = BUTTON_PLAYLIST;
+            break;
+        case SDLK_KP9:
+            new_btn = BUTTON_VOL_UP;
+            break;
+        case SDLK_KP3:
+            new_btn = BUTTON_VOL_DOWN;
+            break;
+        case SDLK_KP_MINUS:
+            new_btn = BUTTON_MENU;
+            break;
+        case SDLK_KP_PLUS:
+            new_btn = BUTTON_VIEW;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/gogear-sa9200.c b/uisimulator/buttonmap/gogear-sa9200.c
new file mode 100644
index 0000000..ef06f0d
--- /dev/null
+++ b/uisimulator/buttonmap/gogear-sa9200.c
@@ -0,0 +1,88 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2009 Mark Arigo
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP1:
+            new_btn = BUTTON_MENU;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_KP7:
+            new_btn = BUTTON_PREV;
+            break;
+        case SDLK_KP9:
+            new_btn = BUTTON_NEXT;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_PAGEUP:
+            new_btn = BUTTON_VOL_UP;
+            break;
+        case SDLK_PAGEDOWN:
+            new_btn = BUTTON_VOL_DOWN;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP_ENTER,  25, 155, 33, "Power" },
+    { SDLK_PAGEUP,   210,  98, 31, "Vol Up" },
+    { SDLK_PAGEDOWN, 210, 168, 34, "Vol Down" },
+    { SDLK_KP7,       40, 249, 26, "Prev" },
+    { SDLK_KP8,      110, 247, 22, "Up" },
+    { SDLK_KP9,      183, 249, 31, "Next" },
+    { SDLK_KP4,       45, 305, 25, "Left" },
+    { SDLK_KP5,      111, 304, 24, "Play" },
+    { SDLK_KP6,      183, 304, 21, "Right" },
+    { SDLK_KP1,       43, 377, 21, "Menu" },
+    { SDLK_KP2,      112, 371, 24, "Down" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/iaudio-6_7.c b/uisimulator/buttonmap/iaudio-6_7.c
new file mode 100644
index 0000000..82ec78c
--- /dev/null
+++ b/uisimulator/buttonmap/iaudio-6_7.c
@@ -0,0 +1,64 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 Vitja Makarov
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_UP:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_DOWN:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_LEFT:
+            new_btn = BUTTON_STOP;
+            break;
+        case SDLK_RETURN:
+        case SDLK_KP_ENTER:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_PLUS:
+            new_btn = BUTTON_VOLUP;
+            break;
+        case SDLK_MINUS:
+            new_btn = BUTTON_VOLDOWN;
+            break;
+        case SDLK_SPACE:
+            new_btn = BUTTON_MENU;
+            break;
+        case SDLK_BACKSPACE:
+            new_btn = BUTTON_POWER;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/iaudio-x5_m5.c b/uisimulator/buttonmap/iaudio-x5_m5.c
new file mode 100644
index 0000000..9bab1df
--- /dev/null
+++ b/uisimulator/buttonmap/iaudio-x5_m5.c
@@ -0,0 +1,96 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2006 by Barry Wardell
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "config.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_F8:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+        case SDLK_a:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP_DIVIDE:
+        case SDLK_F1:
+            new_btn = BUTTON_REC;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+#if defined (IAUDIO_M5)
+    { SDLK_KP_ENTER,  333,  41, 17, "Enter" },
+    { SDLK_h,         334,  74, 21, "Hold" },
+    { SDLK_KP_DIVIDE, 333, 142, 24, "Record" },
+    { SDLK_KP_PLUS,   332, 213, 20, "Play" },
+    { SDLK_KP5,       250, 291, 19, "Select" },
+    { SDLK_KP8,       249, 236, 32, "Up" },
+    { SDLK_KP4,       194, 292, 29, "Left" },
+    { SDLK_KP6,       297, 290, 27, "Right" },
+    { SDLK_KP2,       252, 335, 28, "Down" },
+#elif defined (IAUDIO_X5)
+    { SDLK_KP_ENTER,  275,  38, 17, "Power" },
+    { SDLK_h,         274,  83, 16, "Hold" },
+    { SDLK_KP_DIVIDE, 276, 128, 22, "Record" },
+    { SDLK_KP_PLUS,   274, 186, 22, "Play" },
+    { SDLK_KP5,       200, 247, 16, "Select" },
+    { SDLK_KP8,       200, 206, 16, "Up" },
+    { SDLK_KP4,       163, 248, 19, "Left" },
+    { SDLK_KP6,       225, 247, 24, "Right" },
+    { SDLK_KP2,       199, 279, 20, "Down" },
+#endif
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/iaudo-m3.c b/uisimulator/buttonmap/iaudo-m3.c
new file mode 100644
index 0000000..1ab1392
--- /dev/null
+++ b/uisimulator/buttonmap/iaudo-m3.c
@@ -0,0 +1,101 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 by Jens Arnold
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_LEFT:
+            new_btn = BUTTON_RC_REW;
+            break;
+        case SDLK_KP6:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RC_FF;
+            break;
+        case SDLK_KP8:
+            new_btn = BUTTON_VOL_UP;
+            break;
+        case SDLK_UP:
+            new_btn = BUTTON_RC_VOL_UP;
+            break;
+        case SDLK_KP2:
+            new_btn = BUTTON_VOL_DOWN;
+            break;
+        case SDLK_DOWN:
+            new_btn = BUTTON_RC_VOL_DOWN;
+            break;
+        case SDLK_KP_PERIOD:
+            new_btn = BUTTON_MODE;
+            break;
+        case SDLK_INSERT:
+            new_btn = BUTTON_RC_MODE;
+            break;
+        case SDLK_KP_DIVIDE:
+            new_btn = BUTTON_REC;
+            break;
+        case SDLK_F1:
+            new_btn = BUTTON_RC_REC;
+            break;
+        case SDLK_KP5:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_SPACE:
+            new_btn = BUTTON_RC_PLAY;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+            new_btn = BUTTON_RC_MENU;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP5,         256,  72, 29, "Play" },
+    { SDLK_KP6,         255, 137, 28, "Right" },
+    { SDLK_KP4,         257, 201, 26, "Left" },
+    { SDLK_KP8,         338,  31, 27, "Up" },
+    { SDLK_KP2,         339,  92, 23, "Down" },
+    { SDLK_KP_PERIOD,   336,  50, 23, "Mode" },
+    { SDLK_KP_DIVIDE,   336, 147, 23, "Rec" },
+    { SDLK_h,           336, 212, 30, "Hold" },
+    /* remote */
+    { SDLK_SPACE,       115, 308, 20, "RC Play" },
+    { SDLK_RIGHT,        85, 308, 20, "RC Rew" },
+    { SDLK_LEFT,        143, 308, 20, "RC FF" },
+    { SDLK_UP,          143, 498, 20, "RC Up" },
+    { SDLK_DOWN,         85, 498, 20, "RC Down" },
+    { SDLK_INSERT,      212, 308, 30, "RC Mode" },
+    { SDLK_F1,          275, 308, 25, "RC Rec" },
+    { SDLK_KP_ENTER,    115, 498, 20, "RC Menu" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/ipod.c b/uisimulator/buttonmap/ipod.c
new file mode 100644
index 0000000..504b77b
--- /dev/null
+++ b/uisimulator/buttonmap/ipod.c
@@ -0,0 +1,136 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2006 by Barry Wardell
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "config.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_SCROLL_BACK;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_SCROLL_FWD;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_F8:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_KP_PERIOD:
+        case SDLK_INSERT:
+            new_btn = BUTTON_MENU;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+#if defined (IPOD_VIDEO)
+    { SDLK_KP_PERIOD,  174, 350, 35, "Menu" },
+    { SDLK_KP8,        110, 380, 33, "Scroll Back" },
+    { SDLK_KP2,        234, 377, 34, "Scroll Fwd" },
+    { SDLK_KP4,         78, 438, 47, "Left" },
+    { SDLK_KP5,        172, 435, 43, "Select" },
+    { SDLK_KP6,        262, 438, 52, "Right" },
+    { SDLK_KP_PLUS,    172, 519, 43, "Play" },
+#elif defined (IPOD_MINI) || defined(IPOD_MINI2G)
+    { SDLK_KP5,       92, 267, 29, "Select" },
+    { SDLK_KP4,       31, 263, 37, "Left" },
+    { SDLK_KP6,      150, 268, 33, "Right" },
+    { SDLK_KP_PERIOD, 93, 209, 30, "Menu" },
+    { SDLK_KP_PLUS,   93, 324, 25, "Play" },
+    { SDLK_KP8,       53, 220, 29, "Scroll Back" },
+    { SDLK_KP2,      134, 219, 31, "Scroll Fwd" },
+#elif defined (IPOD_3G)
+    { SDLK_KP5,       108, 296, 26, "Select" },
+    { SDLK_KP8,        70, 255, 26, "Scroll Back" },
+    { SDLK_KP2,       149, 256, 28, "Scroll Fwd" },
+    { SDLK_KP4,        27, 186, 22, "Left" },
+    { SDLK_KP_PERIOD,  82, 185, 22, "Menu" },
+    { SDLK_KP_PERIOD, 133, 185, 21, "Play" },
+    { SDLK_KP6,       189, 188, 21, "Right" },
+#elif defined (IPOD_4G)
+    { SDLK_KP5,        96, 269, 27, "Select" },
+    { SDLK_KP4,        39, 267, 30, "Left" },
+    { SDLK_KP6,       153, 270, 27, "Right" },
+    { SDLK_KP_PERIOD,  96, 219, 30, "Menu" },
+    { SDLK_KP_PLUS,    95, 326, 27, "Play" },
+    { SDLK_KP8,        57, 233, 29, "Scroll Back" },
+    { SDLK_KP2,       132, 226, 29, "Scroll Fwd" },
+#elif defined (IPOD_COLOR) 
+    { SDLK_KP5,        128, 362, 35, "Select" },
+    { SDLK_KP4,         55, 358, 38, "Left" },
+    { SDLK_KP6,        203, 359, 39, "Right" },
+    { SDLK_KP_PERIOD,  128, 282, 34, "Menu" },
+    { SDLK_KP_PLUS,    129, 439, 41, "Play" },
+    { SDLK_KP8,         76, 309, 34, "Scroll Back" },
+    { SDLK_KP2,        182, 311, 45, "Scroll Fwd" },
+#elif defined (IPOD_1G2G) 
+    { SDLK_KP5,       112, 265, 31, "Select" },
+    { SDLK_KP8,        74, 224, 28, "Scroll Back" },
+    { SDLK_KP2,       146, 228, 28, "Scroll Fwd" },
+    /* Dummy button to make crescent shape */
+    { SDLK_y,         112, 265, 76, "None" },
+    { SDLK_KP8,        74, 224, 28, "Scroll Back" },
+    { SDLK_KP2,       146, 228, 28, "Scroll Fwd" },
+    { SDLK_KP6,       159, 268, 64, "Right" },
+    { SDLK_KP4,        62, 266, 62, "Left" },
+    { SDLK_KP_PERIOD, 111, 216, 64, "Menu" },
+    { SDLK_KP_PLUS,   111, 326, 55, "Down" },
+#elif defined (IPOD_NANO) 
+    { SDLK_KP5,       98, 316, 37, "Select" },
+    { SDLK_KP4,       37, 312, 28, "Left" },
+    { SDLK_KP6,      160, 313, 25, "Right" },
+    { SDLK_KP_PERIOD,102, 256, 23, "Menu" },
+    { SDLK_KP_PLUS,   99, 378, 28, "Play" },
+    { SDLK_KP8,       58, 272, 24, "Scroll Back" },
+    { SDLK_KP2,      141, 274, 22, "Scroll Fwd" },
+#elif defined (IPOD_NANO2G) 
+    { SDLK_KP5,       118, 346, 37, "Select" },
+    { SDLK_KP4,        51, 345, 28, "Left" },
+    { SDLK_KP6,       180, 346, 26, "Right" },
+    { SDLK_KP_PERIOD, 114, 286, 23, "Menu" },
+    { SDLK_KP_PLUS,   115, 412, 27, "Down" },
+    { SDLK_KP8,        67, 303, 28, "Scroll Back" },
+    { SDLK_KP2,       163, 303, 27, "Scroll Fwd" },
+#endif
+    { 0, 0, 0 , 0, "None" }
+};
diff --git a/uisimulator/buttonmap/iriver-h10.c b/uisimulator/buttonmap/iriver-h10.c
new file mode 100644
index 0000000..24dbe83
--- /dev/null
+++ b/uisimulator/buttonmap/iriver-h10.c
@@ -0,0 +1,92 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2006 by Barry Wardell
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include <SDL.h>
+#include "config.h"
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_SCROLL_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_SCROLL_DOWN;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_F8:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP_DIVIDE:
+        case SDLK_F1:
+            new_btn = BUTTON_REW;
+            break;
+        case SDLK_KP_MULTIPLY:
+        case SDLK_F2:
+            new_btn = BUTTON_FF;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_PLAY;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {  
+#if defined (IRIVER_H10)
+    { SDLK_KP_PLUS,       38,  70, 37, "Power" },
+    { SDLK_KP4,          123, 194, 26, "Cancel" },
+    { SDLK_KP6,          257, 195, 34, "Select" },
+    { SDLK_KP8,          190, 221, 28, "Up" },
+    { SDLK_KP2,          192, 320, 27, "Down" },
+    { SDLK_KP_DIVIDE,    349,  49, 20, "Rew" },
+    { SDLK_KP5,          349,  96, 20, "Play" },
+    { SDLK_KP_MULTIPLY,  350, 141, 23, "FF" },
+#elif defined (IRIVER_H10_5GB)
+    { SDLK_KP_PLUS,      34,  76, 23, "Power" },
+    { SDLK_KP4,         106, 222, 28, "Cancel" },
+    { SDLK_KP6,         243, 220, 31, "Select" },
+    { SDLK_KP8,         176, 254, 34, "Up" },
+    { SDLK_KP2,         175, 371, 35, "Down" },
+    { SDLK_KP_DIVIDE,   319,  63, 26, "Rew" },
+    { SDLK_KP5,         320, 124, 26, "Play" },
+    { SDLK_KP_MULTIPLY, 320, 181, 32, "FF" },
+#endif
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/iriver-h100_h300.c b/uisimulator/buttonmap/iriver-h100_h300.c
new file mode 100644
index 0000000..5e4ad3b
--- /dev/null
+++ b/uisimulator/buttonmap/iriver-h100_h300.c
@@ -0,0 +1,124 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2006 Dan Everton
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include <SDL.h>
+#include "config.h"
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_t:
+            if(pressed)
+                switch(_remote_type)
+                {
+                    case REMOTETYPE_UNPLUGGED: 
+                        _remote_type=REMOTETYPE_H100_LCD;
+                        DEBUGF("Changed remote type to H100\n");
+                        break;
+                    case REMOTETYPE_H100_LCD:
+                        _remote_type=REMOTETYPE_H300_LCD;
+                        DEBUGF("Changed remote type to H300\n");
+                        break;
+                    case REMOTETYPE_H300_LCD:
+                        _remote_type=REMOTETYPE_H300_NONLCD;
+                        DEBUGF("Changed remote type to H300 NON-LCD\n");
+                        break;
+                    case REMOTETYPE_H300_NONLCD:
+                        _remote_type=REMOTETYPE_UNPLUGGED;
+                        DEBUGF("Changed remote type to none\n");
+                        break;
+                }
+            break;
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_F8:
+            new_btn = BUTTON_ON;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+        case SDLK_a:
+            new_btn = BUTTON_OFF;
+            break;
+        case SDLK_KP_DIVIDE:
+        case SDLK_F1:
+            new_btn = BUTTON_REC;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_KP_PERIOD:
+        case SDLK_INSERT:
+            new_btn = BUTTON_MODE;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {                         
+#if defined (IRIVER_H120) || defined (IRIVER_H100)
+    { SDLK_KP_DIVIDE,   46, 162, 13, "Record" },
+    { SDLK_KP_PLUS,    327,  36, 16, "Play" },
+    { SDLK_KP_ENTER,   330,  99, 18, "Stop" },
+    { SDLK_KP_PERIOD,  330, 163, 18, "AB" },
+    { SDLK_KP5,        186, 227, 27, "5" },
+    { SDLK_KP8,        187, 185, 19, "8" },
+    { SDLK_KP4,        142, 229, 23, "4" },
+    { SDLK_KP6,        231, 229, 22, "6" },
+    { SDLK_KP2,        189, 272, 28, "2" },
+/* Remote Buttons */
+    { SDLK_KP_ENTER,   250, 404, 20, "Stop" },
+    { SDLK_SPACE,      285, 439, 29, "Space" },
+    { SDLK_h,          336, 291, 24, "Hold" },
+#elif defined (IRIVER_H300)
+    { SDLK_KP_PLUS,     56, 335, 20, "Play" },
+    { SDLK_KP8,        140, 304, 29, "Up" },
+    { SDLK_KP_DIVIDE,  233, 331, 23, "Record" },
+    { SDLK_KP_ENTER,    54, 381, 24, "Stop" },
+    { SDLK_KP4,        100, 353, 17, "Left" },
+    { SDLK_KP5,        140, 351, 19, "Navi" },
+    { SDLK_KP6,        185, 356, 19, "Right" },
+    { SDLK_KP_PERIOD,  230, 380, 20, "AB" },
+    { SDLK_KP2,        142, 402, 24, "Down" },
+    { SDLK_KP_ENTER,   211, 479, 21, "Stop" },
+    { SDLK_KP_PLUS,    248, 513, 29, "Play" },
+#endif
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/iriver-ifp7xx.c b/uisimulator/buttonmap/iriver-ifp7xx.c
new file mode 100644
index 0000000..97f29c7
--- /dev/null
+++ b/uisimulator/buttonmap/iriver-ifp7xx.c
@@ -0,0 +1,71 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2006 Dan Everton
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_F8:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+        case SDLK_a:
+           new_btn = BUTTON_EQ;
+           break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_KP_PERIOD:
+        case SDLK_INSERT:
+            new_btn = BUTTON_MODE;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/meizu-m6sl.c b/uisimulator/buttonmap/meizu-m6sl.c
new file mode 100644
index 0000000..e796dce
--- /dev/null
+++ b/uisimulator/buttonmap/meizu-m6sl.c
@@ -0,0 +1,65 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 Marcoen Hirschberg
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP1:
+            new_btn = BUTTON_PREV;
+            break;
+        case SDLK_KP3:
+            new_btn = BUTTON_NEXT;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+        case SDLK_a:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_KP_PERIOD:
+        case SDLK_INSERT:
+            new_btn = BUTTON_MENU;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/mpio-hd200.c b/uisimulator/buttonmap/mpio-hd200.c
new file mode 100644
index 0000000..36cbfe5
--- /dev/null
+++ b/uisimulator/buttonmap/mpio-hd200.c
@@ -0,0 +1,67 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2010 Marcin Bukat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_UP:
+            new_btn = BUTTON_PREV;
+            break;
+        case SDLK_DOWN:
+            new_btn = BUTTON_NEXT;
+            break;
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_RETURN:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_LEFT:
+            new_btn = BUTTON_VOL_DOWN;
+            break;
+        case SDLK_RIGHT:
+            new_btn = BUTTON_VOL_UP;
+            break;
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_REC;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_ESCAPE,  369, 257, 20, "Rec" },
+    { SDLK_RETURN,  369, 305, 20, "Play/Stop" },
+    { SDLK_UP,      353, 168,  10, "Rew" },
+    { SDLK_DOWN,    353, 198,  10, "FF" },
+    { SDLK_SPACE,   353, 186,  10, "Select" },
+    { SDLK_LEFT,     123, 67, 20, "Vol Down" },
+    { SDLK_RIGHT,     206, 67, 20, "Vol Up" },
+    { SDLK_h,     369, 402, 30, "Hold" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/mrobe100.c b/uisimulator/buttonmap/mrobe100.c
new file mode 100644
index 0000000..8e96188
--- /dev/null
+++ b/uisimulator/buttonmap/mrobe100.c
@@ -0,0 +1,105 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 Robert Kukla
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_F9:
+            new_btn = BUTTON_RC_HEART;
+            break;
+        case SDLK_F10:
+            new_btn = BUTTON_RC_MODE;
+            break;
+        case SDLK_F11:
+            new_btn = BUTTON_RC_VOL_DOWN;
+            break;
+        case SDLK_F12:
+            new_btn = BUTTON_RC_VOL_UP;
+            break;
+        case SDLK_LEFT:
+            new_btn = BUTTON_RC_FF;
+            break;
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RC_REW;
+            break;
+        case SDLK_UP:
+            new_btn = BUTTON_RC_PLAY;
+            break;
+        case SDLK_DOWN:
+            new_btn = BUTTON_RC_DOWN;
+            break;
+        case SDLK_KP1:
+            new_btn = BUTTON_DISPLAY;
+            break;
+        case SDLK_KP7:
+            new_btn = BUTTON_MENU;
+            break;
+        case SDLK_KP9:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_KP4:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_KP_MULTIPLY:
+        case SDLK_F8:
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_POWER;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP7,      80, 233, 30, "Menu" },
+    { SDLK_KP8,     138, 250, 19, "Up" },
+    { SDLK_KP9,     201, 230, 27, "Play" },
+    { SDLK_KP4,      63, 305, 25, "Left" },
+    { SDLK_KP5,     125, 309, 28, "Select" },
+    { SDLK_KP6,     200, 307, 35, "Right" },
+    { SDLK_KP1,      52, 380, 32, "Display" },
+    { SDLK_KP2,     125, 363, 30, "Down" },
+    { SDLK_KP9,     168, 425, 10, "Play" },
+    { SDLK_KP4,     156, 440, 11, "Left" },
+    { SDLK_KP6,     180, 440, 13, "Right" },
+    { SDLK_KP7,     169, 452, 10, "Menu" },
+    { SDLK_KP_MULTIPLY, 222, 15, 16, "Power" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/mrobe500.c b/uisimulator/buttonmap/mrobe500.c
new file mode 100644
index 0000000..50d85f6
--- /dev/null
+++ b/uisimulator/buttonmap/mrobe500.c
@@ -0,0 +1,76 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2007 Karl Kurbjun
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_F9:
+            new_btn = BUTTON_RC_HEART;
+            break;
+        case SDLK_F10:
+            new_btn = BUTTON_RC_MODE;
+            break;
+        case SDLK_F11:
+            new_btn = BUTTON_RC_VOL_DOWN;
+            break;
+        case SDLK_F12:
+            new_btn = BUTTON_RC_VOL_UP;
+            break;
+        case SDLK_MINUS:
+        case SDLK_LESS:
+        case SDLK_LEFTBRACKET:
+        case SDLK_KP_DIVIDE:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_PLUS:
+        case SDLK_GREATER:
+        case SDLK_RIGHTBRACKET:
+        case SDLK_KP_MULTIPLY:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_PAGEUP:
+            new_btn = BUTTON_RC_PLAY;
+            break;
+        case SDLK_PAGEDOWN:
+            new_btn = BUTTON_RC_DOWN;
+            break;
+        case SDLK_F8:
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_POWER;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP9,     171, 609, 9, "Play" },
+    { SDLK_KP4,     158, 623, 9, "Left" },
+    { SDLK_KP6,     184, 622, 9, "Right" },
+    { SDLK_KP7,     171, 638, 11, "Menu" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/onda-vx747.c b/uisimulator/buttonmap/onda-vx747.c
new file mode 100644
index 0000000..6d50427
--- /dev/null
+++ b/uisimulator/buttonmap/onda-vx747.c
@@ -0,0 +1,62 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2009 Maurus Cuelenaere
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP_PLUS:
+        case SDLK_PLUS:
+        case SDLK_GREATER:
+        case SDLK_RIGHTBRACKET:
+        case SDLK_KP_MULTIPLY:
+            new_btn = BUTTON_VOL_UP;
+            break;
+        case SDLK_KP_MINUS:
+        case SDLK_MINUS:
+        case SDLK_LESS:
+        case SDLK_LEFTBRACKET:
+        case SDLK_KP_DIVIDE:
+            new_btn = BUTTON_VOL_DOWN;
+            break;
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+            new_btn = BUTTON_MENU;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_MINUS,   113, 583, 28, "Minus" },
+    { SDLK_PLUS,    227, 580, 28, "Plus" },
+    { SDLK_RETURN,  171, 583, 34, "Menu" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/onda-vx777.c b/uisimulator/buttonmap/onda-vx777.c
new file mode 100644
index 0000000..9181b07
--- /dev/null
+++ b/uisimulator/buttonmap/onda-vx777.c
@@ -0,0 +1,41 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2009 Maurus Cuelenaere
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_ESCAPE:
+            new_btn = BUTTON_POWER;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/pbell-vibe500.c b/uisimulator/buttonmap/pbell-vibe500.c
new file mode 100644
index 0000000..662d224
--- /dev/null
+++ b/uisimulator/buttonmap/pbell-vibe500.c
@@ -0,0 +1,72 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2010 Szymon Dziok
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_PREV;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_NEXT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP7:
+            new_btn = BUTTON_MENU;
+            break;
+        case SDLK_KP9:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_KP5:
+            new_btn = BUTTON_OK;
+            break;
+        case SDLK_KP_DIVIDE:
+            new_btn = BUTTON_CANCEL;
+            break;
+        case SDLK_KP_PLUS:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP_MULTIPLY:
+            new_btn = BUTTON_REC;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/samsung-yh820_yh92x.c b/uisimulator/buttonmap/samsung-yh820_yh92x.c
new file mode 100644
index 0000000..0f12c77
--- /dev/null
+++ b/uisimulator/buttonmap/samsung-yh820_yh92x.c
@@ -0,0 +1,94 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2009 Mark Arigo
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "config.h"
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP5:
+        case SDLK_KP_ENTER:
+            new_btn = BUTTON_PLAY;
+            break;
+        case SDLK_KP9:
+        case SDLK_PAGEUP:
+            new_btn = BUTTON_FFWD;
+            break;
+#ifdef SAMSUNG_YH820
+        case SDLK_KP7:
+#else
+        case SDLK_KP3:
+#endif
+        case SDLK_PAGEDOWN:
+            new_btn = BUTTON_REW;
+            break;
+        case SDLK_KP_PLUS:
+            new_btn = BUTTON_REC;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {  
+#if defined (SAMSUNG_YH820)
+    { SDLK_KP_PLUS, 330,  53, 23, "Record" },
+    { SDLK_KP7,     132, 208, 21, "Left" },
+    { SDLK_KP5,     182, 210, 18, "Play" },
+    { SDLK_KP9,     234, 211, 22, "Right" },
+    { SDLK_KP8,     182, 260, 15, "Up" },
+    { SDLK_KP4,     122, 277, 29, "Menu" },
+    { SDLK_KP6,     238, 276, 25, "Select" },
+    { SDLK_KP2,     183, 321, 24, "Down" },
+#elif defined (SAMSUNG_YH920) || defined (SAMSUNG_YH925)
+    { SDLK_KP9,     370,  32, 15, "FF" },
+    { SDLK_KP5,     369,  84, 25, "Play" },
+    { SDLK_KP5,     367, 125, 27, "Play" },
+    { SDLK_KP3,     369, 188, 17, "Rew" },
+    { SDLK_KP_PLUS, 370, 330, 30, "Record" },
+    { SDLK_KP4,     146, 252, 32, "Menu" },
+    { SDLK_KP8,     204, 226, 27, "Up" },
+    { SDLK_KP6,     257, 250, 34, "Select" },
+    { SDLK_KP2,     205, 294, 35, "Down" },
+#endif
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/sansa-c200.c b/uisimulator/buttonmap/sansa-c200.c
new file mode 100644
index 0000000..96755d0
--- /dev/null
+++ b/uisimulator/buttonmap/sansa-c200.c
@@ -0,0 +1,81 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2007 Mark Arigo
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP3:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP1:
+            new_btn = BUTTON_REC;
+            break;
+        case SDLK_KP5:
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_KP7:
+            new_btn = BUTTON_VOL_DOWN;
+            break;
+        case SDLK_KP9:
+            new_btn = BUTTON_VOL_UP;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    
+    { SDLK_KP7,      84,   7, 21, "Vol Down" },
+    { SDLK_KP9,     158,   7, 20, "Vol Up" },
+    { SDLK_KP1,     173, 130, 27, "Record" },
+    { SDLK_KP5,     277,  75, 21, "Select" },
+    { SDLK_KP4,     233,  75, 24, "Left" },
+    { SDLK_KP6,     313,  74, 18, "Right" },
+    { SDLK_KP8,     276,  34, 15, "Play" },
+    { SDLK_KP2,     277, 119, 17, "Down" },
+    { SDLK_KP3,     314, 113, 19, "Menu" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/sansa-clip.c b/uisimulator/buttonmap/sansa-clip.c
new file mode 100644
index 0000000..c1997ad
--- /dev/null
+++ b/uisimulator/buttonmap/sansa-clip.c
@@ -0,0 +1,81 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 Rafaël Carré
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        
+        case SDLK_INSERT:
+        case SDLK_KP_MULTIPLY:
+            new_btn = BUTTON_HOME;
+            break;
+        case SDLK_SPACE:
+        case SDLK_KP5:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_PAGEDOWN:
+        case SDLK_KP3:
+            new_btn = BUTTON_VOL_DOWN;
+            break;
+        case SDLK_PAGEUP:
+        case SDLK_KP9:
+            new_btn = BUTTON_VOL_UP;
+            break;
+        case SDLK_ESCAPE:
+        case SDLK_KP1:
+            new_btn = BUTTON_POWER;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP_MULTIPLY, 165, 158,  17, "Home" },
+    { SDLK_KP5,         102, 230,  29, "Select" },
+    { SDLK_KP8,         100, 179,  25, "Play" },
+    { SDLK_KP4,          53, 231,  21, "Left" },
+    { SDLK_KP6,         147, 232,  19, "Right" },
+    { SDLK_KP2,         105, 275,  22, "Menu" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/sansa-e200.c b/uisimulator/buttonmap/sansa-e200.c
new file mode 100644
index 0000000..66655e2
--- /dev/null
+++ b/uisimulator/buttonmap/sansa-e200.c
@@ -0,0 +1,83 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2006 Barry Wardell
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_SCROLL_BACK;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_SCROLL_FWD;
+            break;
+        case SDLK_KP9:
+        case SDLK_PAGEUP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP3:
+        case SDLK_PAGEDOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP1:
+        case SDLK_HOME:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP7:
+        case SDLK_END:
+            new_btn = BUTTON_REC;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+            new_btn = BUTTON_SELECT;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP7,         5,  92, 18, "Record" },
+    { SDLK_KP9,       128, 295, 43, "Play" },
+    { SDLK_KP4,        42, 380, 33, "Left" },
+    { SDLK_KP5,       129, 378, 36, "Select" },
+    { SDLK_KP6,       218, 383, 30, "Right" },
+    { SDLK_KP3,       129, 461, 29, "Down" },
+    { SDLK_KP1,        55, 464, 20, "Menu" },
+    { SDLK_KP8,        92, 338, 17, "Scroll Back" },
+    { SDLK_KP2,       167, 342, 17, "Scroll Fwd"  },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/sansa-fuze.c b/uisimulator/buttonmap/sansa-fuze.c
new file mode 100644
index 0000000..2788af5
--- /dev/null
+++ b/uisimulator/buttonmap/sansa-fuze.c
@@ -0,0 +1,85 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 Thomas Martitz
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_SCROLL_BACK;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_SCROLL_FWD;
+            break;
+        case SDLK_PAGEUP:
+        case SDLK_KP9:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_PAGEDOWN:
+        case SDLK_KP3:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_KP_MINUS:
+        case SDLK_KP1:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP_MULTIPLY:
+            new_btn = BUTTON_HOME;
+            break;
+        case SDLK_KP5:
+        case SDLK_SPACE:
+        case SDLK_KP_ENTER:
+        case SDLK_RETURN:
+            new_btn = BUTTON_SELECT;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP8,          70, 265, 35, "Scroll Back" },
+    { SDLK_KP9,         141, 255, 31, "Play" },
+    { SDLK_KP_MULTIPLY, 228, 267, 18, "Home" },
+    { SDLK_LEFT,         69, 329, 31, "Left" },
+    { SDLK_SPACE,       141, 330, 20, "Select" },
+    { SDLK_RIGHT,       214, 331, 23, "Right" },
+    { SDLK_KP3,         142, 406, 30, "Menu" },
+    { SDLK_DOWN,        221, 384, 24, "Scroll Fwd" },
+    { SDLK_KP_MINUS,    270, 299, 25, "Power" },
+    { SDLK_h,           269, 358, 26, "Hold" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/sansa-m200.c b/uisimulator/buttonmap/sansa-m200.c
new file mode 100644
index 0000000..6a8c4f2
--- /dev/null
+++ b/uisimulator/buttonmap/sansa-m200.c
@@ -0,0 +1,75 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 Dominik Wenger
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+
+int key_to_button(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case SDLK_KP4:
+        case SDLK_LEFT:
+            new_btn = BUTTON_LEFT;
+            break;
+        case SDLK_KP6:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_RIGHT;
+            break;
+        case SDLK_KP8:
+        case SDLK_UP:
+            new_btn = BUTTON_UP;
+            break;
+        case SDLK_KP2:
+        case SDLK_DOWN:
+            new_btn = BUTTON_DOWN;
+            break;
+        case SDLK_PLUS:
+            new_btn = BUTTON_POWER;
+            break;
+        case SDLK_KP5:
+            new_btn = BUTTON_SELECT;
+            break;
+        case SDLK_KP7:
+            new_btn = BUTTON_VOL_DOWN;
+            break;
+        case SDLK_KP9:
+            new_btn = BUTTON_VOL_UP;
+            break;
+    }
+    return new_btn;
+}
+
+struct button_map bm[] = {
+    { SDLK_KP_PLUS, 54,  14, 16, "Power" },
+    { SDLK_KP7,     96,  13, 12, "Vol Down" },
+    { SDLK_KP9,    139,  14, 14, "Vol Up" },
+    { SDLK_KP5,    260,  82, 20, "Select" },
+    { SDLK_KP8,    258,  35, 30, "Play" },
+    { SDLK_KP4,    214,  84, 25, "Left" },
+    { SDLK_KP6,    300,  83, 24, "Right" },
+    { SDLK_KP2,    262, 125, 28, "Repeat" },
+    { SDLK_h,      113, 151, 21, "Hold" },
+    { 0, 0, 0, 0, "None" }
+};
diff --git a/uisimulator/buttonmap/touchscreen.c b/uisimulator/buttonmap/touchscreen.c
new file mode 100644
index 0000000..746a6d5
--- /dev/null
+++ b/uisimulator/buttonmap/touchscreen.c
@@ -0,0 +1,103 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id$
+ *
+ * Copyright (C) 2008 Jonathan Gordon
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+
+#include <stdio.h>
+#include <SDL.h>
+#include "button.h"
+#include "buttonmap.h"
+#include "touchscreen.h"
+
+int key_to_touch(int keyboard_button)
+{
+    int new_btn = BUTTON_NONE;
+    switch (keyboard_button)
+    {
+        case BUTTON_TOUCHSCREEN:
+            switch (touchscreen_get_mode())
+            {
+                case TOUCHSCREEN_POINT:
+                    new_btn = BUTTON_TOUCHSCREEN;
+                    break;
+                case TOUCHSCREEN_BUTTON:
+                {
+                    static const int touchscreen_buttons[3][3] = {
+                        {BUTTON_TOPLEFT, BUTTON_TOPMIDDLE, BUTTON_TOPRIGHT},
+                        {BUTTON_MIDLEFT, BUTTON_CENTER, BUTTON_MIDRIGHT},
+                        {BUTTON_BOTTOMLEFT, BUTTON_BOTTOMMIDDLE, BUTTON_BOTTOMRIGHT},
+                    };
+                    int px_x = ((mouse_coords&0xffff0000)>>16);
+                    int px_y = ((mouse_coords&0x0000ffff));
+                    new_btn = touchscreen_buttons[px_y/(LCD_HEIGHT/3)][px_x/(LCD_WIDTH/3)];
+                    break;
+                }
+            }
+            break;
+        case SDLK_KP7:
+        case SDLK_7:
+            new_btn = BUTTON_TOPLEFT;
+            break;
+        case SDLK_KP8:
+        case SDLK_8:
+        case SDLK_UP:
+            new_btn = BUTTON_TOPMIDDLE;
+            break;
+        case SDLK_KP9:
+        case SDLK_9:
+            new_btn = BUTTON_TOPRIGHT;
+            break;
+        case SDLK_KP4:
+        case SDLK_u:
+        case SDLK_LEFT:
+            new_btn = BUTTON_MIDLEFT;
+            break;
+        case SDLK_KP5:
+        case SDLK_i:
+            new_btn = BUTTON_CENTER;
+            break;
+        case SDLK_KP6:
+        case SDLK_o:
+        case SDLK_RIGHT:
+            new_btn = BUTTON_MIDRIGHT;
+            break;
+        case SDLK_KP1:
+        case SDLK_j:
+            new_btn = BUTTON_BOTTOMLEFT;
+            break;
+        case SDLK_KP2:
+        case SDLK_k:
+        case SDLK_DOWN:
+            new_btn = BUTTON_BOTTOMMIDDLE;
+            break;
+        case SDLK_KP3:
+        case SDLK_l:
+            new_btn = BUTTON_BOTTOMRIGHT;
+            break;
+        case SDLK_F4:
+            if(pressed)
+            {
+                touchscreen_set_mode(touchscreen_get_mode() == TOUCHSCREEN_POINT ? TOUCHSCREEN_BUTTON : TOUCHSCREEN_POINT);
+                printf("Touchscreen mode: %s\n", touchscreen_get_mode() == TOUCHSCREEN_POINT ? "TOUCHSCREEN_POINT" : "TOUCHSCREEN_BUTTON");
+            }
+            break;
+    }
+    return new_btn;
+}
diff --git a/uisimulator/uisimulator.make b/uisimulator/uisimulator.make
index 2e6e75f..d09fcc2 100644
--- a/uisimulator/uisimulator.make
+++ b/uisimulator/uisimulator.make
@@ -7,12 +7,13 @@
 # $Id$
 #
 
-INCLUDES += -I$(ROOTDIR)/uisimulator/bitmaps -I$(ROOTDIR)/uisimulator/common \
+INCLUDES += -I$(ROOTDIR)/uisimulator/bitmaps -I$(ROOTDIR)/uisimulator/common -I$(ROOTDIR)/uisimulator/buttonmap $\
 	-I$(FIRMDIR)/include -I$(FIRMDIR)/export $(TARGET_INC) -I$(BUILDDIR) -I$(APPSDIR)
 
 SIMFLAGS += $(INCLUDES) $(DEFINES) -DHAVE_CONFIG_H $(GCCOPTS)
 
 SIMSRC += $(call preprocess, $(ROOTDIR)/uisimulator/common/SOURCES)
+SIMSRC += $(call preprocess, $(ROOTDIR)/uisimulator/buttonmap/SOURCES)
 SIMOBJ = $(call c2obj,$(SIMSRC))
 OTHER_SRC += $(SIMSRC)