3 /* local subsystem functions */
4 static void _e_manager_free(E_Manager *man);
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);
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);
35 /* local subsystem globals */
37 typedef struct _Frame_Extents Frame_Extents;
44 static Eina_List *managers = NULL;
45 static Eina_Hash *frame_extents = NULL;
46 static Ecore_Timer *timer_post_screensaver_lock = NULL;
48 /* externally accessible functions */
52 ecore_x_screensaver_event_listen_set(1);
53 frame_extents = eina_hash_string_superfast_new(NULL);
58 e_manager_shutdown(void)
60 E_FREE_LIST(managers, e_object_del);
64 eina_hash_foreach(frame_extents, _e_manager_frame_extents_free_cb, NULL);
65 eina_hash_free(frame_extents);
69 if (timer_post_screensaver_lock)
71 ecore_timer_del(timer_post_screensaver_lock);
72 timer_post_screensaver_lock = NULL;
85 e_manager_new(Ecore_X_Window root, int num)
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);
95 ecore_x_window_size_get(man->root, &(man->w), &(man->h));
99 eina_list_append(man->handlers,
100 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST,
101 _e_manager_cb_window_show_request,
104 eina_list_append(man->handlers,
105 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE,
106 _e_manager_cb_window_configure,
109 eina_list_append(man->handlers,
110 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
111 _e_manager_cb_key_down,
114 eina_list_append(man->handlers,
115 ecore_event_handler_add(ECORE_EVENT_KEY_UP,
116 _e_manager_cb_key_up,
119 eina_list_append(man->handlers,
120 ecore_event_handler_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST,
121 _e_manager_cb_frame_extents_request,
124 eina_list_append(man->handlers,
125 ecore_event_handler_add(ECORE_X_EVENT_PING,
129 eina_list_append(man->handlers,
130 ecore_event_handler_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY,
131 _e_manager_cb_screensaver_notify,
134 eina_list_append(man->handlers,
135 ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
136 _e_manager_cb_client_message,
139 man->pointer = e_pointer_window_new(man->root, 1);
141 ecore_x_window_background_color_set(man->root, 0, 0, 0);
143 man->clear_timer = ecore_timer_add(10.0, _e_manager_clear_timer, man);
148 e_manager_manage_windows(E_Manager *man)
150 Ecore_X_Window *windows;
153 /* a manager is designated for each root. lets get all the windows in
155 windows = ecore_x_window_children_get(man->root, &wnum);
159 const char *atom_names[] =
162 "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR",
165 Ecore_X_Atom atoms[3];
166 Ecore_X_Atom atom_xmbed, atom_kde_netwm_systray, atom_kwm_dockwindow;
167 unsigned char *data = NULL;
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++)
176 Ecore_X_Window_Attributes att;
177 unsigned int ret_val, deskxy[2];
180 if (e_border_find_by_client_window(windows[i]))
182 ecore_x_window_attributes_get(windows[i], &att);
183 if ((att.override) || (att.input_only))
187 char *wname = NULL, *wclass = NULL;
189 ecore_x_icccm_name_class_get(windows[i],
191 if ((wname) && (wclass) &&
192 (!strcmp(wname, "E")) &&
193 (!strcmp(wclass, "Init_Window")))
197 man->initwin = windows[i];
201 if (wname) free(wname);
202 if (wclass) free(wclass);
209 /* XXX manage xembed windows as long as they are not override_redirect..
210 * if (!ecore_x_window_prop_property_get(windows[i],
217 if (!ecore_x_window_prop_property_get(windows[i],
218 atom_kde_netwm_systray,
225 if (!ecore_x_window_prop_property_get(windows[i],
227 atom_kwm_dockwindow, 32,
237 ret = ecore_x_window_prop_card32_get(windows[i],
241 /* we have seen this window before */
242 if ((ret > -1) && (ret_val == 1))
244 E_Container *con = NULL;
250 Efreet_Desktop *desktop = NULL;
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],
258 con = e_container_number_get(man, id);
260 con = e_container_current_get(man);
262 ret = ecore_x_window_prop_card32_get(windows[i],
266 zone = e_container_zone_number_get(con, id);
268 zone = e_zone_current_get(con);
269 ret = ecore_x_window_prop_card32_get(windows[i],
273 desk = e_desk_at_xy_get(zone,
277 path = ecore_x_window_prop_string_get(windows[i],
278 E_ATOM_DESKTOP_FILE);
281 desktop = efreet_desktop_get(path);
286 bd = e_border_new(con, windows[i], 1, 0);
289 bd->ignore_first_unmap = 1;
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;
299 else if ((att.visible) && (!att.override) &&
302 /* We have not seen this window, and X tells us it
307 con = e_container_current_get(man);
308 bd = e_border_new(con, windows[i], 1, 0);
311 bd->ignore_first_unmap = 1;
321 e_manager_show(E_Manager *man)
327 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
328 if (man->visible) return;
329 EINA_LIST_FOREACH(man->containers, l, con)
331 e_container_show(con);
333 if (man->root != man->win)
337 mwin = e_menu_grab_window_get();
338 if (!mwin) mwin = man->initwin;
340 ecore_x_window_raise(man->win);
342 ecore_x_window_configure(man->win,
343 ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
344 ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
346 mwin, ECORE_X_WINDOW_STACK_BELOW);
347 ecore_x_window_show(man->win);
353 e_manager_hide(E_Manager *man)
359 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
360 if (!man->visible) return;
361 EINA_LIST_FOREACH(man->containers, l, con)
363 e_container_hide(con);
365 if (man->root != man->win)
366 ecore_x_window_hide(man->win);
371 e_manager_move(E_Manager *man, int x, int y)
374 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
375 if ((x == man->x) && (y == man->y)) return;
376 if (man->root != man->win)
380 ecore_x_window_move(man->win, man->x, man->y);
385 e_manager_resize(E_Manager *man, int w, int h)
391 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
394 if (man->root != man->win)
395 ecore_x_window_resize(man->win, man->w, man->h);
397 EINA_LIST_FOREACH(man->containers, l, con)
399 e_container_resize(con, man->w, man->h);
402 ecore_x_netwm_desk_size_set(man->root, man->w, man->h);
406 e_manager_move_resize(E_Manager *man, int x, int y, int w, int h)
412 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
413 if (man->root != man->win)
420 ecore_x_window_move_resize(man->win, man->x, man->y, man->w, man->h);
422 EINA_LIST_FOREACH(man->containers, l, con)
424 e_container_resize(con, man->w, man->h);
429 e_manager_raise(E_Manager *man)
432 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
433 if (man->root != man->win)
437 mwin = e_menu_grab_window_get();
438 if (!mwin) mwin = man->initwin;
440 ecore_x_window_raise(man->win);
442 ecore_x_window_configure(man->win,
443 ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
444 ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
446 mwin, ECORE_X_WINDOW_STACK_BELOW);
451 e_manager_lower(E_Manager *man)
454 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
455 if (man->root != man->win)
456 ecore_x_window_lower(man->win);
460 e_manager_current_get(void)
466 if (!managers) return NULL;
467 EINA_LIST_FOREACH(managers, l, man)
469 ecore_x_pointer_xy_get(man->win, &x, &y);
470 if (x == -1 && y == -1)
472 if (E_INSIDE(x, y, man->x, man->y, man->w, man->h))
475 return eina_list_data_get(managers);
479 e_manager_number_get(int num)
484 if (!managers) return NULL;
485 EINA_LIST_FOREACH(managers, l, man)
494 e_managers_keys_grab(void)
499 EINA_LIST_FOREACH(managers, l, man)
501 e_bindings_key_grab(E_BINDING_CONTEXT_ANY, man->root);
506 e_managers_keys_ungrab(void)
511 EINA_LIST_FOREACH(managers, l, man)
513 e_bindings_key_ungrab(E_BINDING_CONTEXT_ANY, man->root);
518 e_manager_comp_set(E_Manager *man, E_Manager_Comp *comp)
521 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
523 e_msg_send("comp.manager", "change.comp", // name + info
525 E_OBJECT(man), // obj
527 NULL, NULL); // afterfunc + afterdata
531 e_manager_comp_evas_get(E_Manager *man)
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);
541 e_manager_comp_evas_update(E_Manager *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);
550 EAPI const Eina_List *
551 e_manager_comp_src_list(E_Manager *man)
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);
560 EAPI E_Manager_Comp_Source*
561 e_manager_comp_border_src_get(E_Manager *man, Ecore_X_Window win)
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);
570 EAPI E_Manager_Comp_Source*
571 e_manager_comp_src_get(E_Manager *man, Ecore_X_Window win)
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);
581 e_manager_comp_src_image_get(E_Manager *man, E_Manager_Comp_Source *src)
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);
591 e_manager_comp_src_shadow_get(E_Manager *man, E_Manager_Comp_Source *src)
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);
601 e_manager_comp_src_image_mirror_add(E_Manager *man, E_Manager_Comp_Source *src)
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);
611 e_manager_comp_src_visible_get(E_Manager *man, E_Manager_Comp_Source *src)
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);
621 e_manager_comp_src_hidden_set(E_Manager *man, E_Manager_Comp_Source *src, Eina_Bool hidden)
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);
631 e_manager_comp_src_hidden_get(E_Manager *man, E_Manager_Comp_Source *src)
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);
641 e_manager_comp_src_window_get(E_Manager *man, E_Manager_Comp_Source *src)
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);
651 e_manager_comp_src_popup_get(E_Manager *man, E_Manager_Comp_Source *src)
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);
661 e_manager_comp_src_border_get(E_Manager *man, E_Manager_Comp_Source *src)
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);
670 #ifdef _F_COMP_SCREEN_LOCK_
672 e_manager_comp_screen_lock(E_Manager *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);
683 e_manager_comp_screen_unlock(E_Manager *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);
694 #ifdef _F_COMP_INPUT_REGION_SET_
696 e_manager_comp_src_input_region_set(E_Manager *man, E_Manager_Comp_Source *src, int x, int y, int w, int h)
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);
706 e_manager_comp_input_region_new(E_Manager *man)
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);
716 e_manager_comp_input_region_set(E_Manager *man, int id, int x, int y, int w, int h)
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);
727 e_manager_comp_input_region_del(E_Manager *man, int id)
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);
738 e_manager_comp_input_region_id_new(E_Manager *man)
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);
748 e_manager_comp_input_region_id_set(E_Manager *man, int id, int x, int y, int w, int h)
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);
759 e_manager_comp_input_region_id_del(E_Manager *man, int id)
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);
770 #ifdef _F_COMP_MOVE_LOCK_
772 e_manager_comp_src_move_lock(E_Manager *man, E_Manager_Comp_Source *src)
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);
782 e_manager_comp_src_move_unlock(E_Manager *man, E_Manager_Comp_Source *src)
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);
792 #ifdef _F_COMP_COMPOSITE_MODE_
794 e_manager_comp_composite_mode_set(E_Manager *man, E_Zone *zone, Eina_Bool set)
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);
806 e_manager_comp_composite_mode_get(E_Manager *man, E_Zone *zone)
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);
816 #endif /* _F_COMP_COMPOSITE_MODE_ */
819 e_manager_comp_event_resize_send(E_Manager *man)
822 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
823 e_msg_send("comp.manager", "resize.comp", // name + info
825 E_OBJECT(man), // obj
827 NULL, NULL); // afterfunc + afterdata
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),
836 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
837 e_msg_send("comp.manager", "add.src", // name + info
839 E_OBJECT(man), // obj
841 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
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),
850 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
851 e_msg_send("comp.manager", "del.src", // name + info
853 E_OBJECT(man), // obj
855 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
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),
864 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
865 e_msg_send("comp.manager", "config.src", // name + info
867 E_OBJECT(man), // obj
869 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
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),
878 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
879 e_msg_send("comp.manager", "visibility.src", // name + info
881 E_OBJECT(man), // obj
883 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
886 #ifdef _F_USE_EXTENDED_ICONIFY_
888 e_manager_comp_src_shadow_show(E_Manager *man, E_Manager_Comp_Source *src)
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);
898 e_manager_comp_src_shadow_hide(E_Manager *man, E_Manager_Comp_Source *src)
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);
908 #ifdef _F_COMP_LAYER_
910 e_manager_comp_layer_get(E_Manager *man, E_Zone *zone, const char *name)
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);
923 /* local subsystem functions */
925 _e_manager_free(E_Manager *man)
929 E_FREE_LIST(man->handlers, ecore_event_handler_del);
931 man->containers = NULL;
932 E_FREE_LIST(l, e_object_del);
933 if (man->root != man->win)
935 ecore_x_window_free(man->win);
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);
944 _e_manager_cb_window_show_request(void *data, int ev_type __UNUSED__, void *ev)
947 Ecore_X_Event_Window_Show_Request *e;
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 */
959 con = e_container_current_get(man);
960 if (!e_border_find_by_client_window(e->win))
962 bd = e_border_new(con, e->win, 0, 0);
964 ecore_x_window_show(e->win);
967 return ECORE_CALLBACK_PASS_ON;
971 _e_manager_cb_window_configure(void *data, int ev_type __UNUSED__, void *ev)
974 Ecore_X_Event_Window_Configure *e;
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;
985 _e_manager_cb_key_down(void *data, int ev_type __UNUSED__, void *ev)
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;
1001 _e_manager_cb_key_up(void *data, int ev_type __UNUSED__, void *ev)
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;
1017 _e_manager_cb_frame_extents_request(void *data, int ev_type __UNUSED__, void *ev)
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;
1028 unsigned int i, num;
1031 con = e_container_current_get(man);
1034 if (ecore_x_window_parent_get(e->win) != man->root) return ECORE_CALLBACK_PASS_ON;
1037 * * We need to check if we remember this window, and border locking is set
1041 ok = ecore_x_mwm_hints_get(e->win, NULL, &decor, NULL);
1043 (!(decor & ECORE_X_MWM_HINT_DECOR_ALL)) &&
1044 (!(decor & ECORE_X_MWM_HINT_DECOR_TITLE)) &&
1045 (!(decor & ECORE_X_MWM_HINT_DECOR_BORDER)))
1047 border = "borderless";
1051 ok = ecore_x_netwm_window_type_get(e->win, &type);
1053 ((type == ECORE_X_WINDOW_TYPE_DESKTOP) ||
1054 (type == ECORE_X_WINDOW_TYPE_DOCK)))
1056 border = "borderless";
1061 ecore_x_netwm_window_state_get(e->win, &state, &num);
1066 for (i = 0; i < num; i++)
1070 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
1073 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
1076 case ECORE_X_WINDOW_STATE_FULLSCREEN:
1077 border = "borderless";
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:
1094 if ((maximized == 2) &&
1095 (e_config->maximize_policy == E_MAXIMIZE_FULLSCREEN))
1097 sig = "e,action,maximize,fullscreen";
1098 key = "maximize,fullscreen";
1103 extents = eina_hash_find(frame_extents, key);
1106 extents = E_NEW(Frame_Extents, 1);
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);
1117 Evas_Coord x, y, w, h;
1121 edje_object_signal_emit(o, sig, "e");
1122 edje_object_message_signal_process(o);
1125 evas_object_resize(o, 1000, 1000);
1126 edje_object_calc_force(o);
1127 edje_object_part_geometry_get(o, "e.swallow.client",
1130 extents->r = 1000 - (x + w);
1132 extents->b = 1000 - (y + h);
1142 eina_hash_add(frame_extents, key, extents);
1147 ecore_x_netwm_frame_size_set(e->win, extents->l, extents->r, extents->t, extents->b);
1149 return ECORE_CALLBACK_PASS_ON;
1153 _e_manager_cb_ping(void *data, int ev_type __UNUSED__, void *ev)
1157 Ecore_X_Event_Ping *e;
1162 if (e->win != man->root) return ECORE_CALLBACK_PASS_ON;
1164 bd = e_border_find_by_client_window(e->event_win);
1165 if (!bd) return ECORE_CALLBACK_PASS_ON;
1168 return ECORE_CALLBACK_PASS_ON;
1172 _e_manager_cb_timer_post_screensaver_lock(void *data __UNUSED__)
1174 e_desklock_show_autolocked();
1175 timer_post_screensaver_lock = NULL;
1176 return ECORE_CALLBACK_CANCEL;
1180 _e_manager_cb_screensaver_notify(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1182 Ecore_X_Event_Screensaver_Notify *e = ev;
1184 if (timer_post_screensaver_lock)
1186 ecore_timer_del(timer_post_screensaver_lock);
1187 timer_post_screensaver_lock = NULL;
1192 if (e_config->desklock_autolock_screensaver)
1194 if (e_config->desklock_post_screensaver_time <= 1.0)
1196 e_desklock_show_autolocked();
1200 timer_post_screensaver_lock = ecore_timer_add
1201 (e_config->desklock_post_screensaver_time,
1202 _e_manager_cb_timer_post_screensaver_lock, NULL);
1206 return ECORE_CALLBACK_PASS_ON;
1210 #ifdef _F_WINDOW_GROUP_RAISE_
1212 _e_manager_windows_group_raise (E_Border* bd)
1214 Ecore_X_Window leader_win;
1218 if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
1219 (e_config->focus_setting == E_FOCUS_NEW_WINDOW_IF_TOP_STACK) ||
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)))))
1225 leader_win = bd->client.icccm.client_leader;
1228 Eina_List* restack_list;
1233 restack_list = NULL;
1235 bl = e_container_border_list_last(bd->zone->container);
1236 while ((temp_bd = e_container_border_list_prev(bl)))
1238 if (temp_bd->client.icccm.client_leader == leader_win)
1240 restack_list = eina_list_prepend(restack_list, temp_bd);
1243 e_container_border_list_free(bl);
1247 EINA_LIST_FREE (restack_list, temp_bd)
1249 if (temp_bd->iconic)
1251 if (e_config->clientlist_warp_to_iconified_desktop == 1)
1252 e_desk_show(temp_bd->desk);
1254 if (!temp_bd->lock_user_iconify)
1255 e_border_uniconify(temp_bd);
1258 if (!temp_bd->iconic) e_desk_show(temp_bd->desk);
1259 if (!temp_bd->lock_user_stacking) e_border_raise(temp_bd);
1261 // set focus to top window
1262 if (!temp_bd->lock_focus_out)
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));
1269 if (e_config->focus_setting != E_FOCUS_NEW_WINDOW_IF_TOP_STACK)
1270 e_border_focus_set(top_bd, 1, 1);
1278 bl = e_container_border_list_last(bd->zone->container);
1279 while ((temp_bd2 = e_container_border_list_prev(bl)))
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))
1289 if (top_bd == temp_bd2)
1291 e_border_focus_set(top_bd, 1, 1);
1296 e_container_border_list_free(bl);
1304 #endif // group raise
1307 _e_manager_cb_client_message(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1309 Ecore_X_Event_Client_Message *e;
1314 if (e->message_type == ECORE_X_ATOM_NET_ACTIVE_WINDOW)
1316 bd = e_border_find_by_client_window(e->win);
1320 if (e->data.l[0] == 0 /* 0 == old, 1 == client, 2 == pager */)
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
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
1330 timestamp = e->data.l[1];
1331 requestor_id e->data.l[2];
1334 #ifdef _F_WINDOW_GROUP_RAISE_
1335 if (e->data.l[0] == 3) // 'e->data.l[0] == 3' means group raise
1337 if (bd->client.icccm.client_leader)
1339 _e_manager_windows_group_raise (bd);
1340 return ECORE_CALLBACK_PASS_ON;
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) ||
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)))))
1355 if (e_config->clientlist_warp_to_iconified_desktop == 1)
1356 e_desk_show(bd->desk);
1358 if (!bd->lock_user_iconify)
1359 e_border_uniconify(bd);
1361 if ((!bd->iconic) && (!bd->sticky))
1362 e_desk_show(bd->desk);
1363 #ifdef _F_DEICONIFY_APPROVE_
1366 if (!bd->lock_user_stacking) e_border_raise(bd);
1369 if (!bd->lock_user_stacking) e_border_raise(bd);
1371 if (!bd->lock_focus_out)
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));
1381 if (e_config->focus_setting != E_FOCUS_NEW_WINDOW_IF_TOP_STACK)
1382 e_border_focus_set(bd, 1, 1);
1385 E_Border* temp_bd = NULL;
1387 E_Border *cur_focus;
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)))
1393 if (temp_bd == cur_focus) break;
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))
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))
1409 e_border_focus_set(temp_bd, 1, 1);
1413 e_container_border_list_free(bl);
1418 if (!bd->focused) e_border_activate(bd, EINA_FALSE);
1419 else e_border_raise(bd);
1424 return ECORE_CALLBACK_PASS_ON;
1428 _e_manager_frame_extents_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__,
1429 void *data, void *fdata __UNUSED__)
1436 _e_manager_get_for_root(Ecore_X_Window root)
1441 if (!managers) return NULL;
1442 EINA_LIST_FOREACH(managers, l, man)
1444 if (man->root == root)
1447 return eina_list_data_get(managers);
1451 _e_manager_clear_timer(void *data)
1453 E_Manager *man = data;
1454 ecore_x_window_background_color_set(man->root, 0, 0, 0);
1455 man->clear_timer = NULL;
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;}