discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=95a8fed0bf69bbcbe1f11e35be202cef4dc5c93b

commit 95a8fed0bf69bbcbe1f11e35be202cef4dc5c93b
Author: Mike Blumenkrantz <zm...@samsung.com>
Date:   Wed Apr 2 14:16:34 2014 -0400

    unify comp object stacking
    
    these were nearly identical, and sooner or later there was going to be an 
unfortunate c/p error
---
 src/bin/e_comp_object.c | 152 +++++++++++-------------------------------------
 1 file changed, 34 insertions(+), 118 deletions(-)

diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c
index 2101990..3face43 100644
--- a/src/bin/e_comp_object.c
+++ b/src/bin/e_comp_object.c
@@ -988,37 +988,38 @@ _e_comp_intercept_layer_set(void *data, Evas_Object *obj, 
int layer)
    e_comp_shape_queue(cw->comp);
 }
 
+typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
+
 static void
-_e_comp_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above)
+_e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, 
E_Comp_Object_Stack_Func stack_cb)
 {
-   E_Comp_Object *cw2 = NULL, *cw = data;
+   E_Comp_Object *cw2 = NULL;
    E_Client *ecstack;
    short layer;
-   Evas_Object *o = above;
+   Evas_Object *o = stack;
+   Eina_Bool raising = stack_cb == evas_object_stack_above;
 
-   EINA_SAFETY_ON_TRUE_RETURN(obj == above);
-   if (evas_object_below_get(obj) == above) return;
    if (cw->ec->layer_block)
      {
         /* obey compositor effects! */
-        if (cw->ec->layer == evas_object_layer_get(obj))
-          evas_object_data_set(obj, "client_restack", (void*)1);
-        evas_object_stack_above(obj, above);
-        if (cw->ec->layer == evas_object_layer_get(obj))
-          evas_object_data_del(obj, "client_restack");
+        if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
+          evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
+        stack_cb(cw->smart_obj, stack);
+        if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
+          evas_object_data_del(cw->smart_obj, "client_restack");
         return;
      }
    /* assume someone knew what they were doing during client init */
    if (cw->ec->new_client)
      layer = cw->ec->layer;
    else
-     layer = evas_object_layer_get(above);
+     layer = evas_object_layer_get(stack);
    ecstack = e_client_below_get(cw->ec);
    if (layer != e_comp_canvas_layer_map_to(cw->layer))
      {
         /* some FOOL is trying to restack a layer marker */
-        if (obj == cw->comp->layers[cw->layer].obj) return;
-        evas_object_layer_set(obj, layer);
+        if (cw->smart_obj == cw->comp->layers[cw->layer].obj) return;
+        evas_object_layer_set(cw->smart_obj, layer);
         /* we got our layer wrangled, return now! */
         if (layer != e_comp_canvas_layer_map_to(cw->layer)) return;
      }
@@ -1038,7 +1039,7 @@ _e_comp_intercept_stack_above(void *data, Evas_Object 
*obj, Evas_Object *above)
          * - find a stacking client
          */
         o = evas_object_above_get(o);
-        if ((!o) || (o == obj)) break;
+        if ((!o) || (o == cw->smart_obj)) break;
         if (evas_object_layer_get(o) != layer)
           {
              /* reached the top client layer somehow
@@ -1066,128 +1067,43 @@ _e_comp_intercept_stack_above(void *data, Evas_Object 
*obj, Evas_Object *above)
    _e_comp_object_layers_remove(cw);
    if (cw2)
      {
-        if (o == above)
-          _e_comp_object_layers_add(cw, cw2, NULL, 0);
-        else if (o == obj)
-          _e_comp_object_layers_add(cw, NULL, NULL, 0);
-        else
-          _e_comp_object_layers_add(cw, NULL, cw2, 0);
+        if (o == stack) //if stacking above, cw2 is above; else cw2 is below
+          _e_comp_object_layers_add(cw, raising ? cw2 : NULL, raising ? NULL : 
cw2, 0);
+        else if (o == cw->smart_obj) //prepend (lower) if not stacking above
+          _e_comp_object_layers_add(cw, NULL, NULL, !raising);
+        else //if no stacking objects found, either raise or lower
+          _e_comp_object_layers_add(cw, raising ? NULL : cw2, raising ? cw2 : 
NULL, 0);
      }
    else
      _e_comp_object_layers_add(cw, NULL, NULL, 0);
    /* set restack if stacking has changed */
    if (cw->ec->new_client || (ecstack->frame != o))
-     evas_object_data_set(obj, "client_restack", (void*)1);
-   evas_object_stack_above(obj, above);
+     evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
+   stack_cb(cw->smart_obj, stack);
    if (cw->comp->layers[cw->layer].obj)
-     if (evas_object_below_get(obj) == cw->comp->layers[cw->layer].obj)
+     if (evas_object_below_get(cw->smart_obj) == 
cw->comp->layers[cw->layer].obj)
        {
           CRI("STACKING ERROR!!!");
        }
    if (cw->ec->new_client || (ecstack->frame != o))
-     evas_object_data_del(obj, "client_restack");
+     evas_object_data_del(cw->smart_obj, "client_restack");
    e_comp_shape_queue(cw->comp);
 }
 
 static void
-_e_comp_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below)
+_e_comp_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above)
 {
-   E_Comp_Object *cw2 = NULL, *cw = data;
-   E_Client *ecstack;
-   short layer;
-   Evas_Object *o = below;
+   EINA_SAFETY_ON_TRUE_RETURN(obj == above);
+   if (evas_object_below_get(obj) == above) return;
+   _e_comp_intercept_stack_helper(data, above, evas_object_stack_above);
+}
 
