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 \
#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)
{
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;
}
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 *
#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 {
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;
{
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;
#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;
} 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;
///////////////////////////////////////////
_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;
iec->input_region = NULL;
}
+ e_view_destroy(e_view_input_client_view_get(iec->view_client));
+
E_FREE(iec);
}
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)
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;
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;
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;
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;
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;
#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>
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);
--- /dev/null
+#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;
+}
--- /dev/null
+#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