simplify stacking rules to be a bit dumber so stacking works better

fixes T8652
This commit is contained in:
Carsten Haitzler 2020-04-12 16:50:26 +01:00
parent 2f27fe1430
commit 2f52f093b6
1 changed files with 45 additions and 19 deletions

View File

@ -2941,6 +2941,7 @@ e_client_desk_set(E_Client *ec, E_Desk *desk)
EINA_LIST_FOREACH(ec->transients, l, child)
e_client_desk_set(child, ec->desk);
e_client_transients_restack(ec);
}
}
@ -5705,7 +5706,7 @@ e_client_layout_cb_set(E_Client_Layout_Cb cb)
E_API void
e_client_parent_set(E_Client *ec, E_Client *parent)
{
E_Client *prev;
// E_Client *prev;
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
@ -5738,7 +5739,7 @@ e_client_parent_set(E_Client *ec, E_Client *parent)
}
if (parent)
{
prev = eina_list_last_data_get(parent->transients);
// prev = eina_list_last_data_get(parent->transients);
parent->transients = eina_list_append(parent->transients, ec);
ec->parent = parent;
}
@ -5746,10 +5747,15 @@ e_client_parent_set(E_Client *ec, E_Client *parent)
{
evas_object_layer_set(ec->frame, ec->parent->layer);
/* complex stacking right above one dialog after the other hurts the
* simple assumptions that the window should be on top by clients so
* be dumber and disable this
if (prev)
evas_object_stack_above(ec->frame, prev->frame);
else
evas_object_stack_above(ec->frame, parent->frame);
*/
evas_object_raise(ec->frame);
if (e_client_util_ignored_get(ec)) return;
if (e_pixmap_usable_get(ec->pixmap) && (!ec->lock_user_location))
@ -5761,11 +5767,46 @@ e_client_parent_set(E_Client *ec, E_Client *parent)
}
}
static void
_e_client_stack_top(E_Client *ec_base EINA_UNUSED,
E_Client *ec_stack, E_Client *ec_above)
{
/* complex stacking right above one dialog after the other hurts the
* simple assumptions that the window should be on top by clients so
* be dumber and disable this
if (!ec_above)
{
evas_object_raise(ec_stack->frame);
evas_object_stack_above(ec_base->frame, ec_stack->frame);
}
else
{
if (ec_above->transients)
{
e_client_transients_restack(ec_above);
E_Client *ec_last = eina_list_last_data_get(ec_above->transients);
if (ec_last)
evas_object_stack_above(ec_stack->frame, ec_last->frame);
else
evas_object_stack_above(ec_stack->frame, ec_above->frame);
}
else
evas_object_stack_above(ec_stack->frame, ec_above->frame);
}
*/
if (!ec_above) evas_object_raise(ec_stack->frame);
else
{
if (ec_above->transients) e_client_transients_restack(ec_above);
evas_object_raise(ec_stack->frame);
}
}
E_API void
e_client_transients_restack(E_Client *ec)
{
E_Client *child, *below = NULL;
Eina_List *list;
E_Client *child, *below = NULL, *last;
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
@ -5777,22 +5818,7 @@ e_client_transients_restack(E_Client *ec)
// Don't stack iconic transients. If the user wants these shown,
// that's another option.
if (child->iconic) continue;
if (below)
{
if (below->transients)
{
e_client_transients_restack(below);
last = eina_list_last_data_get(below->transients);
if (last)
evas_object_stack_above(child->frame, last->frame);
else
evas_object_stack_above(child->frame, below->frame);
}
else
evas_object_stack_above(child->frame, below->frame);
}
else
evas_object_stack_above(child->frame, ec->frame);
_e_client_stack_top(ec, child, below);
below = child;
}
}