devilhorns pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=9aaada21c316c27696d508f2cd232126562ea1e9

commit 9aaada21c316c27696d508f2cd232126562ea1e9
Author: Chris Michael <cp.mich...@samsung.com>
Date:   Mon Nov 9 15:49:18 2015 -0500

    ecore-wl2: Fix issue of not unsetting move mouse pointer
    
    Summary: When we finish moving a window, previously the mouse cursor
    would never get unset from the hand cursor. This is due to the way
    that grabs work in wayland, and not ever getting an event notification
    for the move being completed. This patch works around that issue
    
    @fix
    
    Signed-off-by: Chris Michael <cp.mich...@samsung.com>
---
 src/lib/ecore_wl2/ecore_wl2_input.c   | 10 ++++++++++
 src/lib/ecore_wl2/ecore_wl2_private.h |  1 +
 src/lib/ecore_wl2/ecore_wl2_window.c  | 35 +++++++++++++++++++++--------------
 3 files changed, 32 insertions(+), 14 deletions(-)

diff --git a/src/lib/ecore_wl2/ecore_wl2_input.c 
b/src/lib/ecore_wl2/ecore_wl2_input.c
index 8340290..dccb184 100644
--- a/src/lib/ecore_wl2/ecore_wl2_input.c
+++ b/src/lib/ecore_wl2/ecore_wl2_input.c
@@ -490,6 +490,13 @@ _pointer_cb_enter(void *data, struct wl_pointer *pointer 
EINA_UNUSED, unsigned i
    input->focus.pointer = window;
 
    _ecore_wl2_input_mouse_in_send(input, window);
+
+   if ((window->moving) && (input->grab.window == window))
+     {
+        _ecore_wl2_input_mouse_up_send(input, window, 0, input->grab.button,
+                                       input->grab.timestamp);
+        window->moving = EINA_FALSE;
+     }
 }
 
 static void
@@ -511,6 +518,9 @@ _pointer_cb_leave(void *data, struct wl_pointer *pointer 
EINA_UNUSED, unsigned i
    window = _ecore_wl2_display_window_surface_find(input->display, surface);
    if (!window) return;
 
+   /* NB: Don't send a mouse out if we grabbed this window for moving */
+   if ((window->moving) && (input->grab.window == window)) return;
+
    _ecore_wl2_input_mouse_out_send(input, window);
 }
 
diff --git a/src/lib/ecore_wl2/ecore_wl2_private.h 
b/src/lib/ecore_wl2/ecore_wl2_private.h
index 130ccce..26a15ca 100644
--- a/src/lib/ecore_wl2/ecore_wl2_private.h
+++ b/src/lib/ecore_wl2/ecore_wl2_private.h
@@ -125,6 +125,7 @@ struct _Ecore_Wl2_Window
 
    Eina_Inlist *subsurfs;
 
+   Eina_Bool moving : 1;
    Eina_Bool minimized : 1;
    Eina_Bool maximized : 1;
    Eina_Bool fullscreen : 1;
diff --git a/src/lib/ecore_wl2/ecore_wl2_window.c 
b/src/lib/ecore_wl2/ecore_wl2_window.c
index 27ec0f7..379b283 100644
--- a/src/lib/ecore_wl2/ecore_wl2_window.c
+++ b/src/lib/ecore_wl2/ecore_wl2_window.c
@@ -412,7 +412,7 @@ ecore_wl2_window_move(Ecore_Wl2_Window *window, int x, int 
y)
 
    if ((!input) || (!input->wl.seat)) return;
 
-   _ecore_wl2_input_ungrab(input);
+   window->moving = EINA_TRUE;
 
    if (window->xdg_surface)
      xdg_surface_move(window->xdg_surface, input->wl.seat,
@@ -437,8 +437,6 @@ ecore_wl2_window_resize(Ecore_Wl2_Window *window, int w, 
int h, int location)
 
    if ((!input) || (!input->wl.seat)) return;
 
-   _ecore_wl2_input_ungrab(input);
-
    if (window->xdg_surface)
      xdg_surface_resize(window->xdg_surface, input->wl.seat,
                         input->display->serial, location);
@@ -793,43 +791,52 @@ ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, 
Eina_Bool iconified)
 EAPI void
 ecore_wl2_window_pointer_xy_get(Ecore_Wl2_Window *window, int *x, int *y)
 {
+   Ecore_Wl2_Input *input;
+
    EINA_SAFETY_ON_NULL_RETURN(window);
 
    if (x) *x = 0;
    if (y) *y = 0;
 
-   if (!window->input) return;
+   input = ecore_wl2_window_input_get(window);
+   if (!input) return;
 
-   if (x) *x = window->input->pointer.sx;
-   if (y) *y = window->input->pointer.sy;
+   if (x) *x = input->pointer.sx;
+   if (y) *y = input->pointer.sy;
 }
 
 EAPI void
 ecore_wl2_window_pointer_set(Ecore_Wl2_Window *window, struct wl_surface 
*surface, int hot_x, int hot_y)
 {
+   Ecore_Wl2_Input *input;
+
    EINA_SAFETY_ON_NULL_RETURN(window);
 
-   if (!window->input) return;
+   input = ecore_wl2_window_input_get(window);
+   if (!input) return;
 
-   _ecore_wl2_input_cursor_update_stop(window->input);
+   _ecore_wl2_input_cursor_update_stop(input);
 
-   if (window->input->wl.pointer)
-     wl_pointer_set_cursor(window->input->wl.pointer,
-                           window->input->pointer.enter_serial,
+   if (input->wl.pointer)
+     wl_pointer_set_cursor(input->wl.pointer,
+                           input->pointer.enter_serial,
                            surface, hot_x, hot_y);
 }
 
 EAPI void
 ecore_wl2_window_cursor_from_name_set(Ecore_Wl2_Window *window, const char 
*cursor)
 {
+   Ecore_Wl2_Input *input;
+
    EINA_SAFETY_ON_NULL_RETURN(window);
 
    eina_stringshare_replace(&window->cursor, cursor);
 
-   if (!window->input) return;
+   input = ecore_wl2_window_input_get(window);
+   if (!input) return;
 
-   _ecore_wl2_input_cursor_update_stop(window->input);
-   _ecore_wl2_input_cursor_set(window->input, cursor);
+   _ecore_wl2_input_cursor_update_stop(input);
+   _ecore_wl2_input_cursor_set(input, cursor);
 }
 
 EAPI void

-- 


Reply via email to