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:
parent
cfe26ff838
commit
95a8fed0bf
|
@ -988,37 +988,38 @@ _e_comp_intercept_layer_set(void *data, Evas_Object *obj, int layer)
|
||||||
e_comp_shape_queue(cw->comp);
|
e_comp_shape_queue(cw->comp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
|
||||||
|
|
||||||
static void
|
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;
|
E_Client *ecstack;
|
||||||
short layer;
|
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)
|
if (cw->ec->layer_block)
|
||||||
{
|
{
|
||||||
/* obey compositor effects! */
|
/* obey compositor effects! */
|
||||||
if (cw->ec->layer == evas_object_layer_get(obj))
|
if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
|
||||||
evas_object_data_set(obj, "client_restack", (void*)1);
|
evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
|
||||||
evas_object_stack_above(obj, above);
|
stack_cb(cw->smart_obj, stack);
|
||||||
if (cw->ec->layer == evas_object_layer_get(obj))
|
if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
|
||||||
evas_object_data_del(obj, "client_restack");
|
evas_object_data_del(cw->smart_obj, "client_restack");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* assume someone knew what they were doing during client init */
|
/* assume someone knew what they were doing during client init */
|
||||||
if (cw->ec->new_client)
|
if (cw->ec->new_client)
|
||||||
layer = cw->ec->layer;
|
layer = cw->ec->layer;
|
||||||
else
|
else
|
||||||
layer = evas_object_layer_get(above);
|
layer = evas_object_layer_get(stack);
|
||||||
ecstack = e_client_below_get(cw->ec);
|
ecstack = e_client_below_get(cw->ec);
|
||||||
if (layer != e_comp_canvas_layer_map_to(cw->layer))
|
if (layer != e_comp_canvas_layer_map_to(cw->layer))
|
||||||
{
|
{
|
||||||
/* some FOOL is trying to restack a layer marker */
|
/* some FOOL is trying to restack a layer marker */
|
||||||
if (obj == cw->comp->layers[cw->layer].obj) return;
|
if (cw->smart_obj == cw->comp->layers[cw->layer].obj) return;
|
||||||
evas_object_layer_set(obj, layer);
|
evas_object_layer_set(cw->smart_obj, layer);
|
||||||
/* we got our layer wrangled, return now! */
|
/* we got our layer wrangled, return now! */
|
||||||
if (layer != e_comp_canvas_layer_map_to(cw->layer)) return;
|
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
|
* - find a stacking client
|
||||||
*/
|
*/
|
||||||
o = evas_object_above_get(o);
|
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)
|
if (evas_object_layer_get(o) != layer)
|
||||||
{
|
{
|
||||||
/* reached the top client layer somehow
|
/* 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);
|
_e_comp_object_layers_remove(cw);
|
||||||
if (cw2)
|
if (cw2)
|
||||||
{
|
{
|
||||||
if (o == above)
|
if (o == stack) //if stacking above, cw2 is above; else cw2 is below
|
||||||
_e_comp_object_layers_add(cw, cw2, NULL, 0);
|
_e_comp_object_layers_add(cw, raising ? cw2 : NULL, raising ? NULL : cw2, 0);
|
||||||
else if (o == obj)
|
else if (o == cw->smart_obj) //prepend (lower) if not stacking above
|
||||||
_e_comp_object_layers_add(cw, NULL, NULL, 0);
|
_e_comp_object_layers_add(cw, NULL, NULL, !raising);
|
||||||
else
|
else //if no stacking objects found, either raise or lower
|
||||||
_e_comp_object_layers_add(cw, NULL, cw2, 0);
|
_e_comp_object_layers_add(cw, raising ? NULL : cw2, raising ? cw2 : NULL, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_e_comp_object_layers_add(cw, NULL, NULL, 0);
|
_e_comp_object_layers_add(cw, NULL, NULL, 0);
|
||||||
/* set restack if stacking has changed */
|
/* set restack if stacking has changed */
|
||||||
if (cw->ec->new_client || (ecstack->frame != o))
|
if (cw->ec->new_client || (ecstack->frame != o))
|
||||||
evas_object_data_set(obj, "client_restack", (void*)1);
|
evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
|
||||||
evas_object_stack_above(obj, above);
|
stack_cb(cw->smart_obj, stack);
|
||||||
if (cw->comp->layers[cw->layer].obj)
|
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!!!");
|
CRI("STACKING ERROR!!!");
|
||||||
}
|
}
|
||||||
if (cw->ec->new_client || (ecstack->frame != o))
|
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);
|
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
|
static void
|
||||||
_e_comp_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below)
|
_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);
|
EINA_SAFETY_ON_TRUE_RETURN(obj == below);
|
||||||
if (evas_object_above_get(obj) == below) return;
|
if (evas_object_above_get(obj) == below) return;
|
||||||
if (cw->ec->layer_block)
|
_e_comp_intercept_stack_helper(data, below, evas_object_stack_below);
|
||||||
{
|
|
||||||
/* 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue