add a bg_state value in E_Client to handle background state 70/193670/1 accepted/tizen/5.0/unified/20181126.062042 submit/tizen_5.0/20181123.035305
authorDoyoun Kang <doyoun.kang@samsung.com>
Fri, 23 Nov 2018 03:07:22 +0000 (12:07 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Fri, 23 Nov 2018 03:14:35 +0000 (12:14 +0900)
There was a bug that the visibility was changed to fully-obscured <-> un-obsucred continuously
when an application set a background state.
This patch fixes this bug.

Change-Id: I43f3486e02b7fb9fe30d68d5e09f5fc06269b4b8

src/bin/e_client.c
src/bin/e_client.h
src/bin/e_comp_wl_rsm.c
src/bin/e_policy.c
src/bin/e_policy_stack.c
src/bin/e_policy_visibility.c
src/bin/e_policy_wl.c

index ecc2aac63e2e95e9ed67784e7e60e5b95db87bc6..5237ce674868e88365f497eefaef3b61cca96f0b 100644 (file)
@@ -3190,6 +3190,13 @@ _e_client_visibility_zone_calculate(E_Zone *zone, Eina_Bool check_focus)
                             calc_skip_type |= 0x10;
                          }
                     }
+
+                  if (ec->bg_state)
+                    {
+                       EC_IS_NOT_VISIBLE continue;
+                       calc_region = EINA_FALSE;
+                       calc_skip_type |= 0x20;
+                    }
                }
           }
 
