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)
87 Ecore_Event_Handler *h;
89 if (!ecore_x_window_manage(root)) return NULL;
90 ecore_x_window_background_color_set(root, 0, 0, 0);
91 man = E_OBJECT_ALLOC(E_Manager, E_MANAGER_TYPE, _e_manager_free);
92 if (!man) return NULL;
93 managers = eina_list_append(managers, man);
96 ecore_x_window_size_get(man->root, &(man->w), &(man->h));
97 if (e_config->use_virtual_roots)
99 man->win = ecore_x_window_override_new(man->root, man->x, man->y, man->w, man->h);
100 ecore_x_icccm_title_set(man->win, "Enlightenment Manager");
101 ecore_x_netwm_name_set(man->win, "Enlightenment Manager");
102 ecore_x_window_raise(man->win);
106 man->win = man->root;
109 h = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, _e_manager_cb_window_show_request, man);
110 if (h) man->handlers = eina_list_append(man->handlers, h);
111 h = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE, _e_manager_cb_window_configure, man);
112 if (h) man->handlers = eina_list_append(man->handlers, h);
113 h = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _e_manager_cb_key_down, man);
114 if (h) man->handlers = eina_list_append(man->handlers, h);
115 h = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _e_manager_cb_key_up, man);
116 if (h) man->handlers = eina_list_append(man->handlers, h);
117 h = ecore_event_handler_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, _e_manager_cb_frame_extents_request, man);
118 if (h) man->handlers = eina_list_append(man->handlers, h);
119 h = ecore_event_handler_add(ECORE_X_EVENT_PING, _e_manager_cb_ping, man);
120 if (h) man->handlers = eina_list_append(man->handlers, h);
121 h = ecore_event_handler_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, _e_manager_cb_screensaver_notify, man);
122 if (h) man->handlers = eina_list_append(man->handlers, h);
123 h = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _e_manager_cb_client_message, man);
124 if (h) man->handlers = eina_list_append(man->handlers, h);
126 man->pointer = e_pointer_window_new(man->root, 1);
132 e_manager_manage_windows(E_Manager *man)
134 Ecore_X_Window *windows;
137 /* a manager is designated for each root. lets get all the windows in
139 windows = ecore_x_window_children_get(man->root, &wnum);
143 const char *atom_names[] =
146 "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR",
149 Ecore_X_Atom atoms[3];
150 Ecore_X_Atom atom_xmbed, atom_kde_netwm_systray, atom_kwm_dockwindow;
151 unsigned char *data = NULL;
154 ecore_x_atoms_get(atom_names, 3, atoms);
155 atom_xmbed = atoms[0];
156 atom_kde_netwm_systray = atoms[1];
157 atom_kwm_dockwindow = atoms[2];
158 for (i = 0; i < wnum; i++)
160 Ecore_X_Window_Attributes att;
161 unsigned int ret_val, deskxy[2];
164 if (e_border_find_by_client_window(windows[i]))
166 ecore_x_window_attributes_get(windows[i], &att);
167 if ((att.override) || (att.input_only))
171 char *wname = NULL, *wclass = NULL;
173 ecore_x_icccm_name_class_get(windows[i],
175 if ((wname) && (wclass) &&
176 (!strcmp(wname, "E")) &&
177 (!strcmp(wclass, "Init_Window")))
181 man->initwin = windows[i];
185 if (wname) free(wname);
186 if (wclass) free(wclass);
193 /* XXX manage xembed windows as long as they are not override_redirect..
194 * if (!ecore_x_window_prop_property_get(windows[i],
201 if (!ecore_x_window_prop_property_get(windows[i],
202 atom_kde_netwm_systray,
209 if (!ecore_x_window_prop_property_get(windows[i],
211 atom_kwm_dockwindow, 32,
221 ret = ecore_x_window_prop_card32_get(windows[i],
225 /* we have seen this window before */
226 if ((ret > -1) && (ret_val == 1))
228 E_Container *con = NULL;
234 Efreet_Desktop *desktop = NULL;
236 /* get all information from window before it is
237 * reset by e_border_new */
238 ret = ecore_x_window_prop_card32_get(windows[i],
242 con = e_container_number_get(man, id);
244 con = e_container_current_get(man);
246 ret = ecore_x_window_prop_card32_get(windows[i],
250 zone = e_container_zone_number_get(con, id);
252 zone = e_zone_current_get(con);
253 ret = ecore_x_window_prop_card32_get(windows[i],
257 desk = e_desk_at_xy_get(zone,
261 path = ecore_x_window_prop_string_get(windows[i],
262 E_ATOM_DESKTOP_FILE);
265 desktop = efreet_desktop_get(path);
270 bd = e_border_new(con, windows[i], 1, 0);
273 bd->ignore_first_unmap = 1;
275 * It's enough to set the desk, the zone will
276 * be set according to the desk */
277 // if (zone) e_border_zone_set(bd, zone);
278 if (desk) e_border_desk_set(bd, desk);
279 bd->desktop = desktop;
283 else if ((att.visible) && (!att.override) &&
286 /* We have not seen this window, and X tells us it
291 con = e_container_current_get(man);
292 bd = e_border_new(con, windows[i], 1, 0);
295 bd->ignore_first_unmap = 1;
305 e_manager_show(E_Manager *man)
311 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
312 if (man->visible) return;
313 EINA_LIST_FOREACH(man->containers, l, con)
315 e_container_show(con);
317 if (man->root != man->win)
321 mwin = e_menu_grab_window_get();
322 if (!mwin) mwin = man->initwin;
324 ecore_x_window_raise(man->win);
326 ecore_x_window_configure(man->win,
327 ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
328 ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
330 mwin, ECORE_X_WINDOW_STACK_BELOW);
331 ecore_x_window_show(man->win);
337 e_manager_hide(E_Manager *man)
343 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
344 if (!man->visible) return;
345 EINA_LIST_FOREACH(man->containers, l, con)
347 e_container_hide(con);
349 if (man->root != man->win)
350 ecore_x_window_hide(man->win);
355 e_manager_move(E_Manager *man, int x, int y)
358 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
359 if ((x == man->x) && (y == man->y)) return;
360 if (man->root != man->win)
364 ecore_x_window_move(man->win, man->x, man->y);
369 e_manager_resize(E_Manager *man, int w, int h)
375 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
376 if ((w == man->w) && (h == man->h)) return;
379 if (man->root != man->win)
380 ecore_x_window_resize(man->win, man->w, man->h);
382 EINA_LIST_FOREACH(man->containers, l, con)
384 e_container_resize(con, man->w, man->h);
387 ecore_x_netwm_desk_size_set(man->root, man->w, man->h);
391 e_manager_move_resize(E_Manager *man, int x, int y, int w, int h)
397 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
398 if ((x == man->x) && (y == man->y) && (w == man->w) && (h == man->h)) return;
399 if (man->root != man->win)
406 ecore_x_window_move_resize(man->win, man->x, man->y, man->w, man->h);
408 EINA_LIST_FOREACH(man->containers, l, con)
410 e_container_resize(con, man->w, man->h);
415 e_manager_raise(E_Manager *man)
418 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
419 if (man->root != man->win)
423 mwin = e_menu_grab_window_get();
424 if (!mwin) mwin = man->initwin;
426 ecore_x_window_raise(man->win);
428 ecore_x_window_configure(man->win,
429 ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
430 ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
432 mwin, ECORE_X_WINDOW_STACK_BELOW);
437 e_manager_lower(E_Manager *man)
440 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
441 if (man->root != man->win)
442 ecore_x_window_lower(man->win);
446 e_manager_current_get(void)
452 if (!managers) return NULL;
453 EINA_LIST_FOREACH(managers, l, man)
455 ecore_x_pointer_xy_get(man->win, &x, &y);
456 if (x == -1 && y == -1)
458 if (E_INSIDE(x, y, man->x, man->y, man->w, man->h))
461 return eina_list_data_get(managers);
465 e_manager_number_get(int num)
470 if (!managers) return NULL;
471 EINA_LIST_FOREACH(managers, l, man)
480 e_managers_keys_grab(void)
485 EINA_LIST_FOREACH(managers, l, man)
487 e_bindings_key_grab(E_BINDING_CONTEXT_ANY, man->root);
492 e_managers_keys_ungrab(void)
497 EINA_LIST_FOREACH(managers, l, man)
499 e_bindings_key_ungrab(E_BINDING_CONTEXT_ANY, man->root);
510 e_manager_comp_set(E_Manager *man, E_Manager_Comp *comp)
513 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
515 e_msg_send("comp.manager", "change.comp", // name + info
517 E_OBJECT(man), // obj
519 NULL, NULL); // afterfunc + afterdata
523 e_manager_comp_evas_get(E_Manager *man)
526 E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
527 if (!man->comp) return NULL;
528 return man->comp->func.evas_get(man->comp->data, man);
532 e_manager_comp_evas_update(E_Manager *man)
535 E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
536 if (!man->comp) return;
537 return man->comp->func.update(man->comp->data, man);
540 EAPI const Eina_List *
541 e_manager_comp_src_list(E_Manager *man)
543 return man->comp->func.src_list_get(man->comp->data, man);
547 e_manager_comp_src_image_get(E_Manager *man, E_Manager_Comp_Source *src)
549 return man->comp->func.src_image_get(man->comp->data, man, src);
553 e_manager_comp_src_shadow_get(E_Manager *man, E_Manager_Comp_Source *src)
555 return man->comp->func.src_shadow_get(man->comp->data, man, src);
559 e_manager_comp_src_image_mirror_add(E_Manager *man, E_Manager_Comp_Source *src)
561 return man->comp->func.src_image_mirror_add(man->comp->data, man, src);
565 e_manager_comp_src_visible_get(E_Manager *man, E_Manager_Comp_Source *src)
567 return man->comp->func.src_visible_get(man->comp->data, man, src);
571 e_manager_comp_src_hidden_set(E_Manager *man, E_Manager_Comp_Source *src, Eina_Bool hidden)
573 return man->comp->func.src_hidden_set(man->comp->data, man, src, hidden);
577 e_manager_comp_src_hidden_get(E_Manager *man, E_Manager_Comp_Source *src)
579 return man->comp->func.src_hidden_get(man->comp->data, man, src);
583 e_manager_comp_event_resize_send(E_Manager *man)
585 e_msg_send("comp.manager", "resize.comp", // name + info
587 E_OBJECT(man), // obj
589 NULL, NULL); // afterfunc + afterdata
593 e_manager_comp_event_src_add_send(E_Manager *man, E_Manager_Comp_Source *src,
594 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
597 e_msg_send("comp.manager", "add.src", // name + info
599 E_OBJECT(man), // obj
601 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
605 e_manager_comp_event_src_del_send(E_Manager *man, E_Manager_Comp_Source *src,
606 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
609 e_msg_send("comp.manager", "del.src", // name + info
611 E_OBJECT(man), // obj
613 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
617 e_manager_comp_event_src_config_send(E_Manager *man, E_Manager_Comp_Source *src,
618 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
621 e_msg_send("comp.manager", "config.src", // name + info
623 E_OBJECT(man), // obj
625 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
629 e_manager_comp_event_src_visibility_send(E_Manager *man, E_Manager_Comp_Source *src,
630 void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
633 e_msg_send("comp.manager", "visibility.src", // name + info
635 E_OBJECT(man), // obj
637 (void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
644 /* local subsystem functions */
646 _e_manager_free(E_Manager *man)
650 E_FREE_LIST(man->handlers, ecore_event_handler_del);
652 man->containers = NULL;
653 E_FREE_LIST(l, e_object_del);
654 if (man->root != man->win)
656 ecore_x_window_free(man->win);
658 if (man->pointer) e_object_del(E_OBJECT(man->pointer));
659 managers = eina_list_remove(managers, man);
664 _e_manager_cb_window_show_request(void *data, int ev_type __UNUSED__, void *ev)
667 Ecore_X_Event_Window_Show_Request *e;
671 if (e_stolen_win_get(e->win)) return 1;
672 if (ecore_x_window_parent_get(e->win) != man->root)
673 return ECORE_CALLBACK_PASS_ON; /* try other handlers for this */
679 con = e_container_current_get(man);
680 if (!e_border_find_by_client_window(e->win))
682 bd = e_border_new(con, e->win, 0, 0);
684 ecore_x_window_show(e->win);
687 return ECORE_CALLBACK_PASS_ON;
691 _e_manager_cb_window_configure(void *data, int ev_type __UNUSED__, void *ev)
694 Ecore_X_Event_Window_Configure *e;
698 if (e->win != man->root) return ECORE_CALLBACK_PASS_ON;
699 e_manager_resize(man, e->w, e->h);
700 return ECORE_CALLBACK_PASS_ON;
704 _e_manager_cb_key_down(void *data, int ev_type __UNUSED__, void *ev)
712 if (e->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
713 if (e->root_window != man->root) man = _e_manager_get_for_root(e->root_window);
714 if (e_bindings_key_down_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
715 return ECORE_CALLBACK_DONE;
716 return ECORE_CALLBACK_PASS_ON;
720 _e_manager_cb_key_up(void *data, int ev_type __UNUSED__, void *ev)
728 if (e->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
729 if (e->root_window != man->root) man = _e_manager_get_for_root(e->root_window);
730 if (e_bindings_key_up_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
731 return ECORE_CALLBACK_DONE;
732 return ECORE_CALLBACK_PASS_ON;
736 _e_manager_cb_frame_extents_request(void *data, int ev_type __UNUSED__, void *ev)
740 Ecore_X_Event_Frame_Extents_Request *e;
741 Ecore_X_Window_Type type;
742 Ecore_X_MWM_Hint_Decor decor;
743 Ecore_X_Window_State *state;
744 Frame_Extents *extents;
745 const char *border, *signal, *key;
750 con = e_container_current_get(man);
753 if (ecore_x_window_parent_get(e->win) != man->root) return ECORE_CALLBACK_PASS_ON;
756 * * We need to check if we remember this window, and border locking is set
760 ok = ecore_x_mwm_hints_get(e->win, NULL, &decor, NULL);
762 (!(decor & ECORE_X_MWM_HINT_DECOR_ALL)) &&
763 (!(decor & ECORE_X_MWM_HINT_DECOR_TITLE)) &&
764 (!(decor & ECORE_X_MWM_HINT_DECOR_BORDER)))
766 border = "borderless";
770 ok = ecore_x_netwm_window_type_get(e->win, &type);
772 ((type == ECORE_X_WINDOW_TYPE_DESKTOP) ||
773 (type == ECORE_X_WINDOW_TYPE_DOCK)))
775 border = "borderless";
780 ecore_x_netwm_window_state_get(e->win, &state, &num);
785 for (i = 0; i < num; i++)
789 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
792 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
795 case ECORE_X_WINDOW_STATE_FULLSCREEN:
796 border = "borderless";
799 case ECORE_X_WINDOW_STATE_SHADED:
800 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
801 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
802 case ECORE_X_WINDOW_STATE_HIDDEN:
803 case ECORE_X_WINDOW_STATE_ICONIFIED:
804 case ECORE_X_WINDOW_STATE_MODAL:
805 case ECORE_X_WINDOW_STATE_STICKY:
806 case ECORE_X_WINDOW_STATE_ABOVE:
807 case ECORE_X_WINDOW_STATE_BELOW:
808 case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
809 case ECORE_X_WINDOW_STATE_UNKNOWN:
813 if ((maximized == 2) &&
814 (e_config->maximize_policy == E_MAXIMIZE_FULLSCREEN))
816 signal = "e,action,maximize,fullscreen";
817 key = "maximize,fullscreen";
822 extents = eina_hash_find(frame_extents, key);
825 extents = E_NEW(Frame_Extents, 1);
831 o = edje_object_add(con->bg_evas);
832 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", border);
833 ok = e_theme_edje_object_set(o, "base/theme/borders", buf);
836 Evas_Coord x, y, w, h;
840 edje_object_signal_emit(o, signal, "e");
841 edje_object_message_signal_process(o);
844 evas_object_resize(o, 1000, 1000);
845 edje_object_calc_force(o);
846 edje_object_part_geometry_get(o, "e.swallow.client",
849 extents->r = 1000 - (x + w);
851 extents->b = 1000 - (y + h);
861 eina_hash_add(frame_extents, key, extents);
866 ecore_x_netwm_frame_size_set(e->win, extents->l, extents->r, extents->t, extents->b);
868 return ECORE_CALLBACK_PASS_ON;
872 _e_manager_cb_ping(void *data, int ev_type __UNUSED__, void *ev)
876 Ecore_X_Event_Ping *e;
881 if (e->win != man->root) return ECORE_CALLBACK_PASS_ON;
883 bd = e_border_find_by_client_window(e->event_win);
884 if (!bd) return ECORE_CALLBACK_PASS_ON;
887 return ECORE_CALLBACK_PASS_ON;
891 _e_manager_cb_timer_post_screensaver_lock(void *data __UNUSED__)
893 e_desklock_show_autolocked();
894 timer_post_screensaver_lock = NULL;
895 return ECORE_CALLBACK_CANCEL;
899 _e_manager_cb_screensaver_notify(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
901 Ecore_X_Event_Screensaver_Notify *e = ev;
903 if (timer_post_screensaver_lock)
905 ecore_timer_del(timer_post_screensaver_lock);
906 timer_post_screensaver_lock = NULL;
911 if (e_config->desklock_autolock_screensaver)
913 if (e_config->desklock_post_screensaver_time <= 1.0)
915 e_desklock_show_autolocked();
919 timer_post_screensaver_lock = ecore_timer_add
920 (e_config->desklock_post_screensaver_time,
921 _e_manager_cb_timer_post_screensaver_lock, NULL);
925 return ECORE_CALLBACK_PASS_ON;
929 #ifdef _F_WINDOW_GROUP_RAISE_
931 _e_manager_windows_group_raise (E_Border* bd)
933 Ecore_X_Window leader_win;
937 if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
938 (e_config->focus_setting == E_FOCUS_NEW_WINDOW_IF_TOP_STACK) ||
940 ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
941 ((bd->parent->focused) &&
942 (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
944 leader_win = bd->client.icccm.client_leader;
947 Eina_List* border_list;
948 Eina_List* restack_list;
956 bl = e_container_border_list_last(bd->zone->container);
957 while ((temp_bd = e_container_border_list_prev(bl)))
959 if (temp_bd->client.icccm.client_leader == leader_win)
961 restack_list = eina_list_prepend(restack_list, temp_bd);
964 e_container_border_list_free(bl);
968 EINA_LIST_FREE (restack_list, temp_bd)
972 if (e_config->clientlist_warp_to_iconified_desktop == 1)
973 e_desk_show(temp_bd->desk);
975 if (!temp_bd->lock_user_iconify)
976 e_border_uniconify(temp_bd);
979 if (!temp_bd->iconic) e_desk_show(temp_bd->desk);
980 if (!temp_bd->lock_user_stacking) e_border_raise(temp_bd);
982 // set focus to top window
983 if (!temp_bd->lock_focus_out)
987 if (e_config->focus_policy != E_FOCUS_CLICK)
988 ecore_x_pointer_warp(top_bd->zone->container->win, top_bd->x + (top_bd->w / 2), top_bd->y + (top_bd->h / 2));
990 if (e_config->focus_setting != E_FOCUS_NEW_WINDOW_IF_TOP_STACK)
991 e_border_focus_set(top_bd, 1, 1);
999 bl = e_container_border_list_last(bd->zone->container);
1000 while ((temp_bd2 = e_container_border_list_prev(bl)))
1002 if ((!temp_bd2->iconic) && (temp_bd2->visible) && (temp_bd2->desk == top_bd->desk) &&
1003 (temp_bd2->client.icccm.accepts_focus || temp_bd2->client.icccm.take_focus) &&
1004 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_DOCK) &&
1005 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_TOOLBAR) &&
1006 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_MENU) &&
1007 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_SPLASH) &&
1008 (temp_bd2->client.netwm.type != ECORE_X_WINDOW_TYPE_DESKTOP))
1010 if (top_bd == temp_bd2)
1012 e_border_focus_set(top_bd, 1, 1);
1017 e_container_border_list_free(bl);
1025 #endif // group raise
1028 _e_manager_cb_client_message(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1030 Ecore_X_Event_Client_Message *e;
1035 if (e->message_type == ECORE_X_ATOM_NET_ACTIVE_WINDOW)
1037 bd = e_border_find_by_client_window(e->win);
1038 if ((bd) && (!bd->focused))
1041 if (e->data.l[0] == 0 /* 0 == old, 1 == client, 2 == pager */)
1043 // FIXME: need config for the below - what to do given each
1044 // request (either do nothng, make app look urgent/want
1045 // attention or actiually flip to app as below is the
1047 // if 0 == just make app demand attention somehow
1048 // if 1 == just make app demand attention somehow
1049 // if 2 == activate window as below
1051 timestamp = e->data.l[1];
1052 requestor_id e->data.l[2];
1055 #ifdef _F_WINDOW_GROUP_RAISE_
1056 if (e->data.l[0] == 3) // 'e->data.l[0] == 3' means group raise
1058 if (bd->client.icccm.client_leader)
1060 _e_manager_windows_group_raise (bd);
1061 return ECORE_CALLBACK_PASS_ON;
1067 #ifdef _F_FOCUS_WINDOW_IF_TOP_STACK_
1068 if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
1069 (e_config->focus_setting == E_FOCUS_NEW_WINDOW_IF_TOP_STACK) ||
1071 ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
1072 ((bd->parent->focused) &&
1073 (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
1075 if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
1077 ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
1078 ((bd->parent->focused) &&
1079 (e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
1084 if (e_config->clientlist_warp_to_iconified_desktop == 1)
1085 e_desk_show(bd->desk);
1087 if (!bd->lock_user_iconify)
1088 e_border_uniconify(bd);
1090 if ((!bd->iconic) && (!bd->sticky))
1091 e_desk_show(bd->desk);
1092 if (!bd->lock_user_stacking) e_border_raise(bd);
1093 if (!bd->lock_focus_out)
1095 /* XXX ooffice does send this request for
1096 config dialogs when the main window gets focus.
1097 causing the pointer to jump back and forth. */
1098 if ((e_config->focus_policy != E_FOCUS_CLICK) &&
1099 !(bd->client.icccm.name && !strcmp(bd->client.icccm.name, "VCLSalFrame")))
1100 ecore_x_pointer_warp(bd->zone->container->win,
1101 bd->x + (bd->w / 2), bd->y + (bd->h / 2));
1102 #ifdef _F_FOCUS_WINDOW_IF_TOP_STACK_
1103 if (e_config->focus_setting != E_FOCUS_NEW_WINDOW_IF_TOP_STACK)
1104 e_border_focus_set(bd, 1, 1);
1107 Eina_List* l = NULL;
1108 E_Border* temp_bd = NULL;
1111 bl = e_container_border_list_last(bd->zone->container);
1112 while ((temp_bd = e_container_border_list_prev(bl)))
1114 if ((!temp_bd->iconic) && (temp_bd->visible) && (temp_bd->desk == bd->desk) &&
1115 (temp_bd->client.icccm.accepts_focus || temp_bd->client.icccm.take_focus) &&
1116 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_DOCK) &&
1117 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_TOOLBAR) &&
1118 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_MENU) &&
1119 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_SPLASH) &&
1120 (temp_bd->client.netwm.type != ECORE_X_WINDOW_TYPE_DESKTOP))
1124 e_border_focus_set(bd, 1, 1);
1129 e_container_border_list_free(bl);
1132 e_border_focus_set(bd, 1, 1);
1139 return ECORE_CALLBACK_PASS_ON;
1143 _e_manager_frame_extents_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__,
1144 void *data, void *fdata __UNUSED__)
1151 _e_manager_get_for_root(Ecore_X_Window root)
1156 if (!managers) return NULL;
1157 EINA_LIST_FOREACH(managers, l, man)
1159 if (man->root == root)
1162 return eina_list_data_get(managers);
1166 #if 0 /* use later - maybe */
1167 static int _e_manager_cb_window_destroy(void *data, int ev_type, void *ev){return 1;}
1168 static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev){return 1;}
1169 static int _e_manager_cb_window_reparent(void *data, int ev_type, void *ev){return 1;}
1170 static int _e_manager_cb_window_create(void *data, int ev_type, void *ev){return 1;}
1171 static int _e_manager_cb_window_configure_request(void *data, int ev_type, void *ev){return 1;}
1172 static int _e_manager_cb_window_configure(void *data, int ev_type, void *ev){return 1;}
1173 static int _e_manager_cb_window_gravity(void *data, int ev_type, void *ev){return 1;}
1174 static int _e_manager_cb_window_stack(void *data, int ev_type, void *ev){return 1;}
1175 static int _e_manager_cb_window_stack_request(void *data, int ev_type, void *ev){return 1;}
1176 static int _e_manager_cb_window_property(void *data, int ev_type, void *ev){return 1;}
1177 static int _e_manager_cb_window_colormap(void *data, int ev_type, void *ev){return 1;}
1178 static int _e_manager_cb_window_shape(void *data, int ev_type, void *ev){return 1;}