jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=b2dbf9d9dd52d286e357e988ba55023b7eb9cb13
commit b2dbf9d9dd52d286e357e988ba55023b7eb9cb13 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Wed Nov 2 15:04:24 2016 +0900 win: Fix maximized geometry with CSD in X There is still a geometry issue after un-maximizing. --- src/lib/ecore_evas/ecore_evas.c | 3 ++ src/lib/ecore_evas/ecore_evas_private.h | 1 + src/lib/elementary/efl_ui_win.c | 41 +++++++++++++------------ src/modules/ecore_evas/engines/x/ecore_evas_x.c | 23 ++++++++------ 4 files changed, 39 insertions(+), 29 deletions(-) diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index 4400883..421345d 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -2240,10 +2240,13 @@ EAPI void ecore_evas_shadow_geometry_set(Ecore_Evas *ee, int l, int r, int t, int b) { ECORE_EVAS_CHECK(ee); + if ((ee->shadow.l == l) && (ee->shadow.r == r) && + (ee->shadow.t == t) && (ee->shadow.b == b)) return; ee->shadow.l = l; ee->shadow.r = r; ee->shadow.t = t; ee->shadow.b = b; + ee->shadow.changed = EINA_TRUE; } EAPI void diff --git a/src/lib/ecore_evas/ecore_evas_private.h b/src/lib/ecore_evas/ecore_evas_private.h index c1ea4c0..5184e94 100644 --- a/src/lib/ecore_evas/ecore_evas_private.h +++ b/src/lib/ecore_evas/ecore_evas_private.h @@ -207,6 +207,7 @@ struct _Ecore_Evas struct { int l, r, t, b; + int changed : 1; } shadow; struct { diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 1353292..7b6688d 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -1376,6 +1376,25 @@ _elm_win_opaque_update(Efl_Ui_Win_Data *sd) } #endif +static inline void +_elm_win_frame_geometry_adjust(Efl_Ui_Win_Data *sd) +{ + int l = 0, t = 0, r = 0, b = 0; + + if (sd->frame_obj && !sd->fullscreen) + { + int fw, fh, ox, oy, ow, oh; + evas_object_geometry_get(sd->frame_obj, NULL, NULL, &fw, &fh); + edje_object_part_geometry_get(sd->frame_obj, "elm.spacer.opaque", + &ox, &oy, &ow, &oh); + l = ox; + t = oy; + r = fw - ow - l; + b = fh - oh - t; + } + ecore_evas_shadow_geometry_set(sd->ee, l, r, t, b); +} + static void _elm_win_frame_obj_update(Efl_Ui_Win_Data *sd) { @@ -1386,6 +1405,7 @@ _elm_win_frame_obj_update(Efl_Ui_Win_Data *sd) sd->wl.opaque_dirty = 1; #endif + _elm_win_frame_geometry_adjust(sd); if (sd->fullscreen) { #ifdef HAVE_ELEMENTARY_WL2 @@ -2864,25 +2884,6 @@ super_skip: efl_gfx_position_set(efl_super(obj, EFL_CANVAS_GROUP_CLASS), x, y); } -static inline void -_elm_win_frame_geometry_adjust(Efl_Ui_Win_Data *sd) -{ - int l = 0, t = 0, r = 0, b = 0; - - if (sd->frame_obj) - { - int fw, fh, ox, oy, ow, oh; - evas_object_geometry_get(sd->frame_obj, NULL, NULL, &fw, &fh); - edje_object_part_geometry_get(sd->frame_obj, "elm.spacer.opaque", - &ox, &oy, &ow, &oh); - l = ox; - t = oy; - r = fw - ow - l; - b = fh - oh - t; - } - ecore_evas_shadow_geometry_set(sd->ee, l, r, t, b); -} - EOLIAN static void _efl_ui_win_efl_gfx_size_set(Eo *obj, Efl_Ui_Win_Data *sd, Evas_Coord w, Evas_Coord h) { @@ -3893,7 +3894,7 @@ _elm_win_frame_cb_maximize(void *data, if (sd->maximized) value = EINA_FALSE; else value = EINA_TRUE; - TRAP(sd, maximized_set, value); + efl_ui_win_maximized_set(sd->obj, value); } static void 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 118401e..2a71070 100644 --- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -1608,6 +1608,18 @@ _ecore_evas_x_event_window_destroy(void *data EINA_UNUSED, int type EINA_UNUSED, return ECORE_CALLBACK_PASS_ON; } +static inline void +_ecore_evas_x_shadow_update(Ecore_Evas *ee) +{ + if (EINA_LIKELY(!ee->shadow.changed)) return; + + int shadow[4] = { ee->shadow.l, ee->shadow.r, ee->shadow.t, ee->shadow.b }; + ee->shadow.changed = EINA_FALSE; + ecore_x_window_prop_property_set(ee->prop.window, + ECORE_X_ATOM_GTK_FRAME_EXTENTS, + ECORE_X_ATOM_CARDINAL, 32, shadow, 4); +} + static Eina_Bool _ecore_evas_x_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) { @@ -1638,6 +1650,7 @@ _ecore_evas_x_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSE } } + _ecore_evas_x_shadow_update(ee); evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh); if (!ECORE_EVAS_PORTRAIT(ee)) SWAP_INT(fw, fh); @@ -2170,7 +2183,6 @@ _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; - int zero[4] = {0}; evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh); if (ECORE_EVAS_PORTRAIT(ee)) SWAP_INT(fw, fh); @@ -2198,6 +2210,7 @@ _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h) } } + _ecore_evas_x_shadow_update(ee); if (edata->direct_resize) { if ((ee->w == w) && (ee->h == h)) return; @@ -2234,14 +2247,6 @@ _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h) if (changed) edata->configure_reqs++; if (ee->prop.window) ecore_x_window_resize(ee->prop.window, w + fw, h + fh); } - - if (memcmp(&zero, &ee->shadow, sizeof(zero))) - { - ecore_x_window_prop_property_set(ee->prop.window, - ECORE_X_ATOM_GTK_FRAME_EXTENTS, - ECORE_X_ATOM_CARDINAL, 32, - &ee->shadow, 4); - } } static void --