jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=86e18c3f611dd5a4c85a62d064031204557717fe
commit 86e18c3f611dd5a4c85a62d064031204557717fe Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Fri Oct 28 12:20:07 2016 +0900 ecore_evas/x: Take framespace into account during resize This is another step towards CSD support for X. --- src/modules/ecore_evas/engines/x/ecore_evas_x.c | 62 ++++++++++++++++++------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/src/modules/ecore_evas/engines/x/ecore_evas_x.c b/src/modules/ecore_evas/engines/x/ecore_evas_x.c index 4750073..c9ff1f3 100644 --- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -152,6 +152,8 @@ static void _transparent_do(Ecore_Evas *, int); static void _avoid_damage_do(Ecore_Evas *, int); static void _rotation_do(Ecore_Evas *, int, int); +#define SWAP_INT(a, b) do { a ^= b; b ^= a; a ^= b; } while (0) + static void _ecore_evas_x_hints_update(Ecore_Evas *ee) { @@ -835,16 +837,19 @@ _resize_shape_do(Ecore_Evas *ee) if (einfo) { unsigned int foreground; + int fw = 0, fh = 0; Ecore_X_GC gc; + evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh); + if (edata->mask) ecore_x_pixmap_free(edata->mask); - edata->mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1); + edata->mask = ecore_x_pixmap_new(ee->prop.window, ee->w + fw, ee->h + fh, 1); foreground = 0; gc = ecore_x_gc_new(edata->mask, ECORE_X_GC_VALUE_MASK_FOREGROUND, &foreground); ecore_x_drawable_rectangle_fill(edata->mask, gc, - 0, 0, ee->w, ee->h); + 0, 0, ee->w + fw, ee->h + fh); ecore_x_gc_free(gc); einfo->info.mask = edata->mask; if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) @@ -1609,6 +1614,7 @@ _ecore_evas_x_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSE Ecore_Evas *ee; Ecore_X_Event_Window_Configure *e; Ecore_Evas_Engine_Data_X11 *edata; + int fw = 0, fh = 0, w, h; e = event; ee = ecore_event_window_match(e->win); @@ -1631,11 +1637,18 @@ _ecore_evas_x_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSE if (ee->func.fn_move) ee->func.fn_move(ee); } } - if ((ee->w != e->w) || (ee->h != e->h) || - (ee->req.w != e->w) || (ee->req.h != e->h)) + + evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh); + if (!ECORE_EVAS_PORTRAIT(ee)) + SWAP_INT(fw, fh); + + if (((ee->w + fw) != e->w) || ((ee->h + fh) != e->h) || + ((ee->req.w + fw) != e->w) || ((ee->req.h + fh) != e->h)) { - ee->w = e->w; - ee->h = e->h; + w = e->w; + h = e->h; + ee->w = w - fw; + ee->h = h - fh; if (edata->configure_reqs == 0) { ee->req.w = ee->w; @@ -1643,13 +1656,13 @@ _ecore_evas_x_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSE } if (ECORE_EVAS_PORTRAIT(ee)) { - evas_output_size_set(ee->evas, ee->w, ee->h); - evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); + evas_output_size_set(ee->evas, w, h); + evas_output_viewport_set(ee->evas, 0, 0, w, h); } else { - evas_output_size_set(ee->evas, ee->h, ee->w); - evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w); + evas_output_size_set(ee->evas, h, w); + evas_output_viewport_set(ee->evas, 0, 0, h, w); } if (ee->prop.avoid_damage) { @@ -2156,6 +2169,12 @@ _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h) { Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data; Eina_Bool changed = EINA_FALSE; + int fw = 0, fh = 0; + + evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh); + if (ECORE_EVAS_PORTRAIT(ee)) SWAP_INT(fw, fh); + w -= fw; + h -= fh; if ((ee->req.w != w) || (ee->req.h != h)) { @@ -2212,7 +2231,7 @@ _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h) { edata->configure_coming = 1; if (changed) edata->configure_reqs++; - if (ee->prop.window) ecore_x_window_resize(ee->prop.window, w, h); + if (ee->prop.window) ecore_x_window_resize(ee->prop.window, w + fw, h + fh); } } @@ -2310,10 +2329,16 @@ _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize, { int rot_dif; Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data; + int fw = 0, fh = 0; rot_dif = ee->rotation - rotation; if (rot_dif < 0) rot_dif = -rot_dif; + evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh); + + if (!PORTRAIT_CHECK(rotation)) + SWAP_INT(fw, fh); + if (rot_dif != 180) { int minw, minh, maxw, maxh, basew, baseh, stepw, steph; @@ -2328,11 +2353,11 @@ _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize, edata->configure_coming = 1; if (!ee->prop.fullscreen) { - ecore_x_window_resize(ee->prop.window, ee->req.h, ee->req.w); + ecore_x_window_resize(ee->prop.window, ee->req.h + fw, ee->req.w + fh); ee->expecting_resize.w = ee->h; ee->expecting_resize.h = ee->w; - evas_output_size_set(ee->evas, ee->req.h, ee->req.w); - evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w); + evas_output_size_set(ee->evas, ee->req.h + fw, ee->req.w + fh); + evas_output_viewport_set(ee->evas, 0, 0, ee->req.h + fw, ee->req.w + fh); } else { @@ -2351,11 +2376,12 @@ _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize, evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w); } if (ee->func.fn_resize) ee->func.fn_resize(ee); + fw = fh = 0; } if (PORTRAIT_CHECK(rotation)) - evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h); + evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w + fw, ee->req.h + fh); else - evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w); + evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h + fw, ee->req.w + fh); } else { @@ -2402,9 +2428,9 @@ _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize, if (ee->func.fn_resize) ee->func.fn_resize(ee); if (ECORE_EVAS_PORTRAIT(ee)) - evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + evas_damage_rectangle_add(ee->evas, 0, 0, ee->w + fw, ee->h + fh); else - evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); + evas_damage_rectangle_add(ee->evas, 0, 0, ee->h + fw, ee->w + fh); } } --