diff --git a/src/lib/ecore_evas/Ecore_Evas.h b/src/lib/ecore_evas/Ecore_Evas.h index 3ffdab69d0..45dd047ca3 100644 --- a/src/lib/ecore_evas/Ecore_Evas.h +++ b/src/lib/ecore_evas/Ecore_Evas.h @@ -2307,6 +2307,15 @@ EAPI void ecore_evas_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int EAPI void ecore_evas_draw_frame_set(Ecore_Evas *ee, Eina_Bool draw_frame) EINA_DEPRECATED; EAPI Eina_Bool ecore_evas_draw_frame_get(const Ecore_Evas *ee) EINA_DEPRECATED; +/** + * @brief Set shadow geometry for client-side decorations + * + * Note that the framespace contains both a shadow or glow around the window, + * and the window borders (title bar, etc...). + */ +EAPI void ecore_evas_shadow_geometry_set(Ecore_Evas *ee, int x, int y, int w, int h); +EAPI void ecore_evas_shadow_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h); + /** * @brief Associate the given object to this ecore evas. * diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index d3187ad3aa..440088345d 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -2236,6 +2236,30 @@ ecore_evas_draw_frame_get(const Ecore_Evas *ee EINA_UNUSED) return EINA_FALSE; } +EAPI void +ecore_evas_shadow_geometry_set(Ecore_Evas *ee, int l, int r, int t, int b) +{ + ECORE_EVAS_CHECK(ee); + ee->shadow.l = l; + ee->shadow.r = r; + ee->shadow.t = t; + ee->shadow.b = b; +} + +EAPI void +ecore_evas_shadow_geometry_get(const Ecore_Evas *ee, int *l, int *r, int *t, int *b) +{ + if (l) *l = 0; + if (r) *r = 0; + if (t) *t = 0; + if (b) *b = 0; + ECORE_EVAS_CHECK(ee); + if (l) *l = ee->shadow.l; + if (r) *r = ee->shadow.r; + if (t) *t = ee->shadow.t; + if (b) *b = ee->shadow.b; +} + EAPI void ecore_evas_pointer_xy_get(const Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y) { diff --git a/src/lib/ecore_evas/ecore_evas_private.h b/src/lib/ecore_evas/ecore_evas_private.h index e4642c7c2d..c1ea4c0ecc 100644 --- a/src/lib/ecore_evas/ecore_evas_private.h +++ b/src/lib/ecore_evas/ecore_evas_private.h @@ -205,6 +205,10 @@ struct _Ecore_Evas int x, y, w, h; } req; + struct { + int l, r, t, b; + } shadow; + struct { int x, y; } mouse; diff --git a/src/lib/ecore_x/Ecore_X_Atoms.h b/src/lib/ecore_x/Ecore_X_Atoms.h index 8fbe149c33..69d7f0dbf2 100644 --- a/src/lib/ecore_x/Ecore_X_Atoms.h +++ b/src/lib/ecore_x/Ecore_X_Atoms.h @@ -348,4 +348,7 @@ EAPI extern Ecore_X_Atom ECORE_X_ATOM_TEAMWORK_OPEN; /**< @since 1.18 */ EAPI extern Ecore_X_Atom ECORE_X_ATOM_TEAMWORK_COMPLETED; /**< @since 1.18 */ EAPI extern Ecore_X_Atom ECORE_X_ATOM_TEAMWORK_PROGRESS; /**< @since 1.18 */ EAPI extern Ecore_X_Atom ECORE_X_ATOM_TEAMWORK_STARTED; /**< @since 1.18 */ + +/* Client-Side Decorations */ +EAPI extern Ecore_X_Atom ECORE_X_ATOM_GTK_FRAME_EXTENTS; /**< @since 1.19 */ #endif /* _ECORE_X_ATOMS_H */ diff --git a/src/lib/ecore_x/ecore_x_atoms_decl.h b/src/lib/ecore_x/ecore_x_atoms_decl.h index 64b5764b56..4e95f2c963 100644 --- a/src/lib/ecore_x/ecore_x_atoms_decl.h +++ b/src/lib/ecore_x/ecore_x_atoms_decl.h @@ -378,6 +378,10 @@ EAPI Ecore_X_Atom ECORE_X_ATOM_TEAMWORK_COMPLETED = 0; EAPI Ecore_X_Atom ECORE_X_ATOM_TEAMWORK_PROGRESS = 0; EAPI Ecore_X_Atom ECORE_X_ATOM_TEAMWORK_STARTED = 0; +/* Client-Side Decorations */ +EAPI Ecore_X_Atom ECORE_X_ATOM_GTK_FRAME_EXTENTS = 0; +//EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_OPAQUE_REGION = 0; + typedef struct _Atom_Item Atom_Item; struct _Atom_Item @@ -706,5 +710,8 @@ const Atom_Item atom_items[] = { "_TEAMWORK_COMPLETED", &ECORE_X_ATOM_TEAMWORK_COMPLETED }, { "_TEAMWORK_PROGRESS", &ECORE_X_ATOM_TEAMWORK_PROGRESS }, { "_TEAMWORK_STARTED", &ECORE_X_ATOM_TEAMWORK_STARTED }, + + { "_GTK_FRAME_EXTENTS", &ECORE_X_ATOM_GTK_FRAME_EXTENTS }, + //{ "_NET_WM_OPAQUE_REGION", &ECORE_X_ATOM_NET_WM_OPAQUE_REGION }, }; diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index fd2752fa56..e3782eb3a0 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -1370,6 +1370,7 @@ _elm_win_opaque_update(Efl_Ui_Win_Data *sd) else ecore_wl2_window_opaque_region_set(sd->wl.win, 0, 0, 0, 0); + /* FIXME: Replace with call to ecore_evas_shadow_geometry_set(). */ ecore_wl2_window_geometry_set(sd->wl.win, ox, oy, ow, oh); ecore_wl2_window_input_region_set(sd->wl.win, ox, oy, ow, oh); } @@ -2863,6 +2864,25 @@ 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) { @@ -2885,6 +2905,7 @@ _efl_ui_win_efl_gfx_size_set(Eo *obj, Efl_Ui_Win_Data *sd, Evas_Coord w, Evas_Co evas_object_image_size_set(sd->img_obj, w, h); } + _elm_win_frame_geometry_adjust(sd); if (!sd->response) TRAP(sd, resize, w, h); efl_gfx_size_set(efl_super(obj, MY_CLASS), w, h); @@ -3292,6 +3313,7 @@ _elm_win_resize_objects_eval(Evas_Object *obj) if (sd->img_obj) evas_object_resize(obj, w, h); else { + _elm_win_frame_geometry_adjust(sd); if (!sd->response) TRAP(sd, resize, w, h); } } @@ -4023,6 +4045,7 @@ _elm_win_frame_add(Efl_Ui_Win_Data *sd, const char *style) if (ecore_evas_maximized_get(sd->ee)) edje_object_signal_emit(sd->frame_obj, "elm,state,maximize", "elm"); + _elm_win_frame_geometry_adjust(sd); ecore_evas_geometry_get(sd->ee, NULL, NULL, &w, &h); ecore_evas_resize(sd->ee, w, h); } @@ -4070,6 +4093,7 @@ _elm_win_frame_del(Efl_Ui_Win_Data *sd) if (sd->icon) evas_object_hide(sd->icon); evas_output_framespace_set(sd->evas, 0, 0, 0, 0); + _elm_win_frame_geometry_adjust(sd); ecore_evas_geometry_get(sd->ee, NULL, NULL, &w, &h); ecore_evas_resize(sd->ee, w, h); #ifdef HAVE_ELEMENTARY_WL2 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 c9ff1f3f12..118401efc0 100644 --- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -2170,6 +2170,7 @@ _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); @@ -2233,6 +2234,14 @@ _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