unify comp object stacking

these were nearly identical, and sooner or later there was going to be an unfortunate c/p error
This commit is contained in:
Mike Blumenkrantz 2014-04-02 14:16:34 -04:00
parent cfe26ff838
commit 95a8fed0bf
1 changed files with 34 additions and 118 deletions

View File

@ -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_above(void *data, Evas_Object *obj, Evas_Object *above)
{
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)
{
E_Comp_Object *cw2 = NULL, *cw = data;
E_Client *ecstack;
short layer;
Evas_Object *o = 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