From 84f7106a436c5df2d3e7ba54de78ce9fc20d3602 Mon Sep 17 00:00:00 2001 From: Doyoun Kang Date: Thu, 10 Aug 2023 17:08:00 +0900 Subject: [PATCH] e_client/e_zone: support iconified_type for iconify by parent We add a new iconified type - E_ICONIFIED_TYPE_PARENT_ICONIFY_BY_CLIENT. If the transient parent is iconified by client request, then the children are iconified also and the iconified_type is set to this type. FYI, however, if the transient parent is iconified by visibility, then the children are not iconified. Change-Id: I3afa825bfe3e8cc566519928e3d9d78423a67671 --- src/bin/e_client.c | 32 +++++++++++++++++++++++++++++--- src/bin/e_client.h | 1 + src/bin/e_info_server.c | 24 ++++++++++++++---------- src/bin/e_zone.c | 6 ++++-- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/bin/e_client.c b/src/bin/e_client.c index 58ec043..6123b9d 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -5737,7 +5737,18 @@ e_client_unfullscreen(E_Client *ec) } /////////////////////////////////////// +static Eina_Bool +_e_client_is_parent_iconify_by_client(E_Client *ec) +{ + E_Client *parent = ec->parent; + if (!parent) return EINA_FALSE; + if ((parent->exp_iconify.type == E_ICONIFIED_TYPE_ICONIFY_BY_CLIENT) || + (parent->exp_iconify.type == E_ICONIFIED_TYPE_PARENT_ICONIFY_BY_CLIENT)) + return EINA_TRUE; + + return EINA_FALSE; +} E_API void e_client_iconify(E_Client *ec) @@ -5790,7 +5801,16 @@ e_client_iconify(E_Client *ec) Eina_List *list = eina_list_clone(ec->transients); EINA_LIST_FREE(list, child) - e_client_iconify(child); + { + if ((child->exp_iconify.type != E_ICONIFIED_TYPE_ICONIFY_BY_CLIENT) && + (_e_client_is_parent_iconify_by_client(child))) + { + e_client_iconified_type_set(child, E_ICONIFIED_TYPE_PARENT_ICONIFY_BY_CLIENT); + child->exp_iconify.by_client = 1; + e_policy_client_iconic_state_change_send(child, 1); + } + e_client_iconify(child); + } } _e_client_hook_call(E_CLIENT_HOOK_ICONIFY, ec); @@ -5825,6 +5845,9 @@ e_client_uniconify(E_Client *ec) e_client_desk_set(ec, desk); not_raise = ec->exp_iconify.not_raise; + ec->exp_iconify.by_client = 0; + e_client_iconified_type_set(ec, E_ICONIFIED_TYPE_NONE); + if (e_config->transient.iconify) { E_Client *child; @@ -5895,6 +5918,8 @@ e_client_uniconify(E_Client *ec) { if (e_client_transient_policy_get(child) == E_TRANSIENT_ABOVE) { + if (child->exp_iconify.type == E_ICONIFIED_TYPE_PARENT_ICONIFY_BY_CLIENT) + e_policy_client_iconic_state_change_send(child, 0); child->exp_iconify.not_raise = not_raise; e_client_uniconify(child); } @@ -5904,8 +5929,6 @@ e_client_uniconify(E_Client *ec) _e_client_hook_call(E_CLIENT_HOOK_UNICONIFY, ec); ec->exp_iconify.not_raise = 0; - ec->exp_iconify.by_client = 0; - e_client_iconified_type_set(ec, E_ICONIFIED_TYPE_NONE); TRACE_DS_END(); } @@ -5934,6 +5957,9 @@ E_API Eina_Bool e_client_is_iconified_by_client(E_Client *ec) if (ec->exp_iconify.type == E_ICONIFIED_TYPE_DESK_ICONIFY_BY_CLIENT) return EINA_TRUE; + if (ec->exp_iconify.type == E_ICONIFIED_TYPE_PARENT_ICONIFY_BY_CLIENT) + return EINA_TRUE; + if (ec->exp_iconify.by_client) { ELOGF("POL", "CHECK. mismatch value. by_client:%d, type:%d", ec, ec->exp_iconify.by_client, ec->exp_iconify.type); diff --git a/src/bin/e_client.h b/src/bin/e_client.h index 5814514..38e9094 100644 --- a/src/bin/e_client.h +++ b/src/bin/e_client.h @@ -212,6 +212,7 @@ typedef enum _E_Iconified_Type E_ICONIFIED_TYPE_VISIBILITY = 1, // iconified by visibility E_ICONIFIED_TYPE_ICONIFY_BY_CLIENT = 2, // iconified by iconify request E_ICONIFIED_TYPE_DESK_ICONIFY_BY_CLIENT = 3, // iconified by iconify all windows in the desk request + E_ICONIFIED_TYPE_PARENT_ICONIFY_BY_CLIENT = 4, // iconified by parent's iconify request } E_Iconified_Type; typedef struct E_Client E_Client; diff --git a/src/bin/e_info_server.c b/src/bin/e_info_server.c index d428e15..12aac43 100644 --- a/src/bin/e_info_server.c +++ b/src/bin/e_info_server.c @@ -330,12 +330,14 @@ _msg_ecs_append(Eldbus_Message_Iter *iter, Eina_Bool is_visible) if (ec->iconic) { iconified_type = e_client_iconified_type_get(ec); - if (iconified_type == E_ICONIFIED_TYPE_ICONIFY_BY_CLIENT) - iconified = 2; - else if (iconified_type == E_ICONIFIED_TYPE_DESK_ICONIFY_BY_CLIENT) - iconified = 3; + if (iconified_type == 0) + { + // if iconified_type is 0, then there is code not to set iconify_type + // before calling e_client_iconify. We have to find and fix it. + iconified = -1; + } else - iconified = 1; + iconified = iconified_type; } else iconified = 0; @@ -432,12 +434,14 @@ _msg_clients_append(Eldbus_Message_Iter *iter, Eina_Bool is_visible) if (ec->iconic) { iconified_type = e_client_iconified_type_get(ec); - if (iconified_type == E_ICONIFIED_TYPE_ICONIFY_BY_CLIENT) - iconified = 2; - else if (iconified_type == E_ICONIFIED_TYPE_DESK_ICONIFY_BY_CLIENT) - iconified = 3; + if (iconified_type == 0) + { + // if iconified_type is 0, then there is code not to set iconify_type + // before calling e_client_iconify. We have to find and fix it. + iconified = -1; + } else - iconified = 1; + iconified = iconified_type; } else iconified = 0; diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c index c2f308e..c14d411 100644 --- a/src/bin/e_zone.c +++ b/src/bin/e_zone.c @@ -1463,7 +1463,7 @@ e_zone_visibility_calculate(E_Zone *zone) else if (ec->show_pending.count > 0) { calc_region = EINA_FALSE; - calc_skip_type |= 0x40; + calc_skip_type |= 0x100; skip_by_pending_show = 2; } else @@ -1492,6 +1492,8 @@ e_zone_visibility_calculate(E_Zone *zone) if (iconified_type == E_ICONIFIED_TYPE_ICONIFY_BY_CLIENT) calc_skip_type |= 0x10; else if (iconified_type == E_ICONIFIED_TYPE_DESK_ICONIFY_BY_CLIENT) + calc_skip_type |= 0x20; + else if (iconified_type == E_ICONIFIED_TYPE_PARENT_ICONIFY_BY_CLIENT) calc_skip_type |= 0x40; else { @@ -1506,7 +1508,7 @@ e_zone_visibility_calculate(E_Zone *zone) { EC_IS_NOT_VISIBLE continue; calc_region = EINA_FALSE; - calc_skip_type |= 0x20; + calc_skip_type |= 0x200; } } } -- 2.7.4