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);
78 e_input_thread_client_visibility_set(E_Input_Thread_Client *iec, E_Visibility visibility)
80 EINA_SAFETY_ON_NULL_RETURN(iec);
82 iec->visibility = visibility;
83 INF("[%s] iec(%p), visibility(%d)\n", __func__, iec, visibility);
87 e_input_thread_client_visibility_get(E_Input_Thread_Client *iec)
89 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, E_VISIBILITY_UNKNOWN);
91 return iec->visibility;
95 e_input_thread_client_video_mode_get(E_Input_Thread_Client *iec)
97 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, EINA_FALSE);
103 e_input_thread_client_video_set(E_Input_Thread_Client *iec, Eina_Bool is_video)
105 EINA_SAFETY_ON_NULL_RETURN(iec);
107 iec->is_video = is_video;
108 INF("[%s] iec(%p), video(%d)\n", __func__, iec, is_video);
112 e_input_thread_client_visible_get(E_Input_Thread_Client *iec)
114 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, EINA_FALSE);
116 return iec->visibility;
120 e_input_thread_client_icccm_name_set(E_Input_Thread_Client *iec, char *name)
122 EINA_SAFETY_ON_NULL_RETURN(iec);
124 eina_stringshare_replace(&iec->icccm_name, name);
125 INF("[%s] iec(%p), name(%s)\n", __func__, iec, name);
128 E_API Eina_Stringshare *
129 e_input_thread_client_icccm_name_get(E_Input_Thread_Client *iec)
131 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
133 return iec->icccm_name;
137 e_input_thread_client_icccm_title_set(E_Input_Thread_Client *iec, char *title)
139 EINA_SAFETY_ON_NULL_RETURN(iec);
141 eina_stringshare_replace(&iec->icccm_title, title);
143 INF("[%s] iec(%p), title(%s)\n", __func__, iec, title);
146 E_API Eina_Stringshare *
147 e_input_thread_client_icccm_title_get(E_Input_Thread_Client *iec)
149 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
151 return iec->icccm_title;
155 e_input_thread_client_netwm_name_set(E_Input_Thread_Client *iec, char *name)
157 EINA_SAFETY_ON_NULL_RETURN(iec);
159 eina_stringshare_replace(&iec->icccm_name, name);
161 INF("[%s] iec(%p), name(%s)\n", __func__, iec, name);
164 E_API Eina_Stringshare *
165 e_input_thread_client_netwm_name_get(E_Input_Thread_Client *iec)
167 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
169 return iec->icccm_name;
172 E_API Eina_Stringshare *
173 e_input_thread_client_util_name_get(E_Input_Thread_Client *iec)
175 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
178 return iec->netwm_name;
179 else if (iec->icccm_title)
180 return iec->icccm_title;
185 E_API Eina_Bool e_input_thread_client_cursor_mode_get(E_Input_Thread_Client *iec)
187 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, EINA_FALSE);
189 return iec->is_cursor;
192 EINTERN void e_input_thread_client_layer_set(E_Input_Thread_Client *iec, E_Layer layer)
194 EINA_SAFETY_ON_NULL_RETURN(iec);
197 INF("[%s] iec(%p), layer(%d)\n", __func__, iec, layer);
200 EINTERN void e_input_thread_client_layer_block_set(E_Input_Thread_Client *iec, Eina_Bool block)
202 EINA_SAFETY_ON_NULL_RETURN(iec);
204 iec->layer_block = block;
205 INF("[%s] iec(%p), layer_block(%d)\n", __func__, iec, iec->layer_block);
208 EINTERN void e_input_thread_client_layer_pending_set(E_Input_Thread_Client *iec, Eina_Bool pending)
210 EINA_SAFETY_ON_NULL_RETURN(iec);
212 iec->layer_pending = pending;
213 INF("[%s] iec(%p), layer_pending(%d)\n", __func__, iec, iec->layer_pending);
216 EINTERN void e_input_thread_client_is_cursor_set(E_Input_Thread_Client *iec, Eina_Bool is_cursor)
218 EINA_SAFETY_ON_NULL_RETURN(iec);
220 iec->is_cursor = is_cursor;
221 INF("[%s] iec(%p), is_cursor(%d)\n", __func__, iec, iec->is_cursor);
224 EINTERN E_Input_Thread_Client * e_input_thread_client_get(E_Client *ec)
228 E_Input_Thread_Client *itc = NULL;
230 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
232 EINA_LIST_FOREACH(_itc_list, l, list_data)
234 itc = (E_Input_Thread_Client *)list_data;
235 if (itc && itc->ec == ec)
242 EINTERN Eina_Inlist * e_input_thread_client_Inlist_get(E_Client *ec)
244 E_Input_Thread_Client *iec = e_input_thread_client_get(ec);
245 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
247 return &(iec->__in_list);
250 E_API E_Input_Thread_Client *e_input_thread_client_above_get(E_Input_Thread_Client *iec)
253 E_Input_Thread_Client *iec2;
255 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
256 if (EINA_INLIST_GET(iec)->next) //check current layer
258 EINA_INLIST_FOREACH(EINA_INLIST_GET(iec)->next, iec2)
262 INF("[%s] iec: %p\n", __func__, iec);
269 if (iec->layer == E_LAYER_CLIENT_CURSOR) return NULL;
270 if (e_comp_canvas_client_layer_map(iec->layer) == 9999) return NULL;
272 for (x = e_comp_canvas_layer_map(iec->layer) + 1; x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
274 if (!e_comp_input->layers[x].clients) continue;
275 EINA_INLIST_FOREACH(e_comp_input->layers[x].clients, iec2)
279 INF("EC exist above layer. ec layer_map:%d, cur layer_map:%d", e_comp_canvas_layer_map(iec->layer), x);
292 E_API E_Input_Thread_Client *e_input_thread_client_below_get(E_Input_Thread_Client *iec)
295 E_Input_Thread_Client *iec2;
297 E_Layer iec_layer, iec_layer_cw;
300 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
301 if (EINA_INLIST_GET(iec)->prev) //check current layer
303 for (l = EINA_INLIST_GET(iec)->prev; l; l = l->prev)
305 iec2 = EINA_INLIST_CONTAINER_GET(l, E_Input_Thread_Client);
308 INF("CHECK the ec inlist prev");
316 // check layer validation
317 iec_layer = iec->layer;
318 if (iec->layer_block || iec->layer_pending)
320 cw_layer = iec->layer;
323 iec_layer_cw = e_comp_canvas_layer_map_to(cw_layer);
324 if (iec_layer != iec_layer_cw)
326 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);
327 iec_layer = iec_layer_cw;
332 if (iec_layer == E_LAYER_CLIENT_DESKTOP) return NULL;
333 if (e_comp_canvas_client_layer_map(iec_layer) == 9999) return NULL;
335 /* go down the layers until we find one */
336 x = e_comp_canvas_layer_map(iec_layer);
339 for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
341 if (!e_comp_input->layers[x].clients) continue;
342 EINA_INLIST_REVERSE_FOREACH(e_comp_input->layers[x].clients, iec2)
346 INF("EC exist below layer. ec layer_map:%d, cur layer_map:%d", e_comp_canvas_layer_map(iec_layer), x);
357 E_API E_Input_Thread_Client *e_input_thread_client_bottom_get()
360 for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
362 E_Input_Thread_Client *iec2;
363 if (!e_comp_input->layers[x].clients) continue;
365 EINA_INLIST_FOREACH(e_comp_input->layers[x].clients, iec2)
373 E_API E_Input_Thread_Client *e_input_thread_client_top_get()
376 for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
378 E_Input_Thread_Client *iec2;
379 if (!e_comp_input->layers[x].clients) continue;
381 EINA_INLIST_REVERSE_FOREACH(e_comp_input->layers[x].clients, iec2)
389 E_API E_Input_Thread_Client *e_input_thread_client_focused_get()
391 return e_input_thread_client_get(e_comp_input->focused_ec);
394 E_API E_Input_Thread_Client *e_input_thread_client_from_surface_resource(struct wl_resource *surface_resource)
398 E_Input_Thread_Client *itc = NULL;
400 EINA_SAFETY_ON_NULL_RETURN_VAL(surface_resource, NULL);
402 EINA_LIST_FOREACH(_itc_list, l, list_data)
404 itc = (E_Input_Thread_Client *)list_data;
405 if (itc && itc->surface == surface_resource)
412 E_API struct wl_resource *e_input_thread_client_wl_resource_get(E_Input_Thread_Client *iec)
414 EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);