e_comp_input: Adjust new layer tree logic to input thread client 37/325437/1
authorJunseok Kim <juns.kim@samsung.com>
Tue, 15 Apr 2025 11:46:46 +0000 (20:46 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 10 Jun 2025 09:37:49 +0000 (18:37 +0900)
Change-Id: I15c6353f56cd01be06f6ce8c8c2d0bdb5891aa96

src/bin/Makefile.mk
src/bin/inputmgr/e_comp_input.c
src/bin/inputmgr/e_comp_input_intern.h
src/bin/inputmgr/e_input_thread_client.c
src/bin/inputmgr/e_input_thread_client_intern.h
src/bin/inputmgr/e_view_input_client.c [new file with mode: 0644]
src/bin/inputmgr/e_view_input_client_intern.h [new file with mode: 0644]

index 9a5803fa0d55664a4d2718697823caac78a3d7e9..1d2ade832662096803acbdb390e2c815f89722f5 100644 (file)
@@ -253,6 +253,7 @@ src/bin/inputmgr/e_input_device.c \
 src/bin/inputmgr/e_input_evdev.c \
 src/bin/inputmgr/e_input_seat.c \
 src/bin/inputmgr/e_input_thread_client.c \
+src/bin/inputmgr/e_view_input_client.c \
 src/bin/inputmgr/ecore_device_ex.c \
 src/bin/inputmgr/e_devicemgr_keyboard_grab.c \
 src/bin/inputmgr/e_devicemgr_relative_motion_grab.c \
index 0580c93141b09c17742872b13adeb64283e80dfd..b08d94ffca33ef7012c9c20c0c2bf73d241723b7 100644 (file)
@@ -2,12 +2,21 @@
 #include "e_comp_input_intern.h"
 #include "e_input_log.h"
 #include "e_input_thread_client_intern.h"
+#include "e_view_intern.h"
+#include "e_view_input_client_intern.h"
 
 #include <sys/mman.h>
 
 EINTERN E_Comp_Input_Key_Data *e_comp_input_key = NULL;
 EINTERN E_Comp_Input *e_comp_input = NULL;
 
+
+EINTERN E_View_Tree_Impl comp_input_layer_impl = {
+   .destroy = NULL,
+   .child_add = NULL,
+   .child_remove = NULL,
+};
+
 EINTERN void
 e_comp_input_init(void)
 {
@@ -27,6 +36,16 @@ e_comp_input_init(void)
         return;
      }
 
+   e_view_tree_init(&e_comp_input->tree, NULL, NULL);
+   e_view_show(&e_comp_input->tree.view);
+   e_view_reorderable_set(&e_comp_input->tree.view, false);
+   for (int x = 0 ; x < E_LAYER_COUNT; x++)
+     {
+        e_view_tree_init(&e_comp_input->layer_tree[x], &comp_input_layer_impl, &e_comp_input->tree);
+        e_view_show(&e_comp_input->layer_tree[x].view);
+        e_view_reorderable_set(&e_comp_input->layer_tree[x].view, false);
+     }
+
    e_comp_input_key->xkb.fd = -1;
 }
 
