e_client: add e_client_layer_get() to get client layer 08/228608/2
authorJuyeon Lee <juyeonne.lee@samsung.com>
Tue, 24 Mar 2020 15:16:59 +0000 (00:16 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Tue, 24 Mar 2020 07:06:29 +0000 (07:06 +0000)
client allowed layer is from E_LAYER_CLIENT_DESKTOP to E_LAYER_CLIENT_CURSOR
for any reason, client could be placed on temperary layer out of range E_LAYER_CLIENT
if it is intended behavior(like effect module animates +1 temp.wq layer while pending)
this API shall return client layer where it retores back.
if it is not intended behavior this API returns E_LAYER_BOTTOM just in case.

Change-Id: Ic157dc46ef02a752c905a1b9f5f24c5e3caa1027

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

index b52db434a827f7b3e3bf4c50ac2f4c94ec6c6ec2..6dfcdc179e4c8309b4ce4844ada13a2102e97e27 100644 (file)
@@ -7811,6 +7811,34 @@ e_client_layer_set(E_Client *ec,
    return EINA_TRUE;
 }
 
+E_API E_Layer
+e_client_layer_get(E_Client *ec)
+{
+   short layer;
+
+   E_OBJECT_CHECK_RETURN(ec, E_LAYER_BOTTOM);
+   E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, E_LAYER_BOTTOM);
+   if (!ec->frame) return E_LAYER_BOTTOM;
+
+   layer = evas_object_layer_get(ec->frame);
+   if (ec->layer != layer)
+     {
+        /* client could be on temperory layer while pending or block,
+         * in that case, client restores back to ec->layer after pending/block finish */
+        if (ec->layer_block || ec->layer_pending)
+          return ec->layer;
+
+        /* otherwise, client is on unexpected layer */
+        ELOGF("LAYER", "layer dismatch ec->layer %d | evas obj layer %d ",
+              ec, ec->layer, layer);
+
+        if (e_comp_canvas_client_layer_map(layer) == 9999)
+          return E_LAYER_BOTTOM; //not on E_LAYER_CLIENT
+     }
+
+   return ec->layer;
+}
+
 EINTERN Eina_Bool
 e_client_desk_group_layer_set(E_Client *ec, E_Desk_Group_Layer layer)
 {
index 2ba8e71ccaf735f73303bcc9acb623ebbd0f7a0d..25daf92ad8ac4f38b2b908ebf607f14237900aea 100644 (file)
@@ -1217,6 +1217,10 @@ EINTERN Eina_Bool e_client_pending_geometry_has(E_Client *ec);
 E_API void e_client_frame_focus_set(E_Client *ec, Eina_Bool focus);
 
 E_API Eina_Bool e_client_layer_set(E_Client *ec, E_Layer layer);
+/* client layer shall be placed on range between E_LAYER_CLIENT_DESKTOP and E_LAYER_CLIENT_CURSOR
+ * if it is in unexpected layer return E_LAYER_BOTTOM otherwise
+ */
+E_API E_Layer   e_client_layer_get(E_Client *ec);
 
 EINTERN Eina_Bool e_client_desk_group_layer_set(E_Client *ec, E_Desk_Group_Layer layer);
 EINTERN E_Desk_Group_Layer e_client_desk_group_layer_get(E_Client *ec);