1 #include "e_input_thread_client_intern.h"
2 #include "e_comp_canvas.h"
3 #include "e_comp_input_intern.h"
5 struct _E_Input_Thread_Client
9 struct wl_resource *surface;
11 E_Visibility visibility;
12 Eina_Bool layer_block;
13 Eina_Bool layer_pending;
17 Eina_Stringshare *icccm_name;
18 Eina_Stringshare *netwm_name;
19 Eina_Stringshare *icccm_title;
22 static Eina_List *_itc_list = NULL;
24 ///////////////////////////////////////////
26 e_input_thread_client_init()
32 e_input_thread_client_shutdown()
35 eina_list_free(_itc_list);
40 EINTERN E_Input_Thread_Client *
41 e_input_thread_client_new(E_Client *ec, struct wl_resource *surface)
43 E_Input_Thread_Client *itc = E_NEW(E_Input_Thread_Client, 1);
44 EINA_SAFETY_ON_NULL_RETURN_VAL(itc, NULL);
47 itc->surface = surface;
48 itc->layer = E_LAYER_CLIENT_NORMAL;
49 itc->visibility = E_VISIBILITY_UNKNOWN;
51 _itc_list = eina_list_append(_itc_list, itc);
52 INF("[%s] iec(%p), ec(%p), surface(%p)\n", __func__, itc, ec, surface);
58 e_input_thread_client_free(E_Input_Thread_Client *iec)
60 EINA_SAFETY_ON_NULL_RETURN(iec);
62 INF("[%s] iec(%p), ec(%p)", __func__, iec, iec->ec);
64 _itc_list = eina_list_remove(_itc_list, iec);
70 e_input_thread_client_del(E_Input_Thread_Client *iec)
72 EINA_SAFETY_ON_NULL_RETURN(iec);
74 INF("[%s] iec(%p), ec(%p)", __func__, iec, iec->ec);
79 e_input_thread_client_visibility_set(E_Input_Thread_Client *iec, E_Visibility visibility)
81 EINA_SAFETY_ON_NULL_RETURN(iec);
83 iec->visibility = visibility;
84 INF("[%s] iec(%p), ec(%p), visibility(%d)\n", __func__, iec, iec->ec, visibility);
88 e_input_thread_client_visibility_get(E_Input_Thread_Client *iec)
90 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, E_VISIBILITY_UNKNOWN);
92 return iec->visibility;
96 e_input_thread_client_video_mode_get(E_Input_Thread_Client *iec)
98 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, EINA_FALSE);
100 return iec->is_video;
104 e_input_thread_client_video_set(E_Input_Thread_Client *iec, Eina_Bool is_video)
106 EINA_SAFETY_ON_NULL_RETURN(iec);
108 iec->is_video = is_video;
109 INF("[%s] iec(%p), ec(%p), video(%d)\n", __func__, iec, iec->ec, is_video);
113 e_input_thread_client_visible_get(E_Input_Thread_Client *iec)
115 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, EINA_FALSE);
117 return iec->visibility;
121 e_input_thread_client_icccm_name_set(E_Input_Thread_Client *iec, char *name)
123 EINA_SAFETY_ON_NULL_RETURN(iec);
125 eina_stringshare_replace(&iec->icccm_name, name);
126 INF("[%s] iec(%p), ec(%p), name(%s)\n", __func__, iec, iec->ec, name);
129 E_API Eina_Stringshare *
130 e_input_thread_client_icccm_name_get(E_Input_Thread_Client *iec)
132 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
134 return iec->icccm_name;
138 e_input_thread_client_icccm_title_set(E_Input_Thread_Client *iec, char *title)
140 EINA_SAFETY_ON_NULL_RETURN(iec);
142 eina_stringshare_replace(&iec->icccm_title, title);
144 INF("[%s] iec(%p), ec(%p), title(%s)\n", __func__, iec, iec->ec, title);
147 E_API Eina_Stringshare *
148 e_input_thread_client_icccm_title_get(E_Input_Thread_Client *iec)
150 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
152 return iec->icccm_title;
156 e_input_thread_client_netwm_name_set(E_Input_Thread_Client *iec, char *name)
158 EINA_SAFETY_ON_NULL_RETURN(iec);
160 eina_stringshare_replace(&iec->icccm_name, name);
162 INF("[%s] iec(%p), ec(%p), name(%s)\n", __func__, iec, iec->ec, name);
165 E_API Eina_Stringshare *
166 e_input_thread_client_netwm_name_get(E_Input_Thread_Client *iec)
168 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
170 return iec->icccm_name;
173 E_API Eina_Stringshare *
174 e_input_thread_client_util_name_get(E_Input_Thread_Client *iec)
176 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
179 return iec->netwm_name;
180 else if (iec->icccm_title)
181 return iec->icccm_title;
186 E_API Eina_Bool e_input_thread_client_cursor_mode_get(E_Input_Thread_Client *iec)
188 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, EINA_FALSE);
190 return iec->is_cursor;
193 EINTERN void e_input_thread_client_layer_set(E_Input_Thread_Client *iec, E_Layer layer)
195 EINA_SAFETY_ON_NULL_RETURN(iec);
198 INF("[%s] iec(%p), ec(%p), layer(%d)\n", __func__, iec, iec->ec, layer);
201 EINTERN void e_input_thread_client_layer_block_set(E_Input_Thread_Client *iec, Eina_Bool block)
203 EINA_SAFETY_ON_NULL_RETURN(iec);
205 iec->layer_block = block;
206 INF("[%s] iec(%p), ec(%p), layer_block(%d)\n", __func__, iec, iec->ec, iec->layer_block);
209 EINTERN void e_input_thread_client_layer_pending_set(E_Input_Thread_Client *iec, Eina_Bool pending)
211 EINA_SAFETY_ON_NULL_RETURN(iec);
213 iec->layer_pending = pending;
214 INF("[%s] iec(%p), ec(%p), layer_pending(%d)\n", __func__, iec, iec->ec, iec->layer_pending);
217 EINTERN void e_input_thread_client_is_cursor_set(E_Input_Thread_Client *iec, Eina_Bool is_cursor)
219 EINA_SAFETY_ON_NULL_RETURN(iec);
221 iec->is_cursor = is_cursor;
222 INF("[%s] iec(%p), ec(%p), is_cursor(%d)\n", __func__, iec, iec->ec, iec->is_cursor);
225 EINTERN E_Input_Thread_Client * e_input_thread_client_get(E_Client *ec)
229 E_Input_Thread_Client *itc = NULL;
231 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
233 EINA_LIST_FOREACH(_itc_list, l, list_data)
235 itc = (E_Input_Thread_Client *)list_data;
236 if (itc && itc->ec == ec)
243 EINTERN Eina_Inlist * e_input_thread_client_Inlist_get(E_Client *ec)
245 E_Input_Thread_Client *iec = e_input_thread_client_get(ec);
246 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
248 return &(iec->__in_list);
251 E_API E_Input_Thread_Client *e_input_thread_client_above_get(E_Input_Thread_Client *iec)
254 E_Input_Thread_Client *iec2;
256 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
257 if (EINA_INLIST_GET(iec)->next) //check current layer
259 EINA_INLIST_FOREACH(EINA_INLIST_GET(iec)->next, iec2)
263 INF("[%s] iec: %p\n", __func__, iec);
270 if (iec->layer == E_LAYER_CLIENT_CURSOR) return NULL;
271 if (e_comp_canvas_client_layer_map(iec->layer) == 9999) return NULL;
273 for (x = e_comp_canvas_layer_map(iec->layer) + 1; x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
275 if (!e_comp_input->layers[x].clients) continue;
276 EINA_INLIST_FOREACH(e_comp_input->layers[x].clients, iec2)
280 INF("EC exist above layer. ec layer_map:%d, cur layer_map:%d", e_comp_canvas_layer_map(iec->layer), x);
293 E_API E_Input_Thread_Client *e_input_thread_client_below_get(E_Input_Thread_Client *iec)
296 E_Input_Thread_Client *iec2;
298 E_Layer iec_layer, iec_layer_cw;
301 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
302 if (EINA_INLIST_GET(iec)->prev) //check current layer
304 for (l = EINA_INLIST_GET(iec)->prev; l; l = l->prev)
306 iec2 = EINA_INLIST_CONTAINER_GET(l, E_Input_Thread_Client);
309 INF("CHECK the ec inlist prev");
317 // check layer validation
318 iec_layer = iec->layer;
319 if (iec->layer_block || iec->layer_pending)
321 cw_layer = iec->layer;
324 iec_layer_cw = e_comp_canvas_layer_map_to(cw_layer);
325 if (iec_layer != iec_layer_cw)
327 INF("LAYER is not same. USE obj layer! (ec->layer:%d, obj:%d). block:%d, pending:%d)", iec_layer, iec_layer_cw, iec->layer_block, iec->layer_pending);
328 iec_layer = iec_layer_cw;
333 if (iec_layer == E_LAYER_CLIENT_DESKTOP) return NULL;
334 if (e_comp_canvas_client_layer_map(iec_layer) == 9999) return NULL;
336 /* go down the layers until we find one */
337 x = e_comp_canvas_layer_map(iec_layer);
340 for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
342 if (!e_comp_input->layers[x].clients) continue;
343 EINA_INLIST_REVERSE_FOREACH(e_comp_input->layers[x].clients, iec2)
347 INF("EC exist below layer. ec layer_map:%d, cur layer_map:%d", e_comp_canvas_layer_map(iec_layer), x);
358 E_API E_Input_Thread_Client *e_input_thread_client_bottom_get()
361 for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
363 E_Input_Thread_Client *iec2;
364 if (!e_comp_input->layers[x].clients) continue;
366 EINA_INLIST_FOREACH(e_comp_input->layers[x].clients, iec2)
374 E_API E_Input_Thread_Client *e_input_thread_client_top_get()
377 for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
379 E_Input_Thread_Client *iec2;
380 if (!e_comp_input->layers[x].clients) continue;
382 EINA_INLIST_REVERSE_FOREACH(e_comp_input->layers[x].clients, iec2)
390 E_API E_Input_Thread_Client *e_input_thread_client_focused_get()
392 return e_input_thread_client_get(e_comp_input->focused_ec);
395 E_API E_Input_Thread_Client *e_input_thread_client_from_surface_resource(struct wl_resource *surface_resource)
399 E_Input_Thread_Client *itc = NULL;
401 EINA_SAFETY_ON_NULL_RETURN_VAL(surface_resource, NULL);
403 EINA_LIST_FOREACH(_itc_list, l, list_data)
405 itc = (E_Input_Thread_Client *)list_data;
406 if (itc && itc->surface == surface_resource)
413 E_API struct wl_resource *e_input_thread_client_wl_resource_get(E_Input_Thread_Client *iec)
415 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);