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 #if 0 /* use later - maybe */
20 static int _e_manager_cb_window_destroy(void *data, int ev_type, void *ev);
21 static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev);
22 static int _e_manager_cb_window_reparent(void *data, int ev_type, void *ev);
23 static int _e_manager_cb_window_create(void *data, int ev_type, void *ev);
24 static int _e_manager_cb_window_configure_request(void *data, int ev_type, void *ev);
25 static int _e_manager_cb_window_gravity(void *data, int ev_type, void *ev);
26 static int _e_manager_cb_window_stack(void *data, int ev_type, void *ev);
27 static int _e_manager_cb_window_stack_request(void *data, int ev_type, void *ev);
28 static int _e_manager_cb_window_property(void *data, int ev_type, void *ev);
29 static int _e_manager_cb_window_colormap(void *data, int ev_type, void *ev);
30 static int _e_manager_cb_window_shape(void *data, int ev_type, void *ev);
31 static int _e_manager_cb_client_message(void *data, int ev_type, void *ev);
34 /* local subsystem globals */
36 typedef struct _Frame_Extents Frame_Extents;
43 static Eina_List *managers = NULL;
44 static Eina_Hash *frame_extents = NULL;
45 static Ecore_Timer *timer_post_screensaver_lock = NULL;
47 /* externally accessible functions */
51 ecore_x_screensaver_event_listen_set(1);
52 frame_extents = eina_hash_string_superfast_new(NULL);
57 e_manager_shutdown(void)
59 E_FREE_LIST(managers, e_object_del);
63 eina_hash_foreach(frame_extents, _e_manager_frame_extents_free_cb, NULL);
64 eina_hash_free(frame_extents);
68 if (timer_post_screensaver_lock)
70 ecore_timer_del(timer_post_screensaver_lock);
71 timer_post_screensaver_lock = NULL;
84 e_manager_new(Ecore_X_Window root, int num)
88 if (!ecore_x_window_manage(root)) return NULL;
89 ecore_x_window_background_color_set(root, 0, 0, 0);
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));
96 if (e_config->use_virtual_roots)
98 man->win = ecore_x_window_override_new(man->root, man->x, man->y, man->w, man->h);
99 ecore_x_icccm_title_set(man->win, "Enlightenment Manager");
100 ecore_x_netwm_name_set(man->win, "Enlightenment Manager");
101 ecore_x_window_raise(man->win);
105 man->win = man->root;
109 eina_list_append(man->handlers,
110 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST,
111 _e_manager_cb_window_show_request,
114 eina_list_append(man->handlers,
115 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE,
116 _e_manager_cb_window_configure,
119 eina_list_append(man->handlers,
120 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
121 _e_manager_cb_key_down,
124 eina_list_append(man->handlers,
125 ecore_event_handler_add(ECORE_EVENT_KEY_UP,
126 _e_manager_cb_key_up,
129 eina_list_append(man->handlers,
130 ecore_event_handler_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST,
131 _e_manager_cb_frame_extents_request,
134 eina_list_append(man->handlers,
135 ecore_event_handler_add(ECORE_X_EVENT_PING,
139 eina_list_append(man->handlers,
140 ecore_event_handler_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY,
141 _e_manager_cb_screensaver_notify,
144 eina_list_append(man->handlers,
145 ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
146 _e_manager_cb_client_message,
149 man->pointer = e_pointer_window_new(man->root, 1);
155 e_manager_manage_windows(E_Manager *man)
157 Ecore_X_Window *windows;
160 /* a manager is designated for each root. lets get all the windows in
162 windows = ecore_x_window_children_get(man->root, &wnum);
166 const char *atom_names[] =
169 "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR",
172 Ecore_X_Atom atoms[3];
173 Ecore_X_Atom atom_xmbed, atom_kde_netwm_systray, atom_kwm_dockwindow;
174 unsigned char *data = NULL;
177 ecore_x_atoms_get(atom_names, 3, atoms);
178 atom_xmbed = atoms[0];
179 atom_kde_netwm_systray = atoms[1];
180 atom_kwm_dockwindow = atoms[2];
181 for (i = 0; i < wnum; i++)
183 Ecore_X_Window_Attributes att;
184 unsigned int ret_val, deskxy[2];
187 if (e_border_find_by_client_window(windows[i]))
189 ecore_x_window_attributes_get(windows[i], &att);
190 if ((att.override) || (att.input_only))
194 char *wname = NULL, *wclass = NULL;
196 ecore_x_icccm_name_class_get(windows[i],
198 if ((wname) && (wclass) &&
199 (!strcmp(wname, "E")) &&
200 (!strcmp(wclass, "Init_Window")))
204 man->initwin = windows[i];
208 if (wname) free(wname);
209 if (wclass) free(wclass);
216 /* XXX manage xembed windows as long as they are not override_redirect..
217 * if (!ecore_x_window_prop_property_get(windows[i],
224 if (!ecore_x_window_prop_property_get(windows[i],
225 atom_kde_netwm_systray,
232 if (!ecore_x_window_prop_property_get(windows[i],
234 atom_kwm_dockwindow, 32,
244 ret = ecore_x_window_prop_card32_get(windows[i],
248 /* we have seen this window before */
249 if ((ret > -1) && (ret_val == 1))
251 E_Container *con = NULL;
257 Efreet_Desktop *desktop = NULL;
259 /* get all information from window before it is
260 * reset by e_border_new */
261 ret = ecore_x_window_prop_card32_get(windows[i],
265 con = e_container_number_get(man, id);
267 con = e_container_current_get(man);
269 ret = ecore_x_window_prop_card32_get(windows[i],
273 zone = e_container_zone_number_get(con, id);
275 zone = e_zone_current_get(con);
276 ret = ecore_x_window_prop_card32_get(windows[i],
280 desk = e_desk_at_xy_get(zone,
284 path = ecore_x_window_prop_string_get(windows[i],
285 E_ATOM_DESKTOP_FILE);
288 desktop = efreet_desktop_get(path);
293 bd = e_border_new(con, windows[i], 1, 0);
296 bd->ignore_first_unmap = 1;
298 * It's enough to set the desk, the zone will
299 * be set according to the desk */
300 // if (zone) e_border_zone_set(bd, zone);
301 if (desk) e_border_desk_set(bd, desk);
302 bd->desktop = desktop;
306 else if ((att.visible) && (!att.override) &&
309 /* We have not seen this window, and X tells us it
314 con = e_container_current_get(man);
315 bd = e_border_new(con, windows[i], 1, 0);
318 bd->ignore_first_unmap = 1;
328 e_manager_show(E_Manager *man)
334 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
335 if (man->visible) return;
336 EINA_LIST_FOREACH(man->containers, l, con)
338 e_container_show(con);
340 if (man->root != man->win)
344 mwin = e_menu_grab_window_get();
345 if (!mwin) mwin = man->initwin;
347 ecore_x_window_raise(man->win);
349 ecore_x_window_configure(man->win,
350 ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
351 ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
353 mwin, ECORE_X_WINDOW_STACK_BELOW);
354 ecore_x_window_show(man->win);
360 e_manager_hide(E_Manager *man)
366 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
367 if (!man->visible) return;
368 EINA_LIST_FOREACH(man->containers, l, con)
370 e_container_hide(con);
372 if (man->root != man->win)
373 ecore_x_window_hide(man->win);
378 e_manager_move(E_Manager *man, int x, int y)
381 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
382 if ((x == man->x) && (y == man->y)) return;
383 if (man->root != man->win)
387 ecore_x_window_move(man->win, man->x, man->y);
392 e_manager_resize(E_Manager *man, int w, int h)
398 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
399 if ((w == man->w) && (h == man->h)) return;
402 if (man->root != man->win)
403 ecore_x_window_resize(man->win, man->w, man->h);
405 EINA_LIST_FOREACH(man->containers, l, con)
407 e_container_resize(con, man->w, man->h);
410 ecore_x_netwm_desk_size_set(man->root, man->w, man->h);
414 e_manager_move_resize(E_Manager *man, int x, int y, int w, int h)
420 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
421 if ((x == man->x) && (y == man->y) && (w == man->w) && (h == man->h)) return;
422 if (man->root != man->win)
429 ecore_x_window_move_resize(man->win, man->x, man->y, man->w, man->h);
431 EINA_LIST_FOREACH(man->containers, l, con)
433 e_container_resize(con, man->w, man->h);
438 e_manager_raise(E_Manager *man)
441 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
442 if (man->root != man->win)
446 mwin = e_menu_grab_window_get();
447 if (!mwin) mwin = man->initwin;
449 ecore_x_window_raise(man->win);
451 ecore_x_window_configure(man->win,
452 ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
453 ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
455 mwin, ECORE_X_WINDOW_STACK_BELOW);
460 e_manager_lower(E_Manager *man)
463 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
464 if (man->root != man->win)
465 ecore_x_window_lower(man->win);
469 e_manager_current_get(void)
475 if (!managers) return NULL;
476 EINA_LIST_FOREACH(managers, l, man)
478 ecore_x_pointer_xy_get(man->win, &x, &y);
479 if (x == -1 && y == -1)
481 if (E_INSIDE(x, y, man->x, man->y, man->w, man->h))
484 return eina_list_data_get(managers);
488 e_manager_number_get(int num)
493 if (!managers) return NULL;
494 EINA_LIST_FOREACH(managers, l, man)
503 e_managers_keys_grab(void)
508 EINA_LIST_FOREACH(managers, l, man)
510 e_bindings_key_grab(E_BINDING_CONTEXT_ANY, man->root);
515 e_managers_keys_ungrab(void)
520 EINA_LIST_FOREACH(managers, l, man)
522 e_bindings_key_ungrab(E_BINDING_CONTEXT_ANY, man->root);
533 e_manager_comp_set(E_Manager *man, E_Manager_Comp *comp)
536 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
538 e_msg_send("comp.manager", "change.comp", // name + info
540 E_OBJECT(man), // obj
542 NULL, NULL); // afterfunc + afterdata
546 e_manager_comp_evas_get(E_Manager *man)
549 E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
550 if (!man->comp) return NULL;
551 return man->comp->func.evas_get(man->comp->data, man);
555 e_manager_comp_evas_update(E_Manager *man)
558 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
559 if (!man->comp) return;
560 return man->comp->func.update(man->comp->data, man);
563 EAPI const Eina_List *
564 e_manager_comp_src_list(E_Manager *man)
566 return man->comp->func.src_list_get(man->comp->data, man);
569 EAPI E_Manager_Comp_Source*
570 e_manager_comp_src_get(E_Manager *man, Ecore_X_Window win)
572 return man->comp->func.src_get(man->comp->data, man, win);
576 e_manager_comp_src_image_get(E_Manager *man, E_Manager_Comp_Source *src)
578 return man->comp->func.src_image_get(man->comp->data, man, src);
582 e_manager_comp_src_shadow_get(E_Manager *man, E_Manager_Comp_Source *src)
584 return man->comp->func.src_shadow_get(man->comp->data, man, src);
588 e_manager_comp_src_image_mirror_add(E_Manager *man, E_Manager_Comp_Source *src)
590 return man->comp->func.src_image_mirror_add(man->comp->data, man, src);
594 e_manager_comp_src_visible_get(E_Manager *man, E_Manager_Comp_Source *src)
596 return man->comp->func.src_visible_get(man->comp->data, man, src);
600 e_manager_comp_src_hidden_set(E_Manager *man, E_Manager_Comp_Source *src, Eina_Bool hidden)
602 return man->comp->func.src_hidden_set(man->comp->data, man, src, hidden);
606 e_manager_comp_src_hidden_get(E_Manager *man, E_Manager_Comp_Source *src)
608 return man->comp->func.src_hidden_get(man->comp->data, man, src);
612 e_manager_comp_src_window_get(E_Manager *man, E_Manager_Comp_Source *src)
614 return man->comp->func.src_window_get(man->comp->data, man, src);
618 e_manager_comp_src_popup_get(E_Manager *man, E_Manager_Comp_Source *src)
620 return man->comp->func.src_popup_get(man->comp->data, man, src);
624 e_manager_comp_src_border_get(E_Manager *man, E_Manager_Comp_Source *src)
626 return man->comp->func.src_border_get(man->comp->data, man, src);
629 #ifdef _F_COMP_SCREEN_LOCK_
631 e_manager_comp_screen_lock(E_Manager *man)
634 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
635 if (!man->comp) return;
636 return man->comp->func.screen_lock(man->comp->data, man);
640 e_manager_comp_screen_unlock(E_Manager *man)
643 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
644 if (!man->comp) return;
645 return man->comp->func.screen_unlock(man->comp->data, man);
649 #ifdef _F_COMP_INPUT_REGION_SET_
651 e_manager_comp_src_input_region_set(E_Manager *man, E_Manager_Comp_Source *src, int x, int y, int w, int h)
653 E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
654 E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
655 if (!man->comp) return EINA_FALSE;
656 E_OBJECT_CHECK_RETURN(src, EINA_FALSE);
657 return man->comp->func.src_input_region_set(man->comp->data, man, src, x, y, w, h);
661 #ifdef _F_COMP_MOVE_LOCK_
663 e_manager_comp_src_move_lock(E_Manager *man, E_Manager_Comp_Source *src)
665 E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
666 E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
667 if (!man->comp) return EINA_FALSE;
668 E_OBJECT_CHECK_RETURN(src, EINA_FALSE);
669 return man->comp->func.src_move_lock(man->comp->data, man, src);
673 e_manager_comp_src_move_unlock(E_Manager *man, E_Manager_Comp_Source *src)
675 E_OBJECT_CHECK_RETURN(man, EINA_FALSE);
676 E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, EINA_FALSE);
677 if (!man->comp) return EINA_FALSE;
678 E_OBJECT_CHECK_RETURN(src, EINA_FALSE);
679 return man->comp->func.src_move_unlock(man->comp->data, man, src);
684 e_manager_comp_event_resize_send(E_Manager *man)
686 e_msg_send("comp.manager", "resize.comp", // name + info
688 E_OBJECT(man), // obj
690 NULL, NULL); // afterfunc + afterdata
694 e_manager_comp_event_src_add_send(E_Manager *man, E_Manager_Comp_Source *src,
695 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
698 e_msg_send("comp.manager", "add.src", // name + info
700 E_OBJECT(man), // obj
702 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
706 e_manager_comp_event_src_del_send(E_Manager *man, E_Manager_Comp_Source *src,
707 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
710 e_msg_send("comp.manager", "del.src", // name + info
712 E_OBJECT(man), // obj
714 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
718 e_manager_comp_event_src_config_send(E_Manager *man, E_Manager_Comp_Source *src,
719 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
722 e_msg_send("comp.manager", "config.src", // name + info
724 E_OBJECT(man), // obj
726 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
730 e_manager_comp_event_src_visibility_send(E_Manager *man, E_Manager_Comp_Source *src,
731 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
734 e_msg_send("comp.manager", "visibility.src", // name + info
736 E_OBJECT(man), // obj
738 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
745 /* local subsystem functions */
747 _e_manager_free(E_Manager *man)
751 E_FREE_LIST(man->handlers, ecore_event_handler_del);
753 man->containers = NULL;
754 E_FREE_LIST(l, e_object_del);
755 if (man->root != man->win)
757 ecore_x_window_free(man->win);
759 if (man->pointer) e_object_del(E_OBJECT(man->pointer));
760 managers = eina_list_remove(managers, man);
765 _e_manager_cb_window_show_request(void *data, int ev_type __UNUSED__, void *ev)
768 Ecore_X_Event_Window_Show_Request *e;
772 if (e_stolen_win_get(e->win)) return 1;
773 if (ecore_x_window_parent_get(e->win) != man->root)
774 return ECORE_CALLBACK_PASS_ON; /* try other handlers for this */
780 con = e_container_current_get(man);
781 if (!e_border_find_by_client_window(e->win))
783 bd = e_border_new(con, e->win, 0, 0);
785 ecore_x_window_show(e->win);
788 return ECORE_CALLBACK_PASS_ON;
792 _e_manager_cb_window_configure(void *data, int ev_type __UNUSED__, void *ev)
795 Ecore_X_Event_Window_Configure *e;
799 if (e->win != man->root) return ECORE_CALLBACK_PASS_ON;
800 e_manager_resize(man, e->w, e->h);
801 return ECORE_CALLBACK_PASS_ON;
805 _e_manager_cb_key_down(void *data, int ev_type __UNUSED__, void *ev)
813 if (e->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
814 if (e->root_window != man->root) man = _e_manager_get_for_root(e->root_window);
815 if (e_bindings_key_down_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
816 return ECORE_CALLBACK_DONE;
817 return ECORE_CALLBACK_PASS_ON;
821 _e_manager_cb_key_up(void *data, int ev_type __UNUSED__, void *ev)
829 if (e->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
830 if (e->root_window != man->root) man = _e_manager_get_for_root(e->root_window);
831 if (e_bindings_key_up_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
832 return ECORE_CALLBACK_DONE;
833 return ECORE_CALLBACK_PASS_ON;
837 _e_manager_cb_frame_extents_request(void *data, int ev_type __UNUSED__, void *ev)
841 Ecore_X_Event_Frame_Extents_Request *e;
842 Ecore_X_Window_Type type;
843 Ecore_X_MWM_Hint_Decor decor;
844 Ecore_X_Window_State *state;
845 Frame_Extents *extents;
846 const char *border, *signal, *key;
851 con = e_container_current_get(man);
854 if (ecore_x_window_parent_get(e->win) != man->root) return ECORE_CALLBACK_PASS_ON;
857 * * We need to check if we remember this window, and border locking is set
861 ok = ecore_x_mwm_hints_get(e->win, NULL, &decor, NULL);
863 (!(decor & ECORE_X_MWM_HINT_DECOR_ALL)) &&
864 (!(decor & ECORE_X_MWM_HINT_DECOR_TITLE)) &&
865 (!(decor & ECORE_X_MWM_HINT_DECOR_BORDER)))
867 border = "borderless";
871 ok = ecore_x_netwm_window_type_get(e->win, &type);
873 ((type == ECORE_X_WINDOW_TYPE_DESKTOP) ||
874 (type == ECORE_X_WINDOW_TYPE_DOCK)))
876 border = "borderless";
881 ecore_x_netwm_window_state_get(e->win, &state, &num);
886 for (i = 0; i < num; i++)
890 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
893 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
896 case ECORE_X_WINDOW_STATE_FULLSCREEN:
897 border = "borderless";
900 case ECORE_X_WINDOW_STATE_SHADED:
901 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
902 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
903 case ECORE_X_WINDOW_STATE_HIDDEN:
904 case ECORE_X_WINDOW_STATE_ICONIFIED:
905 case ECORE_X_WINDOW_STATE_MODAL:
906 case ECORE_X_WINDOW_STATE_STICKY:
907 case ECORE_X_WINDOW_STATE_ABOVE:
908 case ECORE_X_WINDOW_STATE_BELOW:
909 case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
910 case ECORE_X_WINDOW_STATE_UNKNOWN:
914 if ((maximized == 2) &&
915 (e_config->maximize_policy == E_MAXIMIZE_FULLSCREEN))
917 signal = "e,action,maximize,fullscreen";
918 key = "maximize,fullscreen";
923 extents = eina_hash_find(frame_extents, key);
926 extents = E_NEW(Frame_Extents, 1);
932 o = edje_object_add(con->bg_evas);
933 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", border);
934 ok = e_theme_edje_object_set(o, "base/theme/borders", buf);
937 Evas_Coord x, y, w, h;
941 edje_object_signal_emit(o, signal, "e");
942 edje_object_message_signal_process(o);
945 evas_object_resize(o, 1000, 1000);
946 edje_object_calc_force(o);
947 edje_object_part_geometry_get(o, "e.swallow.client",
950 extents->r = 1000 - (x + w);
952 extents->b = 1000 - (y + h);
962 eina_hash_add(frame_extents, key, extents);
967 ecore_x_netwm_frame_size_set(e->win, extents->l, extents->r, extents->t, extents->b);
969 return ECORE_CALLBACK_PASS_ON;
973 _e_manager_cb_ping(void *data, int ev_type __UNUSED__, void *ev)
977 Ecore_X_Event_Ping *e;
982 if (e->win != man->root) return ECORE_CALLBACK_PASS_ON;
984 bd = e_border_find_by_client_window(e->event_win);
985 if (!bd) return ECORE_CALLBACK_PASS_ON;
988 return ECORE_CALLBACK_PASS_ON;
992 _e_manager_cb_timer_post_screensaver_lock(void *data __UNUSED__)
994 e_desklock_show_autolocked();
995 timer_post_screensaver_lock = NULL;
996 return ECORE_CALLBACK_CANCEL;
1000 _e_manager_cb_screensaver_notify(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1002 Ecore_X_Event_Screensaver_Notify *e = ev;
1004 if (timer_post_screensaver_lock)
1006 ecore_timer_del(timer_post_screensaver_lock);
1007 timer_post_screensaver_lock = NULL;
1012 if (e_config->desklock_autolock_screensaver)
1014 if (e_config->desklock_post_screensaver_time <= 1.0)
1016 e_desklock_show_autolocked();
1020 timer_post_screensaver_lock = ecore_timer_add
1021 (e_config->desklock_post_screensaver_time,
1022 _e_manager_cb_timer_post_screensaver_lock, NULL);
1026 return ECORE_CALLBACK_PASS_ON;
1030 #ifdef _F_WINDOW_GROUP_RAISE_
1032 _e_manager_windows_group_raise (E_Border* bd)
1034 Ecore_X_Window leader_win;
1038 if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
1039 (e_config->focus_setting == E_FOCUS_NEW_WINDOW_IF_TOP_STACK) ||
1041 ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
1042 ((bd->parent->focused) &&
1043 (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
1045 leader_win = bd->client.icccm.client_leader;
1048 Eina_List* border_list;
1049 Eina_List* restack_list;
1055 restack_list = NULL;
1057 bl = e_container_border_list_last(bd->zone->container);
1058 while ((temp_bd = e_container_border_list_prev(bl)))
1060 if (temp_bd->client.icccm.client_leader == leader_win)
1062 restack_list = eina_list_prepend(restack_list, temp_bd);
1065 e_container_border_list_free(bl);
1069 EINA_LIST_FREE (restack_list, temp_bd)
1071 if (temp_bd->iconic)
1073 if (e_config->clientlist_warp_to_iconified_desktop == 1)
1074 e_desk_show(temp_bd->desk);
1076 if (!temp_bd->lock_user_iconify)
1077 e_border_uniconify(temp_bd);
1080 if (!temp_bd->iconic) e_desk_show(temp_bd->desk);
1081 if (!temp_bd->lock_user_stacking) e_border_raise(temp_bd);
1083 // set focus to top window
1084 if (!temp_bd->lock_focus_out)
1088 if (e_config->focus_policy != E_FOCUS_CLICK)
1089 ecore_x_pointer_warp(top_bd->zone->container->win, top_bd->x + (top_bd->w / 2), top_bd->y + (top_bd->h / 2));
1091 if (e_config->focus_setting != E_FOCUS_NEW_WINDOW_IF_TOP_STACK)
1092 e_border_focus_set(top_bd, 1, 1);
1100 bl = e_container_border_list_last(bd->zone->container);
1101 while ((temp_bd2 = e_container_border_list_prev(bl)))
1103 if ((!temp_bd2->iconic) && (temp_bd2->visible) && (temp_bd2->desk == top_bd->desk) &&
1104 (temp_bd2->client.icccm.accepts_focus || temp_bd2->client.icccm.take_focus) &&
1105 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_DOCK) &&
1106 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_TOOLBAR) &&
1107 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_MENU) &&
1108 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_SPLASH) &&
1109 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_DESKTOP))
1111 if (top_bd == temp_bd2)
1113 e_border_focus_set(top_bd, 1, 1);
1118 e_container_border_list_free(bl);
1126 #endif // group raise
1129 _e_manager_cb_client_message(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1131 Ecore_X_Event_Client_Message *e;
1136 if (e->message_type == ECORE_X_ATOM_NET_ACTIVE_WINDOW)
1138 bd = e_border_find_by_client_window(e->win);
1139 if ((bd) && (!bd->focused))
1142 if (e->data.l[0] == 0 /* 0 == old, 1 == client, 2 == pager */)
1144 // FIXME: need config for the below - what to do given each
1145 // request (either do nothng, make app look urgent/want
1146 // attention or actiually flip to app as below is the
1148 // if 0 == just make app demand attention somehow
1149 // if 1 == just make app demand attention somehow
1150 // if 2 == activate window as below
1152 timestamp = e->data.l[1];
1153 requestor_id e->data.l[2];
1156 #ifdef _F_WINDOW_GROUP_RAISE_
1157 if (e->data.l[0] == 3) // 'e->data.l[0] == 3' means group raise
1159 if (bd->client.icccm.client_leader)
1161 _e_manager_windows_group_raise (bd);
1162 return ECORE_CALLBACK_PASS_ON;
1168 #ifdef _F_FOCUS_WINDOW_IF_TOP_STACK_
1169 if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
1170 (e_config->focus_setting == E_FOCUS_NEW_WINDOW_IF_TOP_STACK) ||
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)))))
1176 if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
1178 ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
1179 ((bd->parent->focused) &&
1180 (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
1185 if (e_config->clientlist_warp_to_iconified_desktop == 1)
1186 e_desk_show(bd->desk);
1188 if (!bd->lock_user_iconify)
1189 e_border_uniconify(bd);
1191 if ((!bd->iconic) && (!bd->sticky))
1192 e_desk_show(bd->desk);
1193 if (!bd->lock_user_stacking) e_border_raise(bd);
1194 if (!bd->lock_focus_out)
1196 /* XXX ooffice does send this request for
1197 config dialogs when the main window gets focus.
1198 causing the pointer to jump back and forth. */
1199 if ((e_config->focus_policy != E_FOCUS_CLICK) &&
1200 !(bd->client.icccm.name && !strcmp(bd->client.icccm.name, "VCLSalFrame")))
1201 ecore_x_pointer_warp(bd->zone->container->win,
1202 bd->x + (bd->w / 2), bd->y + (bd->h / 2));
1203 #ifdef _F_FOCUS_WINDOW_IF_TOP_STACK_
1204 if (e_config->focus_setting != E_FOCUS_NEW_WINDOW_IF_TOP_STACK)
1205 e_border_focus_set(bd, 1, 1);
1208 Eina_List* l = NULL;
1209 E_Border* temp_bd = NULL;
1212 bl = e_container_border_list_last(bd->zone->container);
1213 while ((temp_bd = e_container_border_list_prev(bl)))
1215 if ((!temp_bd->iconic) && (temp_bd->visible) && (temp_bd->desk == bd->desk) &&
1216 (temp_bd->client.icccm.accepts_focus || temp_bd->client.icccm.take_focus) &&
1217 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_DOCK) &&
1218 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_TOOLBAR) &&
1219 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_MENU) &&
1220 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_SPLASH) &&
1221 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_DESKTOP))
1225 e_border_focus_set(bd, 1, 1);
1230 e_container_border_list_free(bl);
1233 e_border_focus_set(bd, 1, 1);
1240 return ECORE_CALLBACK_PASS_ON;
1244 _e_manager_frame_extents_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__,
1245 void *data, void *fdata __UNUSED__)
1252 _e_manager_get_for_root(Ecore_X_Window root)
1257 if (!managers) return NULL;
1258 EINA_LIST_FOREACH(managers, l, man)
1260 if (man->root == root)
1263 return eina_list_data_get(managers);
1267 #if 0 /* use later - maybe */
1268 static int _e_manager_cb_window_destroy(void *data, int ev_type, void *ev){return 1;}
1269 static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev){return 1;}
1270 static int _e_manager_cb_window_reparent(void *data, int ev_type, void *ev){return 1;}
1271 static int _e_manager_cb_window_create(void *data, int ev_type, void *ev){return 1;}
1272 static int _e_manager_cb_window_configure_request(void *data, int ev_type, void *ev){return 1;}
1273 static int _e_manager_cb_window_configure(void *data, int ev_type, void *ev){return 1;}
1274 static int _e_manager_cb_window_gravity(void *data, int ev_type, void *ev){return 1;}
1275 static int _e_manager_cb_window_stack(void *data, int ev_type, void *ev){return 1;}
1276 static int _e_manager_cb_window_stack_request(void *data, int ev_type, void *ev){return 1;}
1277 static int _e_manager_cb_window_property(void *data, int ev_type, void *ev){return 1;}
1278 static int _e_manager_cb_window_colormap(void *data, int ev_type, void *ev){return 1;}
1279 static int _e_manager_cb_window_shape(void *data, int ev_type, void *ev){return 1;}