0b84651cbf55bdd25b766792c1687570b653fc6a
[platform/core/uifw/e17-extra-modules.git] / move-tizen / src / e_mod_move_border_type.c
1 #include "e_mod_move_shared_types.h"
2 #include "e_mod_move.h"
3 #include "e_mod_move_debug.h"
4
5 typedef enum _E_Move_Border_Class_Type
6 {
7    E_MOVE_BORDER_CLASS_TYPE_UNKNOWN = 0,
8    E_MOVE_BORDER_CLASS_TYPE_NORMAL,
9    E_MOVE_BORDER_CLASS_TYPE_MENUSCREEN,
10    E_MOVE_BORDER_CLASS_TYPE_QUICKPANEL_BASE,
11    E_MOVE_BORDER_CLASS_TYPE_QUICKPANEL,
12    E_MOVE_BORDER_CLASS_TYPE_TASKMANAGER,
13    E_MOVE_BORDER_CLASS_TYPE_LIVEMAGAZINE,
14    E_MOVE_BORDER_CLASS_TYPE_LOCKSCREEN,
15    E_MOVE_BORDER_CLASS_TYPE_INDICATOR,
16    E_MOVE_BORDER_CLASS_TYPE_APPTRAY,
17    E_MOVE_BORDER_CLASS_TYPE_MINI_APPTRAY,
18    E_MOVE_BORDER_CLASS_TYPE_SETUP_WIZARD,
19    E_MOVE_BORDER_CLASS_TYPE_APP_SELECTOR,
20    E_MOVE_BORDER_CLASS_TYPE_PWLOCK,
21    E_MOVE_BORDER_CLASS_TYPE_BACKGROUND,
22    E_MOVE_BORDER_CLASS_TYPE_ISF,
23 } E_Move_Border_Class_Type;
24
25 typedef enum _E_Move_Border_Name_Type
26 {
27    E_MOVE_BORDER_NAME_TYPE_UNKNOWN = 0,
28    E_MOVE_BORDER_NAME_TYPE_NORMAL,
29    E_MOVE_BORDER_NAME_TYPE_MENUSCREEN,
30    E_MOVE_BORDER_NAME_TYPE_QUICKPANEL_BASE,
31    E_MOVE_BORDER_NAME_TYPE_QUICKPANEL,
32    E_MOVE_BORDER_NAME_TYPE_TASKMANAGER,
33    E_MOVE_BORDER_NAME_TYPE_LIVEMAGAZINE,
34    E_MOVE_BORDER_NAME_TYPE_LOCKSCREEN,
35    E_MOVE_BORDER_NAME_TYPE_INDICATOR,
36    E_MOVE_BORDER_NAME_TYPE_APPTRAY,
37    E_MOVE_BORDER_NAME_TYPE_MINI_APPTRAY,
38    E_MOVE_BORDER_NAME_TYPE_SETUP_WIZARD,
39    E_MOVE_BORDER_NAME_TYPE_APP_SELECTOR,
40    E_MOVE_BORDER_NAME_TYPE_PWLOCK,
41    E_MOVE_BORDER_NAME_TYPE_BACKGROUND,
42    E_MOVE_BORDER_NAME_TYPE_ISF_KEYBOARD,
43    E_MOVE_BORDER_NAME_TYPE_ISF_SUB,
44 } E_Move_Border_Name_Type;
45
46 /* local subsystem functions */
47 static E_Move_Border_Type _ecore_type_to_e_move_type(Ecore_X_Window_Type t);
48
49 /* local subsystem globals */
50 static const char *border_class[] =
51 {
52    "NORMAL_WINDOW",
53    "MENU_SCREEN",
54    "QUICKPANEL_BASE",
55    "QUICKPANEL",
56    "TASK_MANAGER",
57    "LIVE_MAGAZINE",
58    "LOCK_SCREEN",
59    "INDICATOR",
60    "APP_TRAY",
61    "MINIAPP_TRAY",
62    "SETUP_WIZARD",
63    "APP_SELECTOR",
64    //"PW_LOCK",
65    "pwlock",
66    "BACKGROUND",
67    "ISF",
68 };
69
70 static const char *border_name[] =
71 {
72    "NORMAL_WINDOW",
73    "com.samsung.menu-screen",
74    "QUICKPANEL_BASE",
75    "QUICKPANEL",
76    "TASK_MANAGER",
77    "Live Magazine",
78    "LOCK_SCREEN",
79    "INDICATOR",
80    "APP_TRAY",
81    "MINIAPP_TRAY",
82    "SETUP_WIZARD",
83    "APP_SELECTOR",
84    //"PW_LOCK",
85    "pwlock",
86    "BACKGROUND",
87    // E_COMP_WIN_NAME_TYPE_ISF_KEYBOARD
88    "Virtual Keyboard",
89    // E_COMP_WIN_NAME_TYPE_ISF_SUB
90    "Key Magnifier",
91    "Prediction Window",
92    "Setting Window",
93    "ISF Popup",
94 };
95
96 static const char *type_names[] =
97 {
98    "E_MOVE_BORDER_TYPE_UNKNOWN",
99    "E_MOVE_BORDER_TYPE_DESKTOP",
100    "E_MOVE_BORDER_TYPE_DOCK",
101    "E_MOVE_BORDER_TYPE_TOOLBAR",
102    "E_MOVE_BORDER_TYPE_MENU",
103    "E_MOVE_BORDER_TYPE_UTILITY",
104    "E_MOVE_BORDER_TYPE_SPLASH",
105    "E_MOVE_BORDER_TYPE_DIALOG",
106    "E_MOVE_BORDER_TYPE_NORMAL",
107    "E_MOVE_BORDER_TYPE_DROPDOWN_MENU",
108    "E_MOVE_BORDER_TYPE_POPUP_MENU",
109    "E_MOVE_BORDER_TYPE_TOOLTIP",
110    "E_MOVE_BORDER_TYPE_NOTIFICATION",
111    "E_MOVE_BORDER_TYPE_COMBO",
112    "E_MOVE_BORDER_TYPE_DND",
113    "E_MOVE_BORDER_TYPE_MENUSCREEN",
114    "E_MOVE_BORDER_TYPE_QUICKPANEL_BASE",
115    "E_MOVE_BORDER_TYPE_QUICKPANEL",
116    "E_MOVE_BORDER_TYPE_TASKMANAGER",
117    "E_MOVE_BORDER_TYPE_LIVEMAGAZINE",
118    "E_MOVE_BORDER_TYPE_LOCKSCREEN",
119    "E_MOVE_BORDER_TYPE_INDICATOR",
120    "E_MOVE_BORDER_TYPE_APPTRAY",
121    "E_MOVE_BORDER_TYPE_MINI_APPTRAY",
122    "E_MOVE_BORDER_TYPE_SETUP_WIZARD",
123    "E_MOVE_BORDER_TYPE_PWLOCK",
124    "E_MOVE_BORDER_TYPE_BACKGROUND",
125    "E_MOVE_BORDER_TYPE_ISF_KEYBOARD",
126    "E_MOVE_BORDER_TYPE_ISF_SUB",
127 };
128
129 static E_Move_Border_Class_Type border_class_vals[] =
130 {
131    E_MOVE_BORDER_CLASS_TYPE_NORMAL,
132    E_MOVE_BORDER_CLASS_TYPE_MENUSCREEN,
133    E_MOVE_BORDER_CLASS_TYPE_QUICKPANEL_BASE,
134    E_MOVE_BORDER_CLASS_TYPE_QUICKPANEL,
135    E_MOVE_BORDER_CLASS_TYPE_TASKMANAGER,
136    E_MOVE_BORDER_CLASS_TYPE_LIVEMAGAZINE,
137    E_MOVE_BORDER_CLASS_TYPE_LOCKSCREEN,
138    E_MOVE_BORDER_CLASS_TYPE_INDICATOR,
139    E_MOVE_BORDER_CLASS_TYPE_APPTRAY,
140    E_MOVE_BORDER_CLASS_TYPE_MINI_APPTRAY,
141    E_MOVE_BORDER_CLASS_TYPE_SETUP_WIZARD,
142    E_MOVE_BORDER_CLASS_TYPE_APP_SELECTOR,
143    E_MOVE_BORDER_CLASS_TYPE_PWLOCK,
144    E_MOVE_BORDER_CLASS_TYPE_BACKGROUND,
145    E_MOVE_BORDER_CLASS_TYPE_ISF
146 };
147
148 static E_Move_Border_Class_Type border_name_vals[] =
149 {
150    E_MOVE_BORDER_NAME_TYPE_NORMAL,
151    E_MOVE_BORDER_NAME_TYPE_MENUSCREEN,
152    E_MOVE_BORDER_NAME_TYPE_QUICKPANEL_BASE,
153    E_MOVE_BORDER_NAME_TYPE_QUICKPANEL,
154    E_MOVE_BORDER_NAME_TYPE_TASKMANAGER,
155    E_MOVE_BORDER_NAME_TYPE_LIVEMAGAZINE,
156    E_MOVE_BORDER_NAME_TYPE_LOCKSCREEN,
157    E_MOVE_BORDER_NAME_TYPE_INDICATOR,
158    E_MOVE_BORDER_NAME_TYPE_APPTRAY,
159    E_MOVE_BORDER_NAME_TYPE_MINI_APPTRAY,
160    E_MOVE_BORDER_NAME_TYPE_SETUP_WIZARD,
161    E_MOVE_BORDER_NAME_TYPE_APP_SELECTOR,
162    E_MOVE_BORDER_NAME_TYPE_PWLOCK,
163    E_MOVE_BORDER_NAME_TYPE_BACKGROUND,
164    E_MOVE_BORDER_NAME_TYPE_ISF_KEYBOARD,
165    E_MOVE_BORDER_NAME_TYPE_ISF_SUB
166 };
167
168 static Eina_Hash *class_hash  = NULL;
169 static Eina_Hash *names_hash  = NULL;
170 static Eina_Hash *types_hash = NULL;
171
172 /* local subsystem functions */
173 static E_Move_Border_Type
174 _ecore_type_to_e_move_type(Ecore_X_Window_Type t)
175 {
176    E_Move_Border_Type r = E_MOVE_BORDER_TYPE_UNKNOWN;
177    switch (t)
178      {
179       case ECORE_X_WINDOW_TYPE_NORMAL:        r = E_MOVE_BORDER_TYPE_NORMAL;        break;
180       case ECORE_X_WINDOW_TYPE_TOOLTIP:       r = E_MOVE_BORDER_TYPE_TOOLTIP;       break;
181       case ECORE_X_WINDOW_TYPE_COMBO:         r = E_MOVE_BORDER_TYPE_COMBO;         break;
182       case ECORE_X_WINDOW_TYPE_DND:           r = E_MOVE_BORDER_TYPE_DND;           break;
183       case ECORE_X_WINDOW_TYPE_DESKTOP:       r = E_MOVE_BORDER_TYPE_DESKTOP;       break;
184       case ECORE_X_WINDOW_TYPE_TOOLBAR:       r = E_MOVE_BORDER_TYPE_TOOLBAR;       break;
185       case ECORE_X_WINDOW_TYPE_MENU:          r = E_MOVE_BORDER_TYPE_MENU;          break;
186       case ECORE_X_WINDOW_TYPE_SPLASH:        r = E_MOVE_BORDER_TYPE_SPLASH;        break;
187       case ECORE_X_WINDOW_TYPE_DROPDOWN_MENU: r = E_MOVE_BORDER_TYPE_DROPDOWN_MENU; break;
188       case ECORE_X_WINDOW_TYPE_NOTIFICATION:  r = E_MOVE_BORDER_TYPE_NOTIFICATION;  break;
189       case ECORE_X_WINDOW_TYPE_UTILITY:       r = E_MOVE_BORDER_TYPE_UTILITY;       break;
190       case ECORE_X_WINDOW_TYPE_POPUP_MENU:    r = E_MOVE_BORDER_TYPE_POPUP_MENU;    break;
191       case ECORE_X_WINDOW_TYPE_DIALOG:        r = E_MOVE_BORDER_TYPE_DIALOG;        break;
192       default:
193         r = E_MOVE_BORDER_TYPE_NORMAL;
194         break;
195      }
196    return r;
197 }
198
199 /* externally accessible functions */
200 EINTERN int
201 e_mod_move_border_type_init(void)
202 {
203    int i, n;
204    char type_string[10];
205    if (!class_hash) class_hash = eina_hash_string_superfast_new(NULL);
206    if (!names_hash) names_hash = eina_hash_string_superfast_new(NULL);
207    if (!types_hash) types_hash = eina_hash_string_superfast_new(NULL);
208
209    n = (sizeof(border_class) / sizeof(char *));
210    for (i = 0; i < n; i++)
211      {
212         eina_hash_add
213           (class_hash, border_class[i],
214           &border_class_vals[i]);
215      }
216
217    n = (sizeof(border_name) / sizeof(char *));
218    for (i = 0; i < n; i++)
219      {
220         if (i >= E_MOVE_BORDER_NAME_TYPE_ISF_SUB)
221           {
222              eina_hash_add
223                (names_hash, border_name[i],
224                &border_name_vals[E_MOVE_BORDER_NAME_TYPE_ISF_SUB-1]);
225           }
226         else
227           {
228              eina_hash_add
229                (names_hash,
230                border_name[i], &border_name_vals[i]);
231           }
232      }
233
234    for (i = E_MOVE_BORDER_TYPE_UNKNOWN; i < E_MOVE_BORDER_TYPE_ISF_SUB; i++)
235      {
236         memset(type_string, 0, sizeof(type_string));
237         snprintf(type_string, sizeof(type_string), "%d", i);
238         eina_hash_add(types_hash,
239                       type_string,
240                       type_names[i]);
241      }
242
243    return 1;
244 }
245
246 EINTERN int
247 e_mod_move_border_type_shutdown(void)
248 {
249    if (class_hash) eina_hash_free(class_hash);
250    if (names_hash) eina_hash_free(names_hash);
251    if (types_hash) eina_hash_free(types_hash);
252
253    names_hash = NULL;
254    class_hash = NULL;
255    types_hash = NULL;
256
257    return 1;
258 }
259
260 EINTERN Eina_Bool
261 e_mod_move_border_type_setup(E_Move_Border *mb)
262 {
263    Ecore_X_Window_Type       wtype  = ECORE_X_WINDOW_TYPE_UNKNOWN;
264    E_Move_Border_Class_Type  ctype  = E_MOVE_BORDER_CLASS_TYPE_UNKNOWN;
265    E_Move_Border_Name_Type   ntype  = E_MOVE_BORDER_NAME_TYPE_UNKNOWN;
266    E_Move_Border_Type        res    = E_MOVE_BORDER_TYPE_UNKNOWN;
267    E_Move_Border_Class_Type *pctype = NULL;
268    E_Move_Border_Name_Type  *pntype = NULL;
269    char *clas = NULL, *name = NULL;
270
271    E_CHECK_RETURN(mb, 0);
272    E_CHECK_RETURN(mb->bd, 0);
273
274    wtype = mb->bd->client.netwm.type;
275    if (mb->bd->internal)
276      ecore_x_icccm_name_class_get(mb->bd->client.win, &name, &clas);
277    else
278      {
279         clas = (char *)mb->bd->client.icccm.class;
280         name = (char *)mb->bd->client.icccm.name;
281      }
282
283    if (clas)
284      {
285         pctype = eina_hash_find(class_hash, clas);
286         if (pctype) ctype = *pctype;
287      }
288    if (name)
289      {
290         pntype = eina_hash_find(names_hash, name);
291         if (pntype) ntype = *pntype;
292      }
293
294    switch (ctype)
295      {
296       case E_MOVE_BORDER_CLASS_TYPE_MENUSCREEN:
297          res = E_MOVE_BORDER_TYPE_MENUSCREEN;
298          break;
299       case E_MOVE_BORDER_CLASS_TYPE_QUICKPANEL_BASE:
300          res = E_MOVE_BORDER_TYPE_QUICKPANEL_BASE;
301          break;
302       case E_MOVE_BORDER_CLASS_TYPE_QUICKPANEL:
303          res = E_MOVE_BORDER_TYPE_QUICKPANEL;
304          break;
305       case E_MOVE_BORDER_CLASS_TYPE_TASKMANAGER:
306          if (ntype == E_MOVE_BORDER_NAME_TYPE_TASKMANAGER)
307            res = E_MOVE_BORDER_TYPE_TASKMANAGER;
308          break;
309       case E_MOVE_BORDER_CLASS_TYPE_LIVEMAGAZINE:
310          if ((ntype == E_MOVE_BORDER_NAME_TYPE_LIVEMAGAZINE) &&
311              (wtype == ECORE_X_WINDOW_TYPE_NORMAL))
312            res = E_MOVE_BORDER_TYPE_LIVEMAGAZINE;
313          break;
314       case E_MOVE_BORDER_CLASS_TYPE_LOCKSCREEN:
315          if (ntype == E_MOVE_BORDER_NAME_TYPE_LOCKSCREEN)
316 //         if ((ntype == E_MOVE_BORDER_NAME_TYPE_LOCKSCREEN) &&
317 //            (wtype == ECORE_X_WINDOW_TYPE_NOTIFICATION)) // net wm window type is chaged later. so it will be fixed.
318            res = E_MOVE_BORDER_TYPE_LOCKSCREEN;
319          break;
320       case E_MOVE_BORDER_CLASS_TYPE_INDICATOR:
321          if ((ntype == E_MOVE_BORDER_NAME_TYPE_INDICATOR) &&
322              (wtype == ECORE_X_WINDOW_TYPE_DOCK))
323            res = E_MOVE_BORDER_TYPE_INDICATOR;
324          break;
325       case E_MOVE_BORDER_CLASS_TYPE_ISF:
326          if (wtype != ECORE_X_WINDOW_TYPE_NORMAL)
327            break;
328          else if (ntype == E_MOVE_BORDER_NAME_TYPE_ISF_KEYBOARD)
329            res = E_MOVE_BORDER_TYPE_ISF_KEYBOARD;
330          else if (ntype == E_MOVE_BORDER_NAME_TYPE_ISF_SUB)
331            res = E_MOVE_BORDER_TYPE_ISF_SUB;
332          break;
333       case E_MOVE_BORDER_CLASS_TYPE_NORMAL:
334          if ((wtype == ECORE_X_WINDOW_TYPE_NORMAL) ||
335              (wtype == ECORE_X_WINDOW_TYPE_UNKNOWN))
336            res = E_MOVE_BORDER_TYPE_NORMAL;
337          break;
338       case E_MOVE_BORDER_CLASS_TYPE_APPTRAY:
339          if (ntype == E_MOVE_BORDER_NAME_TYPE_APPTRAY)
340            res = E_MOVE_BORDER_TYPE_APPTRAY;
341       case E_MOVE_BORDER_CLASS_TYPE_MINI_APPTRAY:
342          if (ntype == E_MOVE_BORDER_NAME_TYPE_MINI_APPTRAY)
343            res = E_MOVE_BORDER_TYPE_MINI_APPTRAY;
344       case E_MOVE_BORDER_CLASS_TYPE_SETUP_WIZARD:
345          if (ntype == E_MOVE_BORDER_NAME_TYPE_SETUP_WIZARD)
346            res = E_MOVE_BORDER_TYPE_SETUP_WIZARD;
347       case E_MOVE_BORDER_CLASS_TYPE_APP_SELECTOR:
348          if (ntype == E_MOVE_BORDER_NAME_TYPE_APP_SELECTOR)
349            res = E_MOVE_BORDER_TYPE_APP_SELECTOR;
350       case E_MOVE_BORDER_CLASS_TYPE_PWLOCK:
351          if (ntype == E_MOVE_BORDER_NAME_TYPE_PWLOCK)
352            res = E_MOVE_BORDER_TYPE_PWLOCK;
353       case E_MOVE_BORDER_CLASS_TYPE_BACKGROUND:
354          if (ntype == E_MOVE_BORDER_NAME_TYPE_BACKGROUND)
355            res = E_MOVE_BORDER_TYPE_BACKGROUND;
356          break;
357       default:
358          break;
359      }
360
361    if (res == E_MOVE_BORDER_TYPE_UNKNOWN)
362      res = _ecore_type_to_e_move_type(wtype);
363
364    if (mb->bd->internal)
365      {
366         if (name) E_FREE(name);
367         if (clas) E_FREE(clas);
368      }
369
370    mb->type = res;
371    return EINA_TRUE;
372 }
373
374 EINTERN E_Move_Border_Type
375 e_mod_move_border_type_get(E_Move_Border *mb)
376 {
377    E_CHECK_RETURN(mb, E_MOVE_BORDER_TYPE_UNKNOWN);
378    return mb->type;
379 }
380
381 EINTERN Eina_Bool
382 e_mod_move_border_type_handler_prop(Ecore_X_Event_Window_Property *ev)
383 {
384    E_Move_Border *mb;
385    E_CHECK_RETURN(ev, 0);
386    E_CHECK_RETURN(ev->win, 0);
387
388    L(LT_EVENT_X, "[MOVE] %31s\n", "PROP_WM_CLASS");
389
390    mb = e_mod_move_border_client_find(ev->win);
391    if (mb) return EINA_TRUE;
392
393    e_mod_move_border_type_setup(mb);
394    return EINA_TRUE;
395 }
396
397 EINTERN const char *
398 e_mod_move_border_types_name_get(E_Move_Border_Type t)
399 {
400    char type_string[10];
401    memset(type_string, 0, sizeof(type_string));
402    snprintf(type_string, sizeof(type_string), "%d",t);
403    return eina_hash_find(types_hash,
404                          type_string);
405 }
406