Merged with devel
[platform/core/uifw/e17-extra-modules.git] / comp-tizen / 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_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;
25
26 typedef enum _E_Comp_Win_Name_Type
27 {
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;
46
47 /* local subsystem functions */
48 static E_Comp_Win_Type _ecore_type_to_e_comp_type(Ecore_X_Window_Type t);
49
50 /* local subsystem globals */
51 static const char *win_class[] =
52 {
53    "NORMAL_WINDOW",
54    "MENU_SCREEN",
55    "QUICKPANEL_BASE",
56    "QUICKPANEL",
57    "TASK_MANAGER",
58    "LIVE_MAGAZINE",
59    "LOCK_SCREEN",
60    "lockscreen",
61    "INDICATOR",
62    "quickpanel",
63    "DEBUGGING_INFO",
64    "APP_TRAY",
65    "MINIAPP_TRAY",
66    "volume",
67    "BACKGROUND",
68    "SETUP_WIZARD",
69    "ISF",
70 };
71
72 static const char *win_name[] =
73 {
74    "NORMAL_WINDOW",
75    "com.samsung.menu-screen",
76    "QUICKPANEL_BASE",
77    "QUICKPANEL",
78    "TASK_MANAGER",
79    "Live Magazine",
80    "LOCK_SCREEN",
81    "lockscreen",
82    "INDICATOR",
83    "noti_win",
84    "APP_TRAY",
85    "MINIAPP_TRAY",
86    "volume",
87    "BACKGROUND",
88    "SETUP_WIZARD",
89    // E_COMP_WIN_NAME_TYPE_ISF_KEYBOARD
90    "Virtual Keyboard",
91    // E_COMP_WIN_NAME_TYPE_ISF_SUB
92    "Key Magnifier",
93    "Prediction Window",
94    "Setting Window",
95    "ISF Popup",
96 };
97
98 static E_Comp_Win_Class_Type win_class_vals[] =
99 {
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,
117 };
118
119 static E_Comp_Win_Class_Type win_name_vals[] =
120 {
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,
138 };
139
140 static Eina_Hash *class_hash  = NULL;
141 static Eina_Hash *names_hash  = NULL;
142
143 /* externally accessible functions */
144 EINTERN int
145 e_mod_comp_win_type_init(void)
146 {
147    int i, n;
148    if (!class_hash) class_hash = eina_hash_string_superfast_new(NULL);
149    if (!names_hash) names_hash = eina_hash_string_superfast_new(NULL);
150
151    n = (sizeof(win_class) / sizeof(char *));
152    for (i = 0; i < n; i++)
153      {
154         eina_hash_add
155           (class_hash, win_class[i],
156           &win_class_vals[i]);
157      }
158
159    n = (sizeof(win_name) / sizeof(char *));
160    for (i = 0; i < n; i++)
161      {
162         if (i >= E_COMP_WIN_NAME_TYPE_ISF_SUB)
163           {
164              eina_hash_add
165                (names_hash, win_name[i],
166                &win_name_vals[E_COMP_WIN_NAME_TYPE_ISF_SUB-1]);
167           }
168         else
169           {
170              eina_hash_add
171                (names_hash,
172                win_name[i], &win_name_vals[i]);
173           }
174      }
175
176    return 1;
177 }
178
179 EINTERN int
180 e_mod_comp_win_type_shutdown(void)
181 {
182    if (class_hash) eina_hash_free(class_hash);
183    if (names_hash) eina_hash_free(names_hash);
184
185    names_hash = NULL;
186    class_hash = NULL;
187
188    return 1;
189 }
190
191 EINTERN Eina_Bool
192 e_mod_comp_win_type_setup(E_Comp_Win *cw)
193 {
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;
201
202    E_CHECK_RETURN(cw, 0);
203
204    if (cw->bd)
205      {
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);
209         else
210           {
211              clas = (char *)cw->bd->client.icccm.class;
212              name = (char *)cw->bd->client.icccm.name;
213           }
214      }
215    else
216      ecore_x_icccm_name_class_get(cw->win, &name, &clas);
217
218    if (clas)
219      {
220         pctype = eina_hash_find(class_hash, clas);
221         if (pctype) ctype = *pctype;
222      }
223    if (name)
224      {
225         pntype = eina_hash_find(names_hash, name);
226         if (pntype) ntype = *pntype;
227      }
228
229    switch (ctype)
230      {
231       case E_COMP_WIN_CLASS_TYPE_MENUSCREEN:
232          res = E_COMP_WIN_TYPE_MENUSCREEN;
233          break;
234       case E_COMP_WIN_CLASS_TYPE_QUICKPANEL_BASE:
235          res = E_COMP_WIN_TYPE_QUICKPANEL_BASE;
236          break;
237       case E_COMP_WIN_CLASS_TYPE_QUICKPANEL:
238          res = E_COMP_WIN_TYPE_QUICKPANEL;
239          break;
240       case E_COMP_WIN_CLASS_TYPE_TASKMANAGER:
241          if (ntype == E_COMP_WIN_NAME_TYPE_TASKMANAGER)
242            res = E_COMP_WIN_TYPE_TASKMANAGER;
243          break;
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;
248          break;
249       case E_COMP_WIN_CLASS_TYPE_LOCKSCREEN:
250          if (ntype == E_COMP_WIN_NAME_TYPE_LOCKSCREEN)
251            res = E_COMP_WIN_TYPE_LOCKSCREEN;
252          break;
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;
257          break;
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;
262          break;
263       case E_COMP_WIN_CLASS_TYPE_DEBUGGING_INFO:
264            res = E_COMP_WIN_TYPE_DEBUGGING_INFO;
265          break;
266       case E_COMP_WIN_CLASS_TYPE_ISF:
267          if (wtype != ECORE_X_WINDOW_TYPE_UTILITY)
268            break;
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;
273          break;
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;
278          break;
279       case E_COMP_WIN_CLASS_TYPE_APPTRAY:
280          if (ntype == E_COMP_WIN_NAME_TYPE_APPTRAY)
281            res = E_COMP_WIN_TYPE_APPTRAY;
282          break;
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;
286          break;
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;
291          break;
292       case E_COMP_WIN_CLASS_TYPE_BACKGROUND:
293          if (ntype == E_COMP_WIN_NAME_TYPE_BACKGROUND)
294            res = E_COMP_WIN_TYPE_BACKGROUND;
295          break;
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;
299          break;
300       default:
301          break;
302      }
303
304    if (res == E_COMP_WIN_TYPE_UNKNOWN)
305      res = _ecore_type_to_e_comp_type(wtype);
306
307    if (!cw->bd ||
308        (cw->bd && cw->bd->internal))
309      {
310         if (name) E_FREE(name);
311         if (clas) E_FREE(clas);
312      }
313
314    cw->win_type = res;
315    return EINA_TRUE;
316 }
317
318 EINTERN E_Comp_Win_Type
319 e_mod_comp_win_type_get(E_Comp_Win *cw)
320 {
321    E_CHECK_RETURN(cw, E_COMP_WIN_TYPE_UNKNOWN);
322    return cw->win_type;
323 }
324
325 EINTERN Eina_Bool
326 e_mod_comp_win_type_handler_prop(Ecore_X_Event_Window_Property *ev)
327 {
328    E_Comp_Win *cw;
329    E_CHECK_RETURN(ev, 0);
330    E_CHECK_RETURN(ev->win, 0);
331
332    L(LT_EVENT_X, "COMP|%31s\n", "PROP_WM_CLASS");
333
334    cw = e_mod_comp_border_client_find(ev->win);
335    if (cw) return EINA_TRUE;
336
337    cw = e_mod_comp_win_find(ev->win);
338    E_CHECK_RETURN(cw, 0);
339    E_CHECK_RETURN((!cw->bd), 0);
340
341    e_mod_comp_win_type_setup(cw);
342    return EINA_TRUE;
343 }
344
345 /* local subsystem functions */
346 static E_Comp_Win_Type
347 _ecore_type_to_e_comp_type(Ecore_X_Window_Type t)
348 {
349    E_Comp_Win_Type r = E_COMP_WIN_TYPE_UNKNOWN;
350    switch (t)
351      {
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;
365       default:
366         r = E_COMP_WIN_TYPE_NORMAL;
367         break;
368      }
369    return r;
370 }