e_client: move getter/setter of layer to policy_desk_area 31/323531/1
authorJunseok Kim <juns.kim@samsung.com>
Thu, 3 Apr 2025 03:13:21 +0000 (12:13 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 30 Apr 2025 00:26:08 +0000 (09:26 +0900)
Change-Id: I9571a8896755d7b0ba7b3ba5e0b2743ef692b004

src/bin/core/e_client.c
src/bin/core/e_client_intern.h
src/bin/windowmgr/e_policy_desk_area.c

index 265c23543e3e26a6d72f0adc5361b374292c4171..53979f798ac1b6395567b4421071b22d8ceec689 100644 (file)
@@ -91,6 +91,7 @@ struct _E_Client_Private
         struct wl_signal unfullscreen;
 
         struct wl_signal set_layer;
+        struct wl_signal get_layer;
         struct wl_signal raise;
         struct wl_signal lower;
         struct wl_signal stack_below;
@@ -674,6 +675,7 @@ _e_client_private_init(E_Client *ec)
    wl_signal_init(&priv->events.fullscreen);
    wl_signal_init(&priv->events.unfullscreen);
    wl_signal_init(&priv->events.set_layer);
+   wl_signal_init(&priv->events.get_layer);
    wl_signal_init(&priv->events.raise);
    wl_signal_init(&priv->events.lower);
    wl_signal_init(&priv->events.stack_below);
@@ -5516,8 +5518,7 @@ E_API Eina_Bool
 e_client_layer_set(E_Client *ec,
                    E_Layer layer)
 {
-   E_View *ec_view;
-   E_View_Tree *layer_tree;
+   E_Client_Data_Layer data = {0,};
 
    E_OBJECT_CHECK_RETURN(ec, EINA_FALSE);
    E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE);
@@ -5526,72 +5527,25 @@ e_client_layer_set(E_Client *ec,
    if (e_util_client_layer_map(layer) == 9999)
      return EINA_FALSE; //invalid layer is not allowed
 
-   ec_view = e_view_client_view_get(e_client_view_get(ec));
+   data.layer = layer;
+   data.result = EINA_FALSE;
+   wl_signal_emit(&PRI(ec)->events.set_layer, &data);
 
-   if (ec->layer != layer)
-     {
-        e_view_position_set(ec_view, ec->x, ec->y);
-     }
-
-   layer_tree = e_canvas_layer_view_tree_get(e_canvas_get(ec_view), e_canvas_util_e_layer_map(layer));
-   e_view_reparent(ec_view, layer_tree);
-   evas_object_layer_set(ec_view->eo, layer);
-   if (ec->layer != layer)
-     {
-        /* check exceptional case */
-        if ((ec->fullscreen) &&
-            (ec->saved.layer != layer))
-          {
-             ELOGF("LAYER", "(%d) fail to backup at saved.layer for fullscreen", ec, layer);
-             return EINA_FALSE;
-          }
-        // 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, ec->layer, layer, ec->layer_pending, ec->layer_block);
-        if (ec->layer_pending || ec->layer_block)
-          {
-             ec->layer = layer;
-             if (e_input_thread_check_client_cloning_needed())
-               e_client_input_thread_layer_set(ec, layer);
-             return EINA_TRUE;
-          }
-     }
-
-   wl_signal_emit(&PRI(ec)->events.set_layer, NULL);
-
-   return EINA_TRUE;
+   return data.result;
 }
 
 E_API E_Layer
 e_client_layer_get(E_Client *ec)
 {
-   E_Layer layer;
-   E_Canvas_Layer canvas_layer;
+   E_Client_Data_Layer data = {0,};
 
    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;
 
-   canvas_layer = e_view_layer_index_get(e_view_client_view_get(PRI(ec)->view_client));
-   layer = e_canvas_util_layer_map(canvas_layer);
-   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_util_client_layer_map(layer) == 9999)
-          return E_LAYER_BOTTOM; //not on E_LAYER_CLIENT
-     }
+   wl_signal_emit(&PRI(ec)->events.get_layer, &data);
 
-   return ec->layer;
+   return data.layer;
 }
 
 static void
@@ -6349,6 +6303,13 @@ e_client_set_layer_listener_add(E_Client *ec, struct wl_listener *listener)
    wl_signal_add(&priv->events.set_layer, listener);
 }
 
+EINTERN void
+e_client_get_layer_listener_add(E_Client *ec, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.get_layer, listener);
+}
+
 EINTERN void
 e_client_stack_transient_for_done_listener_add(E_Client *ec, struct wl_listener *listener)
 {
index dc0dec8ea4826c8670f1eb4d814319889566c3af..13d3d69c52816ae9a07fbb073fd23588761cfd31 100644 (file)
@@ -14,6 +14,12 @@ typedef struct _E_Client_Data_Get_Client
    E_Client *result_ec;
 } E_Client_Data_Get_Client;
 
