75 lines
2.1 KiB
C
75 lines
2.1 KiB
C
#include "e.h"
|
|
|
|
/* local function prototypes */
|
|
static void _e_region_destroy(struct wl_resource *resource);
|
|
static void _e_region_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource);
|
|
static void _e_region_cb_add(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, int x, int y, int w, int h);
|
|
static void _e_region_cb_subtract(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, int x, int y, int w, int h);
|
|
|
|
/* local wayland interfaces */
|
|
static const struct wl_region_interface _e_region_interface =
|
|
{
|
|
_e_region_cb_destroy,
|
|
_e_region_cb_add,
|
|
_e_region_cb_subtract
|
|
};
|
|
|
|
EAPI E_Region *
|
|
e_region_new(struct wl_client *client, unsigned int id)
|
|
{
|
|
E_Region *reg;
|
|
|
|
/* try to allocation space for a new region */
|
|
if (!(reg = E_NEW_RAW(E_Region, 1))) return NULL;
|
|
|
|
pixman_region32_init(®->region);
|
|
|
|
reg->resource =
|
|
wl_resource_create(client, &wl_region_interface, 1, id);
|
|
wl_resource_set_implementation(reg->resource, &_e_region_interface,
|
|
reg, _e_region_destroy);
|
|
|
|
return reg;
|
|
}
|
|
|
|
/* local functions */
|
|
static void
|
|
_e_region_destroy(struct wl_resource *resource)
|
|
{
|
|
E_Region *reg;
|
|
|
|
if (!(reg = wl_resource_get_user_data(resource))) return;
|
|
pixman_region32_fini(®->region);
|
|
E_FREE(reg);
|
|
}
|
|
|
|
static void
|
|
_e_region_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
|
|
{
|
|
wl_resource_destroy(resource);
|
|
}
|
|
|
|
static void
|
|
_e_region_cb_add(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, int x, int y, int w, int h)
|
|
{
|
|
E_Region *reg;
|
|
|
|
if (!(reg = wl_resource_get_user_data(resource))) return;
|
|
|
|
pixman_region32_union_rect(®->region, ®->region, x, y, w, h);
|
|
}
|
|
|
|
static void
|
|
_e_region_cb_subtract(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, int x, int y, int w, int h)
|
|
{
|
|
E_Region *reg;
|
|
pixman_region32_t rect;
|
|
|
|
/* try to cast resource to our region */
|
|
if (!(reg = wl_resource_get_user_data(resource))) return;
|
|
|
|
pixman_region32_init_rect(&rect, x, y, w, h);
|
|
pixman_region32_subtract(®->region, ®->region, &rect);
|
|
pixman_region32_init(&rect);
|
|
}
|