Index: ./apps/plugins/rockboy/rockboy.c
===================================================================
RCS file: /cvsroot/rockbox/apps/plugins/rockboy/rockboy.c,v
retrieving revision 1.21
diff -u -r1.21 rockboy.c
--- ./apps/plugins/rockboy/rockboy.c	19 Jun 2006 02:44:50 -0000	1.21
+++ ./apps/plugins/rockboy/rockboy.c	28 Jul 2006 14:08:24 -0000
@@ -170,6 +170,10 @@
 
     rb->lcd_setfont(0);
 
+#if CONFIG_KEYPAD == IPOD_4G_PAD
+    rb->wheel_send_events(false);
+#endif
+
 #if defined(HAVE_LCD_COLOR)
     rb->lcd_set_foreground(LCD_WHITE);
     rb->lcd_set_background(LCD_BLACK);
Index: ./apps/plugins/rockboy/sys_rockbox.c
===================================================================
RCS file: /cvsroot/rockbox/apps/plugins/rockboy/sys_rockbox.c,v
retrieving revision 1.20
diff -u -r1.20 sys_rockbox.c
--- ./apps/plugins/rockboy/sys_rockbox.c	19 Jun 2006 01:47:45 -0000	1.20
+++ ./apps/plugins/rockboy/sys_rockbox.c	28 Jul 2006 14:08:24 -0000
@@ -69,6 +69,18 @@
 }
 
 unsigned int oldbuttonstate = 0, newbuttonstate,holdbutton;
+#if CONFIG_KEYPAD == IPOD_4G_PAD
+int oldwheel=-1, wheel;
+#define WHEEL_UP 0
+#define WHEEL_UP_RIGHT 1
+#define WHEEL_RIGHT 2
+#define WHEEL_DOWN_RIGHT 3
+#define WHEEL_DOWN 4
+#define WHEEL_DOWN_LEFT 5
+#define WHEEL_LEFT 6
+#define WHEEL_UP_LEFT 7
+
+#endif
 
 int released, pressed;
 
@@ -87,6 +99,106 @@
     if (pressed & BUTTON_ON)
         fb.mode=(fb.mode+1)%4;
 #endif
+#if CONFIG_KEYPAD == IPOD_4G_PAD
+    wheel = rb->wheel_status(); //-1 means the wheel isnt touched
+    if ( wheel > 0 ){
+        wheel += 6;
+        wheel /= 12;
+        if ( wheel > 7 ) wheel = 0; 
+    }
+    if ( wheel != oldwheel ) {
+        ev.type = EV_RELEASE;
+        switch (oldwheel)
+        {
+            case WHEEL_UP:
+                ev.code=PAD_UP;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_DOWN:
+                ev.code=PAD_DOWN;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_LEFT:
+                ev.code=PAD_LEFT;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_RIGHT:
+                ev.code=PAD_RIGHT;
+                ev_postevent(&ev);
+                break;
+
+            case WHEEL_UP_LEFT:
+                ev.code=PAD_A;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_UP_RIGHT:
+                ev.code=PAD_B;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_DOWN_LEFT:
+                ev.code=PAD_START;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_DOWN_RIGHT:
+                ev.code=PAD_SELECT;
+                ev_postevent(&ev);
+                break;
+            default:
+                break;
+        }
+        ev.type = EV_PRESS;
+        switch (wheel)
+        {
+            case WHEEL_UP:
+                ev.code=PAD_UP;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_DOWN:
+                ev.code=PAD_DOWN;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_LEFT:
+                ev.code=PAD_LEFT;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_RIGHT:
+                ev.code=PAD_RIGHT;
+                ev_postevent(&ev);
+                break;
+
+            case WHEEL_UP_LEFT:
+                ev.code=PAD_A;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_UP_RIGHT:
+                ev.code=PAD_B;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_DOWN_LEFT:
+                ev.code=PAD_START;
+                ev_postevent(&ev);
+                break;
+            case WHEEL_DOWN_RIGHT:
+                ev.code=PAD_SELECT;
+                ev_postevent(&ev);
+                break;
+            default:
+                break;
+        }
+    }
+
+    oldwheel=wheel;
+    if(released) {
+        ev.type = EV_RELEASE;
+        if ( released & (~BUTTON_SELECT) ) { ev.code=PAD_B; ev_postevent(&ev); }
+        if ( released & BUTTON_SELECT ) { ev.code=PAD_A; ev_postevent(&ev); }
+    }
+    if(pressed) { /* button press */
+        ev.type = EV_PRESS;
+        if ( pressed & (~BUTTON_SELECT) ) { ev.code=PAD_B; ev_postevent(&ev); }
+        if ( pressed & BUTTON_SELECT ) { ev.code=PAD_A; ev_postevent(&ev); }
+    }    
+#else
     if(released) {
         ev.type = EV_RELEASE;
         if(released & ROCKBOY_PAD_LEFT) { ev.code=PAD_LEFT; ev_postevent(&ev); }
@@ -120,19 +232,31 @@
             ev.code=PAD_SELECT;
             ev_postevent(&ev);
         }
+#endif
+#if CONFIG_KEYPAD == IPOD_4G_PAD
+        if(rb->button_hold()) {
+#else
         if(pressed & options.MENU) {
+#endif
 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
     (CONFIG_KEYPAD == IRIVER_H300_PAD) || \
     (CONFIG_KEYPAD == IPOD_4G_PAD)
+#if CONFIG_KEYPAD == IPOD_4G_PAD
+    rb->wheel_send_events(true);
+#endif
           if (do_user_menu() == USER_MENU_QUIT) 
 #endif
           {
             die("");
             cleanshut=1;
           }
+#if CONFIG_KEYPAD == IPOD_4G_PAD
+    rb->wheel_send_events(false);
+#endif
         }
+#if CONFIG_KEYPAD != IPOD_4G_PAD
     }
-    
+#endif    
 }
 
 void vid_setpal(int i, int r, int g, int b)
Index: apps/plugins/rockboy/menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/plugins/rockboy/menu.c,v
retrieving revision 1.10
diff -u -r1.10 menu.c
--- apps/plugins/rockboy/menu.c	19 Jun 2006 02:44:50 -0000	1.10
+++ apps/plugins/rockboy/menu.c	28 Jul 2006 14:08:24 -0000
@@ -9,6 +9,7 @@
 #include "mem.h"
 
 #if (CONFIG_KEYPAD == IPOD_4G_PAD)
+#include "fb.h"
 #define MENU_BUTTON_UP BUTTON_SCROLL_BACK
 #define MENU_BUTTON_DOWN BUTTON_SCROLL_FWD
 #define MENU_BUTTON_LEFT BUTTON_LEFT
@@ -344,7 +345,11 @@
         {"Sound"        , NULL },
         {"Stats"        , NULL },
         {"Fullscreen"   , NULL },
-        {"Set Keys (Buggy)", NULL },
+#if (CONFIG_KEYPAD == IPOD_4G_PAD)
+        {"V.Scaling mode"},
+#else
+        {"Set Keys (BUGGY)"},
+#endif
     };
 
     m = rb->menu_init(items, sizeof(items) / sizeof(*items), NULL, NULL, NULL, NULL);
@@ -373,7 +378,11 @@
                 setvidmode(options.fullscreen);
                 break;
             case 4: /* Keys */
+#if (CONFIG_KEYPAD == IPOD_4G_PAD)
+                fb.mode=(fb.mode+1)%4;
+#else
                 setupkeys();
+#endif
                 break;
             default:
                 done=true;
