diff --git a/src/lib/evas/canvas/evas_device.c b/src/lib/evas/canvas/evas_device.c index c5ae77b10b..def1965341 100644 --- a/src/lib/evas/canvas/evas_device.c +++ b/src/lib/evas/canvas/evas_device.c @@ -186,7 +186,8 @@ evas_device_add_full(Evas *eo_e, const char *name, const char *desc, e->default_keyboard = dev; else if (_is_pointer(clas)) { - if (!_evas_pointer_data_add(e, dev)) + Evas_Pointer_Data *pdata = _evas_pointer_data_add(e, dev); + if (!pdata) { efl_del(dev); return NULL; @@ -198,7 +199,6 @@ evas_device_add_full(Evas *eo_e, const char *name, const char *desc, (parent_dev == e->default_seat) && (evas_device_class_get(e->default_mouse) != EVAS_DEVICE_CLASS_MOUSE)) { - Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, e->default_mouse); Eina_Bool inside = pdata->seat->inside; if (inside) @@ -209,7 +209,19 @@ evas_device_add_full(Evas *eo_e, const char *name, const char *desc, } } else - e->default_mouse = dev; + { + Evas_Pointer_Seat *pseat; + + EINA_INLIST_FOREACH(e->seats, pseat) + if (!pseat->pointers) break; + e->default_mouse = dev; + if (pseat) + { + if (pseat->inside) + evas_event_feed_mouse_in(eo_e, 0, NULL); + evas_event_feed_mouse_move(eo_e, pseat->x, pseat->y, 0, NULL); + } + } } // FIXME: All devices are in the same list, while evas only refs the seats diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index 692fc3528f..075bc94a17 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -2054,8 +2054,26 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da if (e->is_frozen) return; EVAS_EVENT_FEED_SAFETY_CHECK(e); - pdata = _evas_pointer_data_by_device_get(e, ev->device); - if (!pdata) return; + if (ev->device) + { + pdata = _evas_pointer_data_by_device_get(e, ev->device); + if (!pdata) return; + } + else + { + Evas_Pointer_Seat *pseat; + if (!e->seats) return; + pseat = EINA_INLIST_CONTAINER_GET(e->seats, Evas_Pointer_Seat); + pseat->inside = 1; + e->last_timestamp = ev->timestamp; + pseat->prev.x = pseat->x; + pseat->prev.y = pseat->y; + + // new pos + pseat->x = ev->cur.x; + pseat->y = ev->cur.y; + return; + } eo_e = e->evas; e->last_timestamp = ev->timestamp; @@ -2469,8 +2487,19 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) if (!e || !ev) return; EVAS_EVENT_FEED_SAFETY_CHECK(e); - pdata = _evas_pointer_data_by_device_get(e, ev->device); - if (!pdata) return; + if (ev->device) + { + pdata = _evas_pointer_data_by_device_get(e, ev->device); + if (!pdata) return; + } + else + { + Evas_Pointer_Seat *pseat; + if (!e->seats) return; + pseat = EINA_INLIST_CONTAINER_GET(e->seats, Evas_Pointer_Seat); + pseat->inside = 1; + return; + } pdata->seat->inside = 1; if (e->is_frozen) return; @@ -2549,8 +2578,19 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) if (!e || !ev) return; EVAS_EVENT_FEED_SAFETY_CHECK(e); - pdata = _evas_pointer_data_by_device_get(e, ev->device); - if (!pdata) return; + if (ev->device) + { + pdata = _evas_pointer_data_by_device_get(e, ev->device); + if (!pdata) return; + } + else + { + Evas_Pointer_Seat *pseat; + if (!e->seats) return; + pseat = EINA_INLIST_CONTAINER_GET(e->seats, Evas_Pointer_Seat); + pseat->inside = 0; + return; + } pdata->seat->inside = 0; if (e->is_frozen) return; @@ -4126,6 +4166,7 @@ _evas_canvas_event_pointer_in_rect_mouse_move_feed(Evas_Public_Data *edata, EINA_INLIST_FOREACH(edata->seats, pseat) { + if (!pseat->pointers) continue; if (!evas_object_is_in_output_rect(obj, obj_data, pseat->x, pseat->y, w, h)) continue; @@ -4152,7 +4193,10 @@ _evas_canvas_event_pointer_in_list_mouse_move_feed(Evas_Public_Data *edata, { Evas_Pointer_Data *pdata, *found = NULL; Eina_List *l; - int in = evas_object_is_in_output_rect(obj, obj_data, pseat->x, + int in; + + if (!pseat->pointers) continue; + in = evas_object_is_in_output_rect(obj, obj_data, pseat->x, pseat->y, w, h); EINA_LIST_FOREACH(was, l, pdata) if (pdata->seat == pseat) diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index e7c37861d7..ae83bbe3d9 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -1025,7 +1025,11 @@ evas_output_method_set(Evas *eo_e, int render_method) eina_streq(em->definition->name, "wayland_egl") || eina_streq(em->definition->name, "drm") || eina_streq(em->definition->name, "gl_drm"))) - return; + { + Evas_Pointer_Seat *pseat = calloc(1, sizeof(Evas_Pointer_Seat)); + e->seats = eina_inlist_append(e->seats, EINA_INLIST_GET(pseat)); + return; + } e->default_seat = evas_device_add_full(eo_e, "default", "The default seat", NULL, NULL, EVAS_DEVICE_CLASS_SEAT,