+static void
+_e_comp_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below)
+{
    EINA_SAFETY_ON_TRUE_RETURN(obj == below);
    if (evas_object_above_get(obj) == below) return;
-   if (cw->ec->layer_block)
-     {
-        /* obey compositor effects! */
-        if (cw->ec->layer == evas_object_layer_get(obj))
-          evas_object_data_set(obj, "client_restack", (void*)1);
-        evas_object_stack_below(obj, below);
-        if (cw->ec->layer == evas_object_layer_get(obj))
-          evas_object_data_del(obj, "client_restack");
-        return;
-     }
-   /* assume someone knew what they were doing during client init */
-   if (cw->ec->new_client)
-     layer = cw->ec->layer;
-   else
-     layer = evas_object_layer_get(below);
-   ecstack = e_client_below_get(cw->ec);
-   if (layer != e_comp_canvas_layer_map_to(cw->layer))
-     {
-        /* some FOOL is trying to restack a layer marker */
-        if (obj == cw->comp->layers[cw->layer].obj) return;
-        evas_object_layer_set(obj, layer);
-        /* we got our layer wrangled, return now! */
-        if (layer != e_comp_canvas_layer_map_to(cw->layer)) return;
-     }
-
-   /* check if we're stacking below another client */
-   cw2 = evas_object_data_get(o, "comp_obj");
-   while (!cw2)
-     {
-        /* check for non-client layer object */
-        if (!e_util_strcmp(evas_object_name_get(o), "layer_obj"))
-          break;
-        /* find an existing client to use for layering
-         * by walking up the object stack
-         *
-         * this is guaranteed to be pretty quick since we'll either:
-         * - run out of client layers
-         * - find a stacking client
-         */
-        o = evas_object_above_get(o);
-        if ((!o) || (o == obj)) break;
-        if (evas_object_layer_get(o) != layer)
-          {
-             /* reached the top client layer somehow
-              * use top client object
-              */
-             o = 
cw->comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_PRIO)].obj;
-          }
-        if (!o)
-          /* top client layer window hasn't been stacked yet. this probably 
shouldn't happen?
-           * return here since the top client layer window 
-           */
-          {
-             E_Client *ec;
-
-             ec = e_client_top_get(cw->comp);
-             if (ec)
-               o = ec->frame;
-             //else //wat
-          }
-        if (o) cw2 = evas_object_data_get(o, "comp_obj");
-     }
-
-
-   /* remove existing layers */
-   _e_comp_object_layers_remove(cw);
-   if (cw2)
-     {
-        if (o == below)
-          _e_comp_object_layers_add(cw, NULL, cw2, 0);
-        else if (o == obj)
-          _e_comp_object_layers_add(cw, NULL, NULL, 1);
-        else
-          _e_comp_object_layers_add(cw, cw2, NULL, 0);
-     }
-   else
-     _e_comp_object_layers_add(cw, NULL, NULL, 0);
-   /* set restack if stacking has changed */
-   if (cw->ec->new_client || (ecstack->frame != o))
-     evas_object_data_set(obj, "client_restack", (void*)1);
-   evas_object_stack_below(obj, below);
-   if (cw->comp->layers[cw->layer].obj)
-     if (evas_object_below_get(obj) == cw->comp->layers[cw->layer].obj)
-       {
-          CRI("STACKING ERROR!!!");
-       }
-   if (cw->ec->new_client || (ecstack->frame != o))
-     evas_object_data_del(obj, "client_restack");
-   e_comp_shape_queue(cw->comp);
+   _e_comp_intercept_stack_helper(data, below, evas_object_stack_below);
 }
 
 static void

-- 


Reply via email to