discomfitor pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=610c439abd1ec65a15c6849c397a846677e3d0c5
commit 610c439abd1ec65a15c6849c397a846677e3d0c5 Author: Mike Blumenkrantz <[email protected]> Date: Sun Dec 7 20:14:34 2014 -0500 redo shaped client checks to use shape flags instead of rect pointer, fix shapeless clients according to the shape extension protocol, the number of rectangles returned should be checked to determine a client's shape. if 0 is returned, the client has no shape, meaning that it either should not be drawn or should have no input region. this improves behavior with various client window types such as tooltips ref T1820 --- src/bin/e_comp.c | 2 +- src/bin/e_comp_object.c | 17 +++++++++-------- src/bin/e_comp_x.c | 25 ++++++++++++++++++++----- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/bin/e_comp.c b/src/bin/e_comp.c index 1ca1a57..82e6bf2 100644 --- a/src/bin/e_comp.c +++ b/src/bin/e_comp.c @@ -604,7 +604,7 @@ _e_comp_shapes_update_comp_client_shape_comp_helper(E_Client *ec, Eina_Tiler *tb INF("COMP EC: %p", ec); #endif - if (ec->shape_input_rects || ec->shape_rects) + if (ec->shaped || ec->shaped_input) { int num, tot; int l, r, t, b; diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c index 1449b75..3fd2e8b 100644 --- a/src/bin/e_comp_object.c +++ b/src/bin/e_comp_object.c @@ -169,7 +169,6 @@ _e_comp_object_event_add(Evas_Object *obj) static inline Eina_Bool _e_comp_shaped_check(int w, int h, const Eina_Rectangle *rects, int num) { - if ((!rects) || (num < 1)) return EINA_FALSE; if (num > 1) return EINA_TRUE; if ((rects[0].x == 0) && (rects[0].y == 0) && ((int)rects[0].w == w) && ((int)rects[0].h == h)) @@ -3049,9 +3048,11 @@ e_comp_object_shape_apply(Evas_Object *obj) API_ENTRY; if (!cw->ec) return; //NYI - if (!_e_comp_shaped_check(cw->ec->client.w, cw->ec->client.h, cw->ec->shape_rects, cw->ec->shape_rects_num)) + if (cw->ec->shaped) { - if (!cw->ec->shaped) return; + if ((cw->ec->shape_rects_num >= 1) && + (!_e_comp_shaped_check(cw->ec->client.w, cw->ec->client.h, cw->ec->shape_rects, cw->ec->shape_rects_num))) + return; } if (cw->native) { @@ -3063,11 +3064,11 @@ e_comp_object_shape_apply(Evas_Object *obj) //INF("SHAPE RENDER %p", cw->ec); - if (cw->ec->shape_rects) evas_object_image_native_surface_set(cw->obj, NULL); - evas_object_image_alpha_set(cw->obj, !!cw->ec->shape_rects); + if (cw->ec->shaped) evas_object_image_native_surface_set(cw->obj, NULL); + evas_object_image_alpha_set(cw->obj, !!cw->ec->shaped); EINA_LIST_FOREACH(cw->obj_mirror, l, o) { - if (cw->ec->shape_rects) evas_object_image_native_surface_set(o, NULL); + if (cw->ec->shaped) evas_object_image_native_surface_set(o, NULL); evas_object_image_alpha_set(o, 1); } @@ -3077,7 +3078,7 @@ e_comp_object_shape_apply(Evas_Object *obj) evas_object_image_data_set(cw->obj, pix); return; } - if (cw->ec->shape_rects) + if (cw->ec->shaped) { unsigned char *spix, *sp; @@ -3402,7 +3403,7 @@ e_comp_object_util_mirror_add(Evas_Object *obj) evas_object_data_set(o, "E_Client", cw->ec); evas_object_data_set(o, "comp_mirror", cw); - evas_object_image_alpha_set(o, cw->ec->argb || (!!cw->ec->shape_rects)); + evas_object_image_alpha_set(o, cw->ec->argb || (!!cw->ec->shaped)); evas_object_image_size_set(o, w, h); if (cw->ec->shaped) diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index b2ded57..bacdc89 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -3538,7 +3538,7 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) ec->changes.shape = 0; rects = ecore_x_window_shape_rectangles_get(win, &num); - if (rects) + if (rects && num) { int cw = 0, ch = 0; @@ -3601,16 +3601,21 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) free(rects); if (ec->shape_changed) e_comp_object_frame_theme_set(ec->frame, E_COMP_OBJECT_FRAME_RESHADOW); + evas_object_pass_events_set(ec->frame, 0); } else { - // FIXME: no rects i think can mean... totally empty window + ec->shaped = 1; + E_FREE(ec->shape_rects); + E_FREE(ec->shape_input_rects); + ec->shape_input_rects_num = 0; + e_comp_object_frame_theme_set(ec->frame, E_COMP_OBJECT_FRAME_RESHADOW); if (ec->shaped && ec->comp_data->reparented && (!ec->bordername)) { ec->border.changed = 1; EC_CHANGED(ec); } - ec->shaped = 0; + evas_object_pass_events_set(ec->frame, 1); } if (ec->shaped != pshaped) { @@ -3628,7 +3633,7 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) ec->changes.shape_input = 0; rects = ecore_x_window_shape_input_rectangles_get(win, &num); - if (rects) + if (rects && num) { int cw = 0, ch = 0; @@ -3668,9 +3673,19 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) ec->shape_input_rects = (Eina_Rectangle*)rects; ec->shape_input_rects_num = num; } + evas_object_pass_events_set(ec->frame, 0); } else - ec->shaped_input = 0; + { + ec->shaped_input = 1; + if (ec->comp_data->reparented) + ecore_x_window_shape_input_rectangles_set(pwin, rects, num); + changed = EINA_TRUE; + evas_object_pass_events_set(ec->frame, 1); + free(ec->shape_input_rects); + ec->shape_input_rects = NULL; + ec->shape_input_rects_num = 0; + } if (changed || (pshaped != ec->shaped_input)) { ec->need_shape_merge = 1; --
