e_desk_area: delegate e_client_visible_below_get 42/304742/1
authorSooChan Lim <sc1.lim@samsung.com>
Tue, 19 Dec 2023 00:08:48 +0000 (09:08 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 23 Jan 2024 09:19:22 +0000 (18:19 +0900)
The e_desk_area implements the e_client_visible_below_get function.
It is to be done at e_desk at multiple desk_areas later.

Change-Id: Id3c186f966adcb9d25c8470a0b69f6e77131ca57

src/bin/e_client.c
src/bin/e_client_intern.h
src/bin/e_desk_area.c

index a64fc5e..4be5060 100644 (file)
@@ -80,6 +80,7 @@ struct _E_Client_Private
 #ifdef REFACTOR_DESK_AREA
         struct wl_signal get_above;
         struct wl_signal get_below;
+        struct wl_signal get_visible_below;
         struct wl_signal subsurface_stack_update;
 #endif
      } events;
@@ -934,6 +935,7 @@ _e_client_private_init(E_Client *ec)
 #ifdef REFACTOR_DESK_AREA
    wl_signal_init(&priv->events.get_above);
    wl_signal_init(&priv->events.get_below);
+   wl_signal_init(&priv->events.get_visible_below);
    wl_signal_init(&priv->events.subsurface_stack_update);
 #endif
 
@@ -3841,6 +3843,18 @@ e_client_visible_above_get(E_Client *ec)
 EINTERN E_Client *
 e_client_visible_below_get(E_Client *ec)
 {
+#ifdef REFACTOR_DESK_AREA
+   E_Client_Data_Get_Visible_Below data;
+
+   E_OBJECT_CHECK_RETURN(ec, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, NULL);
+
+   data.below_ec = NULL;
+
+   wl_signal_emit_mutable(&PRI(ec)->events.get_visible_below, &data);
+
+   return data.below_ec;
+#else
    unsigned int x;
    E_Client *ec2;
    Eina_Inlist *l;
@@ -3901,6 +3915,7 @@ e_client_visible_below_get(E_Client *ec)
      }
 
    return NULL;
+#endif
 }
 
 E_API E_Client *
@@ -7194,6 +7209,13 @@ e_client_get_below_listener_add(E_Client *ec, struct wl_listener *listener)
 }
 
 EINTERN void
+e_client_get_visible_below_listener_add(E_Client *ec, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.get_visible_below, listener);
+}
+
+EINTERN void
 e_client_subsurface_stack_update_listener_add(E_Client *ec, struct wl_listener *listener)
 {
    API_ENTRY;
index ec0d1aa..b431249 100644 (file)
@@ -15,6 +15,11 @@ typedef struct _E_Client_Data_Get_Below
    E_Client *below_ec; // returned below_ec
 } E_Client_Data_Get_Below;
 
+typedef struct _E_Client_Data_Get_Visible_Below
+{
+   E_Client *below_ec; // returned below_ec
+} E_Client_Data_Get_Visible_Below;
+
 EINTERN void e_client_eval_pre_fetch_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_eval_fetch_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_eval_pre_post_fetch_listener_add(E_Client *ec, struct wl_listener *listener);
@@ -67,6 +72,7 @@ EINTERN void e_client_unstick_listener_add(E_Client *ec, struct wl_listener *lis
 //#ifdef REFACTOR_DESK_AREA
 EINTERN void e_client_get_above_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_get_below_listener_add(E_Client *ec, struct wl_listener *listener);
+EINTERN void e_client_get_visible_below_listener_add(E_Client *ec, struct wl_listener *listener);
 EINTERN void e_client_subsurface_stack_update_listener_add(E_Client *ec, struct wl_listener *listener);
 //#endif
 
index 6966316..e7bae89 100644 (file)
@@ -54,6 +54,7 @@ struct _E_Desk_Area_Private_Client
    // client listeners
    struct wl_listener client_get_above;
    struct wl_listener client_get_below;
+   struct wl_listener client_get_visible_below;
    struct wl_listener client_subsurface_stack_update;
 
    // comp_object listeners
@@ -501,6 +502,79 @@ _desk_area_cb_client_get_below(struct wl_listener *listener, void *data)
 }
 
 static void
