From fea71a885940218b314f002773a2ce10b7c2e0b4 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Fri, 13 Mar 2009 09:47:43 +0000 Subject: [PATCH] patch from Lars Munch for abs input device support in ecore_fb SVN revision: 39461 --- .../ecore/src/lib/ecore_evas/ecore_evas_fb.c | 4 + legacy/ecore/src/lib/ecore_fb/ecore_fb_li.c | 74 +++++++++++++++---- .../ecore/src/lib/ecore_fb/ecore_fb_private.h | 6 +- 3 files changed, 68 insertions(+), 16 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c index 3421c68ebf..87bb4a7c00 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c @@ -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); 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 547aef42dd..7b864e8700 100644 --- a/legacy/ecore/src/lib/ecore_fb/ecore_fb_li.c +++ b/legacy/ecore/src/lib/ecore_fb/ecore_fb_li.c @@ -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; 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 6b5628196e..073236144a 100644 --- a/legacy/ecore/src/lib/ecore_fb/ecore_fb_private.h +++ b/legacy/ecore/src/lib/ecore_fb/ecore_fb_private.h @@ -20,8 +20,8 @@ #define kernel_ulong_t unsigned long #define BITS_PER_LONG 32 #include - #undef kernel_ulong_t <-added - #undef BITS_PER_LONG <-added + #undef kernel_ulong_t + #undef BITS_PER_LONG #else #include #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 {