tizen 2.4 release
[framework/uifw/e17-mod-tizen-comp.git] / src / e_mod_comp_win_type.c
1 #include "e_mod_comp_shared_types.h"
2 #include "e_mod_comp.h"
3 #include "e_mod_comp_debug.h"
4
5 typedef enum _E_Comp_Win_Class_Type
6 {
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_VIDEOCALL,
13    E_COMP_WIN_CLASS_TYPE_TASKMANAGER,
14    E_COMP_WIN_CLASS_TYPE_LIVEMAGAZINE,
15    E_COMP_WIN_CLASS_TYPE_LOCKSCREEN,
16    E_COMP_WIN_CLASS_TYPE_INDICATOR,
17    E_COMP_WIN_CLASS_TYPE_TICKERNOTI,
18    E_COMP_WIN_CLASS_TYPE_DEBUGGING_INFO,
19    E_COMP_WIN_CLASS_TYPE_APPTRAY,
20    E_COMP_WIN_CLASS_TYPE_MINI_APPTRAY,
21    E_COMP_WIN_CLASS_TYPE_VOLUME,
22    E_COMP_WIN_CLASS_TYPE_BACKGROUND,
23    E_COMP_WIN_CLASS_TYPE_SETUP_WIZARD,
24    E_COMP_WIN_CLASS_TYPE_TOAST,
25    E_COMP_WIN_CLASS_TYPE_ISF,
26 } E_Comp_Win_Class_Type;
27
28 typedef enum _E_Comp_Win_Name_Type
29 {
30    E_COMP_WIN_NAME_TYPE_UNKNOWN = 0,
31    E_COMP_WIN_NAME_TYPE_NORMAL,
32    E_COMP_WIN_NAME_TYPE_MENUSCREEN,
33    E_COMP_WIN_NAME_TYPE_QUICKPANEL_BASE,
34    E_COMP_WIN_NAME_TYPE_QUICKPANEL,
35    E_COMP_WIN_NAME_TYPE_TASKMANAGER,
36    E_COMP_WIN_NAME_TYPE_LIVEMAGAZINE,
37    E_COMP_WIN_NAME_TYPE_LOCKSCREEN,
38    E_COMP_WIN_NAME_TYPE_INDICATOR,
39    E_COMP_WIN_NAME_TYPE_TICKERNOTI,
40    E_COMP_WIN_NAME_TYPE_APPTRAY,
41    E_COMP_WIN_NAME_TYPE_MINI_APPTRAY,
42    E_COMP_WIN_NAME_TYPE_VOLUME,
43    E_COMP_WIN_NAME_TYPE_BACKGROUND,
44    E_COMP_WIN_NAME_TYPE_SETUP_WIZARD,
45    E_COMP_WIN_NAME_TYPE_TOAST,
46    E_COMP_WIN_NAME_TYPE_ISF_KEYBOARD,
47    E_COMP_WIN_NAME_TYPE_ISF_SUB,
48 } E_Comp_Win_Name_Type;
49
50 /* local subsystem functions */
51 static E_Comp_Win_Type _ecore_type_to_e_comp_type(Ecore_X_Window_Type t);
52
53 /* local subsystem globals */
54 static const char *win_class[] =
55 {
56    "NORMAL_WINDOW",
57    "MENU_SCREEN",
58    "QUICKPANEL_BASE",
59    "QUICKPANEL",
60    "vtmain",
61    "TASK_MANAGER",
62    "LIVE_MAGAZINE",
63    "LOCK_SCREEN",
64    "lockscreen",
65    "INDICATOR",
66    "quickpanel",
67    "DEBUGGING_INFO",
68    "APP_TRAY",
69    "MINIAPP_TRAY",
70    "volume",
71    "BACKGROUND",
72    "SETUP_WIZARD",
73    "SYSTEM_POPUP",
74    "ISF",
75 };
76
77 static const char *win_name[] =
78 {
79    "NORMAL_WINDOW",
80    "com.samsung.menu-screen",
81    "QUICKPANEL_BASE",
82    "QUICKPANEL",
83    "TASK_MANAGER",
84    "Live Magazine",
85    "LOCK_SCREEN",
86    "lockscreen",
87    "INDICATOR",
88    "noti_win",
89    "APP_TRAY",
90    "MINIAPP_TRAY",
91    "volume",
92    "BACKGROUND",
93    "SETUP_WIZARD",
94    "TOAST_POPUP",
95    // E_COMP_WIN_NAME_TYPE_ISF_KEYBOARD
96    "Virtual Keyboard",
97    // E_COMP_WIN_NAME_TYPE_ISF_SUB
98    "Key Magnifier",
99    "Prediction Window",
100    "Setting Window",
101    "ISF Popup",
102 };
103
104 static E_Comp_Win_Class_Type win_class_vals[] =
105 {
106    E_COMP_WIN_CLASS_TYPE_NORMAL,
107    E_COMP_WIN_CLASS_TYPE_MENUSCREEN,
108    E_COMP_WIN_CLASS_TYPE_QUICKPANEL_BASE,
109    E_COMP_WIN_CLASS_TYPE_QUICKPANEL,
110    E_COMP_WIN_CLASS_TYPE_VIDEOCALL,
111    E_COMP_WIN_CLASS_TYPE_TASKMANAGER,
112    E_COMP_WIN_CLASS_TYPE_LIVEMAGAZINE,
113    E_COMP_WIN_CLASS_TYPE_LOCKSCREEN,
114    E_COMP_WIN_CLASS_TYPE_LOCKSCREEN,
115    E_COMP_WIN_CLASS_TYPE_INDICATOR,
116    E_COMP_WIN_CLASS_TYPE_TICKERNOTI,
117    E_COMP_WIN_CLASS_TYPE_DEBUGGING_INFO,
118    E_COMP_WIN_CLASS_TYPE_APPTRAY,
119    E_COMP_WIN_CLASS_TYPE_MINI_APPTRAY,
120    E_COMP_WIN_CLASS_TYPE_VOLUME,
121    E_COMP_WIN_CLASS_TYPE_BACKGROUND,
122    E_COMP_WIN_CLASS_TYPE_SETUP_WIZARD,
123    E_COMP_WIN_CLASS_TYPE_TOAST,
124    E_COMP_WIN_CLASS_TYPE_ISF,
125 };
126
127 static E_Comp_Win_Class_Type win_name_vals[] =
128 {
129    E_COMP_WIN_NAME_TYPE_NORMAL,
130    E_COMP_WIN_NAME_TYPE_MENUSCREEN,
131    E_COMP_WIN_NAME_TYPE_QUICKPANEL_BASE,
132    E_COMP_WIN_NAME_TYPE_QUICKPANEL,
133    E_COMP_WIN_NAME_TYPE_TASKMANAGER,
134    E_COMP_WIN_NAME_TYPE_LIVEMAGAZINE,
135    E_COMP_WIN_NAME_TYPE_LOCKSCREEN,
136    E_COMP_WIN_NAME_TYPE_LOCKSCREEN,
137    E_COMP_WIN_NAME_TYPE_INDICATOR,
138    E_COMP_WIN_NAME_TYPE_TICKERNOTI,
139    E_COMP_WIN_NAME_TYPE_APPTRAY,
140    E_COMP_WIN_NAME_TYPE_MINI_APPTRAY,
141    E_COMP_WIN_NAME_TYPE_VOLUME,
142    E_COMP_WIN_NAME_TYPE_BACKGROUND,
143    E_COMP_WIN_NAME_TYPE_SETUP_WIZARD,
144    E_COMP_WIN_NAME_TYPE_TOAST,
145    E_COMP_WIN_NAME_TYPE_ISF_KEYBOARD,
146    E_COMP_WIN_NAME_TYPE_ISF_SUB,
147 };
148
149 static Eina_Hash *class_hash  = NULL;
150 static Eina_Hash *names_hash  = NULL;
151
152 /* externally accessible functions */
153 EAPI int
154 e_mod_comp_win_type_init(void)
155 {
156    int i, n;
157    if (!class_hash) class_hash = eina_hash_string_superfast_new(NULL);
158    if (!names_hash) names_hash = eina_hash_string_superfast_new(NULL);
159
160    n = (sizeof(win_class) / sizeof(char *));
161    for (i = 0; i < n; i++)
162      {
163         eina_hash_add
164           (class_hash, win_class[i],
165           &win_class_vals[i]);
166      }
167
168    n = (sizeof(win_name) / sizeof(char *));
169    for (i = 0; i < n; i++)
170      {
171         if (i >= E_COMP_WIN_NAME_TYPE_ISF_SUB)
172           {
173              eina_hash_add
174                (names_hash, win_name[i],
175                &win_name_vals[E_COMP_WIN_NAME_TYPE_ISF_SUB]);
176           }
177         else
178           {
179              eina_hash_add
180                (names_hash,
181                win_name[i], &win_name_vals[i]);
182           }
183      }
184
185    return 1;
186 }
187
188 EAPI int
189 e_mod_comp_win_type_shutdown(void)
190 {
191    if (class_hash) eina_hash_free(class_hash);
192    if (names_hash) eina_hash_free(names_hash);
193
194    names_hash = NULL;
195    class_hash = NULL;
196
197    return 1;
198 }
199
200 EAPI Eina_Bool
201 e_mod_comp_win_type_setup(E_Comp_Win *cw)
202 {
203    Ecore_X_Window_Type    wtype  = ECORE_X_WINDOW_TYPE_UNKNOWN;
204    E_Comp_Win_Class_Type  ctype  = E_COMP_WIN_CLASS_TYPE_UNKNOWN;
205    E_Comp_Win_Name_Type   ntype  = E_COMP_WIN_NAME_TYPE_UNKNOWN;
206    E_Comp_Win_Type        res    = E_COMP_WIN_TYPE_UNKNOWN;
207    E_Comp_Win_Class_Type *pctype = NULL;
208    E_Comp_Win_Name_Type  *pntype = NULL;
209    char *clas = NULL, *name = NULL;
210
211    E_CHECK_RETURN(cw, 0);
212
213    if (cw->bd)
214      {
215         wtype = cw->bd->client.netwm.type;
216         if (cw->bd->internal)
217           ecore_x_icccm_name_class_get(cw->bd->client.win, &name, &clas);
218         else
219           {
220              clas = (char *)cw->bd->client.icccm.class;
221              name = (char *)cw->bd->client.icccm.name;
222           }
223      }
224    else
225      ecore_x_icccm_name_class_get(cw->win, &name, &clas);
226
227    if (clas)
228      {
229         pctype = eina_hash_find(class_hash, clas);
230         if (pctype) ctype = *pctype;
231      }
232    if (name)
233      {
234         pntype = eina_hash_find(names_hash, name);
235         if (pntype) ntype = *pntype;
236      }
237
238    switch (ctype)
239      {
240       case E_COMP_WIN_CLASS_TYPE_MENUSCREEN:
241          res = E_COMP_WIN_TYPE_MENUSCREEN;
242          break;
243       case E_COMP_WIN_CLASS_TYPE_QUICKPANEL_BASE:
244          res = E_COMP_WIN_TYPE_QUICKPANEL_BASE;
245          break;
246       case E_COMP_WIN_CLASS_TYPE_QUICKPANEL:
247          res = E_COMP_WIN_TYPE_QUICKPANEL;
248          break;
249       case E_COMP_WIN_CLASS_TYPE_VIDEOCALL:
250          res = E_COMP_WIN_TYPE_VIDEOCALL;
251          break;
252       case E_COMP_WIN_CLASS_TYPE_TASKMANAGER:
253          if (ntype == E_COMP_WIN_NAME_TYPE_TASKMANAGER)
254            res = E_COMP_WIN_TYPE_TASKMANAGER;
255          break;
256       case E_COMP_WIN_CLASS_TYPE_LIVEMAGAZINE:
257          if ((ntype == E_COMP_WIN_NAME_TYPE_LIVEMAGAZINE) &&
258              (wtype == ECORE_X_WINDOW_TYPE_NORMAL))
259            res = E_COMP_WIN_TYPE_LIVEMAGAZINE;
260          break;
261       case E_COMP_WIN_CLASS_TYPE_LOCKSCREEN:
262          if (ntype == E_COMP_WIN_NAME_TYPE_LOCKSCREEN)
263            res = E_COMP_WIN_TYPE_LOCKSCREEN;
264          break;
265       case E_COMP_WIN_CLASS_TYPE_INDICATOR:
266          if ((ntype == E_COMP_WIN_NAME_TYPE_INDICATOR) &&
267              (wtype == ECORE_X_WINDOW_TYPE_DOCK))
268            res = E_COMP_WIN_TYPE_INDICATOR;
269          break;
270       case E_COMP_WIN_CLASS_TYPE_TICKERNOTI:
271          if ((ntype == E_COMP_WIN_NAME_TYPE_TICKERNOTI) &&
272              (wtype == ECORE_X_WINDOW_TYPE_NOTIFICATION))
273            res = E_COMP_WIN_TYPE_TICKERNOTI;
274          break;
275       case E_COMP_WIN_CLASS_TYPE_DEBUGGING_INFO:
276            res = E_COMP_WIN_TYPE_DEBUGGING_INFO;
277          break;
278       case E_COMP_WIN_CLASS_TYPE_ISF:
279          if (wtype != ECORE_X_WINDOW_TYPE_UTILITY)
280            break;
281          else if (ntype == E_COMP_WIN_NAME_TYPE_ISF_KEYBOARD)
282            res = E_COMP_WIN_TYPE_ISF_KEYBOARD;
283          else if (ntype == E_COMP_WIN_NAME_TYPE_ISF_SUB)
284            res = E_COMP_WIN_TYPE_ISF_SUB;
285          break;
286       case E_COMP_WIN_CLASS_TYPE_NORMAL:
287          if ((wtype == ECORE_X_WINDOW_TYPE_NORMAL) ||
288              (wtype == ECORE_X_WINDOW_TYPE_UNKNOWN))
289            res = E_COMP_WIN_TYPE_NORMAL;
290          break;
291       case E_COMP_WIN_CLASS_TYPE_APPTRAY:
292          if (ntype == E_COMP_WIN_NAME_TYPE_APPTRAY)
293            res = E_COMP_WIN_TYPE_APPTRAY;
294          break;
295       case E_COMP_WIN_CLASS_TYPE_MINI_APPTRAY:
296          if (ntype == E_COMP_WIN_NAME_TYPE_MINI_APPTRAY)
297            res = E_COMP_WIN_TYPE_MINI_APPTRAY;
298          break;
299       case E_COMP_WIN_CLASS_TYPE_VOLUME:
300          if ((ntype == E_COMP_WIN_NAME_TYPE_VOLUME) &&
301              (wtype == ECORE_X_WINDOW_TYPE_NOTIFICATION))
302            res = E_COMP_WIN_TYPE_VOLUME;
303          break;
304       case E_COMP_WIN_CLASS_TYPE_BACKGROUND:
305          if (ntype == E_COMP_WIN_NAME_TYPE_BACKGROUND)
306            res = E_COMP_WIN_TYPE_BACKGROUND;
307          break;
308       case E_COMP_WIN_CLASS_TYPE_SETUP_WIZARD:
309          if (ntype == E_COMP_WIN_NAME_TYPE_SETUP_WIZARD)
310          res = E_COMP_WIN_TYPE_SETUP_WIZARD;
311          break;
312       case E_COMP_WIN_CLASS_TYPE_TOAST:
313          if (ntype == E_COMP_WIN_NAME_TYPE_TOAST)
314          res = E_COMP_WIN_TYPE_TOAST;
315          break;
316       default:
317          break;
318      }
319
320    if (res == E_COMP_WIN_TYPE_UNKNOWN)
321      res = _ecore_type_to_e_comp_type(wtype);
322
323    if (res == E_COMP_WIN_TYPE_DIALOG)
324      {
325         if (cw->bd && cw->bd->parent)
326           res = E_COMP_WIN_TYPE_APP_POPUP;
327      }
328
329    if (!cw->bd ||
330        (cw->bd && cw->bd->internal))
331      {
332         if (name) E_FREE(name);
333         if (clas) E_FREE(clas);
334      }
335
336    cw->win_type = res;
337    return EINA_TRUE;
338 }
339
340 EAPI E_Comp_Win_Type
341 e_mod_comp_win_type_get(E_Comp_Win *cw)
342 {
343    E_CHECK_RETURN(cw, E_COMP_WIN_TYPE_UNKNOWN);
344    return cw->win_type;
345 }
346
347 EAPI Eina_Bool
348 e_mod_comp_win_type_handler_prop(Ecore_X_Event_Window_Property *ev)
349 {
350    E_Comp_Win *cw;
351    E_CHECK_RETURN(ev, 0);
352    E_CHECK_RETURN(ev->win, 0);
353
354    cw = e_mod_comp_border_client_find(ev->win);
355    if (cw) return EINA_TRUE;
356
357    cw = e_mod_comp_win_find(ev->win);
358    E_CHECK_RETURN(cw, 0);
359    E_CHECK_RETURN((!cw->bd), 0);
360
361    e_mod_comp_win_type_setup(cw);
362    return EINA_TRUE;
363 }
364
365 /* local subsystem functions */
366 static E_Comp_Win_Type
367 _ecore_type_to_e_comp_type(Ecore_X_Window_Type t)
368 {
369    E_Comp_Win_Type r = E_COMP_WIN_TYPE_UNKNOWN;
370    switch (t)
371      {
372       case ECORE_X_WINDOW_TYPE_NORMAL:        r = E_COMP_WIN_TYPE_NORMAL;        break;
373       case ECORE_X_WINDOW_TYPE_TOOLTIP:       r = E_COMP_WIN_TYPE_TOOLTIP;       break;
374       case ECORE_X_WINDOW_TYPE_COMBO:         r = E_COMP_WIN_TYPE_COMBO;         break;
375       case ECORE_X_WINDOW_TYPE_DND:           r = E_COMP_WIN_TYPE_DND;           break;
376       case ECORE_X_WINDOW_TYPE_DESKTOP:       r = E_COMP_WIN_TYPE_DESKTOP;       break;
377       case ECORE_X_WINDOW_TYPE_TOOLBAR:       r = E_COMP_WIN_TYPE_TOOLBAR;       break;
378       case ECORE_X_WINDOW_TYPE_MENU:          r = E_COMP_WIN_TYPE_MENU;          break;
379       case ECORE_X_WINDOW_TYPE_SPLASH:        r = E_COMP_WIN_TYPE_SPLASH;        break;
380       case ECORE_X_WINDOW_TYPE_DROPDOWN_MENU: r = E_COMP_WIN_TYPE_DROPDOWN_MENU; break;
381       case ECORE_X_WINDOW_TYPE_NOTIFICATION:  r = E_COMP_WIN_TYPE_NOTIFICATION;  break;
382       case ECORE_X_WINDOW_TYPE_UTILITY:       r = E_COMP_WIN_TYPE_UTILITY;       break;
383       case ECORE_X_WINDOW_TYPE_POPUP_MENU:    r = E_COMP_WIN_TYPE_POPUP_MENU;    break;
384       case ECORE_X_WINDOW_TYPE_DIALOG:        r = E_COMP_WIN_TYPE_DIALOG;        break;
385       default:
386         r = E_COMP_WIN_TYPE_NORMAL;
387         break;
388      }
389    return r;
390 }