+_desk_area_cb_client_get_visible_below(struct wl_listener *listener, void *data)
+{
+   E_Desk_Area_Private_Client *eda_client;
+   E_Client_Data_Get_Visible_Below *get_visible_below_data = data;
+   E_Desk_Area *eda;
+   E_Client *ec, *ec2;
+   unsigned int x;
+   Eina_Inlist *l;
+   E_Layer ec_layer, ec_layer_cw;
+   int cw_layer;
+
+   eda_client = wl_container_of(listener, eda_client, client_get_visible_below);
+   ec = eda_client->ec;
+   eda = eda_client->eda;
+
+   if (EINA_INLIST_GET(ec)->prev) //check current layer
+     {
+        for (l = EINA_INLIST_GET(ec)->prev; l; l = l->prev)
+          {
+             ec2 = EINA_INLIST_CONTAINER_GET(l, E_Client);
+             if (ec == ec2) continue;
+             if ((!e_object_is_del(E_OBJECT(ec2))) &&
+                 (!e_client_util_ignored_get(ec2)) &&
+                 (ec2->visible) &&
+                 (ec2->frame))
+               {
+                  get_visible_below_data->below_ec = ec2;
+                  return;
+               }
+          }
+     }
+
+   // check layer validation
+   ec_layer = ec->layer;
+   if (ec->layer_block || ec->layer_pending)
+     {
+        cw_layer = e_comp_object_layer_get(ec->frame);
+        if (cw_layer >= 0)
+          {
+             ec_layer_cw = e_comp_canvas_layer_map_to(cw_layer);
+             if (ec_layer != ec_layer_cw)
+               {
+                  ELOGF("EDA", "[eda:%p] LAYER is not same. USE obj layer! (ec->layer:%d, obj:%d). block:%d, pending:%d)",
+                        ec, eda, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
+                  ec_layer = ec_layer_cw;
+               }
+          }
+     }
+
+   /* go down the layers until we find one */
+   if (e_comp_canvas_layer_map(ec->layer) > e_comp_canvas_layer_map(E_LAYER_MAX)) return;
+   x = e_comp_canvas_layer_map(ec->layer);
+   if (x > 0) x--;
+
+   for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
+     {
+        if (!e_comp->layers[x].clients) continue;
+        EINA_INLIST_REVERSE_FOREACH(e_comp->layers[x].clients, ec2)
+          {
+             if (ec == ec2) continue;
+             if ((!e_object_is_del(E_OBJECT(ec2))) &&
+                 (!e_client_util_ignored_get(ec2)) &&
+                 (ec2->visible) &&
+                 (ec2->frame))
+               {
+                  get_visible_below_data->below_ec = ec2;
+                  return;
+               }
+          }
+     }
+}
+
+static void
 _desk_area_cb_client_subsurface_stack_update(struct wl_listener *listener, void *data)
 {
    E_Desk_Area_Private_Client *eda_client;
@@ -1211,6 +1285,8 @@ e_desk_area_ec_add(E_Desk_Area *eda, E_Client *ec)
    e_client_get_above_listener_add(ec, &eda_client->client_get_above);
    eda_client->client_get_below.notify = _desk_area_cb_client_get_below;
    e_client_get_below_listener_add(ec, &eda_client->client_get_below);
+   eda_client->client_get_visible_below.notify = _desk_area_cb_client_get_visible_below;
+   e_client_get_visible_below_listener_add(ec, &eda_client->client_get_visible_below);
    eda_client->client_subsurface_stack_update.notify = _desk_area_cb_client_subsurface_stack_update;
    e_client_subsurface_stack_update_listener_add(ec, &eda_client->client_subsurface_stack_update);
 
@@ -1272,6 +1348,7 @@ e_desk_area_ec_remove(E_Desk_Area *eda, E_Client *ec)
    wl_list_remove(&eda_client->comp_object_lower.link);
    wl_list_remove(&eda_client->comp_object_raise.link);
    wl_list_remove(&eda_client->client_subsurface_stack_update.link);
+   wl_list_remove(&eda_client->client_get_visible_below.link);
    wl_list_remove(&eda_client->client_get_below.link);
    wl_list_remove(&eda_client->client_get_above.link);