From: Sung-Jin Park <sj76.park@samsung.com>
authorSung-Jin Park <sj76.park@samsung.com>
Wed, 16 Jan 2013 09:03:55 +0000 (09:03 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Wed, 16 Jan 2013 09:03:55 +0000 (09:03 +0000)
Subject: [E-devel] Bug fix : ecore x XI2 handler not to make button
event twice

Dear developers,
I have fixed a bug in ecore x xi2 handler.

Currently, ecore mouse down/move/up event are made twice for a X touch
event.
Among a couple of events, the first one is made by a X touch event and
the other is made
by a button event whose flags has XIPointerEmulated flag.
The (latter) button event is made from the (former) X touch event
whose flags has XITouchEmulatingPointer flag.
Basically, X touch events doesn't have XITouchEmulatingPointer flag in
its flags when it doesn't make a
(XIPointerEmulated) button event.

Thus I correct ecore_x_xi2.c not to make a mouse down/move/up event
when a X touch event has
XITouchEmulatingPointer flag.

SVN revision: 82869

src/lib/ecore_x/xlib/ecore_x_xi2.c

index 4e4300f..a09f055 100644 (file)
@@ -20,6 +20,10 @@ int _ecore_x_xi2_opcode = -1;
 
 #ifdef ECORE_XI2
 #ifdef ECORE_XI2_2
+#ifndef XITouchEmulatingPointer
+#define XITouchEmulatingPointer (1 << 17)
+#endif
+
 typedef struct _Ecore_X_Touch_Device_Info
 {
    EINA_INLIST;
@@ -307,6 +311,7 @@ _ecore_x_input_handler(XEvent *xevent)
       case XI_TouchUpdate:
 #ifdef ECORE_XI2_2
         i = _ecore_x_input_touch_index_get(devid, evd->detail, XI_TouchUpdate);
+        if ((i == 0) && (evd->flags & XITouchEmulatingPointer)) return;
 #endif /* #ifdef ECORE_XI2_2 */
         _ecore_mouse_move
           (evd->time,
@@ -333,6 +338,7 @@ _ecore_x_input_handler(XEvent *xevent)
       case XI_TouchBegin:
 #ifdef ECORE_XI2_2
         i = _ecore_x_input_touch_index_get(devid, evd->detail, XI_TouchBegin);
+        if ((i == 0) && (evd->flags & XITouchEmulatingPointer)) return;
 #endif /* #ifdef ECORE_XI2_2 */
         _ecore_mouse_button
           (ECORE_EVENT_MOUSE_BUTTON_DOWN,
@@ -361,6 +367,11 @@ _ecore_x_input_handler(XEvent *xevent)
       case XI_TouchEnd:
 #ifdef ECORE_XI2_2
         i = _ecore_x_input_touch_index_get(devid, evd->detail, XI_TouchEnd);
+        if ((i == 0) && (evd->flags & XITouchEmulatingPointer))
+          {
+             _ecore_x_input_touch_index_clear(devid,  i);
+             return;
+          }
 #endif /* #ifdef ECORE_XI2_2 */
         _ecore_mouse_button
           (ECORE_EVENT_MOUSE_BUTTON_UP,