diff --git a/src/bin/e_comp.c b/src/bin/e_comp.c index 7892c2d7c..3f76922e0 100644 --- a/src/bin/e_comp.c +++ b/src/bin/e_comp.c @@ -577,27 +577,28 @@ _e_comp_shapes_update_comp_client_shape_comp_helper(E_Client *ec, Eina_Tiler *tb /* add the frame */ e_comp_object_frame_geometry_get(ec->frame, &l, &r, &t, &b); - if (l || r || t || b) + e_comp_object_frame_extends_get(ec->frame, &x, &y, &w, &h); + if ((l + x) || (r + (w - ec->w + x)) || (t - y) || (b + (h - ec->h + y))) { - if (t) + if (t - y) { - eina_tiler_rect_add(tb, &(Eina_Rectangle){ec->x, ec->y, ec->w, t}); - SHAPE_INF("ADD: %d,%d@%dx%d", ec->x, ec->y, ec->w, t); + eina_tiler_rect_add(tb, &(Eina_Rectangle){ec->x + x, ec->y + y, w, t - y}); + SHAPE_INF("ADD: %d,%d@%dx%d", ec->x + x, ec->y + y, w, t - y); } - if (l) + if (l - x) { - eina_tiler_rect_add(tb, &(Eina_Rectangle){ec->x, ec->y, l, ec->h}); - SHAPE_INF("ADD: %d,%d@%dx%d", ec->x, ec->y, l, ec->h); + eina_tiler_rect_add(tb, &(Eina_Rectangle){ec->x + x, ec->y + y, l - x, h}); + SHAPE_INF("ADD: %d,%d@%dx%d", ec->x + x, ec->y + y, l - x, h); } - if (r) + if (r + (w - ec->w + x)) { - eina_tiler_rect_add(tb, &(Eina_Rectangle){ec->x + l + ec->client.w, ec->y, r, ec->h}); - SHAPE_INF("ADD: %d,%d@%dx%d", ec->client.x + ec->client.w, ec->y, r, ec->h); + eina_tiler_rect_add(tb, &(Eina_Rectangle){ec->x + l + ec->client.w + x, ec->y + y, r + (w - ec->w + x), h}); + SHAPE_INF("ADD: %d,%d@%dx%d", ec->x + l + ec->client.w + x, ec->y + y, r + (w - ec->w + x), h); } - if (b) + if (b + (h - ec->h + y)) { - eina_tiler_rect_add(tb, &(Eina_Rectangle){ec->x, ec->y + t + ec->client.h, ec->w, b}); - SHAPE_INF("ADD: %d,%d@%dx%d", ec->x, ec->client.y + ec->client.h, ec->w, b); + eina_tiler_rect_add(tb, &(Eina_Rectangle){ec->x + x, ec->y + t + ec->client.h + y, w, b + (h - ec->h + y)}); + SHAPE_INF("ADD: %d,%d@%dx%d", ec->x + x, ec->y + t + ec->client.h + y, w, b + (h - ec->h + y)); } } rects = ec->shape_rects ?: ec->shape_input_rects; @@ -631,9 +632,10 @@ _e_comp_shapes_update_comp_client_shape_comp_helper(E_Client *ec, Eina_Tiler *tb if (!e_client_util_borderless(ec)) { + e_comp_object_frame_extends_get(ec->frame, &x, &y, &w, &h); /* add the frame */ - eina_tiler_rect_add(tb, &(Eina_Rectangle){ec->x, ec->y, ec->w, ec->h}); - SHAPE_INF("ADD: %d,%d@%dx%d", ec->x, ec->y, ec->w, ec->h); + eina_tiler_rect_add(tb, &(Eina_Rectangle){ec->x + x, ec->y + y, w, h}); + SHAPE_INF("ADD: %d,%d@%dx%d", ec->x + x, ec->y + y, w, h); } if ((!ec->shaded) && (!ec->shading)) diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c index 0418a861b..dba67d303 100644 --- a/src/bin/e_comp_object.c +++ b/src/bin/e_comp_object.c @@ -97,6 +97,7 @@ typedef struct _E_Comp_Object Eina_Bool updates_full : 1; // entire object will be updated Eina_Bool force_move : 1; + Eina_Bool frame_extends : 1; //frame may extend beyond object size } E_Comp_Object; @@ -2473,6 +2474,21 @@ e_comp_object_client_get(Evas_Object *obj) return cw ? cw->ec : NULL; } +EAPI void +e_comp_object_frame_extends_get(Evas_Object *obj, int *x, int *y, int *w, int *h) +{ + API_ENTRY; + if (cw->frame_extends) + edje_object_parts_extends_calc(cw->frame_object, x, y, w, h); + else + { + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = cw->ec->w; + if (h) *h = cw->ec->h; + } +} + EAPI E_Zone * e_comp_object_util_zone_get(Evas_Object *obj) { @@ -2812,8 +2828,13 @@ reshadow: } evas_object_smart_callback_call(cw->smart_obj, "frame_changed", NULL); if (cw->frame_object) - edje_object_signal_callback_add(cw->frame_object, "*", "*", - _e_comp_object_cb_signal_bind, cw); + { + cw->frame_extends = !!edje_object_data_get(cw->frame_object, "frame_extends"); + edje_object_signal_callback_add(cw->frame_object, "*", "*", + _e_comp_object_cb_signal_bind, cw); + } + else + cw->frame_extends = 0; evas_object_del(pbg); return EINA_TRUE; } diff --git a/src/bin/e_comp_object.h b/src/bin/e_comp_object.h index 34ebdc9d9..4aeaca785 100644 --- a/src/bin/e_comp_object.h +++ b/src/bin/e_comp_object.h @@ -43,6 +43,7 @@ EAPI void e_comp_object_frame_xy_adjust(Evas_Object *obj, int x, int y, int *ax, EAPI void e_comp_object_frame_xy_unadjust(Evas_Object *obj, int x, int y, int *ax, int *ay); EAPI void e_comp_object_frame_wh_adjust(Evas_Object *obj, int w, int h, int *aw, int *ah); EAPI void e_comp_object_frame_wh_unadjust(Evas_Object *obj, int w, int h, int *aw, int *ah); +EAPI void e_comp_object_frame_extends_get(Evas_Object *obj, int *x, int *y, int *w, int *h); EAPI E_Client *e_comp_object_client_get(Evas_Object *obj); EAPI E_Zone *e_comp_object_util_zone_get(Evas_Object *obj); EAPI void e_comp_object_util_del_list_append(Evas_Object *obj, Evas_Object *to_del);