From c9b724a3c07a1bdb8485dbe069b6569f61182141 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 3 May 2005 17:35:50 +0000 Subject: [PATCH] fix shaped ecore_evas handling to be more efficient on resize and if we combine it with obscures - those obscured areas at least start as empty :) SVN revision: 14580 --- .../ecore/src/lib/ecore_evas/ecore_evas_x.c | 49 ++++++++++++++++--- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c index 401858b30b..f1455cd073 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c @@ -71,6 +71,33 @@ _ecore_evas_x_match(Ecore_X_Window win) return NULL; } +static void +_ecore_evas_x_resize_shape(Ecore_Evas *ee) +{ + Evas_Engine_Info_Software_X11 *einfo; + + einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas); + if (einfo) + { + GC gc; + XGCValues gcv; + + if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask); + ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1); + gcv.foreground = 0; + gc = XCreateGC(ecore_x_display_get(), ee->engine.x.mask, + GCForeground, + &gcv); + XFillRectangle(ecore_x_display_get(), ee->engine.x.mask, gc, + 0, 0, ee->w, ee->h); + XFreeGC(ecore_x_display_get(), gc); + einfo->info.mask = ee->engine.x.mask; + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); + evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + + } +} + static void _ecore_evas_modifier_locks_update(Ecore_Evas *ee, int modifiers) { @@ -379,8 +406,7 @@ _ecore_evas_event_window_configure(void *data __UNUSED__, int type __UNUSED__, v } if (ee->shaped) { - ecore_evas_shaped_set(ee, 0); - ecore_evas_shaped_set(ee, 1); + _ecore_evas_x_resize_shape(ee); } if ((ee->expecting_resize.w > 0) && (ee->expecting_resize.h > 0)) @@ -685,8 +711,7 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int h) } if (ee->shaped) { - ecore_evas_shaped_set(ee, 0); - ecore_evas_shaped_set(ee, 1); + _ecore_evas_x_resize_shape(ee); } } } @@ -720,8 +745,7 @@ _ecore_evas_move_resize(Ecore_Evas *ee, int x, int y, int w, int h) } if (ee->shaped) { - ecore_evas_shaped_set(ee, 0); - ecore_evas_shaped_set(ee, 1); + _ecore_evas_x_resize_shape(ee); } } } @@ -809,7 +833,17 @@ _ecore_evas_shaped_set(Ecore_Evas *ee, int shaped) { if (ee->shaped) { + GC gc; + XGCValues gcv; + ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1); + gcv.foreground = 0; + gc = XCreateGC(ecore_x_display_get(), ee->engine.x.mask, + GCForeground, + &gcv); + XFillRectangle(ecore_x_display_get(), ee->engine.x.mask, gc, + 0, 0, ee->w, ee->h); + XFreeGC(ecore_x_display_get(), gc); einfo->info.mask = ee->engine.x.mask; evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); @@ -1113,8 +1147,7 @@ _ecore_evas_fullscreen_set(Ecore_Evas *ee, int on) } if (ee->shaped) { - ecore_evas_shaped_set(ee, 0); - ecore_evas_shaped_set(ee, 1); + _ecore_evas_x_resize_shape(ee); } if ((ee->expecting_resize.w > 0) && (ee->expecting_resize.h > 0))