patch from Lars Munch for abs input device support in ecore_fb
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 13 Mar 2009 09:47:43 +0000 (09:47 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 13 Mar 2009 09:47:43 +0000 (09:47 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/ecore@39461 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore_evas/ecore_evas_fb.c
src/lib/ecore_fb/ecore_fb_li.c
src/lib/ecore_fb/ecore_fb_private.h

index 3421c68..87bb4a7 100644 (file)
@@ -291,7 +291,11 @@ _ecore_evas_fb_init(int w, int h)
        if (ecore_evas_input_devices)
          {
             /* Mouse */
+#ifdef HAVE_TSLIB
             if (caps & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE)
+#else
+            if ((caps & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE) || (caps & ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE))
+#endif
               {
                  ecore_fb_input_device_axis_size_set(device, w, h);
                  ecore_fb_input_device_listen(device,1);
index 547aef4..7b864e8 100644 (file)
@@ -258,15 +258,15 @@ _ecore_fb_li_device_event_rel(Ecore_Fb_Input_Device *dev, struct input_event *ie
 static void
 _ecore_fb_li_device_event_abs(Ecore_Fb_Input_Device *dev, struct input_event *iev)
 {
+       static int prev_pressure = 0;
+       int pressure;
+
        if(!dev->listen)
                return;
        switch(iev->code)
        {
                case ABS_X:
-               case ABS_Y:
-               {
-                       Ecore_Fb_Event_Mouse_Move *ev;
-                       if((iev->code == ABS_X) && (dev->mouse.w != 0))
+                       if(dev->mouse.w != 0)
                        {
                                int tmp;
 
@@ -277,8 +277,12 @@ _ecore_fb_li_device_event_abs(Ecore_Fb_Input_Device *dev, struct input_event *ie
                                        dev->mouse.x = dev->mouse.w;
                                else
                                        dev->mouse.x = tmp;
+                               dev->mouse.event = ECORE_FB_EVENT_MOUSE_MOVE;
                        }
-                       else if((iev->code == ABS_Y) && (dev->mouse.h != 0))
+                       break;
+
+               case ABS_Y:
+                       if(dev->mouse.h != 0)
                        {
                                int tmp;
 
@@ -289,21 +293,62 @@ _ecore_fb_li_device_event_abs(Ecore_Fb_Input_Device *dev, struct input_event *ie
                                        dev->mouse.y = dev->mouse.h;
                                else
                                        dev->mouse.y = tmp;
+                               dev->mouse.event = ECORE_FB_EVENT_MOUSE_MOVE;
                        }
-                       ev = calloc(1,sizeof(Ecore_Fb_Event_Mouse_Move));
-                       ev->x = dev->mouse.x;
-                       ev->y = dev->mouse.y;
-                       ev->dev = dev;
-
-                       ecore_event_add(ECORE_FB_EVENT_MOUSE_MOVE, ev, NULL, NULL);
                        break;
-               }
+
                case ABS_PRESSURE:
-                       /* TODO emulate a button press */
+                       pressure = iev->value;
+                       if ((pressure) && (!prev_pressure))
+                       {
+                               /* DOWN: mouse is down, but was not now */
+                               dev->mouse.event = ECORE_FB_EVENT_MOUSE_BUTTON_DOWN;
+                       }
+                       else if ((!pressure) && (prev_pressure))
+                       {
+                               /* UP: mouse was down, but is not now */
+                               dev->mouse.event = ECORE_FB_EVENT_MOUSE_BUTTON_UP;
+                       }
+                       prev_pressure = pressure;
                        break;
        }
 }
 
+static void
+_ecore_fb_li_device_event_syn(Ecore_Fb_Input_Device *dev, struct input_event *iev)
+{
+       if(!dev->listen)
+               return;
+
+       if(dev->mouse.event == ECORE_FB_EVENT_MOUSE_MOVE)
+       {
+               Ecore_Fb_Event_Mouse_Move *ev;
+               ev = calloc(1,sizeof(Ecore_Fb_Event_Mouse_Move));
+               ev->x = dev->mouse.x;
+               ev->y = dev->mouse.y;
+               ev->dev = dev;
+               ecore_event_add(ECORE_FB_EVENT_MOUSE_MOVE, ev, NULL, NULL);
+       }
+       else if(dev->mouse.event == ECORE_FB_EVENT_MOUSE_BUTTON_DOWN)
+       {
+               Ecore_Fb_Event_Mouse_Button_Down *ev;
+               ev = calloc(1, sizeof(Ecore_Fb_Event_Mouse_Button_Down));
+               ev->x = dev->mouse.x;
+               ev->y = dev->mouse.y;
+               ev->button = 1;
+               ecore_event_add(ECORE_FB_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
+       }
+       else if(dev->mouse.event == ECORE_FB_EVENT_MOUSE_BUTTON_UP)
+       {
+               Ecore_Fb_Event_Mouse_Button_Up *ev;
+               ev = calloc(1, sizeof(Ecore_Fb_Event_Mouse_Button_Up));
+               ev->x = dev->mouse.x;
+               ev->y = dev->mouse.y;
+               ev->button = 1;
+               ecore_event_add(ECORE_FB_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
+       }
+}
+
 static int
 _ecore_fb_li_device_fd_callback(void *data, Ecore_Fd_Handler *fdh)
 {
@@ -320,6 +365,9 @@ _ecore_fb_li_device_fd_callback(void *data, Ecore_Fd_Handler *fdh)
        {
                switch(ev[i].type)
                {
+                       case EV_SYN:
+                               _ecore_fb_li_device_event_syn(dev, &ev[i]);
+                               break;
                        case EV_ABS:
                                _ecore_fb_li_device_event_abs(dev, &ev[i]);
                                break;
index 6b56281..0732361 100644 (file)
@@ -20,8 +20,8 @@
  #define kernel_ulong_t unsigned long 
  #define BITS_PER_LONG 32
  #include <linux/input.h>
- #undef kernel_ulong_t <-added
- #undef BITS_PER_LONG <-added
+ #undef kernel_ulong_t
+ #undef BITS_PER_LONG
 #else
  #include <linux/input.h>
 #endif
@@ -53,7 +53,7 @@ struct _Ecore_Fb_Input_Device
                /* absolute axis */
                int min_w, min_h;
                double rel_w, rel_h;
-
+               int event;
        } mouse;
        struct
        {