@@ -3267,6 +3274,7 @@ _e_client_visibility_zone_calculate(E_Zone *zone, Eina_Bool check_focus)
               */
              if ((!skip_rot_pending_show) ||
                  (ec->visibility.force_obscured) ||
+                 (ec->bg_state) ||
                  (ec->exp_iconify.by_client))
                {
                   /* obscured case */
index d2c44379944ed5e44be3fe25649f0b1f7617639b..5b24ad0fcb3a11c73a67baf099b762671e174135 100644 (file)
@@ -933,6 +933,7 @@ struct E_Client
 
    Eina_Bool launching : 1;
    Eina_Bool extra_animating : 1;
+   Eina_Bool bg_state : 1;
 
    struct
    {
index 004ddbacaee810994fa64437f4deecb0134b86c3..bb14c0781b87858eba094e78e61cf81f7cb0e4cc 100644 (file)
@@ -1550,6 +1550,9 @@ _remote_source_child_data_check(Thread_Data *td)
         if (child_ec->iconic && child_ec->exp_iconify.by_client)
           continue;
 
+        if (child_ec->bg_state)
+          continue;
+
         if (!e_policy_client_is_keyboard(child_ec))
           continue;
 
index 65f84acb127fc5ac563c9adb1d5808dcdc9cb950..864faab32e768b35abf4d9481234f01bd9162291 100644 (file)
@@ -918,6 +918,7 @@ _e_policy_cb_hook_client_visibility(void *d EINA_UNUSED, E_Client *ec)
                        if (above_ec->exp_iconify.by_client) continue;
                        if (above_ec->exp_iconify.skip_iconify) continue;
                        if (above_ec->exp_iconify.skip_by_remote) continue;
+                       if (above_ec->bg_state) continue;
 
                        if (above_ec->argb)
                          {
@@ -959,6 +960,7 @@ _e_policy_cb_hook_client_visibility(void *d EINA_UNUSED, E_Client *ec)
                {
                   if (e_client_util_ignored_get(ec)) return;
                   if (ec->exp_iconify.by_client) return;
+                  if (ec->bg_state) return;
                   if (ec->exp_iconify.skip_iconify) return;
                   if (ec->exp_iconify.skip_by_remote) return;
                   if (!ec->iconic)
index 6c3d4787257dd6a0b3912d6d842578ca2380fd5f..32f76c41ff8548dc2ce831038d4e5493b445a472 100644 (file)
@@ -471,6 +471,7 @@ e_policy_stack_clients_restack_above_lockscreen(E_Client *ec_lock, Eina_Bool sho
              if (!passed_new_lock) continue;
              if (e_policy_client_is_lockscreen(ec)) continue;
              if (ec->exp_iconify.by_client) continue;
+             if (ec->bg_state) continue;
 
              if (ec->changable_layer[E_CHANGABLE_LAYER_TYPE_ABOVE_NOTIFICATION].set)
                {
index d40bb6daf7c4a85cff487ccd12875fbdc3925a4e..757225f614a7aa2e062dbced5e64a25b73418d17 100644 (file)
@@ -260,6 +260,7 @@ _e_policy_client_iconify_by_visibility(E_Client *ec)
    if (!ec) return;
    if (ec->iconic) return;
    if (ec->exp_iconify.by_client) return;
+   if (ec->bg_state) return;
    if (ec->exp_iconify.skip_iconify) return;
    if (ec->exp_iconify.skip_by_remote) return;
 
@@ -329,6 +330,7 @@ _e_policy_client_ancestor_uniconify(E_Client *ec)
    if (e_object_is_del(E_OBJECT(ec))) return;
    if (!ec->iconic) return;
    if (ec->exp_iconify.by_client) return;
+   if (ec->bg_state) return;
    if (ec->exp_iconify.skip_iconify) return;
    if (ec->exp_iconify.skip_by_remote) return;
 
@@ -345,6 +347,7 @@ _e_policy_client_ancestor_uniconify(E_Client *ec)
         if (e_object_is_del(E_OBJECT(parent))) break;
         if (!parent->iconic) break;
         if (parent->exp_iconify.by_client) break;
+        if (parent->bg_state) break;
         if (parent->exp_iconify.skip_iconify) break;
         if (parent->exp_iconify.skip_by_remote) break;
 
@@ -415,6 +418,7 @@ _e_policy_client_uniconify_by_visibility(E_Client *ec)
    if (e_object_is_del(E_OBJECT(ec))) return;
    if (!ec->iconic) return;
    if (ec->exp_iconify.by_client) return;
+   if (ec->bg_state) return;
    if (ec->exp_iconify.skip_iconify) return;
    if (ec->exp_iconify.skip_by_remote) return;
 
@@ -1236,6 +1240,7 @@ _e_vis_client_check_obscured_by_same_layer(E_Client *ec)
         if (e_client_util_ignored_get(above)) continue;
         if (e_object_is_del(E_OBJECT(above))) continue;
         if (above->iconic && above->exp_iconify.by_client) continue;
+        if (above->bg_state) continue;
         if (above->comp_data && !above->comp_data->mapped) continue;
         if (!E_CONTAINS(above->x, above->y, above->w, above->h, ec->x, ec->y, ec->w, ec->h)) continue;
 
@@ -1275,6 +1280,7 @@ _e_vis_client_check_obscured_by_above_layers(E_Client *ec)
         if (e_client_util_ignored_get(above)) continue;
         if (e_object_is_del(E_OBJECT(above))) continue;
         if (above->iconic && above->exp_iconify.by_client) continue;
+        if (above->bg_state) continue;
         if (above->comp_data && !above->comp_data->mapped) continue;
         if (!E_CONTAINS(above->x, above->y, above->w, above->h, ec->x, ec->y, ec->w, ec->h)) continue;
 
@@ -1466,6 +1472,8 @@ _e_vis_ec_activity_check(E_Client *ec, Eina_Bool check_alpha)
    if (check_mapped && ec->comp_data && !ec->comp_data->mapped) return EINA_FALSE;
    /* check iconify window by client */
    if ((ec->iconic) && (ec->exp_iconify.by_client)) return EINA_FALSE;
+   /* check background state */
+   if (ec->bg_state) return EINA_FALSE;
    /* check special client */
    if (_e_vis_ec_special_check(ec)) return EINA_FALSE;
    /* check if full screen */
@@ -1584,6 +1592,9 @@ _e_vis_ec_above_visible_type(E_Client *ec, Eina_Bool check_child)
         if (above->iconic && above->exp_iconify.by_client)
           continue;
 
+        if (above->bg_state)
+          continue;
+
         if (above->visibility.obscured == E_VISIBILITY_UNOBSCURED)
           {
              if (!above->argb)
@@ -1789,6 +1800,8 @@ _e_vis_transient_group_make(E_Client *ec, Eina_List **list)
              if (!child) continue;
              if (child->iconic && ec->exp_iconify.by_client)
                continue;
+             if (child->bg_state)
+               continue;
 
              if (child->transient_policy == E_TRANSIENT_ABOVE)
                {
index a3b667cb3ed2842b85bf5d3a005650907bf4e3ab..1fefa1e823a6cf7f1558c3b78d1797e1cf3d3db7 100644 (file)
@@ -2547,12 +2547,14 @@ e_client_background_state_set(E_Client *ec, Eina_Bool state)
 
    if (state)
      {
+        ec->bg_state = EINA_TRUE;
         evas_object_hide(ec->frame);
         e_pixmap_image_clear(ec->pixmap, 1);
         EC_CHANGED(ec);
      }
    else
      {
+        ec->bg_state = EINA_FALSE;
         if (ec->iconic)
           e_policy_wl_uniconify(ec);
         else