EINTERN void
e_shell_e_client_parent_set(E_Client *ec, struct wl_resource *parent_resource)
{
- E_Client *pc;
+ E_Client *pc, *child;
Ecore_Window pwin = 0;
+ Eina_List *dup_transients = NULL;
EINA_SAFETY_ON_NULL_RETURN(ec);
ec->parent = pc;
}
+ dup_transients = eina_list_clone(pc->transients);
+ EINA_LIST_FREE(dup_transients, child)
+ {
+ if (child->transient_for_always_on_top)
+ {
+ pc->transients = eina_list_remove(pc->transients, child);
+ pc->transients = eina_list_append(pc->transients, child);
+ }
+ }
+
ec->icccm.fetch.transient_for = EINA_TRUE;
ec->icccm.transient_for = pwin;
}
break;
}
if ((top != ec) && (eina_list_data_find(ec->parent->transients, top)))
- break;
+ {
+ if (top->transient_for_always_on_top)
+ {
+ if (e_policy_client_is_keyboard(ec) ||
+ e_policy_client_is_keyboard_sub(ec))
+ break;
+ else
+ {
+ top = e_client_below_get(top);
+ continue;
+ }
+ }
+ else
+ break;
+ }
if (_e_policy_stack_transient_for_check_descendant(top, ec->parent))
break;
void
e_policy_stack_transient_for_set(E_Client *ec, E_Client *parent)
{
+ E_Client *child = NULL;
E_Policy_Stack *ps;
Ecore_Window pwin = 0;
+ Eina_List *dup_transients = NULL;
EINA_SAFETY_ON_NULL_RETURN(ec);
ec->parent = parent;
}
+ dup_transients = eina_list_clone(ec->parent->transients);
+ EINA_LIST_FREE(dup_transients, child)
+ {
+ if (child->transient_for_always_on_top)
+ {
+ ec->parent->transients = eina_list_remove(ec->parent->transients, child);
+ ec->parent->transients = eina_list_append(ec->parent->transients, child);
+ }
+ }
+
ec->icccm.fetch.transient_for = EINA_TRUE;
ec->icccm.transient_for = pwin;