wl2_input: fix a problem that occurs in case of using both pointer/touch input devices

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(410c1f9587) 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
This commit is contained in:
Wonki Kim 2019-04-30 11:27:25 -04:00 committed by Christopher Michael
parent 703ca74d67
commit b376391078
2 changed files with 6 additions and 1 deletions

View File

@ -671,6 +671,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
@ -1210,6 +1211,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++;
_pointer_cb_enter(data, NULL, serial, surface, x, y);
@ -1239,11 +1241,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

View File

@ -473,6 +473,7 @@ struct _Ecore_Wl2_Input
{
unsigned int button, count, timestamp;
Ecore_Wl2_Window *window;
unsigned int touch_count;
} grab;
struct