e_client: add e_client_layer_set() for the change of client layer 06/211806/9
authorJuyeon Lee <juyeonne.lee@samsung.com>
Fri, 9 Aug 2019 07:55:54 +0000 (16:55 +0900)
committerJuyeon Lee <juyeonne.lee@samsung.com>
Wed, 28 Aug 2019 09:34:00 +0000 (18:34 +0900)
evas_object_layer_set is used for change client layer or effect
to distinguish the usage and reduce inappropriate use, added
NEW API: e_client_layer_set

allowd layer set from E_LAYER_CLIENT_DESKTOP to E_LAYER_CLIENT_CURSOR
this api saves layer to ec->layer when in pending or block state
so the layer can be set after pending or block is free.

Change-Id: Ib15af76717901112823c8a495a3214c1d30e5ad3

src/bin/e_client.c
src/bin/e_client.h

index 0dc3266d2061118b39f22aaf8a46adcb3a6ce194..28f9c489ff0b096ecf9969fe15106fa18a557f13 100644 (file)
@@ -6890,3 +6890,41 @@ e_client_visibility_force_obscured_set(E_Client *ec, Eina_Bool set)
    ec->visibility.force_obscured = set;
    e_client_visibility_calculate();
 }
+
+E_API Eina_Bool
+e_client_layer_set(E_Client *ec,
+                   E_Layer layer)
+{
+   E_OBJECT_CHECK_RETURN(ec, EINA_FALSE);
+   E_OBJECT_CHECK_RETURN(ec->frame, EINA_FALSE);
+   E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE);
+
+   if (e_comp_canvas_client_layer_map(layer) == 9999)
+     return EINA_FALSE; //invalid layer is not allowed
+
+   evas_object_layer_set(ec->frame, layer);
+   if (ec->layer != layer)
+     {
+        /* check exceptional case */
+        if ((ec->fullscreen) &&
+            (ec->saved.layer == layer))
+          {
+             ELOGF("LAYER", "(%d) backup at saved.layer for fullscreen", ec->pixmap, ec, layer);
+             return EINA_TRUE;
+          }
+        // if e_comp_object fail to change ec->layer due to ec->layer_pending or block
+        // leave log and apply ec->layer according to set
+        // as a result it restores back to given layer when pending or block is free
+        ELOGF("LAYER", "change layer from %d to %d if in case layer pending(%d) or block(%d)",
+              ec->pixmap, ec, ec->layer, layer, ec->layer_pending, ec->layer_block);
+        if (ec->layer_pending || ec->layer_block)
+          {
+             ec->layer = layer;
+             return EINA_TRUE;
+          }
+
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
index 68c79315235155e0730ec3206258f936d95158a4..764ddfd6ab3497e501bdb1aef50f3d0913084cd3 100644 (file)
@@ -1129,6 +1129,8 @@ E_API void e_client_stay_within_canvas_margin(E_Client *ec);
 
 EINTERN void e_client_revert_focus(E_Client *ec);
 
+E_API Eina_Bool e_client_layer_set(E_Client *ec, E_Layer layer);
+
 /**
  * Move window to coordinates that do not account client decorations yet.
  *