From: Doyoun Kang Date: Fri, 23 Nov 2018 03:07:22 +0000 (+0900) Subject: add a bg_state value in E_Client to handle background state X-Git-Tag: submit/tizen_5.0/20181123.035305^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F70%2F193670%2F1;p=platform%2Fupstream%2Fenlightenment.git add a bg_state value in E_Client to handle background state 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 --- diff --git a/src/bin/e_client.c b/src/bin/e_client.c index ecc2aac63e..5237ce6748 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -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 */ diff --git a/src/bin/e_client.h b/src/bin/e_client.h index d2c4437994..5b24ad0fcb 100644 --- a/src/bin/e_client.h +++ b/src/bin/e_client.h @@ -933,6 +933,7 @@ struct E_Client Eina_Bool launching : 1; Eina_Bool extra_animating : 1; + Eina_Bool bg_state : 1; struct { diff --git a/src/bin/e_comp_wl_rsm.c b/src/bin/e_comp_wl_rsm.c index 004ddbacae..bb14c0781b 100644 --- a/src/bin/e_comp_wl_rsm.c +++ b/src/bin/e_comp_wl_rsm.c @@ -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; diff --git a/src/bin/e_policy.c b/src/bin/e_policy.c index 65f84acb12..864faab32e 100644 --- a/src/bin/e_policy.c +++ b/src/bin/e_policy.c @@ -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) diff --git a/src/bin/e_policy_stack.c b/src/bin/e_policy_stack.c index 6c3d478725..32f76c41ff 100644 --- a/src/bin/e_policy_stack.c +++ b/src/bin/e_policy_stack.c @@ -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) { diff --git a/src/bin/e_policy_visibility.c b/src/bin/e_policy_visibility.c index d40bb6daf7..757225f614 100644 --- a/src/bin/e_policy_visibility.c +++ b/src/bin/e_policy_visibility.c @@ -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) { diff --git a/src/bin/e_policy_wl.c b/src/bin/e_policy_wl.c index a3b667cb3e..1fefa1e823 100644 --- a/src/bin/e_policy_wl.c +++ b/src/bin/e_policy_wl.c @@ -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