discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=11a9ed301dee2d4af9609465ade7685136ad49cc

commit 11a9ed301dee2d4af9609465ade7685136ad49cc
Author: Mike Blumenkrantz <[email protected]>
Date:   Wed Jan 17 17:33:57 2018 -0500

    efl-wl: set event ON_HOLD flag when they are sent to a surface
    
    use a flag to indicate when processed events have been internally processed
    
    @fix
---
 src/lib/efl_wl/efl_wl.c | 122 ++++++++++++++++++++++++++++++++++++------------
 1 file changed, 92 insertions(+), 30 deletions(-)

diff --git a/src/lib/efl_wl/efl_wl.c b/src/lib/efl_wl/efl_wl.c
index 5f04eed930..88a9600b21 100644
--- a/src/lib/efl_wl/efl_wl.c
+++ b/src/lib/efl_wl/efl_wl.c
@@ -249,6 +249,7 @@ typedef struct Comp_Seat
    Eina_Bool focused : 1;
    Eina_Bool selection_changed : 1;
    Eina_Bool selection_exists : 1;
+   Eina_Bool event_propagate : 1;
 } Comp_Seat;
 
 typedef struct Comp_Buffer_State
@@ -1956,7 +1957,7 @@ comp_surface_send_data_device_enter(Comp_Surface *cs, 
Comp_Seat *s)
        wl_fixed_from_int(cx - x), wl_fixed_from_int(cy - y), offer);
 }
 
-static void
+static Eina_Bool
 comp_surface_send_pointer_enter(Comp_Surface *cs, Comp_Seat *s, int cx, int cy)
 {
    Eina_List *l, *ll;
@@ -1964,32 +1965,39 @@ comp_surface_send_pointer_enter(Comp_Surface *cs, 
Comp_Seat *s, int cx, int cy)
    uint32_t serial;
    int x, y;
 
-   if (s->ptr.enter && (cs != s->grab)) return;
-   if (!comp_surface_check_grab(cs, s)) return;
+   if (s->ptr.enter && (cs != s->grab)) return EINA_FALSE;
+   if (!comp_surface_check_grab(cs, s)) return EINA_FALSE;
    s->ptr.enter = cs;
-   if (cs->dead) return;
+   if (cs->dead) return EINA_FALSE;
    if (s->drag.res && (!s->drag.tch))
      {
         comp_surface_send_data_device_enter(cs, s);
-        return;
+        return EINA_TRUE;
      }
    l = seat_ptr_resources_get(s, wl_resource_get_client(cs->res));
-   if (!l) return;
+   if (!l) return EINA_FALSE;
    s->ptr.enter_serial = serial = wl_display_next_serial(cs->c->display);
    //fprintf(stderr, "ENTER %s\n", cs->shell.popup ? "POPUP" : "TOPLEVEL");
    evas_object_geometry_get(cs->obj, &x, &y, NULL, NULL);
    EINA_LIST_FOREACH(l, ll, res)
      wl_pointer_send_enter(res, serial, cs->res,
        wl_fixed_from_int(cx - x), wl_fixed_from_int(cy - y));
+   return EINA_TRUE;
 }
 
 static void
 comp_surface_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info)
 {
    Evas_Event_Mouse_In *ev = event_info;
+   Comp_Seat *s;
 
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
-   comp_surface_send_pointer_enter(data, seat_find(data, ev->dev), 
ev->canvas.x, ev->canvas.y);
+   s = seat_find(data, ev->dev);
+   if (comp_surface_send_pointer_enter(data, s, ev->canvas.x, ev->canvas.y))
+     {
+        s->event_propagate = 1;
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+     }
 }
 
 static void
@@ -2006,40 +2014,47 @@ comp_surface_send_data_device_leave(Comp_Surface *cs, 
Comp_Seat *s)
    wl_data_device_send_leave(res);
 }
 
-static void
+static Eina_Bool
 comp_surface_send_pointer_leave(Comp_Surface *cs, Comp_Seat *s)
 {
    Eina_List *l, *ll;
    struct wl_resource *res;
    uint32_t serial;
 
-   if (s->ptr.enter != cs) return;
-   if (!comp_surface_check_grab(cs, s)) return;
+   if (s->ptr.enter != cs) return EINA_FALSE;
+   if (!comp_surface_check_grab(cs, s)) return EINA_FALSE;
    s->ptr.enter = NULL;
-   if (cs->dead) return;
+   if (cs->dead) return EINA_FALSE;
    if (s->drag.res)
      {
         comp_surface_send_data_device_leave(cs, s);
-        return;
+        return EINA_TRUE;
      }
    l = seat_ptr_resources_get(s, wl_resource_get_client(cs->res));
-   if (!l) return;
+   if (!l) return EINA_FALSE;
    serial = wl_display_next_serial(cs->c->display);
    //fprintf(stderr, "LEAVE %s\n", cs->shell.popup ? "POPUP" : "TOPLEVEL");
    EINA_LIST_FOREACH(l, ll, res)
      wl_pointer_send_leave(res, serial, cs->res);
+   return EINA_TRUE;
 }
 
 static void
 comp_surface_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info)
 {
    Evas_Event_Mouse_Out *ev = event_info;
+   Comp_Seat *s;
 
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
-   comp_surface_send_pointer_leave(data, seat_find(data, ev->dev));
+   s = seat_find(data, ev->dev);
+   if (comp_surface_send_pointer_leave(data, s))
+     {
+        s->event_propagate = 1;
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+     }
 }
 
