e_input: Add a new API for getting input region 66/316766/2
authorInhong Han <inhong1.han@samsung.com>
Tue, 27 Aug 2024 05:35:15 +0000 (14:35 +0900)
committerchangyeon lee <cyeon.lee@samsung.com>
Wed, 28 Aug 2024 02:31:05 +0000 (02:31 +0000)
Change-Id: I4811f980ea24a8a8863c427ba40248c8e5c2f6d2

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/include/e_input_thread_client.h

index 1ca4e55748c0df9db8d4e6586a32e1ed9e6f8133..1085dd6ec2581b0e799e35f0f4391f7fc4b09a6a 100644 (file)
@@ -22,6 +22,8 @@ struct _E_Input_Thread_Client
    Evas_Object *frame;
    int x, y, w, h;
 
+   GList *input_region;
+
    struct
    {
       struct
@@ -75,6 +77,13 @@ e_input_thread_client_new(E_Client *ec, struct wl_resource *surface)
    return itc;
 }
 
+static void
+_eina_rectangle_destory(gpointer data)
+{
+   Eina_Rectangle *rect = (Eina_Rectangle *)data;
+   E_FREE_FUNC(rect, eina_rectangle_free);
+}
+
 EINTERN void
 e_input_thread_client_free(E_Input_Thread_Client *iec)
 {
@@ -84,6 +93,12 @@ e_input_thread_client_free(E_Input_Thread_Client *iec)
 
    _itc_list = eina_list_remove(_itc_list, iec);
 
+   if (iec->input_region)
+     {
+        g_list_free_full(iec->input_region, _eina_rectangle_destory);
+        iec->input_region = NULL;
+     }
+
    E_FREE(iec);
 }
 
@@ -313,6 +328,25 @@ EINTERN void e_input_thread_client_eo_geometry_set(E_Input_Thread_Client *iec, i
        iec->eo_geometry.h);
 }
 
