forked from enlightenment/efl
186 lines
4.5 KiB
C
186 lines
4.5 KiB
C
#ifdef HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#endif
|
|
|
|
#include "ecore_wl2_private.h"
|
|
|
|
void
|
|
_ecore_wl2_subsurf_unmap(Ecore_Wl2_Subsurface *subsurf)
|
|
{
|
|
if (subsurf->wl.subsurface) wl_subsurface_destroy(subsurf->wl.subsurface);
|
|
if (subsurf->wl.surface) wl_surface_destroy(subsurf->wl.surface);
|
|
subsurf->wl.subsurface = NULL;
|
|
subsurf->wl.surface = NULL;
|
|
}
|
|
|
|
void
|
|
_ecore_wl2_subsurf_free(Ecore_Wl2_Subsurface *subsurf)
|
|
{
|
|
Ecore_Wl2_Window *parent;
|
|
|
|
_ecore_wl2_subsurf_unmap(subsurf);
|
|
|
|
parent = subsurf->parent;
|
|
if (parent)
|
|
{
|
|
parent->subsurfs =
|
|
eina_inlist_remove(parent->subsurfs, EINA_INLIST_GET(subsurf));
|
|
}
|
|
|
|
free(subsurf);
|
|
}
|
|
|
|
EAPI Ecore_Wl2_Subsurface *
|
|
ecore_wl2_subsurface_new(Ecore_Wl2_Window *window)
|
|
{
|
|
Ecore_Wl2_Display *display;
|
|
Ecore_Wl2_Subsurface *subsurf;
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(window->surface, NULL);
|
|
|
|
display = window->display;
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(display->wl.compositor, NULL);
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(display->wl.subcompositor, NULL);
|
|
|
|
subsurf = calloc(1, sizeof(Ecore_Wl2_Subsurface));
|
|
if (!subsurf) return NULL;
|
|
|
|
subsurf->parent = window;
|
|
|
|
subsurf->wl.surface = wl_compositor_create_surface(display->wl.compositor);
|
|
if (!subsurf->wl.surface)
|
|
{
|
|
ERR("Failed to create surface");
|
|
goto surf_err;
|
|
}
|
|
|
|
subsurf->wl.subsurface =
|
|
wl_subcompositor_get_subsurface(display->wl.subcompositor,
|
|
subsurf->wl.surface, window->surface);
|
|
if (!subsurf->wl.subsurface)
|
|
{
|
|
ERR("Could not create subsurface");
|
|
goto sub_surf_err;
|
|
}
|
|
|
|
window->subsurfs =
|
|
eina_inlist_append(window->subsurfs, EINA_INLIST_GET(subsurf));
|
|
|
|
return subsurf;
|
|
|
|
sub_surf_err:
|
|
wl_surface_destroy(subsurf->wl.surface);
|
|
|
|
surf_err:
|
|
free(subsurf);
|
|
return NULL;
|
|
}
|
|
|
|
EAPI void
|
|
ecore_wl2_subsurface_del(Ecore_Wl2_Subsurface *subsurface)
|
|
{
|
|
EINA_SAFETY_ON_NULL_RETURN(subsurface);
|
|
|
|
_ecore_wl2_subsurf_free(subsurface);
|
|
}
|
|
|
|
EAPI struct wl_surface *
|
|
ecore_wl2_subsurface_surface_get(Ecore_Wl2_Subsurface *subsurface)
|
|
{
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(subsurface, NULL);
|
|
|
|
return subsurface->wl.surface;
|
|
}
|
|
|
|
EAPI void
|
|
ecore_wl2_subsurface_position_set(Ecore_Wl2_Subsurface *subsurface, int x, int y)
|
|
{
|
|
EINA_SAFETY_ON_NULL_RETURN(subsurface);
|
|
EINA_SAFETY_ON_NULL_RETURN(subsurface->wl.subsurface);
|
|
|
|
if ((subsurface->x == x) && (subsurface->y == y)) return;
|
|
|
|
subsurface->x = x;
|
|
subsurface->y = y;
|
|
|
|
wl_subsurface_set_position(subsurface->wl.subsurface, x, y);
|
|
}
|
|
|
|
EAPI void
|
|
ecore_wl2_subsurface_position_get(Ecore_Wl2_Subsurface *subsurface, int *x, int *y)
|
|
{
|
|
EINA_SAFETY_ON_NULL_RETURN(subsurface);
|
|
|
|
if (x) *x = subsurface->x;
|
|
if (y) *y = subsurface->y;
|
|
}
|
|
|
|
EAPI void
|
|
ecore_wl2_subsurface_place_above(Ecore_Wl2_Subsurface *subsurface, struct wl_surface *surface)
|
|
{
|
|
EINA_SAFETY_ON_NULL_RETURN(subsurface);
|
|
EINA_SAFETY_ON_NULL_RETURN(surface);
|
|
|
|
wl_subsurface_place_above(subsurface->wl.subsurface, surface);
|
|
}
|
|
|
|
EAPI void
|
|
ecore_wl2_subsurface_place_below(Ecore_Wl2_Subsurface *subsurface, struct wl_surface *surface)
|
|
{
|
|
EINA_SAFETY_ON_NULL_RETURN(subsurface);
|
|
EINA_SAFETY_ON_NULL_RETURN(surface);
|
|
|
|
wl_subsurface_place_below(subsurface->wl.subsurface, surface);
|
|
}
|
|
|
|
EAPI void
|
|
ecore_wl2_subsurface_sync_set(Ecore_Wl2_Subsurface *subsurface, Eina_Bool sync)
|
|
{
|
|
EINA_SAFETY_ON_NULL_RETURN(subsurface);
|
|
EINA_SAFETY_ON_NULL_RETURN(subsurface->wl.subsurface);
|
|
|
|
sync = !!sync;
|
|
if (subsurface->sync == sync) return;
|
|
|
|
subsurface->sync = sync;
|
|
|
|
if (subsurface->sync)
|
|
wl_subsurface_set_sync(subsurface->wl.subsurface);
|
|
else
|
|
wl_subsurface_set_desync(subsurface->wl.subsurface);
|
|
}
|
|
|
|
EAPI void
|
|
ecore_wl2_subsurface_opaque_region_set(Ecore_Wl2_Subsurface *subsurface, int x, int y, int w, int h)
|
|
{
|
|
EINA_SAFETY_ON_NULL_RETURN(subsurface);
|
|
EINA_SAFETY_ON_NULL_RETURN(subsurface->wl.subsurface);
|
|
|
|
if ((w > 0) && (h > 0))
|
|
{
|
|
Ecore_Wl2_Window *parent;
|
|
|
|
parent = subsurface->parent;
|
|
if (parent)
|
|
{
|
|
struct wl_region *region;
|
|
|
|
region =
|
|
wl_compositor_create_region(parent->display->wl.compositor);
|
|
if (!region)
|
|
{
|
|
ERR("Failed to create opaque region");
|
|
return;
|
|
}
|
|
|
|
wl_region_add(region, x, y, w, h);
|
|
wl_surface_set_opaque_region(subsurface->wl.surface, region);
|
|
wl_region_destroy(region);
|
|
}
|
|
}
|
|
else
|
|
wl_surface_set_opaque_region(subsurface->wl.surface, NULL);
|
|
}
|