ecore_evas: Fix mouse inputs
authorJean-Philippe Andre <jp.andre@samsung.com>
Thu, 2 Jun 2016 01:58:06 +0000 (10:58 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Thu, 2 Jun 2016 05:19:18 +0000 (14:19 +0900)
Yup, I broke everything again. This time, mouse move inputs
would not move the cursor, since I was bypassing the regular
_ecore_evas_mouse_xxx callbacks.

Fixes T3766

src/lib/ecore_evas/ecore_evas.c
src/lib/ecore_input_evas/ecore_input_evas.c

index c8728e4..7f7b1dc 100644 (file)
@@ -3359,8 +3359,8 @@ _ecore_evas_idle_timeout_update(Ecore_Evas *ee)
      ecore_timer_add(IDLE_FLUSH_TIME, _ecore_evas_cb_idle_flush, ee);
 }
 
-EAPI void
-_ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
+static void
+_ecore_evas_mouse_move_process_internal(Ecore_Evas *ee, int x, int y, unsigned int timestamp, Eina_Bool feed)
 {
    int fx, fy, fw, fh;
    ee->mouse.x = x;
@@ -3388,6 +3388,7 @@ _ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timest
                            y - fx - ee->prop.cursor.hot.x,
                            ee->w + fh - x - fy - 1 - ee->prop.cursor.hot.y);
      }
+   if (!feed) return;
    if (ee->rotation == 0)
      evas_event_input_mouse_move(ee->evas, x, y, timestamp, NULL);
    else if (ee->rotation == 90)
@@ -3399,6 +3400,12 @@ _ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timest
 }
 
 EAPI void
+_ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
+{
+   _ecore_evas_mouse_move_process_internal(ee, x, y, timestamp, EINA_TRUE);
+}
+
+EAPI void
 _ecore_evas_mouse_multi_move_process(Ecore_Evas *ee, int device,
                                      int x, int y,
                                      double radius,
@@ -4400,6 +4407,8 @@ _direct_mouse_move_cb(Ecore_Evas *ee, const Ecore_Event_Mouse_Move *info)
    Evas *e = ee->evas;
    Eina_Bool processed;
 
+   _ecore_evas_mouse_move_process_internal(ee, info->x, info->y, info->timestamp, EINA_FALSE);
+
    /* Unused information:
     * same_screen
     * root.{x,y}
index c06b30d..59bfc29 100644 (file)
@@ -599,34 +599,39 @@ ecore_event_evas_mouse_move(void *data EINA_UNUSED, int type EINA_UNUSED, void *
    e = event;
    lookup = _ecore_event_window_match(e->event_window);
    if (!lookup) return ECORE_CALLBACK_PASS_ON;
-   if (lookup->direct &&
-       lookup->direct(lookup->window, ECORE_EVENT_MOUSE_MOVE, e))
-     return ECORE_CALLBACK_PASS_ON;
    if (e->multi.device == 0)
      {
         _ecore_event_evas_push_mouse_move(e);
         ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
-        if (lookup->move_mouse)
-           lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp);
-        else
-           evas_event_input_mouse_move(lookup->evas, e->x, e->y, e->timestamp,
-                                      NULL);
+        if (!lookup->direct ||
+            !lookup->direct(lookup->window, ECORE_EVENT_MOUSE_MOVE, e))
+          {
+             if (lookup->move_mouse)
+               lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp);
+             else
+                evas_event_input_mouse_move(lookup->evas, e->x, e->y, e->timestamp,
+                                            NULL);
+          }
      }
    else
      {
-        if (lookup->move_multi)
-           lookup->move_multi(lookup->window, e->multi.device,
-                              e->x, e->y, e->multi.radius,
-                              e->multi.radius_x, e->multi.radius_y,
-                              e->multi.pressure, e->multi.angle,
-                              e->multi.x, e->multi.y, e->timestamp);
-        else
-          evas_event_input_multi_move(lookup->evas, e->multi.device,
-                                      e->x, e->y, e->multi.radius,
-                                      e->multi.radius_x, e->multi.radius_y,
-                                      e->multi.pressure, e->multi.angle,
-                                      e->multi.x, e->multi.y, e->timestamp,
-                                      NULL);
+        if (!lookup->direct ||
+            !lookup->direct(lookup->window, ECORE_EVENT_MOUSE_MOVE, e))
+          {
+             if (lookup->move_multi)
+               lookup->move_multi(lookup->window, e->multi.device,
+                                  e->x, e->y, e->multi.radius,
+                                  e->multi.radius_x, e->multi.radius_y,
+                                  e->multi.pressure, e->multi.angle,
+                                  e->multi.x, e->multi.y, e->timestamp);
+             else
+               evas_event_input_multi_move(lookup->evas, e->multi.device,
+                                           e->x, e->y, e->multi.radius,
+                                           e->multi.radius_x, e->multi.radius_y,
+                                           e->multi.pressure, e->multi.angle,
+                                           e->multi.x, e->multi.y, e->timestamp,
+                                           NULL);
+          }
      }
    return ECORE_CALLBACK_PASS_ON;
 }