wl2_input: fix a problem that occurs in case of using both pointer/touch input devices 62/205262/1
authorWonki Kim <wonki_.kim@samsung.com>
Tue, 30 Apr 2019 15:27:25 +0000 (11:27 -0400)
committerWonki Kim <wonki_.kim@samsung.com>
Thu, 2 May 2019 00:57:58 +0000 (09:57 +0900)
Summary:
if wl2_input logic gets a 'touch down' event from touch device,
input->focus.touch has set and it cause the logic handles every input as touch input
from that moment at _ecore_wl2_input_mouse_move_send function.
that is the reason why the patch(410c1f95879e46a5e52132662d4c43b74e95a251) has written for.

however, if there are multiple touch input devices,
clearing focus.touch variable without checking any conditions causes another problem.

I mean a case such as 'touch 1 down' -> 'touch 2 down' -> 'touch 1 up' -> 'touch 2 up'
at the moment 'touch 1 up' event executed, focus.touch would be cleared,
and 'touch 2 up' and following touch events will not be executed properly at the moment.

this patch counts a number of touch devices which are grabbing to clear focus.touch at proper time.

Reviewers: devilhorns

Reviewed By: devilhorns

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D8787

Change-Id: I95b64df82f17069762aa93a60b0eb048805e5bac
Signed-off-by: Wonki Kim <wonki_.kim@samsung.com>
src/lib/ecore_wl2/ecore_wl2_input.c
src/lib/ecore_wl2/ecore_wl2_private.h

index c75cceb..15dd2e2 100644 (file)
@@ -1011,6 +1011,7 @@ _ecore_wl2_input_ungrab(Ecore_Wl2_Input *input)
    input->grab.window = NULL;
    input->grab.button = 0;
    input->grab.count = 0;
+   input->grab.touch_count = 0;
 }
 
 static void
@@ -1632,6 +1633,7 @@ _touch_cb_down(void *data, struct wl_touch *touch EINA_UNUSED, unsigned int seri
 
    input->focus.touch = window;
    input->timestamp = timestamp;
+   input->grab.touch_count++;
 
    // TIZEN_ONLY(20171109): support a tizen_input_device_manager interface
    _ecore_wl2_input_touch_axis_process(input, id);
@@ -1681,11 +1683,13 @@ _touch_cb_up(void *data, struct wl_touch *touch EINA_UNUSED, unsigned int serial
                                   BTN_LEFT, timestamp);
 
    if (input->grab.count) input->grab.count--;
+   if (input->grab.touch_count) input->grab.touch_count--;
    if ((input->grab.window) && (input->grab.button == BTN_LEFT) &&
        (!input->grab.count))
      _ecore_wl2_input_ungrab(input);
 
-   input->focus.touch = NULL;
+   if (input->grab.touch_count == 0) input->focus.touch = NULL;
+
 }
 
 static void
index 06e8719..f7808dc 100644 (file)
@@ -623,6 +623,7 @@ struct _Ecore_Wl2_Input
      {
         unsigned int button, count, timestamp;
         Ecore_Wl2_Window *window;
+        unsigned int touch_count;
      } grab;
 
    struct