add code to handle regions (creating, destroying, setting)

Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
Chris Michael 2014-10-16 11:21:33 -04:00
parent 12d1b5e40f
commit ed649f2ab3
1 changed files with 106 additions and 3 deletions

View File

@ -279,9 +279,7 @@ _e_comp_wl_surface_cb_commit(struct wl_client *client EINA_UNUSED, struct wl_res
/* handle actual surface commit */
if (!e_comp_wl_surface_commit(ec))
{
ERR("Failed to commit surface: %d", wl_resource_get_id(resource));
}
ERR("Failed to commit surface: %d", wl_resource_get_id(resource));
}
static void
@ -366,12 +364,110 @@ _e_comp_wl_compositor_cb_surface_create(struct wl_client *client, struct wl_reso
wl_signal_emit(&comp->wl_comp_data->signals.surface.create, res);
}
static void
_e_comp_wl_region_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
{
DBG("Region Destroy: %d", wl_resource_get_id(resource));
wl_resource_destroy(resource);
}
static void
_e_comp_wl_region_cb_add(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, int32_t x, int32_t y, int32_t w, int32_t h)
{
Eina_Tiler *tiler;
DBG("Region Add: %d", wl_resource_get_id(resource));
DBG("\tGeom: %d %d %d %d", x, y, w, h);
/* get the tiler from the resource */
if ((tiler = wl_resource_get_user_data(resource)))
{
Eina_Tiler *src;
src = eina_tiler_new(w, h);
eina_tiler_tile_size_set(src, 1, 1);
eina_tiler_rect_add(src, &(Eina_Rectangle){x, y, w, h});
eina_tiler_union(tiler, src);
eina_tiler_free(src);
}
}
static void
_e_comp_wl_region_cb_subtract(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, int32_t x, int32_t y, int32_t w, int32_t h)
{
Eina_Tiler *tiler;
DBG("Region Subtract: %d", wl_resource_get_id(resource));
DBG("\tGeom: %d %d %d %d", x, y, w, h);
/* get the tiler from the resource */
if ((tiler = wl_resource_get_user_data(resource)))
{
Eina_Tiler *src;
src = eina_tiler_new(w, h);
eina_tiler_tile_size_set(src, 1, 1);
eina_tiler_rect_add(src, &(Eina_Rectangle){x, y, w, h});
eina_tiler_subtract(tiler, src);
eina_tiler_free(src);
}
}
static const struct wl_region_interface _e_region_interface =
{
_e_comp_wl_region_cb_destroy,
_e_comp_wl_region_cb_add,
_e_comp_wl_region_cb_subtract
};
static void
_e_comp_wl_compositor_cb_region_destroy(struct wl_resource *resource)
{
Eina_Tiler *tiler;
DBG("Compositor Region Destroy: %d", wl_resource_get_id(resource));
if ((tiler = wl_resource_get_user_data(resource)))
eina_tiler_free(tiler);
}
static void
_e_comp_wl_compositor_cb_region_create(struct wl_client *client, struct wl_resource *resource, uint32_t id)
{
E_Comp *comp;
Eina_Tiler *tiler;
struct wl_resource *res;
/* get the compositor from the resource */
if (!(comp = wl_resource_get_user_data(resource))) return;
DBG("Region Create: %d", wl_resource_get_id(resource));
/* try to create new tiler */
if (!(tiler = eina_tiler_new(comp->man->w, comp->man->h)))
{
ERR("Could not create Eina_Tiler");
wl_resource_post_no_memory(resource);
return;
}
/* set tiler size */
eina_tiler_tile_size_set(tiler, 1, 1);
/* add rectangle to tiler */
eina_tiler_rect_add(tiler,
&(Eina_Rectangle){0, 0, comp->man->w, comp->man->h});
if (!(res = wl_resource_create(client, &wl_region_interface, 1, id)))
{
ERR("\tFailed to create region resource");
wl_resource_post_no_memory(resource);
return;
}
wl_resource_set_implementation(res, &_e_region_interface, tiler,
_e_comp_wl_compositor_cb_region_destroy);
}
static const struct wl_compositor_interface _e_comp_interface =
@ -442,6 +538,13 @@ _e_comp_wl_client_cb_new(void *data EINA_UNUSED, E_Client *ec)
return;
}
/* create client tilers */
ec->comp_data->pending.input = eina_tiler_new(ec->w, ec->h);
eina_tiler_tile_size_set(ec->comp_data->pending.input, 1, 1);
ec->comp_data->pending.opaque = eina_tiler_new(ec->w, ec->h);
eina_tiler_tile_size_set(ec->comp_data->pending.opaque, 1, 1);
/* set initial client properties */
ec->ignored = e_comp_ignore_win_find(win);
ec->border_size = 0;