+typedef struct _E_Client_Data_Layer
+{
+   E_Layer layer;
+   Eina_Bool result;
+} E_Client_Data_Layer;
+
 struct _E_Event_Mouse_Button
 {
    int               button; /**< Mouse button number that was raised (1 - 32) */
@@ -211,6 +217,7 @@ EINTERN void e_client_fullscreen_pre_listener_add(E_Client *ec, struct wl_listen
 EINTERN void e_client_fullscreen_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_unfullscreen_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_set_layer_listener_add(E_Client *ec, struct wl_listener *listener);
+EINTERN void e_client_get_layer_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_raise_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_lower_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_stack_below_listener_add(E_Client *ec, struct wl_listener *listener);
index 0cf38b91bc155349230de1a6fd1bf227e3e703c7..db3ab00a88f76f3d8fac3ad77f1beff1423c1ed7 100644 (file)
@@ -20,6 +20,7 @@
 #include "e_view_client_intern.h"
 #include "e_policy_wl_intern.h"
 #include "e_policy_desk_area_layer_intern.h"
+#include "e_canvas_intern.h"
 
 
 typedef struct _E_Policy_Desk_Area_Private_Client  E_Policy_Desk_Area_Private_Client;
@@ -74,6 +75,8 @@ struct _E_Policy_Desk_Area_Private_Client
    struct wl_listener client_mouse_move;
    struct wl_listener client_move_end;
    struct wl_listener client_resize_end;
+   struct wl_listener client_layer_set;
+   struct wl_listener client_layer_get;
    struct wl_listener delete_request;
    struct wl_listener kill_request;
    struct wl_listener redirect;
@@ -1939,6 +1942,86 @@ _desk_area_cb_client_resize_end(struct wl_listener *listener, void *data)
    EC_CHANGED(ec);
 }
 
+static void
+_desk_area_cb_client_layer_set(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk_Area_Private_Client *eda_client;
+   E_Client *ec;
+   E_View *ec_view;
+   E_View_Tree *layer_tree;
+   E_Client_Data_Layer *layer_data;
+   E_Layer layer;
+
+   eda_client = wl_container_of(listener, eda_client, client_layer_set);
+   ec = eda_client->ec;
+   layer_data = (E_Client_Data_Layer *) data;
+   layer = layer_data->layer;
+
+   ec_view = e_view_client_view_get(e_client_view_get(ec));
+
+   if (ec->layer != layer)
+     {
+        e_view_position_set(ec_view, ec->x, ec->y);
+     }
+
+   layer_tree = e_canvas_layer_view_tree_get(e_canvas_get(ec_view), e_canvas_util_e_layer_map(layer));
+   e_view_reparent(ec_view, layer_tree);
+   evas_object_layer_set(ec_view->eo, layer);
+   if (ec->layer != layer)
+     {
+        /* check exceptional case */
+        if ((ec->fullscreen) &&
+            (ec->saved.layer != layer))
+          {
+             ELOGF("LAYER", "(%d) fail to backup at saved.layer for fullscreen", ec, layer);
+             return;
+          }
+        // 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, ec->layer, layer, ec->layer_pending, ec->layer_block);
+        if (ec->layer_pending || ec->layer_block)
+          {
+             ec->layer = layer;
+             if (e_input_thread_check_client_cloning_needed())
+               e_client_input_thread_layer_set(ec, layer);
+             return;
+          }
+     }
+
+   layer_data->result = EINA_TRUE;
+}
+
+static void
+_desk_area_cb_client_layer_get(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk_Area_Private_Client *eda_client;
+   E_Client *ec;
+   E_Client_Data_Layer *layer_data;
+   E_Canvas_Layer canvas_layer;
+   E_Layer layer;
+
+   eda_client = wl_container_of(listener, eda_client, client_layer_get);
+   ec = eda_client->ec;
+   layer_data = (E_Client_Data_Layer *) data;
+
+   canvas_layer = e_view_layer_index_get(e_view_client_view_get(e_client_view_get(ec)));
+   layer = e_canvas_util_layer_map(canvas_layer);
+   layer_data->layer = ec->layer;
+
+   if (ec->layer == layer) return;
+   /* 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;
+
+   /* otherwise, client is on unexpected layer */
+   ELOGF("LAYER", "layer dismatch ec->layer %d | evas obj layer %d ", ec, ec->layer, layer);
+
+   if (e_util_client_layer_map(layer) == 9999)
+     layer_data->layer = E_LAYER_BOTTOM; //not on E_LAYER_CLIENT
+}
+
 
 static void
 _e_policy_desk_area_configure_send(E_Client *ec, Eina_Bool edges, Eina_Bool send_size)
@@ -2800,6 +2883,8 @@ _e_policy_desk_area_private_client_del(E_Policy_Desk_Area_Private_Client *eda_cl
    wl_list_remove(&eda_client->comp_object_lower.link);
    wl_list_remove(&eda_client->comp_object_raise.link);
 
+   wl_list_remove(&eda_client->client_layer_get.link);
+   wl_list_remove(&eda_client->client_layer_set.link);
    wl_list_remove(&eda_client->client_resize_end.link);
    wl_list_remove(&eda_client->client_move_end.link);
    wl_list_remove(&eda_client->client_mouse_move.link);
@@ -2880,6 +2965,10 @@ _e_policy_desk_area_cb_client_add(struct wl_listener *listener, void *data)
    e_client_move_end_listener_add(ec, &eda_client->client_move_end);
    eda_client->client_resize_end.notify = _desk_area_cb_client_resize_end;
    e_client_resize_end_listener_add(ec, &eda_client->client_resize_end);
+   eda_client->client_layer_set.notify = _desk_area_cb_client_layer_set;
+   e_client_set_layer_listener_add(ec, &eda_client->client_layer_set);
+   eda_client->client_layer_get.notify = _desk_area_cb_client_layer_get;
+   e_client_get_layer_listener_add(ec, &eda_client->client_layer_get);
 
    // e_comp_object listeners
    eda_client->comp_object_lower.notify = _desk_area_cb_comp_object_lower;