rotation: Added codes to prevent zone rotation when lockscreen is active. 19/111419/2
authorGwanglim Lee <gl77.lee@samsung.com>
Fri, 20 Jan 2017 08:43:12 +0000 (17:43 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Fri, 20 Jan 2017 08:44:23 +0000 (17:44 +0900)
Change-Id: Id814ac7d474f5e86963f681df3cc41313ee065fc

src/rotation/e_mod_rotation_wl.c

index 13721aa..e18e73e 100644 (file)
@@ -191,6 +191,38 @@ _try_lock_rot_for_fg_app(E_Zone *zone)
                                     EINA_FALSE);
 }
 
+static Eina_Bool
+_no_active_lockscreen_check(E_Client *ec)
+{
+   E_Client *ec2 = NULL;
+   int x, y, w, h;
+
+   if (!ec) return EINA_FALSE;
+
+   /* NB: to set fg_ec to lockscreen, return true if given ec is lockscreen itself. */
+   if (e_policy_client_is_lockscreen(ec)) return EINA_TRUE;
+
+   /* bottom to top */
+   for (ec2 = ec; ec2; ec2 = e_client_above_get(ec2))
+     {
+        if (e_object_is_del(E_OBJECT(ec2))) continue;
+        if (e_policy_client_is_lockscreen(ec2))
+          {
+             e_client_geometry_get(ec2, &x, &y, &w, &h);
+             if (E_CONTAINS(ec->zone->x, ec->zone->y, ec->zone->w, ec->zone->h,
+                            x, y, w, h))
+               {
+                  /* lockscreen is shown on top of given ec. */
+                  return EINA_FALSE;
+               }
+             break;
+          }
+     }
+
+   /* there is no lockscreen on top of given ec. */
+   return EINA_TRUE;
+}
+
 static void
 _rot_client_cb_vis_prepare_foreground(void *data, Evas_Object *obj, void *event_info)
 {
@@ -203,13 +235,17 @@ _rot_client_cb_vis_prepare_foreground(void *data, Evas_Object *obj, void *event_
    EDBG(ec, "Update Foreground Client '%s'(%p)", ec->icccm.name, ec);
    if (e_policy_visibility_client_is_activity(ec))
      {
-        EDBG(ec, "Set the fg_ec to %x", e_client_util_win_get(ec));
-        fg_ec = ec;
+        EDBG(ec, "Check ec %x to set fg_ec", e_client_util_win_get(ec));
+        if (_no_active_lockscreen_check(ec))
+          {
+             EDBG(ec, "Set the fg_ec to %x", e_client_util_win_get(ec));
+             fg_ec = ec;
 
-        if (_camera_check(ec))
-          _unlock_rot_for_fg_app(ec->zone);
-        else
-          _try_lock_rot_for_fg_app(ec->zone);
+             if (_camera_check(ec))
+               _unlock_rot_for_fg_app(ec->zone);
+             else
+               _try_lock_rot_for_fg_app(ec->zone);
+          }
      }
 
    _e_client_rotation_zone_set(ec->zone, ec, NULL);
@@ -2004,13 +2040,17 @@ _rot_intercept_hook_show_helper(void *d EINA_UNUSED, E_Client *ec)
 
    if (e_policy_visibility_client_is_activity(ec))
      {
-        EDBG(ec, "Set the fg_ec to %x", e_client_util_win_get(ec));
-        fg_ec = ec;
+        EDBG(ec, "Check ec %x to set fg_ec", e_client_util_win_get(ec));
+        if (_no_active_lockscreen_check(ec))
+          {
+             EDBG(ec, "Set the fg_ec to %x", e_client_util_win_get(ec));
+             fg_ec = ec;
 
-        if (_camera_check(ec))
-          _unlock_rot_for_fg_app(ec->zone);
-        else
-          _try_lock_rot_for_fg_app(ec->zone);
+             if (_camera_check(ec))
+               _unlock_rot_for_fg_app(ec->zone);
+             else
+               _try_lock_rot_for_fg_app(ec->zone);
+          }
      }
 
    _e_client_rotation_zone_set(ec->zone, ec, NULL);