From 06d6bf0dba9f0cc20075c84507bec2cbdb96aa6b Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Tue, 29 Oct 2013 18:40:33 -0200 Subject: [PATCH] ecore/wayland: Add some getters. This centralizes the place where we have to wait for the init to have finished before first using the compositor. It's also part of the later step of hiding Ecore_Wl_* private structs. --- src/lib/ecore_wayland/Ecore_Wayland.h | 10 ++++++++++ src/lib/ecore_wayland/ecore_wl.c | 22 ++++++++++++++++++++++ src/lib/ecore_wayland/ecore_wl_private.h | 3 +++ src/lib/ecore_wayland/ecore_wl_subsurf.c | 13 +++++++------ src/lib/ecore_wayland/ecore_wl_window.c | 6 +++--- 5 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/lib/ecore_wayland/Ecore_Wayland.h b/src/lib/ecore_wayland/Ecore_Wayland.h index 9ba76369e8..78282812fb 100644 --- a/src/lib/ecore_wayland/Ecore_Wayland.h +++ b/src/lib/ecore_wayland/Ecore_Wayland.h @@ -495,6 +495,16 @@ EAPI struct wl_shm *ecore_wl_shm_get(void); */ EAPI struct wl_display *ecore_wl_display_get(void); +/** + * Retrieves the Compositor interface. + * + * This interface is used by clients to request the creation of surfaces and + * regions. + * + * @return The current wayland compositor interface + * @since 1.8 + */ + /** * Retrieves the size of the current screen. * diff --git a/src/lib/ecore_wayland/ecore_wl.c b/src/lib/ecore_wayland/ecore_wl.c index 451aa794dc..f763675276 100644 --- a/src/lib/ecore_wayland/ecore_wl.c +++ b/src/lib/ecore_wayland/ecore_wl.c @@ -272,6 +272,28 @@ ecore_wl_registry_get(void) return _ecore_wl_disp->wl.registry; } +struct wl_compositor * +ecore_wl_compositor_get(void) +{ + if ((!_ecore_wl_disp) || (!_ecore_wl_disp->wl.display)) + return NULL; + + _ecore_wl_init_wait(); + + return _ecore_wl_disp->wl.compositor; +} + +struct wl_subcompositor * +ecore_wl_subcompositor_get(void) +{ + if ((!_ecore_wl_disp) || (!_ecore_wl_disp->wl.display)) + return NULL; + + _ecore_wl_init_wait(); + + return _ecore_wl_disp->wl.subcompositor; +} + EAPI void ecore_wl_screen_size_get(int *w, int *h) { diff --git a/src/lib/ecore_wayland/ecore_wl_private.h b/src/lib/ecore_wayland/ecore_wl_private.h index b83aae38eb..d615f0f4dd 100644 --- a/src/lib/ecore_wayland/ecore_wl_private.h +++ b/src/lib/ecore_wayland/ecore_wl_private.h @@ -97,4 +97,7 @@ void _ecore_wl_events_shutdown(void); void _ecore_wl_subsurfs_del_all(Ecore_Wl_Window *win); +struct wl_compositor *ecore_wl_compositor_get(void); +struct wl_subcompositor *ecore_wl_subcompositor_get(void); + #endif diff --git a/src/lib/ecore_wayland/ecore_wl_subsurf.c b/src/lib/ecore_wayland/ecore_wl_subsurf.c index 4e144fa084..d59810d6cd 100644 --- a/src/lib/ecore_wayland/ecore_wl_subsurf.c +++ b/src/lib/ecore_wayland/ecore_wl_subsurf.c @@ -23,19 +23,22 @@ ecore_wl_subsurf_create(Ecore_Wl_Window *win) struct wl_subsurface *subsurface; struct wl_surface *surface; Ecore_Wl_Subsurf *ess; + struct wl_subcompositor *subcomp; LOGFN(__FILE__, __LINE__, __FUNCTION__); if (!win) return NULL; if (!win->surface) return NULL; - if (!_ecore_wl_disp->wl.subcompositor) return NULL; - surface = wl_compositor_create_surface(_ecore_wl_disp->wl.compositor); + subcomp = ecore_wl_subcompositor_get(); + if (!subcomp) return NULL; + + surface = wl_compositor_create_surface(ecore_wl_compositor_get()); if (!surface) return NULL; subsurface = wl_subcompositor_get_subsurface - (_ecore_wl_disp->wl.subcompositor, surface, win->surface); + (subcomp, surface, win->surface); if (!subsurface) { wl_surface_destroy(surface); @@ -171,7 +174,6 @@ ecore_wl_subsurf_sync_set(Ecore_Wl_Subsurf *ess, Eina_Bool val) EAPI void ecore_wl_subsurf_opaque_region_set(Ecore_Wl_Subsurf *ess, int x, int y, int w, int h) { - Ecore_Wl_Window *parent; struct wl_region *region = NULL; LOGFN(__FILE__, __LINE__, __FUNCTION__); @@ -180,8 +182,7 @@ ecore_wl_subsurf_opaque_region_set(Ecore_Wl_Subsurf *ess, int x, int y, int w, i if ((w > 0) && (h > 0)) { - parent = ess->parent_win; - region = wl_compositor_create_region(parent->display->wl.compositor); + region = wl_compositor_create_region(ecore_wl_compositor_get()); wl_region_add(region, x, y, w, h); wl_surface_set_opaque_region(ess->surface, region); wl_region_destroy(region); diff --git a/src/lib/ecore_wayland/ecore_wl_window.c b/src/lib/ecore_wayland/ecore_wl_window.c index 4ec78c8460..b92469157f 100644 --- a/src/lib/ecore_wayland/ecore_wl_window.c +++ b/src/lib/ecore_wayland/ecore_wl_window.c @@ -252,7 +252,7 @@ ecore_wl_window_surface_create(Ecore_Wl_Window *win) { if (!win) return NULL; if (win->surface) return win->surface; - win->surface = wl_compositor_create_surface(_ecore_wl_disp->wl.compositor); + win->surface = wl_compositor_create_surface(ecore_wl_compositor_get()); win->surface_id = wl_proxy_get_id((struct wl_proxy *)win->surface); return win->surface; } @@ -610,7 +610,7 @@ ecore_wl_window_input_region_set(Ecore_Wl_Window *win, int x, int y, int w, int struct wl_region *region = NULL; region = - wl_compositor_create_region(_ecore_wl_disp->wl.compositor); + wl_compositor_create_region(ecore_wl_compositor_get()); wl_region_add(region, x, y, w, h); wl_surface_set_input_region(win->surface, region); wl_region_destroy(region); @@ -640,7 +640,7 @@ ecore_wl_window_opaque_region_set(Ecore_Wl_Window *win, int x, int y, int w, int struct wl_region *region = NULL; region = - wl_compositor_create_region(_ecore_wl_disp->wl.compositor); + wl_compositor_create_region(ecore_wl_compositor_get()); switch (win->rotation) {