devilhorns pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=080b9e473064e84af804a9fdc2148891327b59f7
commit 080b9e473064e84af804a9fdc2148891327b59f7 Author: Chris Michael <cp.mich...@samsung.com> Date: Wed Jan 7 14:46:14 2015 -0500 ecore-wayland: Simplify opaque and input region handling. Summary: We can make opaque and input region handling simplier if we just use one opaque & input region per window. Previous code would always create a new region, set it to the surface, then destroy it. This code works much nicer in that it hammers the protocol with less region create/destroy calls. @fix Signed-off-by: Chris Michael <cp.mich...@samsung.com> --- src/lib/ecore_wayland/ecore_wl_private.h | 3 + src/lib/ecore_wayland/ecore_wl_window.c | 131 +++++++++++++++---------------- 2 files changed, 66 insertions(+), 68 deletions(-) diff --git a/src/lib/ecore_wayland/ecore_wl_private.h b/src/lib/ecore_wayland/ecore_wl_private.h index eacc22f..52b7a9b 100644 --- a/src/lib/ecore_wayland/ecore_wl_private.h +++ b/src/lib/ecore_wayland/ecore_wl_private.h @@ -117,6 +117,9 @@ struct _Ecore_Wl_Window int ivi_surface_id; # endif + struct wl_region *opaque_region; + struct wl_region *input_region; + struct xdg_surface *xdg_surface; struct xdg_popup *xdg_popup; Eina_Bool focused : 1; diff --git a/src/lib/ecore_wayland/ecore_wl_window.c b/src/lib/ecore_wayland/ecore_wl_window.c index ecf3ac9..55c7097 100644 --- a/src/lib/ecore_wayland/ecore_wl_window.c +++ b/src/lib/ecore_wayland/ecore_wl_window.c @@ -101,6 +101,12 @@ ecore_wl_window_new(Ecore_Wl_Window *parent, int x, int y, int w, int h, int buf win->opaque.w = w; win->opaque.h = h; + win->opaque_region = + wl_compositor_create_region(_ecore_wl_compositor_get()); + + win->input_region = + wl_compositor_create_region(_ecore_wl_compositor_get()); + win->title = NULL; win->class_name = NULL; @@ -132,6 +138,9 @@ ecore_wl_window_free(Ecore_Wl_Window *win) if (win->subsurfs) _ecore_wl_subsurfs_del_all(win); + if (win->input_region) wl_region_destroy(win->input_region); + if (win->opaque_region) wl_region_destroy(win->opaque_region); + #ifdef USE_IVI_SHELL if (win->ivi_surface) ivi_surface_destroy(win->ivi_surface); win->ivi_surface = NULL; @@ -228,6 +237,19 @@ ecore_wl_window_commit(Ecore_Wl_Window *win) LOGFN(__FILE__, __LINE__, __FUNCTION__); if (!win) return; + + if (win->opaque_region) + { + if (win->surface) + wl_surface_set_opaque_region(win->surface, win->opaque_region); + } + + if (win->input_region) + { + if (win->surface) + wl_surface_set_input_region(win->surface, win->input_region); + } + if ((win->surface) && (win->has_buffer)) wl_surface_commit(win->surface); } @@ -253,7 +275,7 @@ ecore_wl_window_buffer_attach(Ecore_Wl_Window *win, struct wl_buffer *buffer, in wl_surface_attach(win->surface, buffer, x, y); wl_surface_damage(win->surface, 0, 0, win->allocation.w, win->allocation.h); - wl_surface_commit(win->surface); + ecore_wl_window_commit(win); } break; default: @@ -796,39 +818,27 @@ ecore_wl_window_input_region_set(Ecore_Wl_Window *win, int x, int y, int w, int win->input.x = x; win->input.y = y; - if ((w > 0) && (h > 0)) - { - if ((win->input.w == w) && (win->input.h == h)) - return; - - win->input.w = w; - win->input.h = h; - } + win->input.w = w; + win->input.h = h; - if ((win->type != ECORE_WL_WINDOW_TYPE_FULLSCREEN) || - (win->type != ECORE_WL_WINDOW_TYPE_DND)) + if (win->type != ECORE_WL_WINDOW_TYPE_DND) { - if ((w > 0) && (h > 0)) + switch (win->rotation) { - struct wl_region *region = NULL; - - region = - wl_compositor_create_region(_ecore_wl_compositor_get()); - if (!region) - { - wl_surface_set_input_region(win->surface, NULL); - return; - } - - wl_region_add(region, x, y, w, h); - wl_surface_set_input_region(win->surface, region); - wl_region_destroy(region); + case 0: + wl_region_add(win->input_region, x, y, w, h); + break; + case 180: + wl_region_add(win->input_region, x, x + y, w, h); + break; + case 90: + wl_region_add(win->input_region, y, x, h, w); + break; + case 270: + wl_region_add(win->input_region, x + y, x, h, w); + break; } - else - wl_surface_set_input_region(win->surface, NULL); } - - /* ecore_wl_window_commit(win); */ } /* @since 1.8 */ @@ -841,50 +851,35 @@ ecore_wl_window_opaque_region_set(Ecore_Wl_Window *win, int x, int y, int w, int win->opaque.x = x; win->opaque.y = y; - if ((w > 0) && (h > 0)) - { - if ((win->opaque.w == w) && (win->opaque.h == h)) - return; + win->opaque.w = w; + win->opaque.h = h; - win->opaque.w = w; - win->opaque.h = h; - } + if ((win->transparent) || (win->alpha)) return; - if (((w > 0) && (h > 0)) && ((!win->transparent) && (!win->alpha))) + switch (win->rotation) { - struct wl_region *region = NULL; - - region = - wl_compositor_create_region(_ecore_wl_compositor_get()); - if (!region) - { - wl_surface_set_opaque_region(win->surface, NULL); - return; - } - - switch (win->rotation) - { - case 0: - wl_region_add(region, x, y, w, h); - break; - case 180: - wl_region_add(region, x, x + y, w, h); - break; - case 90: - wl_region_add(region, y, x, h, w); - break; - case 270: - wl_region_add(region, x + y, x, h, w); - break; - } - - wl_surface_set_opaque_region(win->surface, region); - wl_region_destroy(region); + case 0: + wl_region_add(win->opaque_region, x, y, w, h); + break; + case 180: + wl_region_add(win->opaque_region, x, x + y, w, h); + break; + case 90: + wl_region_add(win->opaque_region, y, x, h, w); + break; + case 270: + wl_region_add(win->opaque_region, x + y, x, h, w); + break; } - else - wl_surface_set_opaque_region(win->surface, NULL); - /* ecore_wl_window_commit(win); */ + /* if ((w > 0) && (h > 0)) */ + /* { */ + /* if ((win->opaque.w == w) && (win->opaque.h == h)) */ + /* return; */ + + /* win->opaque.w = w; */ + /* win->opaque.h = h; */ + /* } */ } /* @since 1.8 */ --