From 317b0b7e2d3f1f7e3e581ef27e0fb34d212de153 Mon Sep 17 00:00:00 2001 From: Inhong Han Date: Tue, 27 Aug 2024 14:35:15 +0900 Subject: [PATCH] e_input: Add a new API for getting input region Change-Id: I4811f980ea24a8a8863c427ba40248c8e5c2f6d2 --- src/bin/inputmgr/e_input_thread_client.c | 41 ++++++++++++ src/bin/inputmgr/e_input_thread_client_intern.h | 4 ++ src/bin/server/e_comp_wl.c | 83 ++++++++++++++++++++++++- src/include/e_input_thread_client.h | 1 + 4 files changed, 128 insertions(+), 1 deletion(-) diff --git a/src/bin/inputmgr/e_input_thread_client.c b/src/bin/inputmgr/e_input_thread_client.c index 1ca4e55..1085dd6 100644 --- a/src/bin/inputmgr/e_input_thread_client.c +++ b/src/bin/inputmgr/e_input_thread_client.c @@ -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; diff --git a/src/bin/inputmgr/e_input_thread_client_intern.h b/src/bin/inputmgr/e_input_thread_client_intern.h index 8cc711d..ae3d478 100644 --- a/src/bin/inputmgr/e_input_thread_client_intern.h +++ b/src/bin/inputmgr/e_input_thread_client_intern.h @@ -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); diff --git a/src/bin/server/e_comp_wl.c b/src/bin/server/e_comp_wl.c index aa95fa6..5352cbf 100644 --- a/src/bin/server/e_comp_wl.c +++ b/src/bin/server/e_comp_wl.c @@ -2682,6 +2682,26 @@ _e_comp_wl_surface_state_serial_update(E_Client *ec, E_Comp_Wl_Surface_State *st } 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) { Eina_Rectangle *dmg; @@ -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); diff --git a/src/include/e_input_thread_client.h b/src/include/e_input_thread_client.h index d444b96..c3ade79 100644 --- a/src/include/e_input_thread_client.h +++ b/src/include/e_input_thread_client.h @@ -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); -- 2.7.4