From 250b69c239d8f631952ca35e459eaaedf387610f Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Fri, 18 May 2018 13:46:31 -0400 Subject: [PATCH] evas_device: Only remove pointer data on deletion of pointer devices Summary: This delete callback is shared for mouse, pointer, touch, and seat. We should only delete pointer data when we're called on a pointer. Note that (at least under wayland) this particular bug is irreproducible right now because, due to a ref leak, this deletion callback can never fire. Depends on D6180 Reviewers: zmike Reviewed By: zmike Subscribers: cedric, zmike Tags: #efl Differential Revision: https://phab.enlightenment.org/D6181 --- src/lib/evas/canvas/evas_device.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/evas/canvas/evas_device.c b/src/lib/evas/canvas/evas_device.c index a871116aee..3f52d59635 100644 --- a/src/lib/evas/canvas/evas_device.c +++ b/src/lib/evas/canvas/evas_device.c @@ -76,6 +76,7 @@ _new_default_device_find(Evas_Public_Data *e, Evas_Device *old_dev) static void _del_cb(void *data, const Efl_Event *ev) { + Efl_Input_Device_Type devtype; Evas_Public_Data *e = data; e->devices_modified = EINA_TRUE; @@ -89,7 +90,8 @@ _del_cb(void *data, const Efl_Event *ev) else if (e->default_keyboard == ev->object) e->default_keyboard = _new_default_device_find(e, ev->object); - if ((efl_input_device_type_get(ev->object) == EFL_INPUT_DEVICE_TYPE_SEAT) && (!e->default_seat)) + devtype = efl_input_device_type_get(ev->object); + if ((devtype == EFL_INPUT_DEVICE_TYPE_SEAT) && (!e->default_seat)) { Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, ev->object); if (pdata) @@ -108,7 +110,8 @@ _del_cb(void *data, const Efl_Event *ev) } } - _evas_pointer_data_remove(e, ev->object); + if (devtype == EFL_INPUT_DEVICE_TYPE_MOUSE) + _evas_pointer_data_remove(e, ev->object); eina_hash_del_by_key(e->locks.masks, &ev->object); eina_hash_del_by_key(e->modifiers.masks, &ev->object); efl_event_callback_call(e->evas, EFL_CANVAS_SCENE_EVENT_DEVICE_REMOVED,