forked from enlightenment/enlightenment
break out code to set clients as transients for a parent
This commit is contained in:
parent
84f06597ec
commit
d1bb23954f
|
@ -5530,3 +5530,51 @@ e_client_layout_cb_set(E_Client_Layout_Cb cb)
|
|||
_e_client_layout_cb = cb;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////
|
||||
|
||||
E_API void
|
||||
e_client_parent_set(E_Client *ec, E_Client *parent)
|
||||
{
|
||||
E_OBJECT_CHECK(ec);
|
||||
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
|
||||
if (parent)
|
||||
{
|
||||
E_OBJECT_CHECK(parent);
|
||||
E_OBJECT_TYPE_CHECK(parent, E_CLIENT_TYPE);
|
||||
}
|
||||
|
||||
if (ec == parent)
|
||||
{
|
||||
ERR("refusing to set client as its own parent");
|
||||
return;
|
||||
}
|
||||
|
||||
if (parent && (parent->parent == ec))
|
||||
{
|
||||
ERR("refusing to set client as its parent's parent");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ec->parent == parent) return;
|
||||
|
||||
/* If we already have a parent, remove it */
|
||||
if (ec->parent)
|
||||
{
|
||||
ec->parent->transients = eina_list_remove(ec->parent->transients, ec);
|
||||
if (ec->parent->modal == ec) ec->parent->modal = NULL;
|
||||
ec->parent = NULL;
|
||||
}
|
||||
if (parent)
|
||||
{
|
||||
parent->transients = eina_list_append(parent->transients, ec);
|
||||
ec->parent = parent;
|
||||
}
|
||||
if (ec->parent && (!e_client_util_ignored_get(ec)))
|
||||
{
|
||||
evas_object_layer_set(ec->frame, ec->parent->layer);
|
||||
|
||||
if ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
|
||||
(ec->parent->focused && (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))
|
||||
ec->take_focus = 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -860,5 +860,6 @@ E_API Eina_Bool e_client_stack_urgent_get(E_Client *ec);
|
|||
|
||||
YOLO E_API void e_client_focus_stack_set(Eina_List *l);
|
||||
|
||||
E_API void e_client_parent_set(E_Client *ec, E_Client *parent);
|
||||
#include "e_client.x"
|
||||
#endif
|
||||
|
|
|
@ -3826,34 +3826,10 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec)
|
|||
ec->icccm.transient_for = ecore_x_icccm_transient_for_get(win);
|
||||
if (ec->icccm.transient_for)
|
||||
ec_parent = _e_comp_x_client_find_by_window(ec->icccm.transient_for);
|
||||
/* If we already have a parent, remove it */
|
||||
if (ec->parent)
|
||||
{
|
||||
if (ec_parent != ec->parent)
|
||||
{
|
||||
ec->parent->transients = eina_list_remove(ec->parent->transients, ec);
|
||||
if (ec->parent->modal == ec) ec->parent->modal = NULL;
|
||||
ec->parent = NULL;
|
||||
}
|
||||
else
|
||||
ec_parent = NULL;
|
||||
}
|
||||
if ((ec_parent) && (ec_parent != ec) &&
|
||||
(eina_list_data_find(ec->transients, ec_parent) != ec_parent))
|
||||
{
|
||||
ec_parent->transients = eina_list_append(ec_parent->transients, ec);
|
||||
ec->parent = ec_parent;
|
||||
}
|
||||
if (ec->parent && (!e_client_util_ignored_get(ec)))
|
||||
{
|
||||
evas_object_layer_set(ec->frame, ec->parent->layer);
|
||||
if (ec->netwm.state.modal)
|
||||
_e_comp_x_client_modal_setup(ec);
|
||||
|
||||
if (e_config->focus_setting == E_FOCUS_NEW_DIALOG ||
|
||||
(ec->parent->focused && (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))
|
||||
ec->take_focus = 1;
|
||||
}
|
||||
e_client_parent_set(ec, ec_parent);
|
||||
if (ec->parent && (!e_client_util_ignored_get(ec)) && ec->netwm.state.modal)
|
||||
_e_comp_x_client_modal_setup(ec);
|
||||
if ((ec_parent) && (ec->e.state.stack != ECORE_X_STACK_NONE))
|
||||
{
|
||||
E_Client *ec2;
|
||||
|
|
Loading…
Reference in New Issue