discomfitor pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=ed4e54ebe2da6b0c2f04bc118286b1b3251edbd9
commit ed4e54ebe2da6b0c2f04bc118286b1b3251edbd9 Author: Mike Blumenkrantz <[email protected]> Date: Fri May 26 16:34:10 2017 -0400 wayland/drm: create evas_devices and add device pointer to input events this is still semi-broken if a seat has many pointer-ish type devices since pointer devices in ecore-evas were never correctly implemented to be 1:1 with seat:cursor relationships @feature --- src/Makefile_Ecore_Evas.am | 1 + src/lib/ecore_drm2/ecore_drm2_private.h | 3 +- src/lib/elput/elput_evdev.c | 6 ++ src/lib/elput/elput_private.h | 4 +- src/lib/evas/canvas/evas_main.c | 6 +- .../ecore_evas/engines/drm/ecore_evas_drm.c | 86 ++++++++++++++++++++++ 6 files changed, 102 insertions(+), 4 deletions(-) diff --git a/src/Makefile_Ecore_Evas.am b/src/Makefile_Ecore_Evas.am index 7907a67269..dbdf5f6fb9 100644 --- a/src/Makefile_Ecore_Evas.am +++ b/src/Makefile_Ecore_Evas.am @@ -271,6 +271,7 @@ modules_ecore_evas_engines_drm_module_la_SOURCES = $(DRMSOURCES) modules_ecore_evas_engines_drm_module_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl \ @ECORE_EVAS_CFLAGS@ \ @ECORE_DRM2_CFLAGS@ \ +@ELPUT_CFLAGS@ \ -I$(top_srcdir)/src/modules/evas/engines/drm \ -I$(top_srcdir)/src/modules/evas/engines/gl_drm modules_ecore_evas_engines_drm_module_la_LIBADD = \ diff --git a/src/lib/ecore_drm2/ecore_drm2_private.h b/src/lib/ecore_drm2/ecore_drm2_private.h index 2be6069b69..a7e3766d59 100644 --- a/src/lib/ecore_drm2/ecore_drm2_private.h +++ b/src/lib/ecore_drm2/ecore_drm2_private.h @@ -20,6 +20,7 @@ # include <sys/ioctl.h> # include <dlfcn.h> +#ifndef DRM2_NODEFS extern int _ecore_drm2_log_dom; extern Eina_Bool _ecore_drm2_use_atomic; @@ -52,7 +53,7 @@ extern Eina_Bool _ecore_drm2_use_atomic; # undef CRIT # endif # define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_drm2_log_dom, __VA_ARGS__) - +#endif /* The following defines and structures were borrowed from drm.h */ /** diff --git a/src/lib/elput/elput_evdev.c b/src/lib/elput/elput_evdev.c index a212691787..741d1fdfb2 100644 --- a/src/lib/elput/elput_evdev.c +++ b/src/lib/elput/elput_evdev.c @@ -300,6 +300,7 @@ _keyboard_key_send(Elput_Device *dev, enum libinput_key_state state, const char ev->modifiers = dev->seat->modifiers; ev->timestamp = timestamp; ev->same_screen = 1; + ev->dev = dev->evas_device; ev->window = dev->seat->manager->window; ev->event_window = dev->seat->manager->window; @@ -803,6 +804,7 @@ _pointer_motion_send(Elput_Device *edev) ev->root_window = edev->seat->manager->window; ev->timestamp = ptr->timestamp; ev->same_screen = 1; + ev->dev = edev->evas_device; ev->x = ptr->x; ev->y = ptr->y; @@ -912,6 +914,7 @@ _pointer_button_send(Elput_Device *edev, enum libinput_button_state state) ev->root_window = edev->seat->manager->window; ev->timestamp = ptr->timestamp; ev->same_screen = 1; + ev->dev = edev->evas_device; ev->x = ptr->x; ev->y = ptr->y; @@ -1033,6 +1036,7 @@ _pointer_axis_send(Elput_Device *dev, int direction, int value) ev->root_window = dev->seat->manager->window; ev->timestamp = ptr->timestamp; ev->same_screen = 1; + ev->dev = dev->evas_device; ev->x = ptr->x; ev->y = ptr->y; @@ -1189,6 +1193,7 @@ _touch_motion_send(Elput_Device *dev) ev->root_window = dev->seat->manager->window; ev->timestamp = touch->timestamp; ev->same_screen = 1; + ev->dev = dev->evas_device; ev->x = lround(touch->x); ev->y = lround(touch->y); @@ -1447,6 +1452,7 @@ _tablet_tool_axis(struct libinput_device *idev, struct libinput_event_tablet_too ev->root_window = dev->seat->manager->window; ev->timestamp = ptr->timestamp; ev->naxis = num; + ev->dev = dev->evas_device; ev->axis = axis = calloc(num, sizeof(Ecore_Axis)); for (i = 0; i < num; i++) { diff --git a/src/lib/elput/elput_private.h b/src/lib/elput/elput_private.h index 982d3f58c0..202c52bbef 100644 --- a/src/lib/elput/elput_private.h +++ b/src/lib/elput/elput_private.h @@ -28,6 +28,7 @@ # include <systemd/sd-login.h> # endif +#ifndef ELPUT_NODEFS # ifdef ELPUT_DEFAULT_LOG_COLOR # undef ELPUT_DEFAULT_LOG_COLOR # endif @@ -59,7 +60,7 @@ extern int _elput_log_dom; # undef CRIT # endif # define CRIT(...) EINA_LOG_DOM_CRIT(_elput_log_dom, __VA_ARGS__) - +#endif typedef struct _Elput_Interface { Eina_Bool (*connect)(Elput_Manager **manager, const char *seat, unsigned int tty); @@ -218,6 +219,7 @@ struct _Elput_Device Elput_Device_Caps caps; Eina_Hash *key_remap_hash; + Eo *evas_device; Eina_Bool left_handed : 1; Eina_Bool key_remap : 1; diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index e03af07986..0229e0d3b2 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -1006,9 +1006,11 @@ evas_output_method_set(Evas *eo_e, int render_method) output->info = e->engine.func->info(eo_e); } - // Wayland already handles seats. + // Wayland/drm already handles seats. if (em->definition && (eina_streq(em->definition->name, "wayland_shm") || - eina_streq(em->definition->name, "wayland_egl"))) + eina_streq(em->definition->name, "wayland_egl") || + eina_streq(em->definition->name, "drm") || + eina_streq(em->definition->name, "gl_drm"))) return; e->default_seat = evas_device_add_full(eo_e, "default", "The default seat", diff --git a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c index 82b7d0d1bf..279c5aa289 100644 --- a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c +++ b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c @@ -13,6 +13,12 @@ #include <Ecore_Drm2.h> #include <Evas_Engine_Drm.h> +#define DRM2_NODEFS +#include "ecore_drm2_private.h" + +#define ELPUT_NODEFS +#include "elput_private.h" + #ifdef BUILD_ECORE_EVAS_GL_DRM # include <Evas_Engine_GL_Drm.h> # include <dlfcn.h> @@ -83,11 +89,80 @@ typedef struct _Ecore_Evas_Engine_Drm_Data Ecore_Fd_Handler *hdlr; Ecore_Drm2_Device *dev; Ecore_Drm2_Output *output; + Evas_Device *seat; Eina_Bool pending : 1; Eina_Bool ticking : 1; } Ecore_Evas_Engine_Drm_Data; static int _drm_init_count = 0; +static Eina_List *handlers; +static Eina_List *canvases; + +static Eina_Bool +_drm_device_change(void *d EINA_UNUSED, int t EINA_UNUSED, void *event) +{ + Elput_Event_Device_Change *ev = event; + const Eina_List *l; + Ecore_Evas *ee; + Ecore_Evas_Engine_Drm_Data *edata; + Elput_Seat *seat; + Elput_Manager *manager; + Eina_Bool found = EINA_FALSE; + Elput_Device_Caps caps; + Evas_Device_Class devclass = EVAS_DEVICE_CLASS_NONE; + Eo *dev; + + seat = elput_device_seat_get(ev->device); + manager = elput_seat_manager_get(seat); + caps = elput_device_caps_get(ev->device); + + EINA_LIST_FOREACH(canvases, l, ee) + { + edata = ee->engine.data; + found = edata->dev->em == manager; + if (found) break; + } + + if (!found) return ECORE_CALLBACK_RENEW; + if (caps & ELPUT_DEVICE_CAPS_TABLET_TOOL) + devclass = EVAS_DEVICE_CLASS_PEN; // idk how "pen" is a device class? + else if (caps & ELPUT_DEVICE_CAPS_POINTER) + devclass = EVAS_DEVICE_CLASS_MOUSE; + else if (caps & ELPUT_DEVICE_CAPS_TOUCH) + devclass = EVAS_DEVICE_CLASS_TOUCH; + else if (caps & ELPUT_DEVICE_CAPS_KEYBOARD) + devclass = EVAS_DEVICE_CLASS_KEYBOARD; + switch (ev->type) + { + case ELPUT_DEVICE_ADDED: + { + if (!edata->seat) + { + Eina_Stringshare *name = elput_seat_name_get(seat); + edata->seat = evas_device_add_full(ee->evas, name, + "drm seat", NULL, NULL, EVAS_DEVICE_CLASS_SEAT, EVAS_DEVICE_CLASS_NONE); + evas_device_seat_id_set(edata->seat, strtol(name, NULL, 10)); + } + + dev = evas_device_add_full(ee->evas, elput_device_output_name_get(ev->device), + "drm device", edata->seat, NULL, devclass, EVAS_DEVICE_CLASS_NONE); + ev->device->evas_device = dev; + break; + } + case ELPUT_DEVICE_REMOVED: + { + EINA_LIST_FOREACH(evas_device_list(ee->evas, edata->seat), l, dev) + { + if (dev != ev->device->evas_device) continue; + evas_device_del(dev); + break; + } + break; + } + } + + return ECORE_CALLBACK_RENEW; +} static int _ecore_evas_drm_init(Ecore_Evas *ee, Ecore_Evas_Engine_Drm_Data *edata, const char *device) @@ -130,6 +205,11 @@ _ecore_evas_drm_init(Ecore_Evas *ee, Ecore_Evas_Engine_Drm_Data *edata, const ch else WRN("Could not find output at %d %d", edata->x, edata->y); ecore_event_evas_init(); + if (!handlers) + { + handlers = eina_list_append(handlers, + ecore_event_handler_add(ELPUT_EVENT_DEVICE_CHANGE, _drm_device_change, NULL)); + } return _drm_init_count; @@ -146,6 +226,7 @@ init_err: static int _ecore_evas_drm_shutdown(Ecore_Evas_Engine_Drm_Data *edata) { + Ecore_Event_Handler *h; if (--_drm_init_count != 0) return _drm_init_count; ecore_drm2_outputs_destroy(edata->dev); @@ -153,6 +234,8 @@ _ecore_evas_drm_shutdown(Ecore_Evas_Engine_Drm_Data *edata) ecore_drm2_device_free(edata->dev); ecore_drm2_shutdown(); ecore_event_evas_shutdown(); + EINA_LIST_FREE(handlers, h) + ecore_event_handler_del(h); return _drm_init_count; } @@ -165,6 +248,7 @@ _drm_free(Ecore_Evas *ee) ecore_evas_input_event_unregister(ee); edata = ee->engine.data; + canvases = eina_list_remove(canvases, ee); _ecore_evas_drm_shutdown(edata); free(edata); } @@ -843,6 +927,8 @@ _ecore_evas_new_internal(const char *device, int x, int y, int w, int h, Eina_Bo edata->hdlr = ecore_main_fd_handler_add(edata->fd, ECORE_FD_READ, _cb_drm_event, ee, NULL, NULL); + + canvases = eina_list_append(canvases, ee); return ee; eng_err: --
