EINA_SAFETY_ON_NULL_RETURN(ec_data);
INF("[input thread|%s] ec: %p\n", __func__, ec_data->ec);
+ e_input_thread_client_transform_core_enable_set(e_input_thread_client_get(ec_data->ec), ec_data->transform_core.result.enable);
e_input_thread_client_del(e_input_thread_client_get(ec_data->ec));
}
if (e_input_thread_check_client_cloning_needed())
{
ec_data.ec = ec;
+ ec_data.transform_core.result.enable = EINA_FALSE;
INF("[%s] ec: %p\n", __func__, ec);
e_input_backend_thread_safe_call(_e_input_thread_client_del, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
}
e_comp_visibility_calculation_set(EINA_TRUE);
}
+static void
+_e_client_input_thread_eo_geometry_set(void *data)
+{
+ E_Input_Thread_Request_EClient_Data *ec_data = data;
+ EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+ INF("[input thread|%s] ec(%p), eo.x(%d), eo.y(%d), eo.w(%d), eo.h(%d)\n",
+ __func__,
+ ec_data->ec,
+ ec_data->eo_geometry.x,
+ ec_data->eo_geometry.y,
+ ec_data->eo_geometry.w,
+ ec_data->eo_geometry.h);
+ e_input_thread_client_eo_geometry_set(e_input_thread_client_get(ec_data->ec),
+ ec_data->eo_geometry.x,
+ ec_data->eo_geometry.y,
+ ec_data->eo_geometry.w,
+ ec_data->eo_geometry.h);
+}
+
static void
_e_client_cb_evas_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
e_client_transform_core_update(ec);
e_comp_visibility_calculation_set(EINA_TRUE);
+
+ 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));
+ ec_data.ec = ec;
+ ec_data.eo_geometry.x = x;
+ ec_data.eo_geometry.y = y;
+ ec_data.eo_geometry.w = w;
+ ec_data.eo_geometry.h = h;
+
+ INF("[%s] ec(%p), eo.x(%d), eo.y(%d), eo.w(%d), eo.h(%d)\n", __func__, ec, x, y, w, h);
+ e_input_backend_thread_safe_call(_e_client_input_thread_eo_geometry_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+ }
}
static void
return check;
}
+static void
+_e_client_input_thread_boundary_set(void *data)
+{
+ E_Input_Thread_Request_EClient_Data *ec_data = data;
+ EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+ INF("[input thread|%s] ec(%p), boundary.x(%d), boundary.y(%d), boundary.w(%d), boundary.h(%d)\n",
+ __func__,
+ ec_data->ec,
+ ec_data->transform_core.result.boundary.x,
+ ec_data->transform_core.result.boundary.y,
+ ec_data->transform_core.result.boundary.w,
+ ec_data->transform_core.result.boundary.h);
+ e_input_thread_client_transform_core_boundary_set(e_input_thread_client_get(ec_data->ec),
+ ec_data->transform_core.result.boundary.x,
+ ec_data->transform_core.result.boundary.y,
+ ec_data->transform_core.result.boundary.w,
+ ec_data->transform_core.result.boundary.h);
+}
+
static void
_e_client_transform_core_boundary_update(E_Client *ec, E_Util_Transform_Rect_Vertex *vertices)
{
ec->transform_core.result.boundary.y,
ec->transform_core.result.boundary.w,
ec->transform_core.result.boundary.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));
+ ec_data.ec = ec;
+ ec_data.transform_core.result.boundary.x = ec->transform_core.result.boundary.x;
+ ec_data.transform_core.result.boundary.y = ec->transform_core.result.boundary.y;
+ ec_data.transform_core.result.boundary.w = ec->transform_core.result.boundary.w;
+ ec_data.transform_core.result.boundary.h = ec->transform_core.result.boundary.h;
+
+ INF("[%s] ec(%p), boundary.x(%d), boundary.y(%d), boundary.w(%d), boundary.h(%d)\n",
+ __func__,
+ ec,
+ ec->transform_core.result.boundary.x,
+ ec->transform_core.result.boundary.y,
+ ec->transform_core.result.boundary.w,
+ ec->transform_core.result.boundary.h);
+ e_input_backend_thread_safe_call(_e_client_input_thread_boundary_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+ }
}
static E_Map *
INF("[input thread|%s] ec(%p), surface(%p)\n", __func__, ec_data->ec, ec_data->wl_surface);
e_input_thread_client_new(ec_data->ec, ec_data->wl_surface);
+ e_input_thread_client_size_set(e_input_thread_client_get(ec_data->ec), ec_data->w, ec_data->h);
}
static void
ec_new_data.ec = ec;
ec_new_data.wl_surface = ec->comp_data ? ec->comp_data->wl_surface : NULL;
+ ec_new_data.w = 1;
+ ec_new_data.h = 1;
INF("[%s] ec(%p), surface(%p)\n", __func__, ec, ec_new_data.wl_surface);
e_input_backend_thread_safe_call(_e_input_thread_client_new, &ec_new_data, sizeof(E_Input_Thread_Request_EClient_Data));
evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_MOVE, _e_client_cb_evas_move, ec);
evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESIZE, _e_client_cb_evas_resize, ec);
evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESTACK, _e_client_cb_evas_restack, ec);
+
+ if (e_input_thread_check_client_cloning_needed())
+ {
+ Evas_Coord x, y, w, h;
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+ e_view_client_geometry_get(PRI(ec)->view_client, &x, &y, &w, &h);
+ ec_data.ec = ec;
+ ec_data.eo_geometry.x = x;
+ ec_data.eo_geometry.y = y;
+ ec_data.eo_geometry.w = w;
+ ec_data.eo_geometry.h = h;
+
+ INF("[%s] ec(%p), eo.x(%d), eo.y(%d), eo.w(%d), eo.h(%d)\n", __func__, ec, x, y, w, h);
+ e_input_backend_thread_safe_call(_e_client_input_thread_eo_geometry_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+ }
}
_e_client_hook_call(E_CLIENT_HOOK_NEW_CLIENT_POST, ec);
memcpy(&ec->pre_res_change, &pre_res_change, sizeof(pre_res_change));
}
+static void
+_e_client_input_thread_pos_set(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)\n", __func__, ec_data->ec, ec_data->x, ec_data->y);
+ e_input_thread_client_position_set(e_input_thread_client_get(ec_data->ec), ec_data->x, ec_data->y);
+}
+
E_API void
e_client_pos_set(E_Client *ec, int x, int y)
{
if (!ec) return;
ec->x = x;
ec->y = y;
+
+ 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));
+ ec_data.ec = ec;
+ ec_data.x = x;
+ ec_data.y = y;
+
+ INF("[%s] ec(%p), x(%d), y(%d)\n", __func__, ec, x, y);
+ e_input_backend_thread_safe_call(_e_client_input_thread_pos_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+ }
}
E_API void
if (y) *y = ey;
}
+static void
+_e_client_input_thread_size_set(void *data)
+{
+ E_Input_Thread_Request_EClient_Data *ec_data = data;
+ EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+ INF("[input thread|%s] ec(%p), w(%d), h(%d)\n", __func__, ec_data->ec, ec_data->w, ec_data->h);
+ e_input_thread_client_size_set(e_input_thread_client_get(ec_data->ec), ec_data->w, ec_data->h);
+}
+
E_API void
e_client_size_set(E_Client *ec, int w, int h)
{
if (!ec) return;
ec->w = w;
ec->h = 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));
+ ec_data.ec = ec;
+ ec_data.w = w;
+ ec_data.h = h;
+
+ INF("[%s] ec(%p), w(%d), h(%d)\n", __func__, ec, w, h);
+ e_input_backend_thread_safe_call(_e_client_input_thread_size_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+ }
}
E_API void
e_client_transform_core_update(ec);
}
+static void
+_e_input_thread_client_transform_core_enable_set(void *data)
+{
+ E_Input_Thread_Request_EClient_Data *ec_data = data;
+ EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+ INF("[input thread|%s] ec(%p), transform_core.result.enable(%d)\n", __func__, ec_data->ec, ec_data->transform_core.result.enable);
+ e_input_thread_client_transform_core_enable_set(e_input_thread_client_get(ec_data->ec), ec_data->transform_core.result.enable);
+}
+
+static void
+_e_input_thread_client_transform_core_state_set(E_Client *ec, Eina_Bool enable)
+{
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+ ec_data.ec = ec;
+ ec_data.transform_core.result.enable = enable;
+
+ INF("[%s] ec(%p), transform_core.result.enable(%d)\n", __func__, ec, enable);
+ e_input_backend_thread_safe_call(_e_input_thread_client_transform_core_enable_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+}
+
E_API void
e_client_transform_core_update(E_Client *ec)
{
// 1. init state
ec->transform_core.result.enable = EINA_TRUE;
+
+ if (e_input_thread_check_client_cloning_needed())
+ _e_input_thread_client_transform_core_state_set(ec, EINA_TRUE);
+
e_util_transform_rect_client_rect_get(&source_rect, ec);
e_util_transform_init(&ec->transform_core.result.transform);
if (ec->transform_core.result.enable)
{
ec->transform_core.result.enable = EINA_FALSE;
+ if (e_input_thread_check_client_cloning_needed())
+ _e_input_thread_client_transform_core_state_set(ec, EINA_FALSE);
+
_e_client_transform_core_vertices_apply(ec, ec->frame, NULL, NULL);
e_comp_object_transform_bg_set(ec->frame, EINA_FALSE);
ec->transform_core.background = EINA_FALSE;
Eina_Stringshare *icccm_name;
Eina_Stringshare *netwm_name;
Eina_Stringshare *icccm_title;
+
+ Evas_Object *frame;
+ int x, y, w, h;
+
+ struct
+ {
+ struct
+ {
+ Eina_Bool enable;
+ struct
+ {
+ int x, y, w, h;
+ } boundary;
+ } result;
+ } transform_core;
+
+ struct
+ {
+ int x, y, w, h;
+ } eo_geometry;
};
static Eina_List *_itc_list = NULL;
INF("[%s] iec(%p), ec(%p), is_cursor(%d)\n", __func__, iec, iec->ec, iec->is_cursor);
}
+EINTERN void e_input_thread_client_position_set(E_Input_Thread_Client *iec, int x, int y)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ iec->x = x;
+ iec->y = y;
+ INF("[%s] iec(%p), ec(%p), x(%d), y(%d)\n", __func__, iec, iec->ec, iec->x, iec->y);
+}
+
+EINTERN void e_input_thread_client_size_set(E_Input_Thread_Client *iec, int w, int h)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ iec->w = w;
+ iec->h = h;
+ INF("[%s] iec(%p), ec(%p), w(%d), h(%d)\n", __func__, iec, iec->ec, iec->w, iec->h);
+}
+
+EINTERN void e_input_thread_client_transform_core_boundary_set(E_Input_Thread_Client *iec, int x, int y, int w, int h)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ iec->transform_core.result.boundary.x = x;
+ iec->transform_core.result.boundary.y = y;
+ iec->transform_core.result.boundary.w = w;
+ iec->transform_core.result.boundary.h = h;
+ INF("[%s] iec(%p), ec(%p), x(%d), y(%d), w(%d), h(%d)\n",
+ __func__,
+ iec,
+ iec->ec,
+ iec->transform_core.result.boundary.x,
+ iec->transform_core.result.boundary.y,
+ iec->transform_core.result.boundary.w,
+ iec->transform_core.result.boundary.h);
+}
+
+EINTERN void e_input_thread_client_transform_core_enable_set(E_Input_Thread_Client *iec, Eina_Bool enable)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ iec->transform_core.result.enable = enable;
+ INF("[%s] iec(%p), ec(%p), enable(%d)\n", __func__, iec, iec->ec, iec->transform_core.result.enable);
+}
+
+EINTERN void e_input_thread_client_frame_set(E_Input_Thread_Client *iec, Evas_Object *frame)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ iec->frame = frame;
+ INF("[%s] iec(%p), ec(%p), frame(%p)\n", __func__, iec, iec->ec, iec->frame);
+}
+
+EINTERN void e_input_thread_client_eo_geometry_set(E_Input_Thread_Client *iec, int x, int y, int w, int h)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ iec->eo_geometry.x = x;
+ iec->eo_geometry.y = y;
+ iec->eo_geometry.w = w;
+ iec->eo_geometry.h = h;
+ INF("[%s] iec(%p), ec(%p), x(%d), y(%d), w(%d), h(%d)\n",
+ __func__,
+ iec,
+ iec->ec,
+ iec->eo_geometry.x,
+ iec->eo_geometry.y,
+ iec->eo_geometry.w,
+ iec->eo_geometry.h);
+}
+
EINTERN E_Input_Thread_Client * e_input_thread_client_get(E_Client *ec)
{
Eina_List *l;
return e_input_thread_client_get(e_comp_input->focused_ec);
}
+E_API void e_input_thread_client_geometry_get(E_Input_Thread_Client *iec, int *x, int *y, int *w, int *h)
+{
+ int gx = 0;
+ int gy = 0;
+ int gw = 0;
+ int gh = 0;
+
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ if (iec->transform_core.result.enable)
+ {
+ gx = iec->transform_core.result.boundary.x;
+ gy = iec->transform_core.result.boundary.y;
+ gw = iec->transform_core.result.boundary.w;
+ gh = iec->transform_core.result.boundary.h;
+ }
+ else
+ {
+ if (iec->frame)
+ {
+ if (iec->eo_geometry.w == 0 && iec->eo_geometry.h == 0)
+ {
+ gx = iec->x;
+ gy = iec->y;
+ gw = iec->w;
+ gh = iec->h;
+ }
+ else
+ {
+ gx = iec->eo_geometry.x;
+ gy = iec->eo_geometry.y;
+ gw = iec->eo_geometry.w;
+ gh = iec->eo_geometry.h;
+ }
+ }
+ else
+ {
+ gx = iec->x;
+ gy = iec->y;
+ gw = iec->w;
+ gh = iec->h;
+ }
+ }
+
+ if (x) *x = gx;
+ if (y) *y = gy;
+ if (w) *w = gw;
+ if (h) *h = gh;
+}
+
E_API E_Input_Thread_Client *e_input_thread_client_from_surface_resource(struct wl_resource *surface_resource)
{
Eina_List *l;