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;

-- 


Reply via email to