e_client/e_zone: support iconified_type for iconify by parent 64/297164/1 accepted/tizen/unified/20230816.170056
authorDoyoun Kang <doyoun.kang@samsung.com>
Thu, 10 Aug 2023 08:08:00 +0000 (17:08 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 11 Aug 2023 05:52:25 +0000 (14:52 +0900)
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
src/bin/e_client.h
src/bin/e_info_server.c
src/bin/e_zone.c

index 58ec043..6123b9d 100644 (file)
@@ -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);
index 5814514..38e9094 100644 (file)
@@ -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;
index d428e15..12aac43 100644 (file)
@@ -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;
index c2f308e..c14d411 100644 (file)
@@ -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;
                     }
                }
           }