-static void
+static Eina_Bool
 comp_surface_mouse_button(Comp_Surface *cs, Comp_Seat *s, uint32_t timestamp, 
uint32_t button_id, uint32_t state)
 {
    uint32_t serial, btn;
@@ -2073,13 +2088,13 @@ comp_surface_mouse_button(Comp_Surface *cs, Comp_Seat 
*s, uint32_t timestamp, ui
         btn = button_id + BTN_SIDE - 8;
         break;
      }
-   if (s->ptr.enter != cs) return;
-   if (!comp_surface_check_grab(cs, s)) return;
+   if (s->ptr.enter != cs) return EINA_FALSE;
+   if (!comp_surface_check_grab(cs, s)) return EINA_FALSE;
    if (state == WL_POINTER_BUTTON_STATE_PRESSED)
      s->ptr.button_mask |= 1 << button_id;
    else
      {
-        if (!(s->ptr.button_mask & (1 << button_id))) return;
+        if (!(s->ptr.button_mask & (1 << button_id))) return EINA_FALSE;
         s->ptr.button_mask &= ~(1 << button_id);
         if (s->drag.res && (!s->drag.tch))
           {
@@ -2087,41 +2102,54 @@ comp_surface_mouse_button(Comp_Surface *cs, Comp_Seat 
*s, uint32_t timestamp, ui
              comp_surface_input_event(&s->ptr.events, button_id, 0, timestamp, 
state == WL_POINTER_BUTTON_STATE_RELEASED);
              s->ptr.enter = NULL;
              comp_surface_send_pointer_enter(cs, s, s->ptr.pos.x, 
s->ptr.pos.y);
-             return;
+             return EINA_TRUE;
           }
      }
 
    if (cs->dead)
      {
         comp_surface_input_event(&s->ptr.events, button_id, 0, timestamp, 
state == WL_POINTER_BUTTON_STATE_RELEASED);
-        return;
+        return EINA_TRUE;
      }
 
    l = seat_ptr_resources_get(s, wl_resource_get_client(cs->res));
-   if (!l) return;
+   if (!l) return EINA_FALSE;
    serial = wl_display_next_serial(s->c->display);
    comp_surface_input_event(&s->ptr.events, button_id, serial, timestamp, 
state == WL_POINTER_BUTTON_STATE_RELEASED);
 
    EINA_LIST_FOREACH(l, ll, res)
      wl_pointer_send_button(res, serial, timestamp, btn, state);
+   return EINA_TRUE;
 }
 
 static void
 comp_surface_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info)
 {
    Evas_Event_Mouse_Down *ev = event_info;
+   Comp_Seat *s;
 
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
-   comp_surface_mouse_button(data, seat_find(data, ev->dev), ev->timestamp, 
ev->button, WL_POINTER_BUTTON_STATE_PRESSED);
+   s = seat_find(data, ev->dev);
+   if (comp_surface_mouse_button(data, s, ev->timestamp, ev->button, 
WL_POINTER_BUTTON_STATE_PRESSED))
+     {
+        s->event_propagate = 1;
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+     }
 }
 
 static void
 comp_surface_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info)
 {
    Evas_Event_Mouse_Down *ev = event_info;
+   Comp_Seat *s;
 
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
-   comp_surface_mouse_button(data, seat_find(data, ev->dev), ev->timestamp, 
ev->button, WL_POINTER_BUTTON_STATE_RELEASED);
+   s = seat_find(data, ev->dev);
+   if (comp_surface_mouse_button(data, s, ev->timestamp, ev->button, 
WL_POINTER_BUTTON_STATE_RELEASED))
+     {
+        s->event_propagate = 1;
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+     }
 }
 
 static void
@@ -2165,6 +2193,8 @@ comp_surface_mouse_move(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_U
                wl_fixed_from_int(ev->cur.canvas.x - x), 
wl_fixed_from_int(ev->cur.canvas.y - y));
           }
      }
+   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+   s->event_propagate = 1;
 }
 
 static void
