input: send device info in input thread 14/317414/1
authorJihoon Kim <jihoon48.kim@samsung.com>
Fri, 30 Aug 2024 11:02:58 +0000 (20:02 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 10 Sep 2024 04:21:17 +0000 (13:21 +0900)
Change-Id: Iec1c441bfbd4ab148c4a7ca72136fd668be051e2
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/bin/inputmgr/e_input_thread_client.c
src/bin/inputmgr/e_input_thread_client_intern.h
src/bin/server/e_comp_wl.c
src/bin/server/e_comp_wl_input_thread.c
src/bin/server/e_comp_wl_intern.h

index 3d7c4dae38f8bb017399c966d3c04e923c4baea7..a9c0185989ec166fe247ee5853f953900105fbf8 100644 (file)
@@ -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;
+}
index ae3d478a8fa81a08d539c043aaa664756fe6499d..bb7b0d647748c1bf4efe5e5e0436da70ebc93e2a 100644 (file)
@@ -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
index d9106098315a9005c024a3362d5bc4bedfbbdad9..540c0afd95b1fc9669066bc2ceec677a5996d527 100644 (file)
@@ -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();
index 84eabb472e221731674d62ecad9679e402851cef..71f30a787d318419a728ec378df9328226f0f660 100644 (file)
@@ -6,6 +6,8 @@
 #include "e_input_thread_client_intern.h"
 #include "e_input_thread_client.h"
 
+#include <tizen-extension-server-protocol.h>
+
 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)
      {
index 65ea0c3eb2d3b8329cb90f80b90f5264f8fa5c4e..96c52ba7deff881650b384334d8ad7005d3790e2 100644 (file)
@@ -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