diff --git a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h index 7ff73705e2..7ec23e7514 100644 --- a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h +++ b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h @@ -69,6 +69,13 @@ typedef enum _Ecore_Evas_Engine_Type ECORE_EVAS_ENGINE_SDL } Ecore_Evas_Engine_Type; +typedef enum _Ecore_Evas_Avoid_Damage_Type +{ + ECORE_EVAS_AVOID_DAMAGE_NONE = 0, + ECORE_EVAS_AVOID_DAMAGE_EXPOSE = 1, + ECORE_EVAS_AVOID_DAMAGE_BUILT_IN = 2 +} Ecore_Evas_Avoid_Damage_Type; + #ifndef _ECORE_X_H #define _ECORE_X_WINDOW_PREDEF typedef unsigned int Ecore_X_Window; @@ -217,8 +224,8 @@ EAPI void ecore_evas_maximized_set(Ecore_Evas *ee, int on); EAPI int ecore_evas_maximized_get(Ecore_Evas *ee); EAPI void ecore_evas_fullscreen_set(Ecore_Evas *ee, int on); EAPI int ecore_evas_fullscreen_get(Ecore_Evas *ee); -EAPI void ecore_evas_avoid_damage_set(Ecore_Evas *ee, int on); -EAPI int ecore_evas_avoid_damage_get(Ecore_Evas *ee); +EAPI void ecore_evas_avoid_damage_set(Ecore_Evas *ee, Ecore_Evas_Avoid_Damage_Type on); +EAPI Ecore_Evas_Avoid_Damage_Type ecore_evas_avoid_damage_get(Ecore_Evas *ee); EAPI void ecore_evas_withdrawn_set(Ecore_Evas *ee, int withdrawn); EAPI int ecore_evas_withdrawn_get(Ecore_Evas *ee); EAPI void ecore_evas_sticky_set(Ecore_Evas *ee, int sticky); diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c index 1e168fcde1..5575714f0e 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c @@ -1625,7 +1625,7 @@ ecore_evas_fullscreen_get(Ecore_Evas *ee) * On expose events it will copy from the pixmap to the window. */ EAPI void -ecore_evas_avoid_damage_set(Ecore_Evas *ee, int on) +ecore_evas_avoid_damage_set(Ecore_Evas *ee, Ecore_Evas_Avoid_Damage_Type on) { if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) { @@ -1643,7 +1643,7 @@ ecore_evas_avoid_damage_set(Ecore_Evas *ee, int on) * @return 1 if @p ee avoids damage, 0 if not. * */ -EAPI int +EAPI Ecore_Evas_Avoid_Damage_Type ecore_evas_avoid_damage_get(Ecore_Evas *ee) { if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) @@ -1652,7 +1652,7 @@ ecore_evas_avoid_damage_get(Ecore_Evas *ee) "ecore_evas_avoid_damage_get"); return 0; } - return ee->prop.avoid_damage ? 1:0; + return ee->prop.avoid_damage; } /** diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h index 2970104b27..8bfbd32e22 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h @@ -234,13 +234,13 @@ struct _Ecore_Evas } hot; } cursor; int layer; + unsigned char avoid_damage; char focused : 1; char iconified : 1; char borderless : 1; char override : 1; char maximized : 1; char fullscreen : 1; - char avoid_damage : 1; char withdrawn : 1; char sticky : 1; char request_pos : 1; 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 28cd04f42d..93fed53296 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c @@ -158,13 +158,16 @@ _ecore_evas_x_render(Ecore_Evas *ee) updates = evas_render_updates(ee->evas); #if 0 - for (l = updates; l; l = l->next) +// if (ee->w == 640) { - Evas_Rectangle *r; - - r = l->data; - printf("DMG render [%p] %ix%i, [%i %i %ix%i]\n", - ee, ee->w, ee->h, r->x, r->y, r->w, r->h); + for (l = updates; l; l = l->next) + { + Evas_Rectangle *r; + + r = l->data; + printf(" UP render [%p] %ix%i, [%i %i %ix%i]\n", + ee, ee->w, ee->h, r->x, r->y, r->w, r->h); + } } #endif if (ee->engine.x.using_bg_pixmap) @@ -232,6 +235,10 @@ _ecore_evas_x_render(Ecore_Evas *ee) } if (ee->engine.x.damages) { +#if 0 +// if (ee->w == 640) + printf(" --COPY PIXMAP\n"); +#endif /* if we have a damage pixmap - we can avoid exposures by * disabling them just for setting the mask */ ecore_x_event_mask_set(ee->engine.x.win, @@ -309,17 +316,20 @@ _ecore_evas_x_render(Ecore_Evas *ee) if (updates) { #if 0 - Evas_List *l; - - printf("RENDER [%p] [%i] %ix%i\n", - ee, ee->visible, ee->w, ee->h); - for (l = updates; l; l = l->next) +// if (ee->w == 640) { - Evas_Rectangle *r; - - r = l->data; - printf(" render [%i %i %ix%i]\n", - r->x, r->y, r->w, r->h); + Evas_List *l; + + printf("RENDER [%p] [%i] %ix%i\n", + ee, ee->visible, ee->w, ee->h); + for (l = updates; l; l = l->next) + { + Evas_Rectangle *r; + + r = l->data; + printf(" render [%i %i %ix%i]\n", + r->x, r->y, r->w, r->h); + } } #endif evas_render_updates_free(updates); @@ -1043,8 +1053,11 @@ _ecore_evas_x_event_window_configure(void *data __UNUSED__, int type __UNUSED__, } if (ee->prop.avoid_damage) { + int pdam; + + pdam = ecore_evas_avoid_damage_get(ee); ecore_evas_avoid_damage_set(ee, 0); - ecore_evas_avoid_damage_set(ee, 1); + ecore_evas_avoid_damage_set(ee, pdam); } if (ee->shaped) _ecore_evas_x_resize_shape(ee); @@ -1455,8 +1468,11 @@ _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h) } if (ee->prop.avoid_damage) { + int pdam; + + pdam = ecore_evas_avoid_damage_get(ee); ecore_evas_avoid_damage_set(ee, 0); - ecore_evas_avoid_damage_set(ee, 1); + ecore_evas_avoid_damage_set(ee, pdam); } if (ee->shaped) { @@ -1503,8 +1519,11 @@ _ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, int w, int h) } if (ee->prop.avoid_damage) { + int pdam; + + pdam = ecore_evas_avoid_damage_get(ee); ecore_evas_avoid_damage_set(ee, 0); - ecore_evas_avoid_damage_set(ee, 1); + ecore_evas_avoid_damage_set(ee, pdam); } if (ee->shaped) { @@ -2351,9 +2370,7 @@ _ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on) static void _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on) { - if (((ee->prop.avoid_damage) && (on)) || - ((!ee->prop.avoid_damage) && (!on))) - return; + if (ee->prop.avoid_damage == on) return; if (!strcmp(ee->driver, "gl_x11")) return; if ((!strcmp(ee->driver, "software_x11")) || (!strcmp(ee->driver, "software_xcb"))) @@ -2382,6 +2399,12 @@ _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on) evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); else evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN) + { + ee->engine.x.using_bg_pixmap = 1; + ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap); + ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h); + } if (ee->engine.x.direct_resize) { /* Turn this off for now @@ -2398,6 +2421,7 @@ _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on) { ecore_x_window_pixmap_set(ee->engine.x.win, 0); ee->engine.x.using_bg_pixmap = 0; + ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h); } ee->engine.x.pmap = 0; ee->engine.x.gc = 0; @@ -2834,9 +2858,11 @@ ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, int on) } else { +/* turn this off too- bg pixmap is controlled by avoid damage directly ee->engine.x.using_bg_pixmap = 0; ecore_x_window_pixmap_set(ee->engine.x.win, 0); ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h); + */ } } #else @@ -3487,9 +3513,11 @@ ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, int on) } else { +/* turn this off too- bg pixmap is controlled by avoid damage directly ee->engine.x.using_bg_pixmap = 0; ecore_x_window_pixmap_set(ee->engine.x.win, 0); ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h); + */ } } #else