devilhorns pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=5ce3c4a049b14098c4e85e00c2367b7709693a5d

commit 5ce3c4a049b14098c4e85e00c2367b7709693a5d
Author: Marcel Hollerbach <marcel-hollerb...@t-online.de>
Date:   Mon Jun 27 11:31:59 2016 -0400

    ecore_wl2: Fix dnd breakage when focus leaves window
    
    Summary:
    If dnd in the same window is activated, the focus goes away from the
    ecore_wl2 window to the dnd window, after that focus.pointer is NULL.
    After focus.pointer is NULL ev->win of all the events will be 0 which
    breaks dnd-motions, drop and end.
    
    With prev_pointer beeing the last focused window, we can simply set this
    window as event window. After that dnd with jesus works perfectly.
    
    @fix
    
    Reviewers: devilhorns
    
    Subscribers: cedric, jpeg
    
    Differential Revision: https://phab.enlightenment.org/D4093
---
 src/lib/ecore_wl2/ecore_wl2_dnd.c     | 10 ++++++++++
 src/lib/ecore_wl2/ecore_wl2_input.c   |  2 ++
 src/lib/ecore_wl2/ecore_wl2_private.h |  1 +
 3 files changed, 13 insertions(+)

diff --git a/src/lib/ecore_wl2/ecore_wl2_dnd.c 
b/src/lib/ecore_wl2/ecore_wl2_dnd.c
index e9feb12..e35a5cd 100644
--- a/src/lib/ecore_wl2/ecore_wl2_dnd.c
+++ b/src/lib/ecore_wl2/ecore_wl2_dnd.c
@@ -147,6 +147,8 @@ data_source_event_emit(Ecore_Wl2_Input *input, int event)
 
    if (input->focus.pointer)
      ev->win = input->focus.pointer->id;
+   else if (input->focus.prev_pointer)
+     ev->win = input->focus.prev_pointer->id;
    if (input->focus.keyboard)
      ev->source = input->focus.keyboard->id;
 
@@ -360,6 +362,8 @@ _ecore_wl2_dnd_leave(Ecore_Wl2_Input *input)
 
    if (input->focus.pointer)
      ev->win = input->focus.pointer->id;
+   else if (input->focus.prev_pointer)
+     ev->win = input->focus.prev_pointer->id;
    if (input->focus.keyboard)
      ev->source = input->focus.keyboard->id;
 
@@ -381,6 +385,8 @@ _ecore_wl2_dnd_motion(Ecore_Wl2_Input *input, int x, int y, 
uint32_t serial)
 
    if (input->focus.pointer)
      ev->win = input->focus.pointer->id;
+   else if (input->focus.prev_pointer)
+     ev->win = input->focus.prev_pointer->id;
    if (input->focus.keyboard)
      ev->source = input->focus.keyboard->id;
 
@@ -405,6 +411,8 @@ _ecore_wl2_dnd_drop(Ecore_Wl2_Input *input)
      {
         if (input->focus.pointer)
           ev->win = input->focus.pointer->id;
+        else if (input->focus.prev_pointer)
+          ev->win = input->focus.prev_pointer->id;
         if (input->focus.keyboard)
           ev->source = input->focus.keyboard->id;
 
@@ -562,6 +570,8 @@ ecore_wl2_dnd_drag_end(Ecore_Wl2_Input *input)
 
    if (input->focus.pointer)
      ev->win = input->focus.pointer->id;
+   else if (input->focus.prev_pointer)
+     ev->win = input->focus.prev_pointer->id;
    if (input->focus.keyboard)
      ev->source = input->focus.keyboard->id;
 
diff --git a/src/lib/ecore_wl2/ecore_wl2_input.c 
b/src/lib/ecore_wl2/ecore_wl2_input.c
index e86936c..7a5899f 100644
--- a/src/lib/ecore_wl2/ecore_wl2_input.c
+++ b/src/lib/ecore_wl2/ecore_wl2_input.c
@@ -514,6 +514,7 @@ _pointer_cb_enter(void *data, struct wl_pointer *pointer 
EINA_UNUSED, unsigned i
    if (!window) return;
 
    window->input = input;
+   input->focus.prev_pointer = NULL;
    input->focus.pointer = window;
 
    _ecore_wl2_input_mouse_in_send(input, window);
@@ -536,6 +537,7 @@ _pointer_cb_leave(void *data, struct wl_pointer *pointer 
EINA_UNUSED, unsigned i
    if (!input) return;
 
    input->display->serial = serial;
+   input->focus.prev_pointer = input->focus.pointer;
    input->focus.pointer = NULL;
 
    /* trap for a surface that was just destroyed */
diff --git a/src/lib/ecore_wl2/ecore_wl2_private.h 
b/src/lib/ecore_wl2/ecore_wl2_private.h
index fce1245..4f5a441 100644
--- a/src/lib/ecore_wl2/ecore_wl2_private.h
+++ b/src/lib/ecore_wl2/ecore_wl2_private.h
@@ -370,6 +370,7 @@ struct _Ecore_Wl2_Input
    struct
      {
         Ecore_Wl2_Window *pointer;
+        Ecore_Wl2_Window *prev_pointer;
         Ecore_Wl2_Window *keyboard;
         Ecore_Wl2_Window *touch;
      } focus;

-- 


Reply via email to