forked from enlightenment/efl
patch from Lars Munch for abs input device support in ecore_fb
SVN revision: 39461
This commit is contained in:
parent
a63715c0c4
commit
fea71a8859
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
break;
|
||||
|
||||
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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue