the repository of RSA merge with private repository.
[platform/core/uifw/e17.git] / src / bin / e_manager.c
1 #include "e.h"
2
3 /* local subsystem functions */
4 static void _e_manager_free(E_Manager *man);
5
6 static Eina_Bool _e_manager_cb_window_show_request(void *data, int ev_type, void *ev);
7 static Eina_Bool _e_manager_cb_window_configure(void *data, int ev_type, void *ev);
8 static Eina_Bool _e_manager_cb_key_up(void *data, int ev_type, void *ev);
9 static Eina_Bool _e_manager_cb_key_down(void *data, int ev_type, void *ev);
10 static Eina_Bool _e_manager_cb_frame_extents_request(void *data, int ev_type, void *ev);
11 static Eina_Bool _e_manager_cb_ping(void *data, int ev_type, void *ev);
12 static Eina_Bool _e_manager_cb_screensaver_notify(void *data, int ev_type, void *ev);
13 static Eina_Bool _e_manager_cb_client_message(void *data, int ev_type, void *ev);
14
15 static Eina_Bool _e_manager_frame_extents_free_cb(const Eina_Hash *hash __UNUSED__,
16                                                   const void *key __UNUSED__,
17                                                   void *data, void *fdata __UNUSED__);
18 static E_Manager *_e_manager_get_for_root(Ecore_X_Window root);
19 static Eina_Bool _e_manager_clear_timer(void *data);
20 #if 0 /* use later - maybe */
21 static int _e_manager_cb_window_destroy(void *data, int ev_type, void *ev);
22 static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev);
23 static int _e_manager_cb_window_reparent(void *data, int ev_type, void *ev);
24 static int _e_manager_cb_window_create(void *data, int ev_type, void *ev);
25 static int _e_manager_cb_window_configure_request(void *data, int ev_type, void *ev);
26 static int _e_manager_cb_window_gravity(void *data, int ev_type, void *ev);
27 static int _e_manager_cb_window_stack(void *data, int ev_type, void *ev);
28 static int _e_manager_cb_window_stack_request(void *data, int ev_type, void *ev);
29 static int _e_manager_cb_window_property(void *data, int ev_type, void *ev);
30 static int _e_manager_cb_window_colormap(void *data, int ev_type, void *ev);
31 static int _e_manager_cb_window_shape(void *data, int ev_type, void *ev);
32 static int _e_manager_cb_client_message(void *data, int ev_type, void *ev);
33 #endif
34
35 /* local subsystem globals */
36
37 typedef struct _Frame_Extents Frame_Extents;
38
39 struct _Frame_Extents
40 {
41    int l, r, t, b;
42 };
43
44 static Eina_List *managers = NULL;
45 static Eina_Hash *frame_extents = NULL;
46 static Ecore_Timer *timer_post_screensaver_lock = NULL;
47
48 /* externally accessible functions */
49 EINTERN int
50 e_manager_init(void)
51 {
52    ecore_x_screensaver_event_listen_set(1);
53    frame_extents = eina_hash_string_superfast_new(NULL);
54    return 1;
55 }
56
57 EINTERN int
58 e_manager_shutdown(void)
59 {
60    E_FREE_LIST(managers, e_object_del);
61
62    if (frame_extents)
63      {
64         eina_hash_foreach(frame_extents, _e_manager_frame_extents_free_cb, NULL);
65         eina_hash_free(frame_extents);
66         frame_extents = NULL;
67      }
68
69    if (timer_post_screensaver_lock)
70      {
71         ecore_timer_del(timer_post_screensaver_lock);
72         timer_post_screensaver_lock = NULL;
73      }
74
75    return 1;
76 }
77
78 EAPI Eina_List *
79 e_manager_list(void)
80 {
81    return managers;
82 }
83
84 EAPI E_Manager *
85 e_manager_new(Ecore_X_Window root, int num)
86 {
87    E_Manager *man;
88
89    if (!ecore_x_window_manage(root)) return NULL;
90    man = E_OBJECT_ALLOC(E_Manager, E_MANAGER_TYPE, _e_manager_free);
91    if (!man) return NULL;
92    managers = eina_list_append(managers, man);
93    man->root = root;
94    man->num = num;
95    ecore_x_window_size_get(man->root, &(man->w), &(man->h));
96    man->win = man->root;
97
98    man->handlers =
99      eina_list_append(man->handlers,
100                       ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST,
101                                               _e_manager_cb_window_show_request,
102                                               man));
103    man->handlers =
104      eina_list_append(man->handlers,
105                       ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE,
106                                               _e_manager_cb_window_configure,
107                                               man));
108    man->handlers =
109      eina_list_append(man->handlers,
110                       ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
111                                               _e_manager_cb_key_down,
112                                               man));
113    man->handlers =
114      eina_list_append(man->handlers,
115                       ecore_event_handler_add(ECORE_EVENT_KEY_UP,
116                                               _e_manager_cb_key_up,
117                                               man));
118    man->handlers =
119      eina_list_append(man->handlers,
120                       ecore_event_handler_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST,
121                                               _e_manager_cb_frame_extents_request,
122                                               man));
123    man->handlers =
124      eina_list_append(man->handlers,
125                       ecore_event_handler_add(ECORE_X_EVENT_PING,
126                                               _e_manager_cb_ping,
127                                               man));
128    man->handlers =
129      eina_list_append(man->handlers,
130                       ecore_event_handler_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY,
131                                               _e_manager_cb_screensaver_notify,
132                                               man));
133    man->handlers =
134      eina_list_append(man->handlers,
135                       ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
136                                               _e_manager_cb_client_message,
137                                               man));
138
139    man->pointer = e_pointer_window_new(man->root, 1);
140
141    ecore_x_window_background_color_set(man->root, 0, 0, 0);
142
143    man->clear_timer = ecore_timer_add(10.0, _e_manager_clear_timer, man);
144    return man;
145 }
146
147 EAPI void
148 e_manager_manage_windows(E_Manager *man)
149 {
150    Ecore_X_Window *windows;
151    int wnum;
152
153    /* a manager is designated for each root. lets get all the windows in
154       the managers root */
155    windows = ecore_x_window_children_get(man->root, &wnum);
156    if (windows)
157      {
158         int i;
159         const char *atom_names[] =
160           {
161              "_XEMBED_INFO",
162                "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR",
163                "KWM_DOCKWINDOW"
164           };
165         Ecore_X_Atom atoms[3];
166         Ecore_X_Atom atom_xmbed, atom_kde_netwm_systray, atom_kwm_dockwindow;
167         unsigned char *data = NULL;
168         int count;
169
170         ecore_x_atoms_get(atom_names, 3, atoms);
171         atom_xmbed = atoms[0];
172         atom_kde_netwm_systray = atoms[1];
173         atom_kwm_dockwindow = atoms[2];
174         for (i = 0; i < wnum; i++)
175           {
176              Ecore_X_Window_Attributes att;
177              unsigned int ret_val, deskxy[2];
178              int ret;
179
180              if (e_border_find_by_client_window(windows[i]))
181                continue;
182              ecore_x_window_attributes_get(windows[i], &att);
183              if ((att.override) || (att.input_only))
184                {
185                   if (att.override)
186                     {
187                        char *wname = NULL, *wclass = NULL;
188
189                        ecore_x_icccm_name_class_get(windows[i],
190                                                     &wname, &wclass);
191                        if ((wname) && (wclass) &&
192                            (!strcmp(wname, "E")) &&
193                            (!strcmp(wclass, "Init_Window")))
194                          {
195                             free(wname);
196                             free(wclass);
197                             man->initwin = windows[i];
198                          }
199                        else
200                          {
201                             if (wname) free(wname);
202                             if (wclass) free(wclass);
203                             continue;
204                          }
205                     }
206                   else
207                     continue;
208                }
209              /* XXX manage xembed windows as long as they are not override_redirect..
210               * if (!ecore_x_window_prop_property_get(windows[i],
211               *                                    atom_xmbed,
212               *                                    atom_xmbed, 32,
213               *                                    &data, &count))
214               *   data = NULL;
215               * if (!data) */
216                {
217                   if (!ecore_x_window_prop_property_get(windows[i],
218                                                         atom_kde_netwm_systray,
219                                                         atom_xmbed, 32,
220                                                         &data, &count))
221                     data = NULL;
222                }
223              if (!data)
224                {
225                   if (!ecore_x_window_prop_property_get(windows[i],
226                                                         atom_kwm_dockwindow,
227                                                         atom_kwm_dockwindow, 32,
228                                                         &data, &count))
229                     data = NULL;
230                }
231              if (data)
232                {
233                   free(data);
234                   data = NULL;
235                   continue;
236                }
237              ret = ecore_x_window_prop_card32_get(windows[i],
238                                                   E_ATOM_MANAGED,
239                                                   &ret_val, 1);
240
241              /* we have seen this window before */
242              if ((ret > -1) && (ret_val == 1))
243                {
244                   E_Container  *con = NULL;
245                   E_Zone       *zone = NULL;
246                   E_Desk       *desk = NULL;
247                   E_Border     *bd = NULL;
248                   unsigned int  id;
249                   char *path;
250                   Efreet_Desktop *desktop = NULL;
251
252                   /* get all information from window before it is
253                    * reset by e_border_new */
254                   ret = ecore_x_window_prop_card32_get(windows[i],
255                                                        E_ATOM_CONTAINER,
256                                                        &id, 1);
257                   if (ret == 1)
258                     con = e_container_number_get(man, id);
259                   if (!con)
260                     con = e_container_current_get(man);
261
262                   ret = ecore_x_window_prop_card32_get(windows[i],
263                                                        E_ATOM_ZONE,
264                                                        &id, 1);
265                   if (ret == 1)
266                     zone = e_container_zone_number_get(con, id);
267                   if (!zone)
268                     zone = e_zone_current_get(con);
269                   ret = ecore_x_window_prop_card32_get(windows[i],
270                                                        E_ATOM_DESK,
271                                                        deskxy, 2);
272                   if (ret == 2)
273                     desk = e_desk_at_xy_get(zone,
274                                             deskxy[0],
275                                             deskxy[1]);
276
277                   path = ecore_x_window_prop_string_get(windows[i],
278                                                         E_ATOM_DESKTOP_FILE);
279                   if (path)
280                     {
281                        desktop = efreet_desktop_get(path);
282                        free(path);
283                     }
284
285                     {
286                        bd = e_border_new(con, windows[i], 1, 0);
287                        if (bd)
288                          {
289                             bd->ignore_first_unmap = 1;
290                             /* FIXME:
291                              * It's enough to set the desk, the zone will
292                              * be set according to the desk */
293 //                          if (zone) e_border_zone_set(bd, zone);
294                             if (desk) e_border_desk_set(bd, desk);
295                             bd->desktop = desktop;
296                          }
297                     }
298                }
299              else if ((att.visible) && (!att.override) &&
300                       (!att.input_only))
301                {
302                   /* We have not seen this window, and X tells us it
303                    * should be seen */
304                   E_Container *con;
305                   E_Border *bd;
306
307                   con = e_container_current_get(man);
308                   bd = e_border_new(con, windows[i], 1, 0);
309                   if (bd)
310                     {
311                        bd->ignore_first_unmap = 1;
312                        e_border_show(bd);
313                     }
314                }
315           }
316         free(windows);
317      }
318 }
319
320 EAPI void
321 e_manager_show(E_Manager *man)
322 {
323    Eina_List *l;
324    E_Container *con;
325
326    E_OBJECT_CHECK(man);
327    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
328    if (man->visible) return;
329    EINA_LIST_FOREACH(man->containers, l, con)
330      {
331         e_container_show(con);
332      }
333    if (man->root != man->win)
334      {
335         Ecore_X_Window mwin;
336
337         mwin = e_menu_grab_window_get();
338         if (!mwin) mwin = man->initwin;
339         if (!mwin)
340           ecore_x_window_raise(man->win);
341         else
342           ecore_x_window_configure(man->win,
343                                    ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
344                                    ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
345                                    0, 0, 0, 0, 0,
346                                    mwin, ECORE_X_WINDOW_STACK_BELOW);
347         ecore_x_window_show(man->win);
348      }
349    man->visible = 1;
350 }
351
352 EAPI void
353 e_manager_hide(E_Manager *man)
354 {
355    Eina_List *l;
356    E_Container *con;
357
358    E_OBJECT_CHECK(man);
359    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
360    if (!man->visible) return;
361    EINA_LIST_FOREACH(man->containers, l, con)
362      {
363         e_container_hide(con);
364      }
365    if (man->root != man->win)
366      ecore_x_window_hide(man->win);
367    man->visible = 0;
368 }
369
370 EAPI void
371 e_manager_move(E_Manager *man, int x, int y)
372 {
373    E_OBJECT_CHECK(man);
374    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
375    if ((x == man->x) && (y == man->y)) return;
376    if (man->root != man->win)
377      {
378         man->x = x;
379         man->y = y;
380         ecore_x_window_move(man->win, man->x, man->y);
381      }
382 }
383
384 EAPI void
385 e_manager_resize(E_Manager *man, int w, int h)
386 {
387    Eina_List *l;
388    E_Container *con;
389
390    E_OBJECT_CHECK(man);
391    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
392    man->w = w;
393    man->h = h;
394    if (man->root != man->win)
395      ecore_x_window_resize(man->win, man->w, man->h);
396
397    EINA_LIST_FOREACH(man->containers, l, con)
398      {
399         e_container_resize(con, man->w, man->h);
400      }
401
402    ecore_x_netwm_desk_size_set(man->root, man->w, man->h);
403 }
404
405 EAPI void
406 e_manager_move_resize(E_Manager *man, int x, int y, int w, int h)
407 {
408    Eina_List *l;
409    E_Container *con;
410
411    E_OBJECT_CHECK(man);
412    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
413    if (man->root != man->win)
414      {
415         man->x = x;
416         man->y = y;
417      }
418    man->w = w;
419    man->h = h;
420    ecore_x_window_move_resize(man->win, man->x, man->y, man->w, man->h);
421
422    EINA_LIST_FOREACH(man->containers, l, con)
423      {
424         e_container_resize(con, man->w, man->h);
425      }
426 }
427
428 EAPI void
429 e_manager_raise(E_Manager *man)
430 {
431    E_OBJECT_CHECK(man);
432    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
433    if (man->root != man->win)
434      {
435         Ecore_X_Window mwin;
436
437         mwin = e_menu_grab_window_get();
438         if (!mwin) mwin = man->initwin;
439         if (!mwin)
440           ecore_x_window_raise(man->win);
441         else
442           ecore_x_window_configure(man->win,
443                                    ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
444                                    ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
445                                    0, 0, 0, 0, 0,
446                                    mwin, ECORE_X_WINDOW_STACK_BELOW);
447      }
448 }
449
450 EAPI void
451 e_manager_lower(E_Manager *man)
452 {
453    E_OBJECT_CHECK(man);
454    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
455    if (man->root != man->win)
456      ecore_x_window_lower(man->win);
457 }
458
459 EAPI E_Manager *
460 e_manager_current_get(void)
461 {
462    Eina_List *l;
463    E_Manager *man;
464    int x, y;
465
466    if (!managers) return NULL;
467    EINA_LIST_FOREACH(managers, l, man)
468      {
469         ecore_x_pointer_xy_get(man->win, &x, &y);
470         if (x == -1 && y == -1)
471           continue;
472         if (E_INSIDE(x, y, man->x, man->y, man->w, man->h))
473           return man;
474      }
475    return eina_list_data_get(managers);
476 }
477
478 EAPI E_Manager *
479 e_manager_number_get(int num)
480 {
481    Eina_List *l;
482    E_Manager *man;
483
484    if (!managers) return NULL;
485    EINA_LIST_FOREACH(managers, l, man)
486      {
487         if (man->num == num)
488           return man;
489      }
490    return NULL;
491 }
492
493 EAPI void
494 e_managers_keys_grab(void)
495 {
496    Eina_List *l;
497    E_Manager *man;
498
499    EINA_LIST_FOREACH(managers, l, man)
500      {
501         e_bindings_key_grab(E_BINDING_CONTEXT_ANY, man->root);
502      }
503 }
504
505 EAPI void
506 e_managers_keys_ungrab(void)
507 {
508    Eina_List *l;
509    E_Manager *man;
510
511    EINA_LIST_FOREACH(managers, l, man)
512      {
513         e_bindings_key_ungrab(E_BINDING_CONTEXT_ANY, man->root);
514      }
515 }
516
517 EAPI void
518 e_manager_comp_set(E_Manager *man, E_Manager_Comp *comp)
519 {
520    E_OBJECT_CHECK(man);
521    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
522    man->comp = comp;
523    e_msg_send("comp.manager", "change.comp", // name + info
524               0, // val
525               E_OBJECT(man), // obj
526               NULL, // msgdata
527               NULL, NULL); // afterfunc + afterdata
528 }
529
530 EAPI Evas *
531 e_manager_comp_evas_get(E_Manager *man)
532 {
533    E_OBJECT_CHECK_RETURN(man, NULL);
534    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
535    if (!man->comp) return NULL;
536    if (!man->comp->func.evas_get) return NULL;
537    return man->comp->func.evas_get(man->comp->data, man);
538 }
539
540 EAPI void
541 e_manager_comp_evas_update(E_Manager *man)
542 {
543    E_OBJECT_CHECK(man);
544    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
545    if (!man->comp) return;
546    if (!man->comp->func.update) return;
547    return man->comp->func.update(man->comp->data, man);
548 }
549
550 EAPI const Eina_List *
551 e_manager_comp_src_list(E_Manager *man)
552 {
553    E_OBJECT_CHECK_RETURN(man, NULL);
554    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
555    if (!man->comp) return NULL;
556    if (!man->comp->func.src_list_get) return NULL;
557    return man->comp->func.src_list_get(man->comp->data, man);
558 }
559
560 EAPI E_Manager_Comp_Source*
561 e_manager_comp_border_src_get(E_Manager *man, Ecore_X_Window win)
562 {
563    E_OBJECT_CHECK_RETURN(man, NULL);
564    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
565    if (!man->comp) return NULL;
566    if (!man->comp->func.border_src_get) return NULL;
567    return man->comp->func.border_src_get(man->comp->data, man, win);
568 }
569
570 EAPI E_Manager_Comp_Source*
571 e_manager_comp_src_get(E_Manager *man, Ecore_X_Window win)
572 {
573    E_OBJECT_CHECK_RETURN(man, NULL);
574    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
575    if (!man->comp) return NULL;
576    if (!man->comp->func.src_get) return NULL;
577    return man->comp->func.src_get(man->comp->data, man, win);
578 }
579
580 EAPI Evas_Object *
581 e_manager_comp_src_image_get(E_Manager *man, E_Manager_Comp_Source *src)
582 {
583    E_OBJECT_CHECK_RETURN(man, NULL);
584    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
585    if (!man->comp) return NULL;
586    if (!man->comp->func.src_image_get) return NULL;
587    return man->comp->func.src_image_get(man->comp->data, man, src);
588 }
589
590 EAPI Evas_Object *
591 e_manager_comp_src_shadow_get(E_Manager *man, E_Manager_Comp_Source *src)
592 {
593    E_OBJECT_CHECK_RETURN(man, NULL);
594    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
595    if (!man->comp) return NULL;
596    if (!man->comp->func.src_shadow_get) return NULL;
597    return man->comp->func.src_shadow_get(man->comp->data, man, src);
598 }
599
600 EAPI Evas_Object *
601 e_manager_comp_src_image_mirror_add(E_Manager *man, E_Manager_Comp_Source *src)
602 {
603    E_OBJECT_CHECK_RETURN(man, NULL);
604    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
605    if (!man->comp) return NULL;
606    if (!man->comp->func.src_image_mirror_add) return NULL;
607    return man->comp->func.src_image_mirror_add(man->comp->data, man, src);
608 }
609
610 EAPI Eina_Bool
611 e_manager_comp_src_visible_get(E_Manager *man, E_Manager_Comp_Source *src)
612 {
613    E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
614    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
615    if (!man->comp) return EINA_FALSE;
616    if (!man->comp->func.src_visible_get) return EINA_FALSE;
617    return man->comp->func.src_visible_get(man->comp->data, man, src);
618 }
619
620 EAPI void
621 e_manager_comp_src_hidden_set(E_Manager *man, E_Manager_Comp_Source *src, Eina_Bool hidden)
622 {
623    E_OBJECT_CHECK(man);
624    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
625    if (!man->comp) return;
626    if (!man->comp->func.src_hidden_set) return;
627    return man->comp->func.src_hidden_set(man->comp->data, man, src, hidden);
628 }
629
630 EAPI Eina_Bool
631 e_manager_comp_src_hidden_get(E_Manager *man, E_Manager_Comp_Source *src)
632 {
633    E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
634    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
635    if (!man->comp) return EINA_FALSE;
636    if (!man->comp->func.src_hidden_get) return EINA_FALSE;
637    return man->comp->func.src_hidden_get(man->comp->data, man, src);
638 }
639
640 EAPI Ecore_X_Window
641 e_manager_comp_src_window_get(E_Manager *man, E_Manager_Comp_Source *src)
642 {
643    E_OBJECT_CHECK_RETURN(man, 0);
644    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, 0);
645    if (!man->comp) return 0;
646    if (!man->comp->func.src_window_get) return 0;
647    return man->comp->func.src_window_get(man->comp->data, man, src);
648 }
649
650 EAPI E_Popup *
651 e_manager_comp_src_popup_get(E_Manager *man, E_Manager_Comp_Source *src)
652 {
653    E_OBJECT_CHECK_RETURN(man, NULL);
654    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
655    if (!man->comp) return NULL;
656    if (!man->comp->func.src_popup_get) return NULL;
657    return man->comp->func.src_popup_get(man->comp->data, man, src);
658 }
659
660 EAPI E_Border *
661 e_manager_comp_src_border_get(E_Manager *man, E_Manager_Comp_Source *src)
662 {
663    E_OBJECT_CHECK_RETURN(man, NULL);
664    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
665    if (!man->comp) return NULL;
666    if (!man->comp->func.src_border_get) return NULL;
667    return man->comp->func.src_border_get(man->comp->data, man, src);
668 }
669
670 #ifdef _F_COMP_SCREEN_LOCK_
671 EAPI void
672 e_manager_comp_screen_lock(E_Manager *man)
673 {
674    E_OBJECT_CHECK(man);
675    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
676    if (!man->comp) return;
677    if (!man->comp->func.screen_lock) return;
678    ELB(ELBT_MNG, ">> SCREEN LOCK", 0);
679    return man->comp->func.screen_lock(man->comp->data, man);
680 }
681
682 EAPI void
683 e_manager_comp_screen_unlock(E_Manager *man)
684 {
685    E_OBJECT_CHECK(man);
686    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
687    if (!man->comp) return;
688    if (!man->comp->func.screen_unlock) return;
689    ELB(ELBT_MNG, "<< SCREEN UNLOCK", 0);
690    return man->comp->func.screen_unlock(man->comp->data, man);
691 }
692 #endif
693
694 #ifdef _F_COMP_INPUT_REGION_SET_
695 EAPI Eina_Bool
696 e_manager_comp_src_input_region_set(E_Manager *man, E_Manager_Comp_Source *src, int x, int y, int w, int h)
697 {
698    E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
699    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
700    if (!man->comp) return EINA_FALSE;
701    if (!man->comp->func.src_input_region_set) return EINA_FALSE;
702    return man->comp->func.src_input_region_set(man->comp->data, man, src, x, y, w, h);
703 }
704
705 EAPI int
706 e_manager_comp_input_region_new(E_Manager *man)
707 {
708    E_OBJECT_CHECK_RETURN(man, 0);
709    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, 0);
710    if (!man->comp) return 0;
711    if (!man->comp->func.input_region_new) return 0;
712    return man->comp->func.input_region_new(man->comp->data, man);
713 }
714
715 EAPI Eina_Bool
716 e_manager_comp_input_region_set(E_Manager *man, int id, int x, int y, int w, int h)
717 {
718    E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
719    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
720    if (id <= 0) return EINA_FALSE;
721    if (!man->comp) return EINA_FALSE;
722    if (!man->comp->func.input_region_set) return EINA_FALSE;
723    return man->comp->func.input_region_set(man->comp->data, man, id, x, y, w, h);
724 }
725
726 EAPI Eina_Bool
727 e_manager_comp_input_region_del(E_Manager *man, int id)
728 {
729    E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
730    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
731    if (id <= 0) return EINA_FALSE;
732    if (!man->comp) return EINA_FALSE;
733    if (!man->comp->func.input_region_del) return EINA_FALSE;
734    return man->comp->func.input_region_del(man->comp->data, man, id);
735 }
736
737 EAPI int
738 e_manager_comp_input_region_id_new(E_Manager *man)
739 {
740    E_OBJECT_CHECK_RETURN(man, 0);
741    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, 0);
742    if (!man->comp) return 0;
743    if (!man->comp->func.input_region_new) return 0;
744    return man->comp->func.input_region_new(man->comp->data, man);
745 }
746
747 EAPI Eina_Bool
748 e_manager_comp_input_region_id_set(E_Manager *man, int id, int x, int y, int w, int h)
749 {
750    E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
751    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
752    if (id <= 0) return EINA_FALSE;
753    if (!man->comp) return EINA_FALSE;
754    if (!man->comp->func.input_region_set) return EINA_FALSE;
755    return man->comp->func.input_region_set(man->comp->data, man, id, x, y, w, h);
756 }
757
758 EAPI Eina_Bool
759 e_manager_comp_input_region_id_del(E_Manager *man, int id)
760 {
761    E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
762    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
763    if (id <= 0) return EINA_FALSE;
764    if (!man->comp) return EINA_FALSE;
765    if (!man->comp->func.input_region_del) return EINA_FALSE;
766    return man->comp->func.input_region_del(man->comp->data, man, id);
767 }
768 #endif
769
770 #ifdef _F_COMP_MOVE_LOCK_
771 EAPI Eina_Bool
772 e_manager_comp_src_move_lock(E_Manager *man, E_Manager_Comp_Source *src)
773 {
774    E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
775    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
776    if (!man->comp) return EINA_FALSE;
777    if (!man->comp->func.src_move_lock) return EINA_FALSE;
778    return man->comp->func.src_move_lock(man->comp->data, man, src);
779 }
780
781 EAPI Eina_Bool
782 e_manager_comp_src_move_unlock(E_Manager *man, E_Manager_Comp_Source *src)
783 {
784    E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
785    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
786    if (!man->comp) return EINA_FALSE;
787    if (!man->comp->func.src_move_unlock) return EINA_FALSE;
788    return man->comp->func.src_move_unlock(man->comp->data, man, src);
789 }
790 #endif
791
792 #ifdef _F_COMP_COMPOSITE_MODE_
793 EAPI void
794 e_manager_comp_composite_mode_set(E_Manager *man, E_Zone *zone, Eina_Bool set)
795 {
796    E_OBJECT_CHECK(man);
797    E_OBJECT_CHECK(zone);
798    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
799    E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
800    if (!man->comp) return;
801    if (!man->comp->func.composite_mode_set) return;
802    man->comp->func.composite_mode_set(man->comp->data, man, zone, set);
803 }
804
805 EAPI Eina_Bool
806 e_manager_comp_composite_mode_get(E_Manager *man, E_Zone *zone)
807 {
808    E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
809    E_OBJECT_CHECK_RETURN(zone, EINA_FALSE);
810    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
811    E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, EINA_FALSE);
812    if (!man->comp) return EINA_FALSE;
813    if (!man->comp->func.composite_mode_get) return EINA_FALSE;
814    return man->comp->func.composite_mode_get(man->comp->data, man, zone);
815 }
816 #endif /* _F_COMP_COMPOSITE_MODE_ */
817
818 EAPI void
819 e_manager_comp_event_resize_send(E_Manager *man)
820 {
821    E_OBJECT_CHECK(man);
822    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
823    e_msg_send("comp.manager", "resize.comp", // name + info
824               0, // val
825               E_OBJECT(man), // obj
826               NULL, // msgdata
827               NULL, NULL); // afterfunc + afterdata
828 }
829
830 EAPI void
831 e_manager_comp_event_src_add_send(E_Manager *man, E_Manager_Comp_Source *src,
832                                   void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
833                                   void *data)
834 {
835    E_OBJECT_CHECK(man);
836    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
837    e_msg_send("comp.manager", "add.src", // name + info
838               0, // val
839               E_OBJECT(man), // obj
840               src, // msgdata
841               (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
842 }
843
844 EAPI void
845 e_manager_comp_event_src_del_send(E_Manager *man, E_Manager_Comp_Source *src,
846                                   void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
847                                   void *data)
848 {
849    E_OBJECT_CHECK(man);
850    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
851    e_msg_send("comp.manager", "del.src", // name + info
852               0, // val
853               E_OBJECT(man), // obj
854               src, // msgdata
855               (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
856 }
857
858 EAPI void
859 e_manager_comp_event_src_config_send(E_Manager *man, E_Manager_Comp_Source *src,
860                                      void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
861                                      void *data)
862 {
863    E_OBJECT_CHECK(man);
864    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
865    e_msg_send("comp.manager", "config.src", // name + info
866               0, // val
867               E_OBJECT(man), // obj
868               src, // msgdata
869               (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
870 }
871
872 EAPI void
873 e_manager_comp_event_src_visibility_send(E_Manager *man, E_Manager_Comp_Source *src,
874                                          void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
875                                          void *data)
876 {
877    E_OBJECT_CHECK(man);
878    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
879    e_msg_send("comp.manager", "visibility.src", // name + info
880               0, // val
881               E_OBJECT(man), // obj
882               src, // msgdata
883               (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
884 }
885
886 #ifdef _F_USE_EXTENDED_ICONIFY_
887 EAPI void
888 e_manager_comp_src_shadow_show(E_Manager *man, E_Manager_Comp_Source *src)
889 {
890    E_OBJECT_CHECK(man);
891    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
892    if (!man->comp) return;
893    if (!man->comp->func.src_shadow_show) return;
894    return man->comp->func.src_shadow_show(man->comp->data, man, src);
895 }
896
897 EAPI void
898 e_manager_comp_src_shadow_hide(E_Manager *man, E_Manager_Comp_Source *src)
899 {
900    E_OBJECT_CHECK(man);
901    E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
902    if (!man->comp) return;
903    if (!man->comp->func.src_shadow_show) return;
904    return man->comp->func.src_shadow_hide(man->comp->data, man, src);
905 }
906 #endif
907
908 #ifdef _F_COMP_LAYER_
909 EAPI Evas_Object *
910 e_manager_comp_layer_get(E_Manager *man, E_Zone *zone, const char *name)
911 {
912    E_OBJECT_CHECK_RETURN(man, NULL);
913    E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
914    E_OBJECT_CHECK_RETURN(zone, NULL);
915    E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
916    if (!name) return NULL;
917    if (!man->comp) return NULL;
918    if (!man->comp->func.layer_get) return NULL;
919    return man->comp->func.layer_get(man->comp->data, man, zone, name);
920 }
921 #endif
922
923 /* local subsystem functions */
924 static void
925 _e_manager_free(E_Manager *man)
926 {
927    Eina_List *l;
928
929    E_FREE_LIST(man->handlers, ecore_event_handler_del);
930    l = man->containers;
931    man->containers = NULL;
932    E_FREE_LIST(l, e_object_del);
933    if (man->root != man->win)
934      {
935         ecore_x_window_free(man->win);
936      }
937    if (man->pointer) e_object_del(E_OBJECT(man->pointer));
938    managers = eina_list_remove(managers, man);
939    if (man->clear_timer) ecore_timer_del(man->clear_timer);
940    free(man);
941 }
942
943 static Eina_Bool
944 _e_manager_cb_window_show_request(void *data, int ev_type __UNUSED__, void *ev)
945 {
946    E_Manager *man;
947    Ecore_X_Event_Window_Show_Request *e;
948
949    man = data;
950    e = ev;
951    if (e_stolen_win_get(e->win)) return 1;
952    if (ecore_x_window_parent_get(e->win) != man->root)
953      return ECORE_CALLBACK_PASS_ON;  /* try other handlers for this */
954
955      {
956         E_Container *con;
957         E_Border *bd;
958
959         con = e_container_current_get(man);
960         if (!e_border_find_by_client_window(e->win))
961           {
962              bd = e_border_new(con, e->win, 0, 0);
963              if (!bd)
964                ecore_x_window_show(e->win);
965           }
966      }
967    return ECORE_CALLBACK_PASS_ON;
968 }
969
970 static Eina_Bool
971 _e_manager_cb_window_configure(void *data, int ev_type __UNUSED__, void *ev)
972 {
973    E_Manager *man;
974    Ecore_X_Event_Window_Configure *e;
975
976    man = data;
977    e = ev;
978    if (e->win != man->root) return ECORE_CALLBACK_PASS_ON;
979    if ((man->w != e->w) || (man->h != e->h))
980      e_manager_resize(man, e->w, e->h);
981    return ECORE_CALLBACK_PASS_ON;
982 }
983
984 static Eina_Bool
985 _e_manager_cb_key_down(void *data, int ev_type __UNUSED__, void *ev)
986 {
987    E_Manager *man;
988    Ecore_Event_Key *e;
989
990    man = data;
991    e = ev;
992
993    if (e->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
994    if (e->root_window != man->root) man = _e_manager_get_for_root(e->root_window);
995    if (e_bindings_key_down_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
996      return ECORE_CALLBACK_DONE;
997    return ECORE_CALLBACK_PASS_ON;
998 }
999
1000 static Eina_Bool
1001 _e_manager_cb_key_up(void *data, int ev_type __UNUSED__, void *ev)
1002 {
1003    E_Manager *man;
1004    Ecore_Event_Key *e;
1005
1006    man = data;
1007    e = ev;
1008
1009    if (e->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
1010    if (e->root_window != man->root) man = _e_manager_get_for_root(e->root_window);
1011    if (e_bindings_key_up_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
1012      return ECORE_CALLBACK_DONE;
1013    return ECORE_CALLBACK_PASS_ON;
1014 }
1015
1016 static Eina_Bool
1017 _e_manager_cb_frame_extents_request(void *data, int ev_type __UNUSED__, void *ev)
1018 {
1019    E_Manager *man;
1020    E_Container *con;
1021    Ecore_X_Event_Frame_Extents_Request *e;
1022    Ecore_X_Window_Type type;
1023    Ecore_X_MWM_Hint_Decor decor;
1024    Ecore_X_Window_State *state;
1025    Frame_Extents *extents;
1026    const char *border, *sig, *key;
1027    int ok;
1028    unsigned int i, num;
1029
1030    man = data;
1031    con = e_container_current_get(man);
1032    e = ev;
1033
1034    if (ecore_x_window_parent_get(e->win) != man->root) return ECORE_CALLBACK_PASS_ON;
1035
1036    /* TODO:
1037     * * We need to check if we remember this window, and border locking is set
1038     */
1039    border = "default";
1040    key = border;
1041    ok = ecore_x_mwm_hints_get(e->win, NULL, &decor, NULL);
1042    if ((ok) &&
1043        (!(decor & ECORE_X_MWM_HINT_DECOR_ALL)) &&
1044        (!(decor & ECORE_X_MWM_HINT_DECOR_TITLE)) &&
1045        (!(decor & ECORE_X_MWM_HINT_DECOR_BORDER)))
1046      {
1047         border = "borderless";
1048         key = border;
1049      }
1050
1051    ok = ecore_x_netwm_window_type_get(e->win, &type);
1052    if ((ok) &&
1053        ((type == ECORE_X_WINDOW_TYPE_DESKTOP) ||
1054         (type == ECORE_X_WINDOW_TYPE_DOCK)))
1055      {
1056         border = "borderless";
1057         key = border;
1058      }
1059
1060    sig = NULL;
1061    ecore_x_netwm_window_state_get(e->win, &state, &num);
1062    if (state)
1063      {
1064         int maximized = 0;
1065
1066         for (i = 0; i < num; i++)
1067           {
1068              switch (state[i])
1069                {
1070                 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
1071                   maximized++;
1072                   break;
1073                 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
1074                   maximized++;
1075                   break;
1076                 case ECORE_X_WINDOW_STATE_FULLSCREEN:
1077                   border = "borderless";
1078                   key = border;
1079                   break;
1080                 case ECORE_X_WINDOW_STATE_SHADED:
1081                 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
1082                 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
1083                 case ECORE_X_WINDOW_STATE_HIDDEN:
1084                 case ECORE_X_WINDOW_STATE_ICONIFIED:
1085                 case ECORE_X_WINDOW_STATE_MODAL:
1086                 case ECORE_X_WINDOW_STATE_STICKY:
1087                 case ECORE_X_WINDOW_STATE_ABOVE:
1088                 case ECORE_X_WINDOW_STATE_BELOW:
1089                 case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
1090                 case ECORE_X_WINDOW_STATE_UNKNOWN:
1091                   break;
1092                }
1093           }
1094         if ((maximized == 2) &&
1095             (e_config->maximize_policy == E_MAXIMIZE_FULLSCREEN))
1096           {
1097              sig = "e,action,maximize,fullscreen";
1098              key = "maximize,fullscreen";
1099           }
1100         free(state);
1101      }
1102
1103    extents = eina_hash_find(frame_extents, key);
1104    if (!extents)
1105      {
1106         extents = E_NEW(Frame_Extents, 1);
1107         if (extents)
1108           {
1109              Evas_Object *o;
1110              char buf[1024];
1111
1112              o = edje_object_add(con->bg_evas);
1113              snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", border);
1114              ok = e_theme_edje_object_set(o, "base/theme/borders", buf);
1115              if (ok)
1116                {
1117                   Evas_Coord x, y, w, h;
1118
1119                   if (sig)
1120                     {
1121                        edje_object_signal_emit(o, sig, "e");
1122                        edje_object_message_signal_process(o);
1123                     }
1124
1125                   evas_object_resize(o, 1000, 1000);
1126                   edje_object_calc_force(o);
1127                   edje_object_part_geometry_get(o, "e.swallow.client",
1128                                                 &x, &y, &w, &h);
1129                   extents->l = x;
1130                   extents->r = 1000 - (x + w);
1131                   extents->t = y;
1132                   extents->b = 1000 - (y + h);
1133                }
1134              else
1135                {
1136                   extents->l = 0;
1137                   extents->r = 0;
1138                   extents->t = 0;
1139                   extents->b = 0;
1140                }
1141              evas_object_del(o);
1142              eina_hash_add(frame_extents, key, extents);
1143           }
1144      }
1145
1146    if (extents)
1147      ecore_x_netwm_frame_size_set(e->win, extents->l, extents->r, extents->t, extents->b);
1148
1149    return ECORE_CALLBACK_PASS_ON;
1150 }
1151
1152 static Eina_Bool
1153 _e_manager_cb_ping(void *data, int ev_type __UNUSED__, void *ev)
1154 {
1155    E_Manager *man;
1156    E_Border *bd;
1157    Ecore_X_Event_Ping *e;
1158
1159    man = data;
1160    e = ev;
1161
1162    if (e->win != man->root) return ECORE_CALLBACK_PASS_ON;
1163
1164    bd = e_border_find_by_client_window(e->event_win);
1165    if (!bd) return ECORE_CALLBACK_PASS_ON;
1166
1167    bd->ping_ok = 1;
1168    return ECORE_CALLBACK_PASS_ON;
1169 }
1170
1171 static Eina_Bool
1172 _e_manager_cb_timer_post_screensaver_lock(void *data __UNUSED__)
1173 {
1174    e_desklock_show_autolocked();
1175    timer_post_screensaver_lock = NULL;
1176    return ECORE_CALLBACK_CANCEL;
1177 }
1178
1179 static Eina_Bool
1180 _e_manager_cb_screensaver_notify(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1181 {
1182    Ecore_X_Event_Screensaver_Notify *e = ev;
1183
1184    if (timer_post_screensaver_lock)
1185      {
1186         ecore_timer_del(timer_post_screensaver_lock);
1187         timer_post_screensaver_lock = NULL;
1188      }
1189
1190    if (e->on)
1191      {
1192         if (e_config->desklock_autolock_screensaver)
1193           {
1194              if (e_config->desklock_post_screensaver_time <= 1.0)
1195                {
1196                   e_desklock_show_autolocked();
1197                }
1198              else
1199                {
1200                   timer_post_screensaver_lock = ecore_timer_add
1201                     (e_config->desklock_post_screensaver_time,
1202                      _e_manager_cb_timer_post_screensaver_lock, NULL);
1203                }
1204           }
1205      }
1206    return ECORE_CALLBACK_PASS_ON;
1207 }
1208
1209
1210 #ifdef _F_WINDOW_GROUP_RAISE_
1211 static void
1212 _e_manager_windows_group_raise (E_Border* bd)
1213 {
1214    Ecore_X_Window leader_win;
1215    
1216    if (!bd) return;
1217
1218    if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
1219       (e_config->focus_setting == E_FOCUS_NEW_WINDOW_IF_TOP_STACK) ||
1220       ((bd->parent) && 
1221       ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
1222       ((bd->parent->focused) &&
1223       (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
1224      {
1225         leader_win = bd->client.icccm.client_leader;
1226         if (leader_win)
1227           {
1228              Eina_List* restack_list;
1229              E_Border *temp_bd;
1230              E_Border *top_bd;
1231              E_Border_List *bl;
1232
1233              restack_list = NULL;
1234              top_bd = NULL;
1235              bl = e_container_border_list_last(bd->zone->container);
1236              while ((temp_bd = e_container_border_list_prev(bl)))
1237                {
1238                   if (temp_bd->client.icccm.client_leader == leader_win)
1239                     {
1240                        restack_list = eina_list_prepend(restack_list, temp_bd);
1241                     }
1242                }
1243              e_container_border_list_free(bl);
1244
1245              if (restack_list)
1246                {
1247                   EINA_LIST_FREE (restack_list, temp_bd)
1248                     {
1249                        if (temp_bd->iconic)
1250                          {
1251                             if (e_config->clientlist_warp_to_iconified_desktop == 1)
1252                                e_desk_show(temp_bd->desk);
1253
1254                             if (!temp_bd->lock_user_iconify)
1255                                e_border_uniconify(temp_bd);
1256                          }
1257
1258                        if (!temp_bd->iconic) e_desk_show(temp_bd->desk);
1259                        if (!temp_bd->lock_user_stacking) e_border_raise(temp_bd);
1260
1261                        // set focus to top window
1262                        if (!temp_bd->lock_focus_out)
1263                          {
1264                             top_bd = temp_bd;
1265
1266                             if (e_config->focus_policy != E_FOCUS_CLICK)
1267                                ecore_x_pointer_warp(top_bd->zone->container->win, top_bd->x + (top_bd->w / 2), top_bd->y + (top_bd->h / 2));
1268                             
1269                             if (e_config->focus_setting != E_FOCUS_NEW_WINDOW_IF_TOP_STACK)
1270                                e_border_focus_set(top_bd, 1, 1);
1271                             else
1272                               {
1273                                  Eina_List* l2;
1274                                  E_Border* temp_bd2;
1275                                  l2 = NULL;
1276                                  temp_bd2 = NULL;
1277
1278                                  bl = e_container_border_list_last(bd->zone->container);
1279                                  while ((temp_bd2 = e_container_border_list_prev(bl)))
1280                                    {
1281                                       if ((!temp_bd2->iconic) && (temp_bd2->visible) && (temp_bd2->desk == top_bd->desk) &&
1282                                          (temp_bd2->client.icccm.accepts_focus || temp_bd2->client.icccm.take_focus) &&
1283                                          (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_DOCK) &&
1284                                          (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_TOOLBAR) &&
1285                                          (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_MENU) &&
1286                                          (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_SPLASH) &&
1287                                          (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_DESKTOP))
1288                                         {
1289                                            if (top_bd == temp_bd2)
1290                                              {
1291                                                 e_border_focus_set(top_bd, 1, 1);
1292                                              }
1293                                             break;
1294                                         }
1295                                    }
1296                                  e_container_border_list_free(bl);
1297                               }
1298                          }
1299                     }
1300                }
1301           }
1302      }
1303 }
1304 #endif // group raise
1305
1306 static Eina_Bool
1307 _e_manager_cb_client_message(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1308 {
1309    Ecore_X_Event_Client_Message *e;
1310    E_Border *bd;
1311
1312    e = ev;
1313
1314    if (e->message_type == ECORE_X_ATOM_NET_ACTIVE_WINDOW)
1315      {
1316         bd = e_border_find_by_client_window(e->win);
1317         if (bd)
1318           {
1319 #if 0 /* notes */
1320              if (e->data.l[0] == 0 /* 0 == old, 1 == client, 2 == pager */)
1321                {
1322                   // FIXME: need config for the below - what to do given each
1323                   //  request (either do nothng, make app look urgent/want
1324                   //  attention or actiually flip to app as below is the
1325                   //  current default)
1326                   // if 0 == just make app demand attention somehow
1327                   // if 1 == just make app demand attention somehow
1328                   // if 2 == activate window as below
1329                }
1330              timestamp = e->data.l[1];
1331              requestor_id e->data.l[2];
1332 #endif
1333
1334 #ifdef _F_WINDOW_GROUP_RAISE_
1335              if (e->data.l[0] == 3) // 'e->data.l[0] == 3' means group raise
1336                {
1337                   if (bd->client.icccm.client_leader)
1338                     {
1339                        _e_manager_windows_group_raise (bd);
1340                        return ECORE_CALLBACK_PASS_ON;
1341                     }
1342                }
1343 #endif
1344
1345 #ifdef _F_FOCUS_WINDOW_IF_TOP_STACK_
1346              if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
1347                  (e_config->focus_setting == E_FOCUS_NEW_WINDOW_IF_TOP_STACK) ||
1348                  ((bd->parent) &&
1349                   ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
1350                    ((bd->parent->focused) &&
1351                     (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
1352                {
1353                   if (bd->iconic)
1354                     {
1355                        if (e_config->clientlist_warp_to_iconified_desktop == 1)
1356                          e_desk_show(bd->desk);
1357
1358                        if (!bd->lock_user_iconify)
1359                          e_border_uniconify(bd);
1360                     }
1361                   if ((!bd->iconic) && (!bd->sticky))
1362                     e_desk_show(bd->desk);
1363 #ifdef _F_DEICONIFY_APPROVE_
1364                   if (!bd->iconic)
1365                     {
1366                        if (!bd->lock_user_stacking) e_border_raise(bd);
1367                     }
1368 #else
1369                   if (!bd->lock_user_stacking) e_border_raise(bd);
1370 #endif
1371                   if (!bd->lock_focus_out)
1372                     {
1373                        /* XXX ooffice does send this request for
1374                           config dialogs when the main window gets focus.
1375                           causing the pointer to jump back and forth.  */
1376                        if ((e_config->focus_policy != E_FOCUS_CLICK) &&
1377                            !(bd->client.icccm.name && !strcmp(bd->client.icccm.name, "VCLSalFrame")))
1378                          ecore_x_pointer_warp(bd->zone->container->win,
1379                                               bd->x + (bd->w / 2), bd->y + (bd->h / 2));
1380
1381                        if (e_config->focus_setting != E_FOCUS_NEW_WINDOW_IF_TOP_STACK)
1382                          e_border_focus_set(bd, 1, 1);
1383                        else
1384                          {
1385                             E_Border* temp_bd = NULL;
1386                             E_Border_List *bl;
1387                             E_Border *cur_focus;
1388
1389                             cur_focus = e_border_focused_get();
1390                             bl = e_container_border_list_last(bd->zone->container);
1391                             while ((temp_bd = e_container_border_list_prev(bl)))
1392                               {
1393                                  if (temp_bd == cur_focus) break;
1394
1395                                  if ((temp_bd->x >= bd->zone->w) || (temp_bd->y >= bd->zone->h)) continue;
1396                                  if (((temp_bd->x + temp_bd->w) <= 0) || ((temp_bd->y + temp_bd->h) <= 0)) continue;
1397                                  if ((temp_bd != bd) &&
1398                                      (temp_bd->client.illume.win_state.state == ECORE_X_ILLUME_WINDOW_STATE_FLOATING))
1399                                    continue;
1400
1401                                  if ((!temp_bd->iconic) && (temp_bd->visible) && (temp_bd->desk == bd->desk) &&
1402                                      (temp_bd->client.icccm.accepts_focus || temp_bd->client.icccm.take_focus) &&
1403                                      (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_DOCK) &&
1404                                      (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_TOOLBAR) &&
1405                                      (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_MENU) &&
1406                                      (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_SPLASH) &&
1407                                      (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_DESKTOP))
1408                                    {
1409                                       e_border_focus_set(temp_bd, 1, 1);
1410                                       break;
1411                                    }
1412                               }
1413                             e_container_border_list_free(bl);
1414                          }
1415                     }
1416                }
1417 #else // original
1418              if (!bd->focused) e_border_activate(bd, EINA_FALSE);
1419              else e_border_raise(bd);
1420 #endif
1421           }
1422      }
1423
1424    return ECORE_CALLBACK_PASS_ON;
1425 }
1426
1427 static Eina_Bool
1428 _e_manager_frame_extents_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__,
1429                                  void *data, void *fdata __UNUSED__)
1430 {
1431    free(data);
1432    return EINA_TRUE;
1433 }
1434
1435 static E_Manager *
1436 _e_manager_get_for_root(Ecore_X_Window root)
1437 {
1438    Eina_List *l;
1439    E_Manager *man;
1440
1441    if (!managers) return NULL;
1442    EINA_LIST_FOREACH(managers, l, man)
1443      {
1444         if (man->root == root)
1445           return man;
1446      }
1447    return eina_list_data_get(managers);
1448 }
1449
1450 static Eina_Bool
1451 _e_manager_clear_timer(void *data)
1452 {
1453    E_Manager *man = data;
1454    ecore_x_window_background_color_set(man->root, 0, 0, 0);
1455    man->clear_timer = NULL;
1456    return EINA_FALSE;
1457 }
1458
1459 #if 0 /* use later - maybe */
1460 static int _e_manager_cb_window_destroy(void *data, int ev_type, void *ev){return 1;}
1461 static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev){return 1;}
1462 static int _e_manager_cb_window_reparent(void *data, int ev_type, void *ev){return 1;}
1463 static int _e_manager_cb_window_create(void *data, int ev_type, void *ev){return 1;}
1464 static int _e_manager_cb_window_configure_request(void *data, int ev_type, void *ev){return 1;}
1465 static int _e_manager_cb_window_configure(void *data, int ev_type, void *ev){return 1;}
1466 static int _e_manager_cb_window_gravity(void *data, int ev_type, void *ev){return 1;}
1467 static int _e_manager_cb_window_stack(void *data, int ev_type, void *ev){return 1;}
1468 static int _e_manager_cb_window_stack_request(void *data, int ev_type, void *ev){return 1;}
1469 static int _e_manager_cb_window_property(void *data, int ev_type, void *ev){return 1;}
1470 static int _e_manager_cb_window_colormap(void *data, int ev_type, void *ev){return 1;}
1471 static int _e_manager_cb_window_shape(void *data, int ev_type, void *ev){return 1;}
1472 #endif