raster pushed a commit to branch master.

commit 2ca1a5a5d4aaeb346c4209415dedc75399e0b518
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Thu Sep 12 01:23:23 2013 +0900

    fix comp fullscreen nocomp detection to work properly given comp changes
---
 src/bin/e_comp.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 106 insertions(+), 2 deletions(-)

diff --git a/src/bin/e_comp.c b/src/bin/e_comp.c
index faf7e9a..c4a3ffd 100644
--- a/src/bin/e_comp.c
+++ b/src/bin/e_comp.c
@@ -200,6 +200,96 @@ _e_comp_child_hide(E_Comp_Win *cw)
      }
 }
 
+static Eina_Bool
+_e_comp_visible_object_clip_is(Evas_Object *obj)
+{
+   Evas_Object *clip;
+   int a;
+   
+   clip = evas_object_clip_get(obj);
+   if (!evas_object_visible_get(clip)) return EINA_FALSE;
+   evas_object_color_get(clip, NULL, NULL, NULL, &a);
+   if (a <= 0) return EINA_FALSE;
+   if (evas_object_clip_get(clip))
+     return _e_comp_visible_object_clip_is(clip);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_e_comp_visible_object_is(Evas_Object *obj, Evas_Coord x, Evas_Coord y, 
Evas_Coord w, Evas_Coord h)
+{
+   const char *type = evas_object_type_get(obj);
+   Evas_Coord xx, yy, ww, hh;
+
+   if (!type) return EINA_FALSE;
+   evas_object_geometry_get(obj, &xx, &yy, &ww, &hh);
+   if (E_INTERSECTS(x, y, w, h, xx, yy, ww, hh))
+     {
+        if ((evas_object_visible_get(obj))
+            && (!evas_object_clipees_get(obj))
+           )
+          {
+             int a;
+             
+             evas_object_color_get(obj, NULL, NULL, NULL, &a);
+             if (a > 0)
+               {
+                  if ((!strcmp(type, "rectangle")) ||
+                      (!strcmp(type, "image")) ||
+                      (!strcmp(type, "text")) ||
+                      (!strcmp(type, "textblock")) ||
+                      (!strcmp(type, "textgrid")) ||
+                      (!strcmp(type, "polygon")) ||
+                      (!strcmp(type, "line")))
+                    {
+                       if (evas_object_clip_get(obj))
+                         return _e_comp_visible_object_clip_is(obj);
+                       return EINA_TRUE;
+                    }
+                  else
+                    {
+                       Eina_List *children;
+                       
+                       if ((children = evas_object_smart_members_get(obj)))
+                         {
+                            Eina_List *l;
+                            Evas_Object *o;
+                            
+                            EINA_LIST_FOREACH(children, l, o)
+                              {
+                                 if (_e_comp_visible_object_is(o, x, y, w, h))
+                                   {
+                                      if (evas_object_clip_get(o))
+                                        {
+                                           children = eina_list_free(children);
+                                           return 
_e_comp_visible_object_clip_is(o);
+                                        }
+                                      children = eina_list_free(children);
+                                      return EINA_TRUE;
+                                   }
+                              }
+                            eina_list_free(children);
+                         }
+                    }
+               }
+          }
+     }
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_e_comp_visible_object_is_above(Evas_Object *obj, Evas_Coord x, Evas_Coord y, 
Evas_Coord w, Evas_Coord h)
+{
+   Evas_Object *above;
+   
+   for (above = evas_object_above_get(obj); above;
+        above = evas_object_above_get(above))
+     {
+        if (_e_comp_visible_object_is(above, x, y, w, h)) return EINA_TRUE;
+     }
+   return EINA_FALSE;
+}
+
 static E_Comp_Win *
 _e_comp_fullscreen_check(E_Comp *c)
 {
@@ -212,11 +302,25 @@ _e_comp_fullscreen_check(E_Comp *c)
           continue;
         if (!cw->bd) continue;
         if ((cw->x == 0) && (cw->y == 0) &&
-            ((cw->bd->client.w) >= c->man->w) &&
-            ((cw->bd->client.h) >= c->man->h) &&
+            ((cw->bd->client.w) == c->man->w) &&
+            ((cw->bd->client.h) == c->man->h) &&
+            (cw->bd->client_inset.l == 0) && (cw->bd->client_inset.r == 0) &&
+            (cw->bd->client_inset.t == 0) && (cw->bd->client_inset.b == 0) &&
             (!cw->argb) && (!cw->shaped) && (!cw->bg_win)
             )
           {
+             // check for objects above...
+             Evas_Object *parent = NULL, *o = NULL;
+
+             o = cw->obj;
+             do
+               {
+                  if (_e_comp_visible_object_is_above
+                      (o, 0, 0, c->man->w, c->man->h)) return NULL;
+                  parent = evas_object_smart_parent_get(o);
+                  if (parent) o = parent;
+               }
+             while (parent);
              return cw;
           }
         return NULL;

-- 

------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. Consolidate legacy IT systems to a single system of record for IT
2. Standardize and globalize service processes across IT
3. Implement zero-touch automation to replace manual, redundant tasks
http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk

Reply via email to