_e_comp_wl_surface_state_cb_buffer_destroy;
state->sx = state->sy = 0;
- state->input = eina_tiler_new(w, h);
- eina_tiler_tile_size_set(state->input, 1, 1);
-
state->buffer_viewport.buffer.transform = WL_OUTPUT_TRANSFORM_NORMAL;
state->buffer_viewport.buffer.scale = 1;
state->buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
EINA_LIST_FREE(state->frames, cb)
wl_resource_destroy(cb);
- if (state->input) eina_tiler_free(state->input);
- state->input = NULL;
-
if (state->buffer) wl_list_remove(&state->buffer_destroy_listener.link);
state->buffer = NULL;
pixman_region32_fini(®ion);
}
+static void
+_e_comp_wl_client_input_region_update(E_Client *ec)
+{
+ E_Surface *surface = e_surface_from_ec(ec);
+ pixman_region32_t *input_region = e_surface_input_region_get(surface);
+ pixman_region32_t region;
+ pixman_box32_t *rects;
+ int nrects, i;
+ int x, y, w, h;
+ int sw = ec->w;
+ int sh = ec->h;
+
+ if (!input_region || !pixman_region32_not_empty(input_region) || !ec->first_mapped)
+ return;
+
+ pixman_region32_init(®ion);
+
+ pixman_region32_intersect_rect(®ion, input_region, 0, 0, sw, sh);
+ if (pixman_region32_not_empty(®ion))
+ {
+ 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));
+ }
+
+ rects = pixman_region32_rectangles(®ion, &nrects);
+ for (i = 0; i < nrects; i++)
+ {
+ x = rects[i].x1;
+ y = rects[i].y1;
+ w = rects[i].x2 - x;
+ h = rects[i].y2 - y;
+
+ ELOGF("COMP", "Set Input Area x:%d, y:%d, w:%d, h:%d, ec(%dx%d)",
+ ec, x, y, w, h, sw, sh);
+ e_view_client_input_area_set(e_client_view_get(ec), x, y, w, h);
+
+ if (e_input_thread_check_client_cloning_needed())
+ {
+ Eina_Rectangle *input_rect;
+ input_rect = eina_rectangle_new(x, y, w, 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(input_rect));
+ e_input_backend_thread_safe_call(_e_comp_wl_input_thread_input_area_append, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+ }
+ }
+ }
+ }
+ else
+ {
+ e_view_client_input_area_set(e_client_view_get(ec), 0, 0, sw, sh);
+
+ 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, sw, sh);
+
+ 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, sw, sh);
+ e_input_backend_thread_safe_call(_e_comp_wl_input_thread_input_area_append, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+ }
+ }
+ }
+
+ pixman_region32_fini(®ion);
+}
+
static void
_e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
{
_e_comp_wl_surface_damage_update(ec);
_e_comp_wl_client_pixmap_opaque_region_update(ec, state->bw, state->bh);
-
- /* put state input into surface */
- if ((state->input) &&
- (!eina_tiler_empty(state->input)) &&
- ec->first_mapped)
- {
- Eina_Tiler *src, *tmp;
- int sw = ec->w;
- int sh = ec->h;
-
- tmp = eina_tiler_new(sw, sh);
- eina_tiler_tile_size_set(tmp, 1, 1);
-
- eina_tiler_rect_add(tmp,
- &(Eina_Rectangle){0, 0, sw, sh});
-
- if ((src = eina_tiler_intersection(state->input, tmp)))
- {
- 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;
- ICINF("[%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)
- {
- ELOGF("COMP", "Set Input Area x:%d, y:%d, w:%d, h:%d, ec(%dx%d), state(%dx%d)",
- ec, rect->x, rect->y, rect->w, rect->h,
- ec->w, ec->h, state->bw, state->bh);
- 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;
- ICINF("[%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);
-
- 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;
-
- ICINF("[%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);
-
- /* clear input tiler */
- eina_tiler_clear(state->input);
- }
+ _e_comp_wl_client_input_region_update(ec);
e_comp_wl_subsurface_check_alpha_mask_rect(ec);
}
EINTERN void
-e_comp_wl_client_surface_pending_input_region_set(E_Client *ec, Eina_Tiler *region)
+e_comp_wl_client_input_region_set(E_Client *ec, pixman_region32_t *region)
{
- if (ec->comp_data->pending.input)
- eina_tiler_clear(ec->comp_data->pending.input);
+ if (pixman_region32_not_empty(region))
+ return;
- if (region)
- {
- if (eina_tiler_empty(region))
- {
- 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);
+ 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));
+ 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);
+ 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;
+ if (input_rect)
+ {
+ ec_data.ec = ec;
+ ec_data.rect = input_rect;
- ICINF("[%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));
- }
- }
+ ICINF("[%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);
- }
- else
- {
- eina_tiler_rect_add(ec->comp_data->pending.input,
- &(Eina_Rectangle){0, 0, ec->client.w, ec->client.h});
}
}