@@ -2196,6 +2226,8 @@ comp_surface_mouse_wheel(void *data, Evas *evas 
EINA_UNUSED, Evas_Object *obj EI
    if (!l) return;
    EINA_LIST_FOREACH(l, ll, res)
      wl_pointer_send_axis(res, ev->timestamp, axis, dir);
+   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+   s->event_propagate = 1;
 }
 
 static void
@@ -2218,6 +2250,8 @@ comp_surface_multi_down(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_U
    if (!l)
      {
         comp_surface_input_event(&s->tch.events, ev->device, 0, ev->timestamp, 
0);
+        s->event_propagate = 1;
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
         return;
      }
    evas_object_geometry_get(cs->obj, &x, &y, NULL, NULL);
@@ -2226,6 +2260,8 @@ comp_surface_multi_down(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_U
    EINA_LIST_FOREACH(l, ll, res)
      wl_touch_send_down(res, serial, ev->timestamp, cs->res, ev->device,
        wl_fixed_from_int(ev->canvas.x - x), wl_fixed_from_int(ev->canvas.y - 
y));
+   s->event_propagate = 1;
+   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
 }
 
 static void
@@ -2250,12 +2286,16 @@ comp_surface_multi_up(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNU
         if (s->drag.tch)
           wl_data_device_send_drop(data_device_find(s, cs->res));
         comp_surface_input_event(&s->tch.events, ev->device, 0, ev->timestamp, 
1);
+        s->event_propagate = 1;
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
         return;
      }
    serial = wl_display_next_serial(cs->c->display);
    comp_surface_input_event(&s->tch.events, ev->device, serial, ev->timestamp, 
1);
    EINA_LIST_FOREACH(l, ll, res)
      wl_touch_send_up(res, serial, ev->timestamp, ev->device);
+   s->event_propagate = 1;
+   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
 }
 
 static void
@@ -2277,8 +2317,12 @@ comp_surface_multi_move(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_U
         if (s->drag.enter != cs) return;
         res = data_device_find(s, cs->res);
         if (res)
-          wl_data_device_send_motion(res, ev->timestamp,
-            wl_fixed_from_int(ev->cur.canvas.x - x), 
wl_fixed_from_int(ev->cur.canvas.y - y));
+          {
+             wl_data_device_send_motion(res, ev->timestamp,
+               wl_fixed_from_int(ev->cur.canvas.x - x), 
wl_fixed_from_int(ev->cur.canvas.y - y));
+             s->event_propagate = 1;
+             ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+          }
         return;
      }
    else
@@ -2290,6 +2334,8 @@ comp_surface_multi_move(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_U
         EINA_LIST_FOREACH(l, ll, res)
           wl_touch_send_motion(res, ev->timestamp, ev->device,
             wl_fixed_from_int(ev->cur.canvas.x - x), 
wl_fixed_from_int(ev->cur.canvas.y - y));
+        s->event_propagate = 1;
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
      }
 }
 
@@ -4907,9 +4953,13 @@ comp_mouse_in(void *data, Evas *e, Evas_Object *obj, 
void *event_info)
    Comp *c = data;
    Evas_Event_Mouse_In *ev = event_info;
    Comp_Seat *s;
-
-   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
    s = comp_seat_find(c, ev->dev);
+
+   if (!s->event_propagate)
+     {
+        if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+     }
+   s->event_propagate = 0;
    if (s->drag.proxy_win)
      {
         ecore_evas_free(s->drag.proxy_win);
@@ -4943,8 +4993,12 @@ comp_multi_move(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, v
    Comp_Seat *s;
    int w, h;
 
-   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
    s = comp_seat_find(c, ev->dev);
+   if (!s->event_propagate)
+     {
+        if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+     }
+   s->event_propagate = 0;
    s->tch.pos.x = ev->cur.canvas.x;
    s->tch.pos.y = ev->cur.canvas.y;
    if ((!s->drag.tch) || (!s->drag.surface)) return;
@@ -4960,8 +5014,12 @@ comp_mouse_move(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, v
    Comp_Seat *s;
    int w, h;
 
-   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
    s = comp_seat_find(c, ev->dev);
+   if (!s->event_propagate)
+     {
+        if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+     }
+   s->event_propagate = 0;
    s->ptr.pos.x = ev->cur.canvas.x;
    s->ptr.pos.y = ev->cur.canvas.y;
    if (s->drag.tch || (!s->drag.surface)) return;
@@ -4979,8 +5037,12 @@ comp_mouse_out(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj, void *event_in
    const char **types, *type;
    unsigned int i = 0;
 
-   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
    s = comp_seat_find(c, ev->dev);
+   if (!s->event_propagate)
+     {
+        if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+     }
+   s->event_propagate = 0;
    s->ptr.in = 0;
    ecore_evas_cursor_device_unset(ecore_evas_ecore_evas_get(e), ev->dev);
    if (s->ptr.efl.obj)

-- 


Reply via email to