@@ -65,28 +84,55 @@ e_comp_input_shutdown(void)
 
 EINTERN void e_comp_input_layers_update(E_Comp_Input_Layer_Data *layer_data)
 {
+   E_Input_Thread_Client *itc = NULL, *relative_itc = NULL;
+   E_View *itc_view = NULL, *relative_itc_view = NULL;
+   E_View_Input_Client *view_client;
+
+   if (layer_data->item)
+     {
+        itc = e_input_thread_client_get(layer_data->item);
+        view_client = e_input_thread_client_view_input_client_get(itc);
+        itc_view = e_view_input_client_view_get(view_client);
+     }
+
+   if (!itc_view)
+     {
+        ERR("Couldn't get view of itc, target ec(%p):%s", layer_data->item, e_client_icccm_title_get(layer_data->item));
+        return;
+     }
+
+   if (layer_data->relative)
+     {
+        relative_itc = e_input_thread_client_get(layer_data->relative);
+        view_client = e_input_thread_client_view_input_client_get(relative_itc);
+        relative_itc_view = e_view_input_client_view_get(view_client);
+     }
+
    switch (layer_data->type)
      {
       case E_COMP_INPUT_INLIST_APPEND:
-         e_comp_input->layers[layer_data->layer].clients = eina_inlist_append(e_comp_input->layers[layer_data->layer].clients, e_input_thread_client_Inlist_get(layer_data->item));
+         e_view_reparent(itc_view, &e_comp_input->layer_tree[layer_data->layer]);
          break;
       case E_COMP_INPUT_INLIST_PREPEND:
-         e_comp_input->layers[layer_data->layer].clients = eina_inlist_prepend(e_comp_input->layers[layer_data->layer].clients, e_input_thread_client_Inlist_get(layer_data->item));
+         e_view_reparent(itc_view, &e_comp_input->layer_tree[layer_data->layer]);
          break;
       case E_COMP_INPUT_INLIST_APPEND_RELATIVE:
-         e_comp_input->layers[layer_data->layer].clients = eina_inlist_append_relative(e_comp_input->layers[layer_data->layer].clients, e_input_thread_client_Inlist_get(layer_data->item), e_input_thread_client_Inlist_get(layer_data->relative));
+         if (!relative_itc_view)
+           {
+              ERR("Couldn't get relative view of itc, target ec(%p):%s", layer_data->relative, e_client_icccm_title_get(layer_data->relative));
+              return;
+           }
+         e_view_place_above(itc_view, relative_itc_view);
          break;
       case E_COMP_INPUT_INLIST_PREPEND_RELATIVE:
-         e_comp_input->layers[layer_data->layer].clients = eina_inlist_prepend_relative(e_comp_input->layers[layer_data->layer].clients, e_input_thread_client_Inlist_get(layer_data->item), e_input_thread_client_Inlist_get(layer_data->relative));
-         break;
-      case E_COMP_INPUT_INLIST_REMOVE:
-         e_comp_input->layers[layer_data->layer].clients = eina_inlist_remove(e_comp_input->layers[layer_data->layer].clients, e_input_thread_client_Inlist_get(layer_data->item));
-         e_comp_input->layers[layer_data->layer].clients_count--;
+         if (!relative_itc_view)
+           {
+              ERR("Couldn't get relative view of itc, target ec(%p):%s", layer_data->relative, e_client_icccm_title_get(layer_data->relative));
+              return;
+           }
+         e_view_place_below(itc_view, relative_itc_view);
          break;
      }
-
-   if (layer_data->type < E_COMP_INPUT_INLIST_REMOVE)
-     e_comp_input->layers[layer_data->layer].clients_count++;
 }
 
 E_API E_Input_Thread_Info *
index 3b00e5255fac0e2c183687d08c8dcb477a1a48b3..af38b8ea11aa604a495b38787341185103e067ac 100644 (file)
@@ -2,6 +2,7 @@
 #define E_COMP_INPUT_INTERN_H
 
 #include "e_intern.h"
