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);
392 if ((w == man->w) && (h == man->h)) return;
395 if (man->root != man->win)
396 ecore_x_window_resize(man->win, man->w, man->h);
398 EINA_LIST_FOREACH(man->containers, l, con)
400 e_container_resize(con, man->w, man->h);
403 ecore_x_netwm_desk_size_set(man->root, man->w, man->h);
407 e_manager_move_resize(E_Manager *man, int x, int y, int w, int h)
413 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
414 if ((x == man->x) && (y == man->y) && (w == man->w) && (h == man->h)) return;
415 if (man->root != man->win)
422 ecore_x_window_move_resize(man->win, man->x, man->y, man->w, man->h);
424 EINA_LIST_FOREACH(man->containers, l, con)
426 e_container_resize(con, man->w, man->h);
431 e_manager_raise(E_Manager *man)
434 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
435 if (man->root != man->win)
439 mwin = e_menu_grab_window_get();
440 if (!mwin) mwin = man->initwin;
442 ecore_x_window_raise(man->win);
444 ecore_x_window_configure(man->win,
445 ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
446 ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
448 mwin, ECORE_X_WINDOW_STACK_BELOW);
453 e_manager_lower(E_Manager *man)
456 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
457 if (man->root != man->win)
458 ecore_x_window_lower(man->win);
462 e_manager_current_get(void)
468 if (!managers) return NULL;
469 EINA_LIST_FOREACH(managers, l, man)
471 ecore_x_pointer_xy_get(man->win, &x, &y);
472 if (x == -1 && y == -1)
474 if (E_INSIDE(x, y, man->x, man->y, man->w, man->h))
477 return eina_list_data_get(managers);
481 e_manager_number_get(int num)
486 if (!managers) return NULL;
487 EINA_LIST_FOREACH(managers, l, man)
496 e_managers_keys_grab(void)
501 EINA_LIST_FOREACH(managers, l, man)
503 e_bindings_key_grab(E_BINDING_CONTEXT_ANY, man->root);
508 e_managers_keys_ungrab(void)
513 EINA_LIST_FOREACH(managers, l, man)
515 e_bindings_key_ungrab(E_BINDING_CONTEXT_ANY, man->root);
526 e_manager_comp_set(E_Manager *man, E_Manager_Comp *comp)
529 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
531 e_msg_send("comp.manager", "change.comp", // name + info
533 E_OBJECT(man), // obj
535 NULL, NULL); // afterfunc + afterdata
539 e_manager_comp_evas_get(E_Manager *man)
542 E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
543 if (!man->comp) return NULL;
544 return man->comp->func.evas_get(man->comp->data, man);
548 e_manager_comp_evas_update(E_Manager *man)
551 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
552 if (!man->comp) return;
553 return man->comp->func.update(man->comp->data, man);
556 EAPI const Eina_List *
557 e_manager_comp_src_list(E_Manager *man)
559 return man->comp->func.src_list_get(man->comp->data, man);
562 EAPI E_Manager_Comp_Source*
563 e_manager_comp_src_get(E_Manager *man, Ecore_X_Window win)
565 return man->comp->func.src_get(man->comp->data, man, win);
569 e_manager_comp_src_image_get(E_Manager *man, E_Manager_Comp_Source *src)
571 return man->comp->func.src_image_get(man->comp->data, man, src);
575 e_manager_comp_src_shadow_get(E_Manager *man, E_Manager_Comp_Source *src)
577 return man->comp->func.src_shadow_get(man->comp->data, man, src);
581 e_manager_comp_src_image_mirror_add(E_Manager *man, E_Manager_Comp_Source *src)
583 return man->comp->func.src_image_mirror_add(man->comp->data, man, src);
587 e_manager_comp_src_visible_get(E_Manager *man, E_Manager_Comp_Source *src)
589 return man->comp->func.src_visible_get(man->comp->data, man, src);
593 e_manager_comp_src_hidden_set(E_Manager *man, E_Manager_Comp_Source *src, Eina_Bool hidden)
595 return man->comp->func.src_hidden_set(man->comp->data, man, src, hidden);
599 e_manager_comp_src_hidden_get(E_Manager *man, E_Manager_Comp_Source *src)
601 return man->comp->func.src_hidden_get(man->comp->data, man, src);
605 e_manager_comp_src_window_get(E_Manager *man, E_Manager_Comp_Source *src)
607 return man->comp->func.src_window_get(man->comp->data, man, src);
611 e_manager_comp_src_popup_get(E_Manager *man, E_Manager_Comp_Source *src)
613 return man->comp->func.src_popup_get(man->comp->data, man, src);
617 e_manager_comp_src_border_get(E_Manager *man, E_Manager_Comp_Source *src)
619 return man->comp->func.src_border_get(man->comp->data, man, src);
622 #ifdef _F_COMP_SCREEN_LOCK_
624 e_manager_comp_screen_lock(E_Manager *man)
627 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
628 if (!man->comp) return;
629 return man->comp->func.screen_lock(man->comp->data, man);
633 e_manager_comp_screen_unlock(E_Manager *man)
636 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
637 if (!man->comp) return;
638 return man->comp->func.screen_unlock(man->comp->data, man);
642 #ifdef _F_COMP_INPUT_REGION_SET_
644 e_manager_comp_src_input_region_set(E_Manager *man, E_Manager_Comp_Source *src, int x, int y, int w, int h)
646 E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
647 E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
648 if (!man->comp) return EINA_FALSE;
649 E_OBJECT_CHECK_RETURN(src, EINA_FALSE);
650 return man->comp->func.src_input_region_set(man->comp->data, man, src, x, y, w, h);
654 #ifdef _F_COMP_MOVE_LOCK_
656 e_manager_comp_src_move_lock(E_Manager *man, E_Manager_Comp_Source *src)
658 E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
659 E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
660 if (!man->comp) return EINA_FALSE;
661 E_OBJECT_CHECK_RETURN(src, EINA_FALSE);
662 return man->comp->func.src_move_lock(man->comp->data, man, src);
666 e_manager_comp_src_move_unlock(E_Manager *man, E_Manager_Comp_Source *src)
668 E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
669 E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
670 if (!man->comp) return EINA_FALSE;
671 E_OBJECT_CHECK_RETURN(src, EINA_FALSE);
672 return man->comp->func.src_move_unlock(man->comp->data, man, src);
677 e_manager_comp_event_resize_send(E_Manager *man)
679 e_msg_send("comp.manager", "resize.comp", // name + info
681 E_OBJECT(man), // obj
683 NULL, NULL); // afterfunc + afterdata
687 e_manager_comp_event_src_add_send(E_Manager *man, E_Manager_Comp_Source *src,
688 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
691 e_msg_send("comp.manager", "add.src", // name + info
693 E_OBJECT(man), // obj
695 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
699 e_manager_comp_event_src_del_send(E_Manager *man, E_Manager_Comp_Source *src,
700 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
703 e_msg_send("comp.manager", "del.src", // name + info
705 E_OBJECT(man), // obj
707 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
711 e_manager_comp_event_src_config_send(E_Manager *man, E_Manager_Comp_Source *src,
712 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
715 e_msg_send("comp.manager", "config.src", // name + info
717 E_OBJECT(man), // obj
719 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
723 e_manager_comp_event_src_visibility_send(E_Manager *man, E_Manager_Comp_Source *src,
724 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
727 e_msg_send("comp.manager", "visibility.src", // name + info
729 E_OBJECT(man), // obj
731 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
738 /* local subsystem functions */
740 _e_manager_free(E_Manager *man)
744 E_FREE_LIST(man->handlers, ecore_event_handler_del);
746 man->containers = NULL;
747 E_FREE_LIST(l, e_object_del);
748 if (man->root != man->win)
750 ecore_x_window_free(man->win);
752 if (man->pointer) e_object_del(E_OBJECT(man->pointer));
753 managers = eina_list_remove(managers, man);
754 if (man->clear_timer) ecore_timer_del(man->clear_timer);
759 _e_manager_cb_window_show_request(void *data, int ev_type __UNUSED__, void *ev)
762 Ecore_X_Event_Window_Show_Request *e;
766 if (e_stolen_win_get(e->win)) return 1;
767 if (ecore_x_window_parent_get(e->win) != man->root)
768 return ECORE_CALLBACK_PASS_ON; /* try other handlers for this */
774 con = e_container_current_get(man);
775 if (!e_border_find_by_client_window(e->win))
777 bd = e_border_new(con, e->win, 0, 0);
779 ecore_x_window_show(e->win);
782 return ECORE_CALLBACK_PASS_ON;
786 _e_manager_cb_window_configure(void *data, int ev_type __UNUSED__, void *ev)
789 Ecore_X_Event_Window_Configure *e;
793 if (e->win != man->root) return ECORE_CALLBACK_PASS_ON;
794 e_manager_resize(man, e->w, e->h);
795 return ECORE_CALLBACK_PASS_ON;
799 _e_manager_cb_key_down(void *data, int ev_type __UNUSED__, void *ev)
807 if (e->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
808 if (e->root_window != man->root) man = _e_manager_get_for_root(e->root_window);
809 if (e_bindings_key_down_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
810 return ECORE_CALLBACK_DONE;
811 return ECORE_CALLBACK_PASS_ON;
815 _e_manager_cb_key_up(void *data, int ev_type __UNUSED__, void *ev)
823 if (e->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
824 if (e->root_window != man->root) man = _e_manager_get_for_root(e->root_window);
825 if (e_bindings_key_up_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
826 return ECORE_CALLBACK_DONE;
827 return ECORE_CALLBACK_PASS_ON;
831 _e_manager_cb_frame_extents_request(void *data, int ev_type __UNUSED__, void *ev)
835 Ecore_X_Event_Frame_Extents_Request *e;
836 Ecore_X_Window_Type type;
837 Ecore_X_MWM_Hint_Decor decor;
838 Ecore_X_Window_State *state;
839 Frame_Extents *extents;
840 const char *border, *signal, *key;
845 con = e_container_current_get(man);
848 if (ecore_x_window_parent_get(e->win) != man->root) return ECORE_CALLBACK_PASS_ON;
851 * * We need to check if we remember this window, and border locking is set
855 ok = ecore_x_mwm_hints_get(e->win, NULL, &decor, NULL);
857 (!(decor & ECORE_X_MWM_HINT_DECOR_ALL)) &&
858 (!(decor & ECORE_X_MWM_HINT_DECOR_TITLE)) &&
859 (!(decor & ECORE_X_MWM_HINT_DECOR_BORDER)))
861 border = "borderless";
865 ok = ecore_x_netwm_window_type_get(e->win, &type);
867 ((type == ECORE_X_WINDOW_TYPE_DESKTOP) ||
868 (type == ECORE_X_WINDOW_TYPE_DOCK)))
870 border = "borderless";
875 ecore_x_netwm_window_state_get(e->win, &state, &num);
880 for (i = 0; i < num; i++)
884 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
887 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
890 case ECORE_X_WINDOW_STATE_FULLSCREEN:
891 border = "borderless";
894 case ECORE_X_WINDOW_STATE_SHADED:
895 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
896 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
897 case ECORE_X_WINDOW_STATE_HIDDEN:
898 case ECORE_X_WINDOW_STATE_ICONIFIED:
899 case ECORE_X_WINDOW_STATE_MODAL:
900 case ECORE_X_WINDOW_STATE_STICKY:
901 case ECORE_X_WINDOW_STATE_ABOVE:
902 case ECORE_X_WINDOW_STATE_BELOW:
903 case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
904 case ECORE_X_WINDOW_STATE_UNKNOWN:
908 if ((maximized == 2) &&
909 (e_config->maximize_policy == E_MAXIMIZE_FULLSCREEN))
911 signal = "e,action,maximize,fullscreen";
912 key = "maximize,fullscreen";
917 extents = eina_hash_find(frame_extents, key);
920 extents = E_NEW(Frame_Extents, 1);
926 o = edje_object_add(con->bg_evas);
927 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", border);
928 ok = e_theme_edje_object_set(o, "base/theme/borders", buf);
931 Evas_Coord x, y, w, h;
935 edje_object_signal_emit(o, signal, "e");
936 edje_object_message_signal_process(o);
939 evas_object_resize(o, 1000, 1000);
940 edje_object_calc_force(o);
941 edje_object_part_geometry_get(o, "e.swallow.client",
944 extents->r = 1000 - (x + w);
946 extents->b = 1000 - (y + h);
956 eina_hash_add(frame_extents, key, extents);
961 ecore_x_netwm_frame_size_set(e->win, extents->l, extents->r, extents->t, extents->b);
963 return ECORE_CALLBACK_PASS_ON;
967 _e_manager_cb_ping(void *data, int ev_type __UNUSED__, void *ev)
971 Ecore_X_Event_Ping *e;
976 if (e->win != man->root) return ECORE_CALLBACK_PASS_ON;
978 bd = e_border_find_by_client_window(e->event_win);
979 if (!bd) return ECORE_CALLBACK_PASS_ON;
982 return ECORE_CALLBACK_PASS_ON;
986 _e_manager_cb_timer_post_screensaver_lock(void *data __UNUSED__)
988 e_desklock_show_autolocked();
989 timer_post_screensaver_lock = NULL;
990 return ECORE_CALLBACK_CANCEL;
994 _e_manager_cb_screensaver_notify(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
996 Ecore_X_Event_Screensaver_Notify *e = ev;
998 if (timer_post_screensaver_lock)
1000 ecore_timer_del(timer_post_screensaver_lock);
1001 timer_post_screensaver_lock = NULL;
1006 if (e_config->desklock_autolock_screensaver)
1008 if (e_config->desklock_post_screensaver_time <= 1.0)
1010 e_desklock_show_autolocked();
1014 timer_post_screensaver_lock = ecore_timer_add
1015 (e_config->desklock_post_screensaver_time,
1016 _e_manager_cb_timer_post_screensaver_lock, NULL);
1020 return ECORE_CALLBACK_PASS_ON;
1024 #ifdef _F_WINDOW_GROUP_RAISE_
1026 _e_manager_windows_group_raise (E_Border* bd)
1028 Ecore_X_Window leader_win;
1032 if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
1033 (e_config->focus_setting == E_FOCUS_NEW_WINDOW_IF_TOP_STACK) ||
1035 ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
1036 ((bd->parent->focused) &&
1037 (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
1039 leader_win = bd->client.icccm.client_leader;
1042 Eina_List* border_list;
1043 Eina_List* restack_list;
1049 restack_list = NULL;
1051 bl = e_container_border_list_last(bd->zone->container);
1052 while ((temp_bd = e_container_border_list_prev(bl)))
1054 if (temp_bd->client.icccm.client_leader == leader_win)
1056 restack_list = eina_list_prepend(restack_list, temp_bd);
1059 e_container_border_list_free(bl);
1063 EINA_LIST_FREE (restack_list, temp_bd)
1065 if (temp_bd->iconic)
1067 if (e_config->clientlist_warp_to_iconified_desktop == 1)
1068 e_desk_show(temp_bd->desk);
1070 if (!temp_bd->lock_user_iconify)
1071 e_border_uniconify(temp_bd);
1074 if (!temp_bd->iconic) e_desk_show(temp_bd->desk);
1075 if (!temp_bd->lock_user_stacking) e_border_raise(temp_bd);
1077 // set focus to top window
1078 if (!temp_bd->lock_focus_out)
1082 if (e_config->focus_policy != E_FOCUS_CLICK)
1083 ecore_x_pointer_warp(top_bd->zone->container->win, top_bd->x + (top_bd->w / 2), top_bd->y + (top_bd->h / 2));
1085 if (e_config->focus_setting != E_FOCUS_NEW_WINDOW_IF_TOP_STACK)
1086 e_border_focus_set(top_bd, 1, 1);
1094 bl = e_container_border_list_last(bd->zone->container);
1095 while ((temp_bd2 = e_container_border_list_prev(bl)))
1097 if ((!temp_bd2->iconic) && (temp_bd2->visible) && (temp_bd2->desk == top_bd->desk) &&
1098 (temp_bd2->client.icccm.accepts_focus || temp_bd2->client.icccm.take_focus) &&
1099 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_DOCK) &&
1100 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_TOOLBAR) &&
1101 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_MENU) &&
1102 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_SPLASH) &&
1103 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_DESKTOP))
1105 if (top_bd == temp_bd2)
1107 e_border_focus_set(top_bd, 1, 1);
1112 e_container_border_list_free(bl);
1120 #endif // group raise
1123 _e_manager_cb_client_message(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1125 Ecore_X_Event_Client_Message *e;
1130 if (e->message_type == ECORE_X_ATOM_NET_ACTIVE_WINDOW)
1132 bd = e_border_find_by_client_window(e->win);
1133 if ((bd) && (!bd->focused))
1136 if (e->data.l[0] == 0 /* 0 == old, 1 == client, 2 == pager */)
1138 // FIXME: need config for the below - what to do given each
1139 // request (either do nothng, make app look urgent/want
1140 // attention or actiually flip to app as below is the
1142 // if 0 == just make app demand attention somehow
1143 // if 1 == just make app demand attention somehow
1144 // if 2 == activate window as below
1146 timestamp = e->data.l[1];
1147 requestor_id e->data.l[2];
1150 #ifdef _F_WINDOW_GROUP_RAISE_
1151 if (e->data.l[0] == 3) // 'e->data.l[0] == 3' means group raise
1153 if (bd->client.icccm.client_leader)
1155 _e_manager_windows_group_raise (bd);
1156 return ECORE_CALLBACK_PASS_ON;
1162 #ifdef _F_FOCUS_WINDOW_IF_TOP_STACK_
1163 if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
1164 (e_config->focus_setting == E_FOCUS_NEW_WINDOW_IF_TOP_STACK) ||
1166 ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
1167 ((bd->parent->focused) &&
1168 (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
1170 if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
1172 ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
1173 ((bd->parent->focused) &&
1174 (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
1179 if (e_config->clientlist_warp_to_iconified_desktop == 1)
1180 e_desk_show(bd->desk);
1182 if (!bd->lock_user_iconify)
1183 e_border_uniconify(bd);
1185 if ((!bd->iconic) && (!bd->sticky))
1186 e_desk_show(bd->desk);
1187 if (!bd->lock_user_stacking) e_border_raise(bd);
1188 if (!bd->lock_focus_out)
1190 /* XXX ooffice does send this request for
1191 config dialogs when the main window gets focus.
1192 causing the pointer to jump back and forth. */
1193 if ((e_config->focus_policy != E_FOCUS_CLICK) &&
1194 !(bd->client.icccm.name && !strcmp(bd->client.icccm.name, "VCLSalFrame")))
1195 ecore_x_pointer_warp(bd->zone->container->win,
1196 bd->x + (bd->w / 2), bd->y + (bd->h / 2));
1197 #ifdef _F_FOCUS_WINDOW_IF_TOP_STACK_
1198 if (e_config->focus_setting != E_FOCUS_NEW_WINDOW_IF_TOP_STACK)
1199 e_border_focus_set(bd, 1, 1);
1202 Eina_List* l = NULL;
1203 E_Border* temp_bd = NULL;
1206 bl = e_container_border_list_last(bd->zone->container);
1207 while ((temp_bd = e_container_border_list_prev(bl)))
1209 if ((!temp_bd->iconic) && (temp_bd->visible) && (temp_bd->desk == bd->desk) &&
1210 (temp_bd->client.icccm.accepts_focus || temp_bd->client.icccm.take_focus) &&
1211 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_DOCK) &&
1212 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_TOOLBAR) &&
1213 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_MENU) &&
1214 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_SPLASH) &&
1215 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_DESKTOP))
1217 e_border_focus_set(temp_bd, 1, 1);
1221 e_container_border_list_free(bl);
1224 e_border_focus_set(bd, 1, 1);
1231 return ECORE_CALLBACK_PASS_ON;
1235 _e_manager_frame_extents_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__,
1236 void *data, void *fdata __UNUSED__)
1243 _e_manager_get_for_root(Ecore_X_Window root)
1248 if (!managers) return NULL;
1249 EINA_LIST_FOREACH(managers, l, man)
1251 if (man->root == root)
1254 return eina_list_data_get(managers);
1258 _e_manager_clear_timer(void *data)
1260 E_Manager *man = data;
1261 ecore_x_window_background_color_set(man->root, 0, 0, 0);
1262 man->clear_timer = NULL;
1266 #if 0 /* use later - maybe */
1267 static int _e_manager_cb_window_destroy(void *data, int ev_type, void *ev){return 1;}
1268 static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev){return 1;}
1269 static int _e_manager_cb_window_reparent(void *data, int ev_type, void *ev){return 1;}
1270 static int _e_manager_cb_window_create(void *data, int ev_type, void *ev){return 1;}
1271 static int _e_manager_cb_window_configure_request(void *data, int ev_type, void *ev){return 1;}
1272 static int _e_manager_cb_window_configure(void *data, int ev_type, void *ev){return 1;}
1273 static int _e_manager_cb_window_gravity(void *data, int ev_type, void *ev){return 1;}
1274 static int _e_manager_cb_window_stack(void *data, int ev_type, void *ev){return 1;}
1275 static int _e_manager_cb_window_stack_request(void *data, int ev_type, void *ev){return 1;}
1276 static int _e_manager_cb_window_property(void *data, int ev_type, void *ev){return 1;}
1277 static int _e_manager_cb_window_colormap(void *data, int ev_type, void *ev){return 1;}
1278 static int _e_manager_cb_window_shape(void *data, int ev_type, void *ev){return 1;}