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_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);
|
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"
|
#include "e_client.x"
|
||||||
#endif
|
#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);
|
ec->icccm.transient_for = ecore_x_icccm_transient_for_get(win);
|
||||||
if (ec->icccm.transient_for)
|
if (ec->icccm.transient_for)
|
||||||
ec_parent = _e_comp_x_client_find_by_window(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 ||
|
e_client_parent_set(ec, ec_parent);
|
||||||
(ec->parent->focused && (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))
|
if (ec->parent && (!e_client_util_ignored_get(ec)) && ec->netwm.state.modal)
|
||||||
ec->take_focus = 1;
|
_e_comp_x_client_modal_setup(ec);
|
||||||
}
|
|
||||||
if ((ec_parent) && (ec->e.state.stack != ECORE_X_STACK_NONE))
|
if ((ec_parent) && (ec->e.state.stack != ECORE_X_STACK_NONE))
|
||||||
{
|
{
|
||||||
E_Client *ec2;
|
E_Client *ec2;
|
||||||
|
|
Loading…
Reference in New Issue