+#include "e_view_intern.h"
 #include <xkbcommon/xkbcommon.h>
 
 typedef enum _E_Comp_Input_Inlist_Function_Type {
@@ -9,7 +10,6 @@ typedef enum _E_Comp_Input_Inlist_Function_Type {
    E_COMP_INPUT_INLIST_PREPEND,
    E_COMP_INPUT_INLIST_APPEND_RELATIVE,
    E_COMP_INPUT_INLIST_PREPEND_RELATIVE,
-   E_COMP_INPUT_INLIST_REMOVE,
 } E_Comp_Input_Inlist_Function_Type;
 
 typedef struct _E_Comp_Input_Key_Data E_Comp_Input_Key_Data;
@@ -54,11 +54,8 @@ struct _E_Comp_Input
 {
    E_Client *focused_ec;
 
-   struct
-     {
-        Eina_Inlist *clients;
-        unsigned int clients_count;
-     } layers[E_LAYER_COUNT];
+   E_View_Tree tree;
+   E_View_Tree layer_tree[E_LAYER_COUNT];
 };
 
 extern EINTERN E_Comp_Input_Key_Data *e_comp_input_key;
index ab4a823240c4b2569a2414570f95b2b020536fff..2d6699bc31015c0759b272196d78a1a04c5b5f9e 100644 (file)
@@ -3,10 +3,12 @@
 #include "e_comp_input_intern.h"
 #include "e_utils_intern.h"
 #include "e_comp_cfdata_intern.h"
+#include "e_view_input_client_intern.h"
 
 struct _E_Input_Thread_Client
 {
-   EINA_INLIST;
+   E_View_Input_Client *view_client;
+
    void *ec;
    struct wl_resource *surface;
    E_Layer layer;
@@ -49,6 +51,13 @@ struct _E_Input_Thread_Client
    } eo_geometry;
 };
 
+typedef struct _E_Input_Thread_Client_Data_Get
+{
+   E_Input_Thread_Client *criterion_itc;
+   E_Input_Thread_Client *result_itc;
+   unsigned int cur_layer;
+} E_Input_Thread_Client_Data_Get;
+
 static Eina_List *_itc_list = NULL;
 
 ///////////////////////////////////////////
@@ -80,6 +89,8 @@ e_input_thread_client_new(E_Client *ec, struct wl_resource *surface)
 
    _itc_list = eina_list_append(_itc_list, itc);
 
+   itc->view_client = e_view_input_client_create((void *)itc, &e_comp_input->layer_tree[e_comp_canvas_layer_map(E_LAYER_CLIENT_NORMAL)]);
+
    ICINF("[%s] iec(%p), ec(%p), surface(%p)\n", __func__, itc, ec, surface);
 
    return itc;
@@ -107,6 +118,8 @@ e_input_thread_client_free(E_Input_Thread_Client *iec)
         iec->input_region = NULL;
      }
 
+   e_view_destroy(e_view_input_client_view_get(iec->view_client));
+
    E_FREE(iec);
 }
 
@@ -389,14 +402,6 @@ EINTERN E_Input_Thread_Client * e_input_thread_client_get(E_Client *ec)
    return NULL;
 }
 
-EINTERN Eina_Inlist * e_input_thread_client_Inlist_get(E_Client *ec)
-{
-   E_Input_Thread_Client *iec = e_input_thread_client_get(ec);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
-
-   return &(iec->__in_list);
-}
-
 EINTERN Eina_Bool e_input_thread_check_client_cloning_needed()
 {
    if (e_config)
@@ -405,43 +410,64 @@ EINTERN Eina_Bool e_input_thread_check_client_cloning_needed()
      return EINA_TRUE;
 }
 
-E_API E_Input_Thread_Client *e_input_thread_client_above_get(E_Input_Thread_Client *iec)
+EINTERN E_View_Input_Client *e_input_thread_client_view_input_client_get(E_Input_Thread_Client *itc)
 {
-   unsigned int x;
-   E_Input_Thread_Client *iec2;
+   if (!itc) return NULL;
+   return itc->view_client;
+}
 
