forked from enlightenment/efl
Ecore_Fb
======== + Initial support for absolute axis (touchscreen, touchpad). SVN revision: 24376
This commit is contained in:
parent
ac0055db7e
commit
4bcb051ded
|
@ -230,26 +230,55 @@ _ecore_fb_li_device_event_rel(Ecore_Fb_Input_Device *dev, struct input_event *ie
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
//printf("[ecore_li_device] mouse event %d %d\n", iev->code, iev->value);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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)
|
if(!dev->listen)
|
||||||
return;
|
return;
|
||||||
switch(ev->code)
|
switch(iev->code)
|
||||||
{
|
{
|
||||||
case ABS_X:
|
case ABS_X:
|
||||||
printf("abs x %d\n", ev->value);
|
|
||||||
break;
|
|
||||||
case ABS_Y:
|
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;
|
break;
|
||||||
|
}
|
||||||
case ABS_PRESSURE:
|
case ABS_PRESSURE:
|
||||||
printf("pressure!!!\n");
|
/* TODO emulate a button press */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -325,23 +354,20 @@ ecore_fb_input_device_open(const char *dev)
|
||||||
|
|
||||||
if((fd = open(dev, O_RDONLY, O_NONBLOCK)) < 0)
|
if((fd = open(dev, O_RDONLY, O_NONBLOCK)) < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ecore_fb_li:device_open] %s ", dev);
|
fprintf(stderr, "[ecore_fb_li:device_open] %s %s", dev, strerror(errno));
|
||||||
perror("");
|
|
||||||
goto error_open;
|
goto error_open;
|
||||||
}
|
}
|
||||||
/* query capabilities */
|
/* query capabilities */
|
||||||
if(ioctl(fd, EVIOCGBIT(0, EV_MAX), event_type_bitmask) < 0)
|
if(ioctl(fd, EVIOCGBIT(0, EV_MAX), event_type_bitmask) < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"[ecore_fb_li:device_open] query capabilities %s ", dev);
|
fprintf(stderr,"[ecore_fb_li:device_open] query capabilities %s %s", dev, strerror(errno));
|
||||||
perror("");
|
|
||||||
goto error_caps;
|
goto error_caps;
|
||||||
}
|
}
|
||||||
/* query name */
|
/* query name */
|
||||||
device->info.name = calloc(256, sizeof(char));
|
device->info.name = calloc(256, sizeof(char));
|
||||||
if(ioctl(fd, EVIOCGNAME(sizeof(char) * 256), device->info.name) < 0)
|
if(ioctl(fd, EVIOCGNAME(sizeof(char) * 256), device->info.name) < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ecore_fb_li:device_open] get name %s ", dev);
|
fprintf(stderr, "[ecore_fb_li:device_open] get name %s %s", dev, strerror(errno));
|
||||||
perror("");
|
|
||||||
strcpy(device->info.name, "Unknown");
|
strcpy(device->info.name, "Unknown");
|
||||||
}
|
}
|
||||||
device->fd = fd;
|
device->fd = fd;
|
||||||
|
@ -369,23 +395,6 @@ ecore_fb_input_device_open(const char *dev)
|
||||||
|
|
||||||
case EV_ABS:
|
case EV_ABS:
|
||||||
device->info.cap |= ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE;
|
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;
|
break;
|
||||||
|
|
||||||
case EV_MSC:
|
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)
|
if(!dev)
|
||||||
return;
|
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)
|
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))
|
else if(!(dev->info.cap & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* update the local values */
|
/* update the local values */
|
||||||
if(w < 0 || h < 0)
|
|
||||||
return;
|
|
||||||
if(dev->mouse.x > w - 1)
|
if(dev->mouse.x > w - 1)
|
||||||
dev->mouse.x = w -1;
|
dev->mouse.x = w -1;
|
||||||
if(dev->mouse.y > h - 1)
|
if(dev->mouse.y > h - 1)
|
||||||
|
|
|
@ -32,12 +32,17 @@ struct _Ecore_Fb_Input_Device
|
||||||
} info;
|
} info;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
/* common mouse */
|
||||||
int x,y;
|
int x,y;
|
||||||
int w,h;
|
int w,h;
|
||||||
|
|
||||||
double last;
|
double last;
|
||||||
double prev;
|
double prev;
|
||||||
double threshold;
|
double threshold;
|
||||||
double acceleration;
|
/* absolute axis */
|
||||||
|
int min_w, min_h;
|
||||||
|
double rel_w, rel_h;
|
||||||
|
|
||||||
} mouse;
|
} mouse;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue