e_desk_area: delegate e_client_visible_above_get 43/304743/1
authorSooChan Lim <sc1.lim@samsung.com>
Tue, 19 Dec 2023 00:58:58 +0000 (09:58 +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_above_get function.
It is to be done at e_desk at multiple desk_areas later.

Change-Id: I17aab78c05909912ce86ac8eba1c4778e1a5e7e9

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

index 4be5060..ec2b9b1 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_above;
         struct wl_signal get_visible_below;
         struct wl_signal subsurface_stack_update;
 #endif
@@ -935,6 +936,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_above);
    wl_signal_init(&priv->events.get_visible_below);
    wl_signal_init(&priv->events.subsurface_stack_update);
 #endif
@@ -3802,6 +3804,18 @@ e_client_below_get(const E_Client *ec)
 EINTERN E_Client *
 e_client_visible_above_get(E_Client *ec)
 {
+#ifdef REFACTOR_DESK_AREA
+   E_Client_Data_Get_Visible_Above data;
+
+   E_OBJECT_CHECK_RETURN(ec, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, NULL);
+
+   data.above_ec = NULL;
+
+   wl_signal_emit_mutable(&PRI(ec)->events.get_visible_above, &data);
+
+   return data.above_ec;
+#else
    unsigned int x;
    E_Client *ec2;
 
@@ -3838,6 +3852,7 @@ e_client_visible_above_get(E_Client *ec)
      }
 
    return NULL;
+#endif
 }
 
 EINTERN E_Client *
@@ -7209,6 +7224,13 @@ e_client_get_below_listener_add(E_Client *ec, struct wl_listener *listener)
 }
 
 EINTERN void
+e_client_get_visible_above_listener_add(E_Client *ec, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.get_visible_above, listener);
+}
+
+EINTERN void
 e_client_get_visible_below_listener_add(E_Client *ec, struct wl_listener *listener)
 {
    API_ENTRY;
index b431249..9f7b6f5 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_Above
+{
+   E_Client *above_ec; // returned above_ec
+} E_Client_Data_Get_Visible_Above;
+
 typedef struct _E_Client_Data_Get_Visible_Below
 {
    E_Client *below_ec; // returned below_ec
@@ -72,6 +77,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_above_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 e7bae89..3950f58 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_above;
    struct wl_listener client_get_visible_below;
    struct wl_listener client_subsurface_stack_update;
 
@@ -502,6 +503,55 @@ _desk_area_cb_client_get_below(struct wl_listener *listener, void *data)
 }
 
 static void
+_desk_area_cb_client_get_visible_above(struct wl_listener *listener, void *data)
+{
+   E_Desk_Area_Private_Client *eda_client;
+   E_Client_Data_Get_Visible_Above *get_visible_above_data = data;
+   E_Client *ec, *ec2;
+   unsigned int x;
+
+   eda_client = wl_container_of(listener, eda_client, client_get_visible_above);
+   ec = eda_client->ec;
+
+   if (EINA_INLIST_GET(ec)->next) //check current layer
+     {
+        EINA_INLIST_FOREACH(EINA_INLIST_GET(ec)->next, 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_above_data->above_ec = ec2;
+                  return;
+               }
+          }
+     }
+
+   if (ec->layer == E_LAYER_CLIENT_CURSOR) return;
+   if (e_comp_canvas_client_layer_map(ec->layer) == 9999) return;
+
+   /* go up the layers until we find one */
+   for (x = e_comp_canvas_layer_map(ec->layer) + 1; x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
+     {
+        if (!e_comp->layers[x].clients) continue;
+        EINA_INLIST_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_above_data->above_ec = ec2;
+                  return;
+               }
+          }
+     }
+}
+
+static void
 _desk_area_cb_client_get_visible_below(struct wl_listener *listener, void *data)
 {
    E_Desk_Area_Private_Client *eda_client;
@@ -1285,6 +1335,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_above.notify = _desk_area_cb_client_get_visible_above;
+   e_client_get_visible_above_listener_add(ec, &eda_client->client_get_visible_above);
    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;
@@ -1349,6 +1401,7 @@ e_desk_area_ec_remove(E_Desk_Area *eda, E_Client *ec)
    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_visible_above.link);
    wl_list_remove(&eda_client->client_get_below.link);
    wl_list_remove(&eda_client->client_get_above.link);