From 4bcb051ded271b1f17f25d5eaa56e0d57e832c84 Mon Sep 17 00:00:00 2001 From: Jorge Luis Zapata Muga Date: Thu, 3 Aug 2006 05:58:14 +0000 Subject: [PATCH] Ecore_Fb ======== + Initial support for absolute axis (touchscreen, touchpad). SVN revision: 24376 --- legacy/ecore/src/lib/ecore_fb/ecore_fb_li.c | 88 ++++++++++++------- .../ecore/src/lib/ecore_fb/ecore_fb_private.h | 7 +- 2 files changed, 61 insertions(+), 34 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_fb/ecore_fb_li.c b/legacy/ecore/src/lib/ecore_fb/ecore_fb_li.c index 5614e1a5a9..27e01f2adb 100644 --- a/legacy/ecore/src/lib/ecore_fb/ecore_fb_li.c +++ b/legacy/ecore/src/lib/ecore_fb/ecore_fb_li.c @@ -230,26 +230,55 @@ _ecore_fb_li_device_event_rel(Ecore_Fb_Input_Device *dev, struct input_event *ie 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 @@ ecore_fb_input_device_open(const char *dev) 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 @@ ecore_fb_input_device_open(const char *dev) 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 @@ ecore_fb_input_device_axis_size_set(Ecore_Fb_Input_Device *dev, int w, int h) { 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) diff --git a/legacy/ecore/src/lib/ecore_fb/ecore_fb_private.h b/legacy/ecore/src/lib/ecore_fb/ecore_fb_private.h index 58179bd0f4..b628c94cca 100644 --- a/legacy/ecore/src/lib/ecore_fb/ecore_fb_private.h +++ b/legacy/ecore/src/lib/ecore_fb/ecore_fb_private.h @@ -32,12 +32,17 @@ struct _Ecore_Fb_Input_Device } 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 {