+EINTERN void e_input_thread_client_input_region_append(E_Input_Thread_Client *iec, Eina_Rectangle *rect)
+{
+   EINA_SAFETY_ON_NULL_RETURN(iec);
+
+   iec->input_region = g_list_append(iec->input_region, rect);
+   INF("[%s] iec(%p), ec(%p), x(%d), y(%d), w(%d), h(%d)\n", __func__, iec, iec->ec, EINA_RECTANGLE_ARGS(rect));
+}
+
+EINTERN void e_input_thread_client_input_region_clear(E_Input_Thread_Client *iec)
+{
+   EINA_SAFETY_ON_NULL_RETURN(iec);
+
+   if (iec->input_region)
+     {
+        g_list_free_full(iec->input_region, _eina_rectangle_destory);
+        iec->input_region = NULL;
+     }
+}
+
 EINTERN E_Input_Thread_Client * e_input_thread_client_get(E_Client *ec)
 {
    Eina_List *l;
@@ -539,6 +573,13 @@ E_API void e_input_thread_client_geometry_get(E_Input_Thread_Client *iec, int *x
    if (h) *h = gh;
 }
 
+E_API void e_input_thread_client_input_region_get(E_Input_Thread_Client *iec, GList **region)
+{
+   EINA_SAFETY_ON_NULL_RETURN(iec);
+
+   *region = iec->input_region;
+}
+
 E_API E_Input_Thread_Client *e_input_thread_client_from_surface_resource(struct wl_resource *surface_resource)
 {
    Eina_List *l;
index 8cc711d89f13b399966ba239c5ac40f0c86ef8d0..ae3d478a8fa81a08d539c043aaa664756fe6499d 100644 (file)
@@ -24,6 +24,8 @@ typedef struct
   Evas_Object *frame;
   int x, y, w, h;
 
+  Eina_Rectangle *rect;
+
   struct
   {
      struct
@@ -83,6 +85,8 @@ EINTERN void e_input_thread_client_transform_core_boundary_set(E_Input_Thread_Cl
 EINTERN void e_input_thread_client_transform_core_enable_set(E_Input_Thread_Client *ec, Eina_Bool enable);
 EINTERN void e_input_thread_client_frame_set(E_Input_Thread_Client *ec, Evas_Object *frame);
 EINTERN void e_input_thread_client_eo_geometry_set(E_Input_Thread_Client *ec, int x, int y, int w, int h);
+EINTERN void e_input_thread_client_input_region_append(E_Input_Thread_Client *ec, Eina_Rectangle *rect);
+EINTERN void e_input_thread_client_input_region_clear(E_Input_Thread_Client *ec);
 
 EINTERN E_Input_Thread_Client * e_input_thread_client_get(E_Client *ec);
 EINTERN Eina_Inlist * e_input_thread_client_Inlist_get(E_Client *ec);
index aa95fa61b74a3e8f9b2374effdae34a6bcf2dbf2..5352cbfc5a4647320af8b6bf6b9dbaa77726c2bb 100644 (file)
@@ -2681,6 +2681,26 @@ _e_comp_wl_surface_state_serial_update(E_Client *ec, E_Comp_Wl_Surface_State *st
      ELOGF("COMP", "Update serial(%u) wl_buffer(%u)", ec, serial, wl_resource_get_id(buffer->resource));
 }
 
+static void
+_e_comp_wl_input_thread_input_area_clear(void *data)
+{
+   E_Input_Thread_Request_EClient_Data *ec_data = data;
+   EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+   INF("[input thread|%s] ec(%p)\n", __func__, ec_data->ec);
+   e_input_thread_client_input_region_clear(e_input_thread_client_get(ec_data->ec));
+}
+
+static void
+_e_comp_wl_input_thread_input_area_append(void *data)
+{
+   E_Input_Thread_Request_EClient_Data *ec_data = data;
+   EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+   INF("[input thread|%s] ec(%p), x(%d), y(%d), w(%d), h(%d)\n", __func__, ec_data->ec, EINA_RECTANGLE_ARGS(ec_data->rect));
+   e_input_thread_client_input_region_append(e_input_thread_client_get(ec_data->ec), ec_data->rect);
+}
+
 static void
 _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
 {
@@ -2984,8 +3004,17 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
           {
              Eina_Rectangle *rect;
              Eina_Iterator *itr;
+             E_Input_Thread_Request_EClient_Data ec_data;
+             memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
 
              e_view_client_input_objs_del(e_client_view_get(ec));
+             if (e_input_thread_check_client_cloning_needed())
+               {
+                  ec_data.ec = ec;
+                  INF("[%s] ec(%p)\n", __func__, ec);
+                  e_input_backend_thread_safe_call(_e_comp_wl_input_thread_input_area_clear, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+               }
+
              itr = eina_tiler_iterator_new(src);
              EINA_ITERATOR_FOREACH(itr, rect)
                {
@@ -2995,13 +3024,46 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
                   e_view_client_input_area_set(e_client_view_get(ec),
                                                rect->x, rect->y,
                                                rect->w, rect->h);
+
+                  if (e_input_thread_check_client_cloning_needed())
+                    {
+                       Eina_Rectangle *input_rect;
+                       input_rect = eina_rectangle_new(rect->x, rect->y, rect->w, rect->h);
+
+                       if (input_rect)
+                         {
+                            ec_data.rect = input_rect;
+                            INF("[%s] ec(%p), x(%d), y(%d), w(%d), h(%d)\n", __func__, ec, EINA_RECTANGLE_ARGS(rect));
+                            e_input_backend_thread_safe_call(_e_comp_wl_input_thread_input_area_append, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+                         }
+                    }
                }
 
              eina_iterator_free(itr);
              eina_tiler_free(src);
           }
         else
-          e_view_client_input_area_set(e_client_view_get(ec), 0, 0, ec->w, ec->h);
+          {
+             e_view_client_input_area_set(e_client_view_get(ec), 0, 0, ec->w, ec->h);
+
+             if (e_input_thread_check_client_cloning_needed())
+               {
+                  E_Input_Thread_Request_EClient_Data ec_data;
+                  memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
+                  Eina_Rectangle *input_rect;
+                  input_rect = eina_rectangle_new(0, 0, ec->w, ec->h);
+
+                  if (input_rect)
+                    {
+                       ec_data.ec = ec;
+                       ec_data.rect = input_rect;
+
+                       INF("[%s] ec(%p), x(0), y(0), w(%d), h(%d)\n", __func__, ec, ec->w, ec->h);
+                       e_input_backend_thread_safe_call(_e_comp_wl_input_thread_input_area_append, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+                    }
+               }
+          }
 
         eina_tiler_free(tmp);
 
@@ -6145,6 +6207,25 @@ e_comp_wl_client_surface_pending_input_region_set(E_Client *ec, Eina_Tiler *regi
              ELOGF("COMP", "         |unset input rect", NULL);
              e_view_client_input_objs_del(e_client_view_get(ec));
              e_view_client_input_area_set(e_client_view_get(ec), -1, -1, 1, 1);
+
+             if (e_input_thread_check_client_cloning_needed())
+               {
+                  E_Input_Thread_Request_EClient_Data ec_data;
+                  memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
+                  Eina_Rectangle *input_rect;
+                  input_rect = eina_rectangle_new(-1, -1, 1, 1);
+
+                  if (input_rect)
+                    {
+                       ec_data.ec = ec;
+                       ec_data.rect = input_rect;
+
+                       INF("[%s] ec(%p), x(-1), y(-1), w(1), h(1)\n", __func__, ec);
+                       e_input_backend_thread_safe_call(_e_comp_wl_input_thread_input_area_clear, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+                       e_input_backend_thread_safe_call(_e_comp_wl_input_thread_input_area_append, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+                    }
+               }
           }
         else
           eina_tiler_union(ec->comp_data->pending.input, region);
index d444b96c9f1c4aaa740b796c91ef0120292c20cf..c3ade791bf352f7f8f75d7e714f109fa93832742 100644 (file)
@@ -22,6 +22,7 @@ E_API E_Input_Thread_Client *e_input_thread_client_top_get();
 E_API E_Input_Thread_Client *e_input_thread_client_focused_get();
 
 E_API void e_input_thread_client_geometry_get(E_Input_Thread_Client *ec, int *x, int *y, int *w, int *h);
+E_API void e_input_thread_client_input_region_get(E_Input_Thread_Client *ec, GList **region);
 
 E_API E_Input_Thread_Client *e_input_thread_client_from_surface_resource(struct wl_resource *surface_resource);
 E_API struct wl_resource *e_input_thread_client_wl_resource_get(E_Input_Thread_Client *ec);