Evas_Object *frame;
int x, y, w, h;
+ GList *input_region;
+
struct
{
struct
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)
{
_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);
}
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;
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;
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)
{
{
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)
{
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);
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);