Enlightenment CVS committal

Author  : turran
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_fb


Modified Files:
        ecore_fb_li.c ecore_fb_private.h 


Log Message:
Ecore_Fb
========
+ Initial support for absolute axis (touchscreen, touchpad).


===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_fb/ecore_fb_li.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- ecore_fb_li.c       31 Jul 2006 04:13:51 -0000      1.1
+++ ecore_fb_li.c       3 Aug 2006 05:58:14 -0000       1.2
@@ -230,26 +230,55 @@
                        break;
                }
                default:
-                       //printf("[ecore_li_device] mouse event %d %d\n", 
iev->code, iev->value);
                        break;
        }
 }
 
 static void
-_ecore_fb_li_device_event_abs(Ecore_Fb_Input_Device *dev, struct input_event 
*ev)
+_ecore_fb_li_device_event_abs(Ecore_Fb_Input_Device *dev, struct input_event 
*iev)
 {
        if(!dev->listen)
                return;
-       switch(ev->code)
+       switch(iev->code)
        {
                case ABS_X:
-                       printf("abs x %d\n", ev->value);
-                       break;
                case ABS_Y:
-                       printf("abs y %d\n", ev->value);
+               {
+                       Ecore_Fb_Event_Mouse_Move *ev;
+                       if((iev->code == ABS_X) && (dev->mouse.w != 0))
+                       {
+                               int tmp;
+
+                               tmp = (int)((double)(iev->value - 
dev->mouse.min_w) / dev->mouse.rel_w);
+                               if(tmp < 0)
+                                       dev->mouse.x = 0;
+                               else if(tmp > dev->mouse.w)
+                                       dev->mouse.x = dev->mouse.w;
+                               else
+                                       dev->mouse.x = tmp;
+                       }
+                       else if((iev->code == ABS_Y) && (dev->mouse.h != 0))
+                       {
+                               int tmp;
+
+                               tmp = (int)((double)(iev->value - 
dev->mouse.min_h) / dev->mouse.rel_h);
+                               if(tmp < 0)
+                                       dev->mouse.y = 0;
+                               else if(tmp > dev->mouse.h)
+                                       dev->mouse.y = dev->mouse.h;
+                               else
+                                       dev->mouse.y = tmp;
+                       }
+                       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:
-                       printf("pressure!!!\n");
+                       /* TODO emulate a button press */
                        break;
        }
 }
@@ -325,23 +354,20 @@
 
        if((fd = open(dev, O_RDONLY, O_NONBLOCK)) < 0)
        {
-               fprintf(stderr, "[ecore_fb_li:device_open] %s ", dev);
-               perror("");
+               fprintf(stderr, "[ecore_fb_li:device_open] %s %s", dev, 
strerror(errno));
                goto error_open;
        }
        /* query capabilities */
        if(ioctl(fd, EVIOCGBIT(0, EV_MAX), event_type_bitmask) < 0) 
        {
-               fprintf(stderr,"[ecore_fb_li:device_open] query capabilities %s 
", dev);
-               perror("");
+               fprintf(stderr,"[ecore_fb_li:device_open] query capabilities %s 
%s", dev, strerror(errno));
                goto error_caps;
        }
        /* query name */
        device->info.name = calloc(256, sizeof(char));
        if(ioctl(fd, EVIOCGNAME(sizeof(char) * 256), device->info.name) < 0)
        {
-               fprintf(stderr, "[ecore_fb_li:device_open] get name %s ", dev);
-               perror("");
+               fprintf(stderr, "[ecore_fb_li:device_open] get name %s %s", 
dev, strerror(errno));
                strcpy(device->info.name, "Unknown");
        }
        device->fd = fd;
@@ -369,23 +395,6 @@
 
                        case EV_ABS:
                        device->info.cap |= ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE;
-                       {
-                       #if 0
-                               struct input_absinfo abs_features;
-                               ioctl(fd, EVIOCGABS(ABS_X), &abs_features);
-                               printf("(min: %d, max: %d, flatness: %d, fuzz: 
%d)\n",
-                               abs_features.minimum,
-                               abs_features.maximum,
-                               abs_features.flat,
-                               abs_features.fuzz);
-                               ioctl(fd, EVIOCGABS(ABS_Y), &abs_features);
-                               printf("(min: %d, max: %d, flatness: %d, fuzz: 
%d)\n",
-                               abs_features.minimum,
-                               abs_features.maximum,
-                               abs_features.flat,
-                               abs_features.fuzz);
-                       #endif
-                       }
                        break;
 
                        case EV_MSC:
@@ -433,16 +442,29 @@
 {
        if(!dev) 
                return;
+       if(w < 0 || h < 0)
+               return;
+       /* FIXME 
+        * this code is for a touchscreen device, 
+        * make it configurable (ABSOLUTE | RELATIVE)
+        */
        if(dev->info.cap & ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE)
        {
-               struct input_absinfo;
+               /* FIXME looks like some kernels dont include this struct */
+               struct input_absinfo abs_features;
+
+               ioctl(dev->fd, EVIOCGABS(ABS_X), &abs_features);
+               dev->mouse.min_w = abs_features.minimum;
+               dev->mouse.rel_w = (double)(abs_features.maximum - 
abs_features.minimum)/(double)(w);
+
+               ioctl(dev->fd, EVIOCGABS(ABS_Y), &abs_features);
+               dev->mouse.min_h = abs_features.minimum;
+               dev->mouse.rel_h = (double)(abs_features.maximum - 
abs_features.minimum)/(double)(h);
        }
        else if(!(dev->info.cap & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE))
                return;
 
        /* update the local values */
-       if(w < 0 || h < 0)
-               return;
        if(dev->mouse.x > w - 1)
                dev->mouse.x = w -1;
        if(dev->mouse.y > h - 1)
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_fb/ecore_fb_private.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- ecore_fb_private.h  31 Jul 2006 04:13:51 -0000      1.3
+++ ecore_fb_private.h  3 Aug 2006 05:58:14 -0000       1.4
@@ -32,12 +32,17 @@
        } info;
        struct
        {
+               /* common mouse */
                int x,y;
                int w,h;
+               
                double last;
                double prev;
                double threshold;
-               double acceleration;
+               /* absolute axis */
+               int min_w, min_h;
+               double rel_w, rel_h;
+
        } mouse;
        struct
        {



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to