mouse support for HAVE_TOUCHPAD target simulator


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15430 a1c6a512-1295-4272-9138-f99709370657
diff --git a/uisimulator/sdl/button.c b/uisimulator/sdl/button.c
index 0447512..8694a83 100644
--- a/uisimulator/sdl/button.c
+++ b/uisimulator/sdl/button.c
@@ -30,6 +30,9 @@
 
 static intptr_t button_data; /* data value from last message dequeued */
 
+#ifdef HAVE_TOUCHPAD
+static int mouse_coords = 0;
+#endif
 /* how long until repeat kicks in */
 #define REPEAT_START      6
 
@@ -83,12 +86,12 @@
 }
 #endif
 
+static int lastbtn;
 void button_event(int key, bool pressed)
 {
     int new_btn = 0;
     int diff = 0;
     static int count = 0;
-    static int lastbtn;
     static int repeat_speed = REPEAT_INTERVAL_START;
     static int repeat_count = 0;
     static bool repeat = false;
@@ -100,11 +103,18 @@
 #endif
 #endif 
     static bool usb_connected = false;
+    int data = 0;
     if (usb_connected && key != SDLK_u)
         return;
     switch (key)
     {
 
+#ifdef HAVE_TOUCHPAD
+    case BUTTON_TOUCHPAD:
+        new_btn = BUTTON_TOUCHPAD;
+        data = mouse_coords;
+        break;
+#endif
     case SDLK_u:
         if (!pressed)
         {
@@ -650,17 +660,17 @@
 #ifdef HAVE_REMOTE_LCD
         if(diff & BUTTON_REMOTE)
             if(!skip_remote_release)
-                queue_post(&button_queue, BUTTON_REL | diff, 0);
+                queue_post(&button_queue, BUTTON_REL | diff, data);
             else
                 skip_remote_release = false;
         else
 #endif
             if(!skip_release)
-                queue_post(&button_queue, BUTTON_REL | diff, 0);
+                queue_post(&button_queue, BUTTON_REL | diff, data);
             else
                 skip_release = false;
 #else
-        queue_post(&button_queue, BUTTON_REL | diff, 0);
+        queue_post(&button_queue, BUTTON_REL | diff, data);
 #endif
     }
 
@@ -712,7 +722,7 @@
                 {
                     if (queue_empty(&button_queue))
                     {
-                        queue_post(&button_queue, BUTTON_REPEAT | btn, 0);
+                        queue_post(&button_queue, BUTTON_REPEAT | btn, data);
 #ifdef HAVE_BACKLIGHT
 #ifdef HAVE_REMOTE_LCD
                             if(btn & BUTTON_REMOTE)
@@ -734,18 +744,18 @@
 #ifdef HAVE_REMOTE_LCD
                         if (btn & BUTTON_REMOTE) {
                             if (!remote_filter_first_keypress || is_remote_backlight_on())
-                                queue_post(&button_queue, btn, 0);
+                                queue_post(&button_queue, btn, data0);
                             else
                                 skip_remote_release = true;
                         }
                         else
 #endif                                    
                             if (!filter_first_keypress || is_backlight_on())
-                                queue_post(&button_queue, btn, 0);
+                                queue_post(&button_queue, btn, data);
                             else
                                 skip_release = true;
 #else /* no backlight, nothing to skip */
-                        queue_post(&button_queue, btn, 0);
+                        queue_post(&button_queue, btn, data);
 #endif
                     post = false;
                 }    
@@ -801,12 +811,39 @@
 
 intptr_t button_get_data(void)
 {
+#ifdef HAVE_TOUCHPAD
+    return button_data;
+#else
     /* Needed by the accelerating wheel driver for Sansa e200 */
     return 1 << 24;
+#endif
 }
 
+#ifdef HAVE_TOUCHPAD
+void mouse_tick_task(void)
+{
+    static int last_check = 0;
+    int x,y;
+    if (TIME_BEFORE(current_tick, last_check+(HZ/10)))
+        return;
+    last_check = current_tick;
+    if (SDL_GetMouseState(&x, &y) & SDL_BUTTON(SDL_BUTTON_LEFT))
+    {
+        mouse_coords = (x<<16)|y;
+        button_event(BUTTON_TOUCHPAD, true);
+    }
+    else if (lastbtn == BUTTON_TOUCHPAD)
+    {
+        button_event(BUTTON_TOUCHPAD, false);
+        mouse_coords = 0;
+    }
+}
+#endif
 void button_init(void)
 {
+#ifdef HAVE_TOUCHPAD
+    tick_add_task(mouse_tick_task);
+#endif
 }
 
 int button_status(void)