e_desk_area: delegate e_client_above_get 34/304734/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 14 Dec 2023 04:12:57 +0000 (13:12 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 23 Jan 2024 09:19:21 +0000 (18:19 +0900)
The e_desk_area implements the e_client_above_get function.
It is to be done at e_desk at multiple desk_areas later.

Change-Id: Iaafc109c37eec4ebcd09506710bc07574d05f6b8

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

index 29e3d17..66bcc47 100644 (file)
@@ -3651,6 +3651,18 @@ e_client_geometry_get(E_Client *ec, int *x, int *y, int *w, int *h)
 E_API E_Client *
 e_client_above_get(const E_Client *ec)
 {
+#ifdef REFACTOR_DESK_AREA
+   E_Client_Data_Get_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_above, &data);
+
+   return data.above_ec;
+#else
    unsigned int x;
    E_Client *ec2;
 
@@ -3694,6 +3706,7 @@ e_client_above_get(const E_Client *ec)
    g_rec_mutex_unlock(&e_comp->ec_list_mutex);
 
    return NULL;
+#endif
 }
 
 E_API E_Client *
index 184bfa8..76fb334 100644 (file)
@@ -5,6 +5,11 @@
 
 typedef struct E_Client E_Client;
 
+typedef struct _E_Client_Data_Get_Above
+{
+   E_Client *above_ec; // returned above_ec
+} E_Client_Data_Get_Above;
+
 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);
index 21aba6c..33bf2a7 100644 (file)
@@ -359,7 +359,61 @@ _e_desk_area_smart_set_user(Evas_Smart_Class *sc)
 static void
 _desk_area_cb_client_get_above(struct wl_listener *listener, void *data)
 {
-   // TODO:
+   E_Desk_Area_Private_Client *eda_client;
+   E_Client_Data_Get_Above *get_above_data = data;
+   E_Desk_Area *eda;
+   E_Client *ec, *ec2;
+   unsigned int x;
+
+   eda_client = wl_container_of(listener, eda_client, client_get_above);
+   ec = eda_client->ec;
+   eda = eda_client->eda;
+
+   if (EINA_INLIST_GET(ec)->next) //check current layer
+     {
+        EINA_INLIST_FOREACH(EINA_INLIST_GET(ec)->next, ec2)
+          {
+             if (ec == ec2)
+               {
+                  ELOGF("FATAL", "CHECK the ec inlist next", ec);
+                  continue;
+               }
+             if (!e_object_is_del(E_OBJECT(ec2)))
+               {
+                  get_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;
+
+   g_rec_mutex_lock(&e_comp->ec_list_mutex);
+
+   /* 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)
+               {
+                  ELOGF("FATAL", "[eda:%p] EC exist above layer. ec layer_map:%d, cur layer_map:%d",
+                        ec, eda, e_comp_canvas_layer_map(ec->layer), x);
+                  continue;
+               }
+             if (!e_object_is_del(E_OBJECT(ec2)))
+               {
+                  get_above_data->above_ec = ec2;
+                  g_rec_mutex_unlock(&e_comp->ec_list_mutex);
+                  return;
+               }
+          }
+     }
+
+   g_rec_mutex_unlock(&e_comp->ec_list_mutex);
 }
 
 static void