========
+ Initial support for absolute axis (touchscreen, touchpad).


SVN revision: 24376
This commit is contained in:
Jorge Luis Zapata Muga 2006-08-03 05:58:14 +00:00
parent ac0055db7e
commit 4bcb051ded
2 changed files with 61 additions and 34 deletions

View File

@ -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)

View File

@ -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
{