1 #include "e_mod_comp_shared_types.h"
2 #include "e_mod_comp.h"
3 #include "e_mod_comp_debug.h"
5 typedef enum _E_Comp_Win_Class_Type
7 E_COMP_WIN_CLASS_TYPE_UNKNOWN = 0,
8 E_COMP_WIN_CLASS_TYPE_NORMAL,
9 E_COMP_WIN_CLASS_TYPE_MENUSCREEN,
10 E_COMP_WIN_CLASS_TYPE_QUICKPANEL_BASE,
11 E_COMP_WIN_CLASS_TYPE_QUICKPANEL,
12 E_COMP_WIN_CLASS_TYPE_TASKMANAGER,
13 E_COMP_WIN_CLASS_TYPE_LIVEMAGAZINE,
14 E_COMP_WIN_CLASS_TYPE_LOCKSCREEN,
15 E_COMP_WIN_CLASS_TYPE_INDICATOR,
16 E_COMP_WIN_CLASS_TYPE_TICKERNOTI,
17 E_COMP_WIN_CLASS_TYPE_DEBUGGING_INFO,
18 E_COMP_WIN_CLASS_TYPE_APPTRAY,
19 E_COMP_WIN_CLASS_TYPE_MINI_APPTRAY,
20 E_COMP_WIN_CLASS_TYPE_VOLUME,
21 E_COMP_WIN_CLASS_TYPE_BACKGROUND,
22 E_COMP_WIN_CLASS_TYPE_SETUP_WIZARD,
23 E_COMP_WIN_CLASS_TYPE_ISF,
24 } E_Comp_Win_Class_Type;
26 typedef enum _E_Comp_Win_Name_Type
28 E_COMP_WIN_NAME_TYPE_UNKNOWN = 0,
29 E_COMP_WIN_NAME_TYPE_NORMAL,
30 E_COMP_WIN_NAME_TYPE_MENUSCREEN,
31 E_COMP_WIN_NAME_TYPE_QUICKPANEL_BASE,
32 E_COMP_WIN_NAME_TYPE_QUICKPANEL,
33 E_COMP_WIN_NAME_TYPE_TASKMANAGER,
34 E_COMP_WIN_NAME_TYPE_LIVEMAGAZINE,
35 E_COMP_WIN_NAME_TYPE_LOCKSCREEN,
36 E_COMP_WIN_NAME_TYPE_INDICATOR,
37 E_COMP_WIN_NAME_TYPE_TICKERNOTI,
38 E_COMP_WIN_NAME_TYPE_APPTRAY,
39 E_COMP_WIN_NAME_TYPE_MINI_APPTRAY,
40 E_COMP_WIN_NAME_TYPE_VOLUME,
41 E_COMP_WIN_NAME_TYPE_BACKGROUND,
42 E_COMP_WIN_NAME_TYPE_SETUP_WIZARD,
43 E_COMP_WIN_NAME_TYPE_ISF_KEYBOARD,
44 E_COMP_WIN_NAME_TYPE_ISF_SUB,
45 } E_Comp_Win_Name_Type;
47 /* local subsystem functions */
48 static E_Comp_Win_Type _ecore_type_to_e_comp_type(Ecore_X_Window_Type t);
50 /* local subsystem globals */
51 static const char *win_class[] =
72 static const char *win_name[] =
75 "com.samsung.menu-screen",
89 // E_COMP_WIN_NAME_TYPE_ISF_KEYBOARD
91 // E_COMP_WIN_NAME_TYPE_ISF_SUB
98 static E_Comp_Win_Class_Type win_class_vals[] =
100 E_COMP_WIN_CLASS_TYPE_NORMAL,
101 E_COMP_WIN_CLASS_TYPE_MENUSCREEN,
102 E_COMP_WIN_CLASS_TYPE_QUICKPANEL_BASE,
103 E_COMP_WIN_CLASS_TYPE_QUICKPANEL,
104 E_COMP_WIN_CLASS_TYPE_TASKMANAGER,
105 E_COMP_WIN_CLASS_TYPE_LIVEMAGAZINE,
106 E_COMP_WIN_CLASS_TYPE_LOCKSCREEN,
107 E_COMP_WIN_CLASS_TYPE_LOCKSCREEN,
108 E_COMP_WIN_CLASS_TYPE_INDICATOR,
109 E_COMP_WIN_CLASS_TYPE_TICKERNOTI,
110 E_COMP_WIN_CLASS_TYPE_DEBUGGING_INFO,
111 E_COMP_WIN_CLASS_TYPE_APPTRAY,
112 E_COMP_WIN_CLASS_TYPE_MINI_APPTRAY,
113 E_COMP_WIN_CLASS_TYPE_VOLUME,
114 E_COMP_WIN_CLASS_TYPE_BACKGROUND,
115 E_COMP_WIN_CLASS_TYPE_SETUP_WIZARD,
116 E_COMP_WIN_CLASS_TYPE_ISF,
119 static E_Comp_Win_Class_Type win_name_vals[] =
121 E_COMP_WIN_NAME_TYPE_NORMAL,
122 E_COMP_WIN_NAME_TYPE_MENUSCREEN,
123 E_COMP_WIN_NAME_TYPE_QUICKPANEL_BASE,
124 E_COMP_WIN_NAME_TYPE_QUICKPANEL,
125 E_COMP_WIN_NAME_TYPE_TASKMANAGER,
126 E_COMP_WIN_NAME_TYPE_LIVEMAGAZINE,
127 E_COMP_WIN_NAME_TYPE_LOCKSCREEN,
128 E_COMP_WIN_NAME_TYPE_LOCKSCREEN,
129 E_COMP_WIN_NAME_TYPE_INDICATOR,
130 E_COMP_WIN_NAME_TYPE_TICKERNOTI,
131 E_COMP_WIN_NAME_TYPE_APPTRAY,
132 E_COMP_WIN_NAME_TYPE_MINI_APPTRAY,
133 E_COMP_WIN_NAME_TYPE_VOLUME,
134 E_COMP_WIN_NAME_TYPE_BACKGROUND,
135 E_COMP_WIN_NAME_TYPE_SETUP_WIZARD,
136 E_COMP_WIN_NAME_TYPE_ISF_KEYBOARD,
137 E_COMP_WIN_NAME_TYPE_ISF_SUB,
140 static Eina_Hash *class_hash = NULL;
141 static Eina_Hash *names_hash = NULL;
143 /* externally accessible functions */
145 e_mod_comp_win_type_init(void)
148 if (!class_hash) class_hash = eina_hash_string_superfast_new(NULL);
149 if (!names_hash) names_hash = eina_hash_string_superfast_new(NULL);
151 n = (sizeof(win_class) / sizeof(char *));
152 for (i = 0; i < n; i++)
155 (class_hash, win_class[i],
159 n = (sizeof(win_name) / sizeof(char *));
160 for (i = 0; i < n; i++)
162 if (i >= E_COMP_WIN_NAME_TYPE_ISF_SUB)
165 (names_hash, win_name[i],
166 &win_name_vals[E_COMP_WIN_NAME_TYPE_ISF_SUB-1]);
172 win_name[i], &win_name_vals[i]);
180 e_mod_comp_win_type_shutdown(void)
182 if (class_hash) eina_hash_free(class_hash);
183 if (names_hash) eina_hash_free(names_hash);
192 e_mod_comp_win_type_setup(E_Comp_Win *cw)
194 Ecore_X_Window_Type wtype = ECORE_X_WINDOW_TYPE_UNKNOWN;
195 E_Comp_Win_Class_Type ctype = E_COMP_WIN_CLASS_TYPE_UNKNOWN;
196 E_Comp_Win_Name_Type ntype = E_COMP_WIN_NAME_TYPE_UNKNOWN;
197 E_Comp_Win_Type res = E_COMP_WIN_TYPE_UNKNOWN;
198 E_Comp_Win_Class_Type *pctype = NULL;
199 E_Comp_Win_Name_Type *pntype = NULL;
200 char *clas = NULL, *name = NULL;
202 E_CHECK_RETURN(cw, 0);
206 wtype = cw->bd->client.netwm.type;
207 if (cw->bd->internal)
208 ecore_x_icccm_name_class_get(cw->bd->client.win, &name, &clas);
211 clas = (char *)cw->bd->client.icccm.class;
212 name = (char *)cw->bd->client.icccm.name;
216 ecore_x_icccm_name_class_get(cw->win, &name, &clas);
220 pctype = eina_hash_find(class_hash, clas);
221 if (pctype) ctype = *pctype;
225 pntype = eina_hash_find(names_hash, name);
226 if (pntype) ntype = *pntype;
231 case E_COMP_WIN_CLASS_TYPE_MENUSCREEN:
232 res = E_COMP_WIN_TYPE_MENUSCREEN;
234 case E_COMP_WIN_CLASS_TYPE_QUICKPANEL_BASE:
235 res = E_COMP_WIN_TYPE_QUICKPANEL_BASE;
237 case E_COMP_WIN_CLASS_TYPE_QUICKPANEL:
238 res = E_COMP_WIN_TYPE_QUICKPANEL;
240 case E_COMP_WIN_CLASS_TYPE_TASKMANAGER:
241 if (ntype == E_COMP_WIN_NAME_TYPE_TASKMANAGER)
242 res = E_COMP_WIN_TYPE_TASKMANAGER;
244 case E_COMP_WIN_CLASS_TYPE_LIVEMAGAZINE:
245 if ((ntype == E_COMP_WIN_NAME_TYPE_LIVEMAGAZINE) &&
246 (wtype == ECORE_X_WINDOW_TYPE_NORMAL))
247 res = E_COMP_WIN_TYPE_LIVEMAGAZINE;
249 case E_COMP_WIN_CLASS_TYPE_LOCKSCREEN:
250 if (ntype == E_COMP_WIN_NAME_TYPE_LOCKSCREEN)
251 res = E_COMP_WIN_TYPE_LOCKSCREEN;
253 case E_COMP_WIN_CLASS_TYPE_INDICATOR:
254 if ((ntype == E_COMP_WIN_NAME_TYPE_INDICATOR) &&
255 (wtype == ECORE_X_WINDOW_TYPE_DOCK))
256 res = E_COMP_WIN_TYPE_INDICATOR;
258 case E_COMP_WIN_CLASS_TYPE_TICKERNOTI:
259 if ((ntype == E_COMP_WIN_NAME_TYPE_TICKERNOTI) &&
260 (wtype == ECORE_X_WINDOW_TYPE_NOTIFICATION))
261 res = E_COMP_WIN_TYPE_TICKERNOTI;
263 case E_COMP_WIN_CLASS_TYPE_DEBUGGING_INFO:
264 res = E_COMP_WIN_TYPE_DEBUGGING_INFO;
266 case E_COMP_WIN_CLASS_TYPE_ISF:
267 if (wtype != ECORE_X_WINDOW_TYPE_UTILITY)
269 else if (ntype == E_COMP_WIN_NAME_TYPE_ISF_KEYBOARD)
270 res = E_COMP_WIN_TYPE_ISF_KEYBOARD;
271 else if (ntype == E_COMP_WIN_NAME_TYPE_ISF_SUB)
272 res = E_COMP_WIN_TYPE_ISF_SUB;
274 case E_COMP_WIN_CLASS_TYPE_NORMAL:
275 if ((wtype == ECORE_X_WINDOW_TYPE_NORMAL) ||
276 (wtype == ECORE_X_WINDOW_TYPE_UNKNOWN))
277 res = E_COMP_WIN_TYPE_NORMAL;
279 case E_COMP_WIN_CLASS_TYPE_APPTRAY:
280 if (ntype == E_COMP_WIN_NAME_TYPE_APPTRAY)
281 res = E_COMP_WIN_TYPE_APPTRAY;
283 case E_COMP_WIN_CLASS_TYPE_MINI_APPTRAY:
284 if (ntype == E_COMP_WIN_NAME_TYPE_MINI_APPTRAY)
285 res = E_COMP_WIN_TYPE_MINI_APPTRAY;
287 case E_COMP_WIN_CLASS_TYPE_VOLUME:
288 if ((ntype == E_COMP_WIN_NAME_TYPE_VOLUME) &&
289 (wtype == ECORE_X_WINDOW_TYPE_NOTIFICATION))
290 res = E_COMP_WIN_TYPE_VOLUME;
292 case E_COMP_WIN_CLASS_TYPE_BACKGROUND:
293 if (ntype == E_COMP_WIN_NAME_TYPE_BACKGROUND)
294 res = E_COMP_WIN_TYPE_BACKGROUND;
296 case E_COMP_WIN_CLASS_TYPE_SETUP_WIZARD:
297 if (ntype == E_COMP_WIN_NAME_TYPE_SETUP_WIZARD)
298 res = E_COMP_WIN_TYPE_SETUP_WIZARD;
304 if (res == E_COMP_WIN_TYPE_UNKNOWN)
305 res = _ecore_type_to_e_comp_type(wtype);
308 (cw->bd && cw->bd->internal))
310 if (name) E_FREE(name);
311 if (clas) E_FREE(clas);
318 EINTERN E_Comp_Win_Type
319 e_mod_comp_win_type_get(E_Comp_Win *cw)
321 E_CHECK_RETURN(cw, E_COMP_WIN_TYPE_UNKNOWN);
326 e_mod_comp_win_type_handler_prop(Ecore_X_Event_Window_Property *ev)
329 E_CHECK_RETURN(ev, 0);
330 E_CHECK_RETURN(ev->win, 0);
332 L(LT_EVENT_X, "COMP|%31s\n", "PROP_WM_CLASS");
334 cw = e_mod_comp_border_client_find(ev->win);
335 if (cw) return EINA_TRUE;
337 cw = e_mod_comp_win_find(ev->win);
338 E_CHECK_RETURN(cw, 0);
339 E_CHECK_RETURN((!cw->bd), 0);
341 e_mod_comp_win_type_setup(cw);
345 /* local subsystem functions */
346 static E_Comp_Win_Type
347 _ecore_type_to_e_comp_type(Ecore_X_Window_Type t)
349 E_Comp_Win_Type r = E_COMP_WIN_TYPE_UNKNOWN;
352 case ECORE_X_WINDOW_TYPE_NORMAL: r = E_COMP_WIN_TYPE_NORMAL; break;
353 case ECORE_X_WINDOW_TYPE_TOOLTIP: r = E_COMP_WIN_TYPE_TOOLTIP; break;
354 case ECORE_X_WINDOW_TYPE_COMBO: r = E_COMP_WIN_TYPE_COMBO; break;
355 case ECORE_X_WINDOW_TYPE_DND: r = E_COMP_WIN_TYPE_DND; break;
356 case ECORE_X_WINDOW_TYPE_DESKTOP: r = E_COMP_WIN_TYPE_DESKTOP; break;
357 case ECORE_X_WINDOW_TYPE_TOOLBAR: r = E_COMP_WIN_TYPE_TOOLBAR; break;
358 case ECORE_X_WINDOW_TYPE_MENU: r = E_COMP_WIN_TYPE_MENU; break;
359 case ECORE_X_WINDOW_TYPE_SPLASH: r = E_COMP_WIN_TYPE_SPLASH; break;
360 case ECORE_X_WINDOW_TYPE_DROPDOWN_MENU: r = E_COMP_WIN_TYPE_DROPDOWN_MENU; break;
361 case ECORE_X_WINDOW_TYPE_NOTIFICATION: r = E_COMP_WIN_TYPE_NOTIFICATION; break;
362 case ECORE_X_WINDOW_TYPE_UTILITY: r = E_COMP_WIN_TYPE_UTILITY; break;
363 case ECORE_X_WINDOW_TYPE_POPUP_MENU: r = E_COMP_WIN_TYPE_POPUP_MENU; break;
364 case ECORE_X_WINDOW_TYPE_DIALOG: r = E_COMP_WIN_TYPE_DIALOG; break;
366 r = E_COMP_WIN_TYPE_NORMAL;