From: Jihoon Kim Date: Fri, 30 Aug 2024 11:02:58 +0000 (+0900) Subject: input: send device info in input thread X-Git-Tag: accepted/tizen/unified/20240911.161955~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=46a58353ca2911f06b5bd332542f7c89141d777c;p=platform%2Fupstream%2Fenlightenment.git input: send device info in input thread Change-Id: Iec1c441bfbd4ab148c4a7ca72136fd668be051e2 Signed-off-by: Jihoon Kim --- diff --git a/src/bin/inputmgr/e_input_thread_client.c b/src/bin/inputmgr/e_input_thread_client.c index 3d7c4dae38..a9c0185989 100644 --- a/src/bin/inputmgr/e_input_thread_client.c +++ b/src/bin/inputmgr/e_input_thread_client.c @@ -23,6 +23,9 @@ struct _E_Input_Thread_Client int x, y, w, h; GList *input_region; + E_Devicemgr_Input_Device *last_device_kbd; + E_Devicemgr_Input_Device *last_device_ptr; + E_Devicemgr_Input_Device *last_device_touch; struct { @@ -603,3 +606,39 @@ E_API struct wl_resource *e_input_thread_client_wl_resource_get(E_Input_Thread_C return iec->surface; } + +EINTERN void +e_input_thread_client_last_device_set(E_Input_Thread_Client *iec, Ecore_Device_Class dev_class, E_Devicemgr_Input_Device *device) +{ + switch (dev_class) + { + case ECORE_DEVICE_CLASS_MOUSE: + iec->last_device_ptr = device; + break; + case ECORE_DEVICE_CLASS_KEYBOARD: + iec->last_device_kbd = device; + break; + case ECORE_DEVICE_CLASS_TOUCH: + iec->last_device_touch = device; + break; + default: + break; + } +} + +EINTERN E_Devicemgr_Input_Device * +e_input_thread_client_last_device_get(E_Input_Thread_Client *iec, Ecore_Device_Class dev_class) +{ + switch (dev_class) + { + case ECORE_DEVICE_CLASS_MOUSE: + return iec->last_device_ptr; + case ECORE_DEVICE_CLASS_KEYBOARD: + return iec->last_device_kbd; + case ECORE_DEVICE_CLASS_TOUCH: + return iec->last_device_touch; + default: + return NULL;; + } + return NULL; +} diff --git a/src/bin/inputmgr/e_input_thread_client_intern.h b/src/bin/inputmgr/e_input_thread_client_intern.h index ae3d478a8f..bb7b0d6477 100644 --- a/src/bin/inputmgr/e_input_thread_client_intern.h +++ b/src/bin/inputmgr/e_input_thread_client_intern.h @@ -93,4 +93,7 @@ EINTERN Eina_Inlist * e_input_thread_client_Inlist_get(E_Client *ec); EINTERN Eina_Bool e_input_thread_check_client_cloning_needed(); +EINTERN void e_input_thread_client_last_device_set(E_Input_Thread_Client *iec, Ecore_Device_Class dev_class, E_Devicemgr_Input_Device *device); +EINTERN E_Devicemgr_Input_Device *e_input_thread_client_last_device_get(E_Input_Thread_Client *iec, Ecore_Device_Class dev_class); + #endif diff --git a/src/bin/server/e_comp_wl.c b/src/bin/server/e_comp_wl.c index d910609831..540c0afd95 100644 --- a/src/bin/server/e_comp_wl.c +++ b/src/bin/server/e_comp_wl.c @@ -841,8 +841,8 @@ _e_comp_wl_touch_cancel(void) _e_comp_wl_send_touch_cancel(ec); } -static E_Devicemgr_Input_Device * -_e_comp_wl_device_last_device_get(Ecore_Device_Class dev_class) +EINTERN E_Devicemgr_Input_Device * +e_comp_wl_device_last_device_get(Ecore_Device_Class dev_class) { E_Devicemgr_Input_Device *last_kbd = NULL; switch (dev_class) @@ -860,8 +860,8 @@ _e_comp_wl_device_last_device_get(Ecore_Device_Class dev_class) return NULL; } -static void -_e_comp_wl_device_last_device_set(Ecore_Device_Class dev_class, E_Devicemgr_Input_Device *device) +EINTERN void +e_comp_wl_device_last_device_set(Ecore_Device_Class dev_class, E_Devicemgr_Input_Device *device) { switch (dev_class) { @@ -941,7 +941,7 @@ _e_comp_wl_device_send_event_device(E_Client *ec, Evas_Device *dev, uint32_t tim dev_class = (Ecore_Device_Class)evas_device_class_get(dev); dev_name = evas_device_description_get(dev); - last_device = _e_comp_wl_device_last_device_get(dev_class); + last_device = e_comp_wl_device_last_device_get(dev_class); ec_last_device = _e_comp_wl_device_client_last_device_get(ec, dev_class); serial = wl_display_next_serial(e_comp_wl->wl.disp); @@ -952,7 +952,7 @@ _e_comp_wl_device_send_event_device(E_Client *ec, Evas_Device *dev, uint32_t tim if (!eina_streq(input_dev->identifier, dev_name) || (input_dev->clas != dev_class)) continue; if ((!last_device) || (last_device != input_dev) || (!ec_last_device) || (ec_last_device != input_dev)) { - _e_comp_wl_device_last_device_set(dev_class, input_dev); + e_comp_wl_device_last_device_set(dev_class, input_dev); _e_comp_wl_device_client_last_device_set(ec, dev_class, input_dev); EINA_LIST_FOREACH(input_dev->resources, ll, dev_res) @@ -977,7 +977,7 @@ _e_comp_wl_device_send_last_event_device(E_Client *ec, Ecore_Device_Class dev_cl struct wl_resource *surface = e_comp_wl_client_surface_get(ec); if (!surface) return; - last_device = _e_comp_wl_device_last_device_get(dev_class); + last_device = e_comp_wl_device_last_device_get(dev_class); if (!last_device) return; _e_comp_wl_device_client_last_device_set(ec, dev_class, last_device); @@ -1008,7 +1008,7 @@ _e_comp_wl_send_event_device(struct wl_client *wc, uint32_t timestamp, Ecore_Dev { if (!eina_streq(input_dev->identifier, dev_name) || (input_dev->clas != ecore_device_class_get(dev))) continue; - _e_comp_wl_device_last_device_set(ecore_device_class_get(dev), input_dev); + e_comp_wl_device_last_device_set(ecore_device_class_get(dev), input_dev); EINA_LIST_FOREACH(input_dev->resources, ll, dev_res) { @@ -1036,7 +1036,7 @@ _e_comp_wl_send_event_e_device(struct wl_client *wc, uint32_t timestamp, E_Devic { if (!eina_streq(input_dev->identifier, dev_name) || (input_dev->clas != e_device_class_get(dev))) continue; - _e_comp_wl_device_last_device_set(e_device_class_get(dev), input_dev); + e_comp_wl_device_last_device_set(e_device_class_get(dev), input_dev); EINA_LIST_FOREACH(input_dev->resources, ll, dev_res) { @@ -4993,7 +4993,7 @@ e_comp_wl_touch_send(E_Client *ec, int idx, int x, int y, Eina_Bool pressed, Eco struct wl_resource *surface = e_comp_wl_client_surface_get(ec); EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE); - if (!dev) device = _e_comp_wl_device_last_device_get(ECORE_DEVICE_CLASS_TOUCH); + if (!dev) device = e_comp_wl_device_last_device_get(ECORE_DEVICE_CLASS_TOUCH); wc = wl_resource_get_client(surface); if (!time) time = e_util_timestamp_get(); @@ -5032,7 +5032,7 @@ e_comp_wl_touch_update_send(E_Client *ec, int idx, int x, int y, Ecore_Device *d struct wl_resource *surface = e_comp_wl_client_surface_get(ec); EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE); - if (!dev) device = _e_comp_wl_device_last_device_get(ECORE_DEVICE_CLASS_TOUCH); + if (!dev) device = e_comp_wl_device_last_device_get(ECORE_DEVICE_CLASS_TOUCH); wc = wl_resource_get_client(surface); if (!time) time = e_util_timestamp_get(); diff --git a/src/bin/server/e_comp_wl_input_thread.c b/src/bin/server/e_comp_wl_input_thread.c index 84eabb472e..71f30a787d 100644 --- a/src/bin/server/e_comp_wl_input_thread.c +++ b/src/bin/server/e_comp_wl_input_thread.c @@ -6,6 +6,8 @@ #include "e_input_thread_client_intern.h" #include "e_input_thread_client.h" +#include + static E_Input_Event_Handler *_mouse_move_handler = NULL; static E_Input_Event_Handler *_mouse_down_handler = NULL; static E_Input_Event_Handler *_mouse_up_handler = NULL; @@ -82,6 +84,61 @@ _e_comp_wl_input_thread_client_under_pointer(int x, int y) return target_iec; } +static void +_e_comp_wl_device_input_thread_send_event_device(E_Input_Thread_Client *iec, E_Device *dev, uint32_t timestamp) +{ + E_Devicemgr_Input_Device *last_device, *input_dev, *ec_last_device; + struct wl_resource *dev_res; + const char *dev_name, *dev_identifier; + Ecore_Device_Class dev_class; + struct wl_client *wc; + uint32_t serial; + Eina_List *l, *ll; + + EINA_SAFETY_ON_NULL_RETURN(dev); + + if (!iec) return; + // if (ec->cur_mouse_action || e_comp_wl->drag) + // return; + // if (e_object_is_del(E_OBJECT(ec))) return; + // if ((ec->ignored) && (!ec->remote_surface.provider)) return; + + struct wl_resource *surface = e_input_thread_client_wl_resource_get(iec); + if (!surface) return; + + dev_class = e_device_class_get(dev); + dev_name = e_device_name_get(dev); + dev_identifier = e_device_identifier_get(dev); + last_device = e_comp_wl_device_last_device_get(dev_class); + ec_last_device = e_input_thread_client_last_device_get(iec, dev_class); + + ELOGF("Mouse", "dev name(%s), identifier(%s), class(%d), last device(%p)", NULL, dev_name, dev_identifier, dev_class, last_device); + + serial = wl_display_next_serial(e_comp_wl->wl.disp); + wc = wl_resource_get_client(surface); + g_rec_mutex_lock(&e_devicemgr->device_list_mutex); + EINA_LIST_FOREACH(e_devicemgr->device_list, l, input_dev) + { + ELOGF("Mouse", "input_dev(%p), identifier(%s), name(%s), class(%d)", NULL, input_dev, input_dev->identifier, input_dev->name, input_dev->clas); + + if (!eina_streq(input_dev->identifier, dev_identifier) || (input_dev->clas != dev_class)) continue; + if ((!last_device) || (last_device != input_dev) || (!ec_last_device) || (ec_last_device != input_dev)) + { + e_comp_wl_device_last_device_set(dev_class, input_dev); + e_input_thread_client_last_device_set(iec, dev_class, input_dev); + + EINA_LIST_FOREACH(input_dev->resources, ll, dev_res) + { + if (wl_resource_get_client(dev_res) != wc) continue; + + ELOGF("Mouse", "Send event device (%s)", NULL, input_dev->identifier); + tizen_input_device_send_event_device(dev_res, serial, input_dev->identifier, timestamp); + } + } + } + g_rec_mutex_unlock(&e_devicemgr->device_list_mutex); +} + static Eina_Bool _e_comp_wl_cb_mouse_move_thread_mode(void *d EINA_UNUSED, int t EINA_UNUSED, void *event) { @@ -166,6 +223,8 @@ _e_comp_wl_cb_mouse_button_down_thread_mode(void *d EINA_UNUSED, int t EINA_UNUS NULL, ev->buttons, ev->timestamp, ev->x, ev->y, wl_fixed_from_int(ev->x), wl_fixed_from_int(ev->y), dev_name); + _e_comp_wl_device_input_thread_send_event_device(iec, dev, ev->timestamp); + if (dev && device_class == ECORE_DEVICE_CLASS_TOUCH) { e_comp_wl->touch.pressed |= (1 << 0); @@ -219,6 +278,8 @@ _e_comp_wl_cb_mouse_button_up_thread_mode(void *d EINA_UNUSED, int t EINA_UNUSED if (!iec) return ECORE_CALLBACK_RENEW; + _e_comp_wl_device_input_thread_send_event_device(iec, dev, ev->timestamp); + surface = e_input_thread_client_wl_resource_get(iec); if (!surface) { diff --git a/src/bin/server/e_comp_wl_intern.h b/src/bin/server/e_comp_wl_intern.h index 65ea0c3eb2..96c52ba7de 100644 --- a/src/bin/server/e_comp_wl_intern.h +++ b/src/bin/server/e_comp_wl_intern.h @@ -108,4 +108,7 @@ EINTERN void e_comp_wl_trace_serial_debug(Eina_Bool on); EINTERN void e_comp_wl_surface_send_mouse_move(struct wl_resource *surface, int x, int y, int client_x, int client_y, unsigned int timestamp); EINTERN void e_comp_wl_surface_mouse_button_send(struct wl_resource *surface, uint32_t timestamp, uint32_t button_id, uint32_t state); +EINTERN E_Devicemgr_Input_Device *e_comp_wl_device_last_device_get(Ecore_Device_Class dev_class); +EINTERN void e_comp_wl_device_last_device_set(Ecore_Device_Class dev_class, E_Devicemgr_Input_Device *device); + #endif