aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/ecore_evas/Ecore_Evas.h9
-rw-r--r--src/lib/ecore_evas/ecore_evas.c24
-rw-r--r--src/lib/ecore_evas/ecore_evas_private.h4
-rw-r--r--src/lib/ecore_x/Ecore_X_Atoms.h3
-rw-r--r--src/lib/ecore_x/ecore_x_atoms_decl.h7
-rw-r--r--src/lib/elementary/efl_ui_win.c24
-rw-r--r--src/modules/ecore_evas/engines/x/ecore_evas_x.c9
7 files changed, 80 insertions, 0 deletions
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
@@ -2308,6 +2308,15 @@ EAPI void ecore_evas_draw_frame_set(Ecore_Evas *ee, Eina_Bool draw_frame)
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.
*
* @param ee The Ecore_Evas to associate to @a obj
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
@@ -206,6 +206,10 @@ struct _Ecore_Evas
} 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