win: Fix maximized geometry with CSD in X

There is still a geometry issue after un-maximizing.
This commit is contained in:
Jean-Philippe Andre 2016-11-02 15:04:24 +09:00
parent 2147d5cb33
commit b2dbf9d9dd
4 changed files with 39 additions and 29 deletions

View File

@ -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

View File

@ -207,6 +207,7 @@ struct _Ecore_Evas
struct {
int l, r, t, b;
int changed : 1;
} shadow;
struct {

View File

@ -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

View File

@ -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