-   EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
-   if (EINA_INLIST_GET(iec)->next) //check current layer
+static void _e_input_thread_iter_client_get(E_View *view, int sx, int sy, void *user_data)
+{
+   E_Input_Thread_Client_Data_Get *iter_data = (E_Input_Thread_Client_Data_Get *) user_data;
+   E_Input_Thread_Client *itc;
+
+   if (view->type != E_VIEW_TYPE_CLIENT) return;
+
+   itc = e_view_input_client_input_thread_client_get(e_view_input_client_from_view(view));
+
+   if (iter_data->criterion_itc)
      {
-        EINA_INLIST_FOREACH(EINA_INLIST_GET(iec)->next, iec2)
+        if (iter_data->criterion_itc == itc)
           {
-             if (iec == iec2)
-               {
-                  ICINF("[%s] iec: %p\n", __func__, iec);
-                  continue;
-               }
-             if (!iec2->deleted)
-               return iec2;
+             if (itc->layer == iter_data->criterion_itc->layer)
+               ICINF("[%s] iec: %p\n", __func__, itc);
+             else
+               ICINF("EC exist above layer. ec layer_map:%d, cur layer_map:%d", e_comp_canvas_layer_map(itc->layer), iter_data->cur_layer);
+             iter_data->criterion_itc = NULL;
           }
+        return;
      }
+
+   if (!itc->deleted) iter_data->result_itc = itc;
+}
+
+E_API E_Input_Thread_Client *e_input_thread_client_above_get(E_Input_Thread_Client *iec)
+{
+   unsigned int x;
+   E_View_Tree *layer_tree;
+   E_View *layer_view;
+   E_Input_Thread_Client_Data_Get iter_data = {
+      .criterion_itc = iec,
+      .result_itc = NULL,
+   };
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
+
+   layer_tree = &e_comp_input->layer_tree[e_comp_canvas_layer_map(iec->layer)];
+   layer_view = e_view_tree_view_get(layer_tree);
+   e_view_for_each_view(layer_view, _e_input_thread_iter_client_get, &iter_data);
+   if (iter_data.result_itc) return iter_data.result_itc;
+
    if (iec->layer == E_LAYER_CLIENT_CURSOR) return NULL;
    if (!e_util_client_layer_validate(iec->layer)) return NULL;
 
    for (x = e_comp_canvas_layer_map(iec->layer) + 1; x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
      {
-        if (!e_comp_input->layers[x].clients) continue;
-        EINA_INLIST_FOREACH(e_comp_input->layers[x].clients, iec2)
-          {
-             if (iec == iec2)
-               {
-                  ICINF("EC exist above layer. ec layer_map:%d, cur layer_map:%d", e_comp_canvas_layer_map(iec->layer), x);
-                  continue;
-               }
-             if (!iec2->deleted)
-               {
-                  return iec2;
-               }
-          }
+        layer_tree = &e_comp_input->layer_tree[x];
+        layer_view = e_view_tree_view_get(layer_tree);
+        iter_data.cur_layer = x;
+        e_view_for_each_view(layer_view, _e_input_thread_iter_client_get, &iter_data);
+        if (iter_data.result_itc) return iter_data.result_itc;
      }
 
    return NULL;
@@ -450,26 +476,21 @@ E_API E_Input_Thread_Client *e_input_thread_client_above_get(E_Input_Thread_Clie
 E_API E_Input_Thread_Client *e_input_thread_client_below_get(E_Input_Thread_Client *iec)
 {
    unsigned int x;
-   E_Input_Thread_Client *iec2;
-   Eina_Inlist *l;
    E_Layer iec_layer, iec_layer_cw;
    int cw_layer;
+   E_View_Tree *layer_tree;
+   E_View *layer_view;
+   E_Input_Thread_Client_Data_Get iter_data = {
+      .criterion_itc = iec,
+      .result_itc = NULL,
+   };
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
-   if (EINA_INLIST_GET(iec)->prev) //check current layer
-     {
-        for (l = EINA_INLIST_GET(iec)->prev; l; l = l->prev)
-          {
-             iec2 = EINA_INLIST_CONTAINER_GET(l, E_Input_Thread_Client);
-             if (iec == iec2)
-               {
-                  ICINF("CHECK the ec inlist prev");
-                  continue;
-               }
-             if (!iec2->deleted)
-               return iec2;
-          }
-     }
+
+   layer_tree = &e_comp_input->layer_tree[e_comp_canvas_layer_map(iec->layer)];
+   layer_view = e_view_tree_view_get(layer_tree);
+   e_view_for_each_view_reverse(layer_view, _e_input_thread_iter_client_get, &iter_data);
+   if (iter_data.result_itc) return iter_data.result_itc;
 
    // check layer validation
    iec_layer = iec->layer;
@@ -496,17 +517,11 @@ E_API E_Input_Thread_Client *e_input_thread_client_below_get(E_Input_Thread_Clie
 
    for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
      {
-        if (!e_comp_input->layers[x].clients) continue;
-        EINA_INLIST_REVERSE_FOREACH(e_comp_input->layers[x].clients, iec2)
-          {
-             if (iec == iec2)
-               {
-                  ICINF("EC exist below layer. ec layer_map:%d, cur layer_map:%d", e_comp_canvas_layer_map(iec_layer), x);
-                  continue;
-               }
-             if (!iec2->deleted)
-               return iec2;
-          }
+        layer_tree = &e_comp_input->layer_tree[x];
+        layer_view = e_view_tree_view_get(layer_tree);
+        iter_data.cur_layer = x;
+        e_view_for_each_view_reverse(layer_view, _e_input_thread_iter_client_get, &iter_data);
+        if (iter_data.result_itc) return iter_data.result_itc;
      }
 
    return NULL;
@@ -515,14 +530,17 @@ E_API E_Input_Thread_Client *e_input_thread_client_below_get(E_Input_Thread_Clie
 E_API E_Input_Thread_Client *e_input_thread_client_bottom_get()
 {
    unsigned int x;
+   E_Input_Thread_Client_Data_Get iter_data = {
+      .criterion_itc = NULL,
+      .result_itc = NULL,
+   };
+
    for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
      {
-        E_Input_Thread_Client *iec2;
-        if (!e_comp_input->layers[x].clients) continue;
-
-        EINA_INLIST_FOREACH(e_comp_input->layers[x].clients, iec2)
-          if (!iec2->deleted)
-            return iec2;
+        E_View_Tree *layer_tree = &e_comp_input->layer_tree[x];
+        E_View *layer_view = e_view_tree_view_get(layer_tree);
+        e_view_for_each_view(layer_view, _e_input_thread_iter_client_get, &iter_data);
+        if (iter_data.result_itc) return iter_data.result_itc;
      }
 
    return NULL;
@@ -531,14 +549,17 @@ E_API E_Input_Thread_Client *e_input_thread_client_bottom_get()
 E_API E_Input_Thread_Client *e_input_thread_client_top_get()
 {
    unsigned int x;
+   E_Input_Thread_Client_Data_Get iter_data = {
+      .criterion_itc = NULL,
+      .result_itc = NULL,
+   };
+
    for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
      {
-        E_Input_Thread_Client *iec2;
-        if (!e_comp_input->layers[x].clients) continue;
-
-        EINA_INLIST_REVERSE_FOREACH(e_comp_input->layers[x].clients, iec2)
-          if (!iec2->deleted)
-            return iec2;
+        E_View_Tree *layer_tree = &e_comp_input->layer_tree[x];
+        E_View *layer_view = e_view_tree_view_get(layer_tree);
+        e_view_for_each_view_reverse(layer_view, _e_input_thread_iter_client_get, &iter_data);
+        if (iter_data.result_itc) return iter_data.result_itc;
      }
 
    return NULL;
index dd90f42b511854bb1ea4f09816c7604b0b8261d8..5f3afa50b7e85a81fd618e8b903ff0910eb6419c 100644 (file)
@@ -2,6 +2,8 @@
 #define E_INPUT_THREAD_CLIENT_INTERN_H
 
 #include "e_intern.h"
+#include "e_view.h"
+#include "e_view_input_client_intern.h"
 
 #include <wayland-server.h>
 
@@ -76,9 +78,9 @@ EINTERN void e_input_thread_client_input_region_clear(E_Input_Thread_Client *ec)
 EINTERN void e_input_thread_client_surface_set(E_Input_Thread_Client *ec, struct wl_resource *surface);
 
 EINTERN E_Input_Thread_Client * e_input_thread_client_get(E_Client *ec);
-EINTERN Eina_Inlist * e_input_thread_client_Inlist_get(E_Client *ec);
 
 EINTERN Eina_Bool e_input_thread_check_client_cloning_needed();
+EINTERN E_View_Input_Client *e_input_thread_client_view_input_client_get(E_Input_Thread_Client *itc);
 
 EINTERN void e_input_thread_client_last_device_set(E_Input_Thread_Client *iec, Ecore_Device_Class dev_class, E_Devicemgr_Input_Device *device);
 EINTERN E_Devicemgr_Input_Device *e_input_thread_client_last_device_get(E_Input_Thread_Client *iec, Ecore_Device_Class dev_class);
diff --git a/src/bin/inputmgr/e_view_input_client.c b/src/bin/inputmgr/e_view_input_client.c
new file mode 100644 (file)
index 0000000..a5074d5
--- /dev/null
@@ -0,0 +1,76 @@
+#include "e_view_input_client_intern.h"
+#include "e_intern.h"
+#include "e_view_intern.h"
+
+struct _E_View_Input_Client
+{
+   E_View view;
+   E_View_Tree tree;
+
+   void *itc;
+};
+
+static void
+_thread_view_tree_destroy(E_View_Tree *view_tree)
+{
+   ;//nothing to do
+}
+
+E_View_Tree_Impl input_client_tree_impl = {
+   .destroy = _thread_view_tree_destroy,
+};
+
+static void
+_thread_view_client_destroy(E_View *view)
+{
+   E_View_Input_Client *client = e_view_input_client_from_view(view);
+
+   E_FREE(client);
+}
+
+E_View_Impl input_client_impl = {
+   .destroy = _thread_view_client_destroy,
+};
+
+EINTERN E_View_Input_Client *
+e_view_input_client_create(void *itc, E_View_Tree *parent)
+{
+   E_View_Input_Client *client;
+
+   if (itc == NULL || parent == NULL)
+     return NULL;
+
+   client = E_NEW(E_View_Input_Client, 1);
+   if (!client)
+     return NULL;
+
+   e_view_init(&client->view, E_VIEW_TYPE_RECT, (E_View_Impl*)&input_client_impl, NULL, parent);
+
+   e_view_tree_init(&client->tree, &input_client_tree_impl, NULL);
+   e_view_reorderable_set(&client->tree.view, false);
+
+   client->itc = itc;
+
+   return client;
+}
+
+EINTERN E_View_Input_Client *
+e_view_input_client_from_view(E_View *view)
+{
+   E_View_Input_Client *client;
+
+   assert(view->impl == (E_View_Impl*)&input_client_impl);
+   return wl_container_of(view, client, view);
+}
+
+EINTERN E_View *
+e_view_input_client_view_get(E_View_Input_Client *input_client)
+{
+   return &input_client->view;
+}
+
+EINTERN void *
+e_view_input_client_input_thread_client_get(E_View_Input_Client *input_client)
+{
+   return input_client->itc;
+}
diff --git a/src/bin/inputmgr/e_view_input_client_intern.h b/src/bin/inputmgr/e_view_input_client_intern.h
new file mode 100644 (file)
index 0000000..093a5b3
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef E_VIEW_INPUT_CLIENT_INTERN_H
+#define E_VIEW_INPUT_CLIENT_INTERN_H
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#include "e_intern.h"
+#include "e_view_intern.h"
+
+typedef struct _E_View_Input_Client E_View_Input_Client;
+
+EINTERN E_View_Input_Client *e_view_input_client_create(void *itc, E_View_Tree *parent);
+EINTERN E_View_Input_Client *e_view_input_client_from_view(E_View *view);
+EINTERN E_View              *e_view_input_client_view_get(E_View_Input_Client *client);
+EINTERN void                *e_view_input_client_input_thread_client_get(E_View_Input_Client *input_client);
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif