3 /* E_Zone is a child object of E_Container. There is one zone per screen
4 * in a xinerama setup. Each zone has one or more desktops.
7 static void _e_zone_free(E_Zone *zone);
8 static void _e_zone_cb_bg_mouse_down(void *data,
12 static void _e_zone_cb_bg_mouse_up(void *data,
16 static void _e_zone_event_zone_desk_count_set_free(void *data,
18 static Eina_Bool _e_zone_cb_mouse_in(void *data,
21 static Eina_Bool _e_zone_cb_mouse_out(void *data,
24 static Eina_Bool _e_zone_cb_mouse_down(void *data,
27 static Eina_Bool _e_zone_cb_mouse_up(void *data,
30 static Eina_Bool _e_zone_cb_mouse_move(void *data,
33 static Eina_Bool _e_zone_cb_desk_after_show(void *data,
36 static Eina_Bool _e_zone_cb_edge_timer(void *data);
37 static void _e_zone_event_move_resize_free(void *data,
39 static void _e_zone_event_add_free(void *data,
41 static void _e_zone_event_del_free(void *data,
43 static void _e_zone_object_del_attach(void *o);
44 static E_Zone_Edge _e_zone_detect_edge(E_Zone *zone,
46 static void _e_zone_edge_move_resize(E_Zone *zone);
48 EAPI int E_EVENT_ZONE_DESK_COUNT_SET = 0;
49 EAPI int E_EVENT_POINTER_WARP = 0;
50 EAPI int E_EVENT_ZONE_MOVE_RESIZE = 0;
51 EAPI int E_EVENT_ZONE_ADD = 0;
52 EAPI int E_EVENT_ZONE_DEL = 0;
53 EAPI int E_EVENT_ZONE_EDGE_IN = 0;
54 EAPI int E_EVENT_ZONE_EDGE_OUT = 0;
55 EAPI int E_EVENT_ZONE_EDGE_MOVE = 0;
57 #define E_ZONE_FLIP_LEFT(zone) (((e_config->desk_flip_wrap && ((zone)->desk_x_count > 1)) || ((zone)->desk_x_current > 0)) && (zone)->edge.left)
58 #define E_ZONE_FLIP_RIGHT(zone) (((e_config->desk_flip_wrap && ((zone)->desk_x_count > 1)) || (((zone)->desk_x_current + 1) < (zone)->desk_x_count)) && (zone)->edge.right)
59 #define E_ZONE_FLIP_UP(zone) (((e_config->desk_flip_wrap && ((zone)->desk_y_count > 1)) || ((zone)->desk_y_current > 0)) && (zone)->edge.top)
60 #define E_ZONE_FLIP_DOWN(zone) (((e_config->desk_flip_wrap && ((zone)->desk_y_count > 1)) || (((zone)->desk_y_current + 1) < (zone)->desk_y_count)) && (zone)->edge.bottom)
62 #define E_ZONE_CORNER_RATIO 0.025;
67 E_EVENT_ZONE_DESK_COUNT_SET = ecore_event_type_new();
68 E_EVENT_POINTER_WARP = ecore_event_type_new();
69 E_EVENT_ZONE_MOVE_RESIZE = ecore_event_type_new();
70 E_EVENT_ZONE_ADD = ecore_event_type_new();
71 E_EVENT_ZONE_DEL = ecore_event_type_new();
72 E_EVENT_ZONE_EDGE_IN = ecore_event_type_new();
73 E_EVENT_ZONE_EDGE_OUT = ecore_event_type_new();
74 E_EVENT_ZONE_EDGE_MOVE = ecore_event_type_new();
85 e_zone_all_edge_flip_eval(void)
87 Eina_List *l, *ll, *lll;
92 EINA_LIST_FOREACH(e_manager_list(), l, man)
94 EINA_LIST_FOREACH(man->containers, ll, con)
96 EINA_LIST_FOREACH(con->zones, lll, zone)
98 e_zone_edge_flip_eval(zone);
105 _e_zone_black_new(E_Zone *zone)
110 if (zone->black_ecore_evas) return;
111 zone->black_ecore_evas =
112 e_canvas_new(e_config->evas_engine_zone, zone->container->win,
113 zone->x, zone->y, 1, 1, 1, 1, &(zone->black_win));
114 e_canvas_add(zone->black_ecore_evas);
115 ecore_evas_layer_set(zone->black_ecore_evas, 6);
116 zone->black_evas = ecore_evas_get(zone->black_ecore_evas);
118 o = evas_object_rectangle_add(zone->black_evas);
119 evas_object_move(o, 0, 0);
120 evas_object_resize(o, zone->w, zone->h);
121 evas_object_color_set(o, 0, 0, 0, 255);
124 ecore_evas_name_class_set(zone->black_ecore_evas, "E", "Black_Window");
125 snprintf(name, sizeof(name), "Enlightenment Black Zone (%d)", zone->num);
126 ecore_evas_title_set(zone->black_ecore_evas, name);
130 _e_zone_black_free(E_Zone *zone)
132 if (!zone->black_ecore_evas) return;
133 e_canvas_del(zone->black_ecore_evas);
134 ecore_evas_free(zone->black_ecore_evas);
135 zone->black_ecore_evas = NULL;
140 _e_zone_black_get(E_Zone *zone)
143 if (!zone->black_ecore_evas) return;
144 if (zone->black_need == 1)
146 ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
147 ecore_evas_resize(zone->black_ecore_evas, zone->w, zone->h);
152 _e_zone_black_unget(E_Zone *zone)
155 if (!zone->black_ecore_evas) return;
156 if (zone->black_need == 0)
158 ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
159 ecore_evas_resize(zone->black_ecore_evas, 1, 1);
164 e_zone_new(E_Container *con,
174 E_Event_Zone_Add *ev;
177 zone = E_OBJECT_ALLOC(E_Zone, E_ZONE_TYPE, _e_zone_free);
178 if (!zone) return NULL;
180 zone->container = con;
188 e_zone_useful_geometry_dirty(zone);
191 eina_list_append(zone->handlers,
192 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN,
193 _e_zone_cb_mouse_in, zone));
195 eina_list_append(zone->handlers,
196 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT,
197 _e_zone_cb_mouse_out, zone));
199 eina_list_append(zone->handlers,
200 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
201 _e_zone_cb_mouse_down, zone));
203 eina_list_append(zone->handlers,
204 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
205 _e_zone_cb_mouse_up, zone));
207 eina_list_append(zone->handlers,
208 ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
209 _e_zone_cb_mouse_move, zone));
211 eina_list_append(zone->handlers,
212 ecore_event_handler_add(E_EVENT_DESK_AFTER_SHOW,
213 _e_zone_cb_desk_after_show, zone));
215 snprintf(name, sizeof(name), "Zone %d", zone->num);
216 zone->name = eina_stringshare_add(name);
218 con->zones = eina_list_append(con->zones, zone);
220 o = evas_object_rectangle_add(con->bg_evas);
221 zone->bg_clip_object = o;
222 evas_object_move(o, x, y);
223 evas_object_resize(o, w, h);
224 evas_object_color_set(o, 255, 255, 255, 255);
227 o = evas_object_rectangle_add(con->bg_evas);
228 zone->bg_event_object = o;
229 evas_object_clip_set(o, zone->bg_clip_object);
230 evas_object_move(o, x, y);
231 evas_object_resize(o, w, h);
232 evas_object_color_set(o, 0, 0, 0, 0);
233 evas_object_repeat_events_set(o, 1);
235 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_zone_cb_bg_mouse_down, zone);
236 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _e_zone_cb_bg_mouse_up, zone);
238 /* TODO: config the ecore_evas type. */
240 zone->desk_x_count = 0;
241 zone->desk_y_count = 0;
242 zone->desk_x_current = 0;
243 zone->desk_y_current = 0;
244 e_zone_desk_count_set(zone, e_config->zone_desks_x_count,
245 e_config->zone_desks_y_count);
247 e_object_del_attach_func_set(E_OBJECT(zone), _e_zone_object_del_attach);
249 _e_zone_black_new(zone);
251 ev = E_NEW(E_Event_Zone_Add, 1);
253 e_object_ref(E_OBJECT(ev->zone));
254 ecore_event_add(E_EVENT_ZONE_ADD, ev, _e_zone_event_add_free, NULL);
256 e_zone_all_edge_flip_eval();
261 e_zone_name_set(E_Zone *zone,
264 E_OBJECT_CHECK(zone);
265 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
267 if (zone->name) eina_stringshare_del(zone->name);
268 zone->name = eina_stringshare_add(name);
272 e_zone_move(E_Zone *zone,
276 E_Event_Zone_Move_Resize *ev;
278 E_OBJECT_CHECK(zone);
279 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
281 if ((x == zone->x) && (y == zone->y)) return;
284 evas_object_move(zone->bg_object, x, y);
285 evas_object_move(zone->bg_event_object, x, y);
286 evas_object_move(zone->bg_clip_object, x, y);
288 ev = E_NEW(E_Event_Zone_Move_Resize, 1);
290 e_object_ref(E_OBJECT(ev->zone));
291 ecore_event_add(E_EVENT_ZONE_MOVE_RESIZE, ev, _e_zone_event_move_resize_free, NULL);
293 _e_zone_edge_move_resize(zone);
294 e_zone_bg_reconfigure(zone);
295 if (zone->black_need > 0)
297 ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
298 ecore_evas_resize(zone->black_ecore_evas, zone->w, zone->h);
303 e_zone_resize(E_Zone *zone,
307 E_Event_Zone_Move_Resize *ev;
309 E_OBJECT_CHECK(zone);
310 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
312 if ((w == zone->w) && (h == zone->h)) return;
315 evas_object_resize(zone->bg_object, w, h);
316 evas_object_resize(zone->bg_event_object, w, h);
317 evas_object_resize(zone->bg_clip_object, w, h);
319 ev = E_NEW(E_Event_Zone_Move_Resize, 1);
321 e_object_ref(E_OBJECT(ev->zone));
322 ecore_event_add(E_EVENT_ZONE_MOVE_RESIZE, ev,
323 _e_zone_event_move_resize_free, NULL);
325 _e_zone_edge_move_resize(zone);
326 e_zone_bg_reconfigure(zone);
327 if (zone->black_need > 0)
329 ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
330 ecore_evas_resize(zone->black_ecore_evas, zone->w, zone->h);
335 e_zone_move_resize(E_Zone *zone,
341 E_Event_Zone_Move_Resize *ev;
343 E_OBJECT_CHECK(zone);
344 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
346 if ((x == zone->x) && (y == zone->y) && (w == zone->w) && (h == zone->h))
354 evas_object_move(zone->bg_object, x, y);
355 evas_object_move(zone->bg_event_object, x, y);
356 evas_object_move(zone->bg_clip_object, x, y);
357 evas_object_resize(zone->bg_object, w, h);
358 evas_object_resize(zone->bg_event_object, w, h);
359 evas_object_resize(zone->bg_clip_object, w, h);
361 ev = E_NEW(E_Event_Zone_Move_Resize, 1);
363 e_object_ref(E_OBJECT(ev->zone));
364 ecore_event_add(E_EVENT_ZONE_MOVE_RESIZE, ev,
365 _e_zone_event_move_resize_free, NULL);
367 _e_zone_edge_move_resize(zone);
369 e_zone_bg_reconfigure(zone);
370 if (zone->black_need > 0)
372 ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
373 ecore_evas_resize(zone->black_ecore_evas, zone->w, zone->h);
378 e_zone_fullscreen_set(E_Zone *zone,
381 E_OBJECT_CHECK(zone);
382 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
384 if ((!zone->fullscreen) && (on))
386 _e_zone_black_get(zone);
387 ecore_evas_show(zone->black_ecore_evas);
388 e_container_window_raise(zone->container, zone->black_win, 150);
389 zone->fullscreen = 1;
391 else if ((zone->fullscreen) && (!on))
393 ecore_evas_hide(zone->black_ecore_evas);
394 zone->fullscreen = 0;
395 _e_zone_black_unget(zone);
400 e_zone_current_get(E_Container *con)
405 E_OBJECT_CHECK_RETURN(con, NULL);
406 E_OBJECT_TYPE_CHECK_RETURN(con, E_CONTAINER_TYPE, NULL);
411 ecore_x_pointer_xy_get(con->win, &x, &y);
412 EINA_LIST_FOREACH(con->zones, l, zone)
414 if (E_INSIDE(x, y, zone->x, zone->y, zone->w, zone->h))
418 if (!con->zones) return NULL;
419 return (E_Zone *)eina_list_data_get(con->zones);
423 e_zone_bg_reconfigure(E_Zone *zone)
425 E_OBJECT_CHECK(zone);
426 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
428 e_bg_zone_update(zone, E_BG_TRANSITION_CHANGE);
432 e_zone_flip_coords_handle(E_Zone *zone,
436 E_Event_Zone_Edge *zev;
437 E_Binding_Edge *bind;
445 E_OBJECT_CHECK(zone);
446 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
448 if (!e_config->edge_flip_dragging || zone->flip.switching) return;
449 /* if we have only 1 row we can flip up/down even if we have xinerama */
450 if (eina_list_count(zone->container->zones) > 1)
456 zones = zone->container->zones;
457 next_zone = (E_Zone *)eina_list_data_get(zones);
460 zones = eina_list_next(zones);
461 EINA_LIST_FOREACH(eina_list_next(zones), zones, next_zone)
463 if (next_zone->x != cx) one_col = 0;
464 if (next_zone->y != cy) one_row = 0;
467 if (eina_list_count(zone->container->manager->containers) > 1)
469 if (!E_INSIDE(x, y, zone->x, zone->y, zone->w, zone->h))
471 if ((one_row) && (y == 0))
472 edge = E_ZONE_EDGE_TOP;
473 else if ((one_col) && (x == (zone->w - 1)))
474 edge = E_ZONE_EDGE_RIGHT;
475 else if ((one_row) && (y == (zone->h - 1)))
476 edge = E_ZONE_EDGE_BOTTOM;
477 else if ((one_col) && (x == 0))
478 edge = E_ZONE_EDGE_LEFT;
483 e_shelf_toggle(zone->flip.es, 0);
484 zone->flip.es = NULL;
487 EINA_LIST_FOREACH(e_shelf_list(), l, es)
489 if (es->zone != zone) continue;
490 switch (es->gadcon->orient)
492 case E_GADCON_ORIENT_TOP:
493 case E_GADCON_ORIENT_CORNER_TL:
494 case E_GADCON_ORIENT_CORNER_TR:
495 if (edge == E_ZONE_EDGE_TOP) ok = 1;
498 case E_GADCON_ORIENT_BOTTOM:
499 case E_GADCON_ORIENT_CORNER_BL:
500 case E_GADCON_ORIENT_CORNER_BR:
501 if (edge == E_ZONE_EDGE_BOTTOM) ok = 1;
504 case E_GADCON_ORIENT_LEFT:
505 case E_GADCON_ORIENT_CORNER_LT:
506 case E_GADCON_ORIENT_CORNER_LB:
507 if (edge == E_ZONE_EDGE_LEFT) ok = 1;
510 case E_GADCON_ORIENT_RIGHT:
511 case E_GADCON_ORIENT_CORNER_RT:
512 case E_GADCON_ORIENT_CORNER_RB:
513 if (edge == E_ZONE_EDGE_RIGHT) ok = 1;
522 if (!E_INSIDE(x, y, es->x, es->y, es->w, es->h))
526 e_shelf_toggle(zone->flip.es, 0);
529 e_shelf_toggle(es, 1);
533 case E_ZONE_EDGE_LEFT:
534 if (E_ZONE_FLIP_LEFT(zone)) ok = 1;
537 case E_ZONE_EDGE_TOP:
538 if (E_ZONE_FLIP_UP(zone)) ok = 1;
541 case E_ZONE_EDGE_RIGHT:
542 if (E_ZONE_FLIP_RIGHT(zone)) ok = 1;
545 case E_ZONE_EDGE_BOTTOM:
546 if (E_ZONE_FLIP_DOWN(zone)) ok = 1;
554 bind = e_bindings_edge_get("desk_flip_in_direction", edge, 0);
555 if (!bind) bind = e_bindings_edge_get("desk_flip_by", edge, 0);
558 zev = E_NEW(E_Event_Zone_Edge, 1);
564 zone->flip.bind = bind;
565 zone->flip.switching = 1;
566 bind->timer = ecore_timer_add(((double)bind->delay), _e_zone_cb_edge_timer, zone);
571 e_zone_desk_count_set(E_Zone *zone,
576 E_Desk *desk, *new_desk;
578 E_Event_Zone_Desk_Count_Set *ev;
580 int x, y, xx, yy, moved, nx, ny;
582 E_OBJECT_CHECK(zone);
583 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
590 /* Orphaned window catcher; in case desk count gets reset */
592 if (zone->desk_x_current >= xx) moved = 1;
593 if (zone->desk_y_current >= yy) moved = 1;
596 nx = zone->desk_x_current;
597 ny = zone->desk_y_current;
598 if (zone->desk_x_current >= xx) nx = xx - 1;
599 if (zone->desk_y_current >= yy) ny = yy - 1;
600 e_desk_show(e_desk_at_xy_get(zone, nx, ny));
603 new_desks = malloc(xx * yy * sizeof(E_Desk *));
604 for (x = 0; x < xx; x++)
606 for (y = 0; y < yy; y++)
608 if ((x < zone->desk_x_count) && (y < zone->desk_y_count))
609 desk = zone->desks[x + (y * zone->desk_x_count)];
611 desk = e_desk_new(zone, x, y);
612 new_desks[x + (y * xx)] = desk;
616 /* catch windoes that have fallen off the end if we got smaller */
617 if (xx < zone->desk_x_count)
619 for (y = 0; y < zone->desk_y_count; y++)
621 new_desk = zone->desks[xx - 1 + (y * zone->desk_x_count)];
622 for (x = xx; x < zone->desk_x_count; x++)
624 desk = zone->desks[x + (y * zone->desk_x_count)];
626 bl = e_container_border_list_first(zone->container);
627 while ((bd = e_container_border_list_next(bl)))
629 if (bd->desk == desk)
630 e_border_desk_set(bd, new_desk);
632 e_container_border_list_free(bl);
633 e_object_del(E_OBJECT(desk));
637 if (yy < zone->desk_y_count)
639 for (x = 0; x < zone->desk_x_count; x++)
641 new_desk = zone->desks[x + ((yy - 1) * zone->desk_x_count)];
642 for (y = yy; y < zone->desk_y_count; y++)
644 desk = zone->desks[x + (y * zone->desk_x_count)];
646 bl = e_container_border_list_first(zone->container);
647 while ((bd = e_container_border_list_next(bl)))
649 if (bd->desk == desk)
650 e_border_desk_set(bd, new_desk);
652 e_container_border_list_free(bl);
653 e_object_del(E_OBJECT(desk));
657 if (zone->desks) free(zone->desks);
658 zone->desks = new_desks;
660 zone->desk_x_count = xx;
661 zone->desk_y_count = yy;
662 e_config->zone_desks_x_count = xx;
663 e_config->zone_desks_y_count = yy;
664 e_config_save_queue();
666 /* Cannot call desk_current_get until the zone desk counts have been set
667 * or else we end up with a "white background" because desk_current_get will
670 desk = e_desk_current_get(zone);
677 e_zone_edge_flip_eval(zone);
679 ev = E_NEW(E_Event_Zone_Desk_Count_Set, 1);
682 e_object_ref(E_OBJECT(ev->zone));
683 ecore_event_add(E_EVENT_ZONE_DESK_COUNT_SET, ev,
684 _e_zone_event_zone_desk_count_set_free, NULL);
688 e_zone_desk_count_get(E_Zone *zone,
692 E_OBJECT_CHECK(zone);
693 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
695 if (x_count) *x_count = zone->desk_x_count;
696 if (y_count) *y_count = zone->desk_y_count;
700 e_zone_desk_flip_by(E_Zone *zone,
704 E_OBJECT_CHECK(zone);
705 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
707 dx = zone->desk_x_current + dx;
708 dy = zone->desk_y_current + dy;
709 e_zone_desk_flip_to(zone, dx, dy);
710 e_zone_edge_flip_eval(zone);
714 e_zone_desk_flip_to(E_Zone *zone,
720 E_OBJECT_CHECK(zone);
721 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
723 if (e_config->desk_flip_wrap)
725 x = x % zone->desk_x_count;
726 y = y % zone->desk_y_count;
727 if (x < 0) x += zone->desk_x_count;
728 if (y < 0) y += zone->desk_y_count;
733 else if (x >= zone->desk_x_count)
734 x = zone->desk_x_count - 1;
736 else if (y >= zone->desk_y_count)
737 y = zone->desk_y_count - 1;
739 desk = e_desk_at_xy_get(zone, x, y);
740 if (desk) e_desk_show(desk);
741 e_zone_edge_flip_eval(zone);
745 e_zone_desk_linear_flip_by(E_Zone *zone,
748 E_OBJECT_CHECK(zone);
749 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
751 dx = zone->desk_x_current +
752 (zone->desk_y_current * zone->desk_x_count) + dx;
753 dx = dx % (zone->desk_x_count * zone->desk_y_count);
755 dx += (zone->desk_x_count * zone->desk_y_count);
756 e_zone_desk_linear_flip_to(zone, dx);
757 e_zone_edge_flip_eval(zone);
761 e_zone_desk_linear_flip_to(E_Zone *zone,
766 E_OBJECT_CHECK(zone);
767 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
769 y = x / zone->desk_x_count;
770 x = x - (y * zone->desk_x_count);
771 e_zone_desk_flip_to(zone, x, y);
772 e_zone_edge_flip_eval(zone);
776 e_zone_edge_enable(void)
778 Eina_List *l, *ll, *lll;
783 EINA_LIST_FOREACH(e_manager_list(), l, man)
785 EINA_LIST_FOREACH(man->containers, ll, con)
787 EINA_LIST_FOREACH(con->zones, lll, zone)
789 if (zone->edge.left) ecore_x_window_show(zone->edge.left);
790 if (zone->edge.right) ecore_x_window_show(zone->edge.right);
791 if (zone->edge.top) ecore_x_window_show(zone->edge.top);
792 if (zone->edge.bottom) ecore_x_window_show(zone->edge.bottom);
793 if (zone->corner.left_top) ecore_x_window_show(zone->corner.left_top);
794 if (zone->corner.top_left) ecore_x_window_show(zone->corner.top_left);
795 if (zone->corner.top_right) ecore_x_window_show(zone->corner.top_right);
796 if (zone->corner.right_top) ecore_x_window_show(zone->corner.right_top);
797 if (zone->corner.right_bottom) ecore_x_window_show(zone->corner.right_bottom);
798 if (zone->corner.bottom_right) ecore_x_window_show(zone->corner.bottom_right);
799 if (zone->corner.bottom_left) ecore_x_window_show(zone->corner.bottom_left);
800 if (zone->corner.left_bottom) ecore_x_window_show(zone->corner.left_bottom);
801 e_zone_edge_flip_eval(zone);
808 e_zone_edge_disable(void)
810 Eina_List *l, *ll, *lll;
815 EINA_LIST_FOREACH(e_manager_list(), l, man)
817 EINA_LIST_FOREACH(man->containers, ll, con)
819 EINA_LIST_FOREACH(con->zones, lll, zone)
821 if (zone->edge.left) ecore_x_window_hide(zone->edge.left);
822 if (zone->edge.right) ecore_x_window_hide(zone->edge.right);
823 if (zone->edge.top) ecore_x_window_hide(zone->edge.top);
824 if (zone->edge.bottom) ecore_x_window_hide(zone->edge.bottom);
825 if (zone->corner.left_top) ecore_x_window_hide(zone->corner.left_top);
826 if (zone->corner.top_left) ecore_x_window_hide(zone->corner.top_left);
827 if (zone->corner.top_right) ecore_x_window_hide(zone->corner.top_right);
828 if (zone->corner.right_top) ecore_x_window_hide(zone->corner.right_top);
829 if (zone->corner.right_bottom) ecore_x_window_hide(zone->corner.right_bottom);
830 if (zone->corner.bottom_right) ecore_x_window_hide(zone->corner.bottom_right);
831 if (zone->corner.bottom_left) ecore_x_window_hide(zone->corner.bottom_left);
832 if (zone->corner.left_bottom) ecore_x_window_hide(zone->corner.left_bottom);
839 e_zone_edges_desk_flip_capable(E_Zone *zone, Eina_Bool l, Eina_Bool r, Eina_Bool t, Eina_Bool b)
843 if (e_bindings_edge_flippable_get(E_ZONE_EDGE_LEFT))
845 if (zone->edge.left) ecore_x_window_show(zone->edge.left);
850 if (zone->edge.left) ecore_x_window_hide(zone->edge.left);
854 if (e_bindings_edge_flippable_get(E_ZONE_EDGE_RIGHT))
856 if (zone->edge.right) ecore_x_window_show(zone->edge.right);
861 if (zone->edge.right) ecore_x_window_hide(zone->edge.right);
865 if (e_bindings_edge_flippable_get(E_ZONE_EDGE_TOP))
867 if (zone->edge.top) ecore_x_window_show(zone->edge.top);
872 if (zone->edge.top) ecore_x_window_hide(zone->edge.top);
876 if (e_bindings_edge_flippable_get(E_ZONE_EDGE_BOTTOM))
878 if (zone->edge.bottom) ecore_x_window_show(zone->edge.bottom);
883 if (zone->edge.bottom) ecore_x_window_hide(zone->edge.bottom);
887 if (zone->corner.left_top) ecore_x_window_hide(zone->corner.left_top);
888 if (zone->corner.top_left) ecore_x_window_hide(zone->corner.top_left);
892 if (e_bindings_edge_flippable_get(E_ZONE_EDGE_TOP_LEFT))
894 if (zone->corner.left_top) ecore_x_window_show(zone->corner.left_top);
895 if (zone->corner.top_left) ecore_x_window_show(zone->corner.top_left);
900 if (zone->corner.right_top) ecore_x_window_hide(zone->corner.right_top);
901 if (zone->corner.top_right) ecore_x_window_hide(zone->corner.top_right);
905 if (e_bindings_edge_flippable_get(E_ZONE_EDGE_TOP_RIGHT))
907 if (zone->corner.right_top) ecore_x_window_show(zone->corner.right_top);
908 if (zone->corner.top_right) ecore_x_window_show(zone->corner.top_right);
913 if (zone->corner.left_bottom) ecore_x_window_hide(zone->corner.left_bottom);
914 if (zone->corner.bottom_left) ecore_x_window_hide(zone->corner.bottom_left);
918 if (e_bindings_edge_flippable_get(E_ZONE_EDGE_BOTTOM_LEFT))
920 if (zone->corner.left_bottom) ecore_x_window_show(zone->corner.left_bottom);
921 if (zone->corner.bottom_left) ecore_x_window_show(zone->corner.bottom_left);
926 if (zone->corner.right_bottom) ecore_x_window_hide(zone->corner.right_bottom);
927 if (zone->corner.bottom_right) ecore_x_window_hide(zone->corner.bottom_right);
931 if (e_bindings_edge_flippable_get(E_ZONE_EDGE_BOTTOM_RIGHT))
933 if (zone->corner.right_bottom) ecore_x_window_show(zone->corner.right_bottom);
934 if (zone->corner.bottom_right) ecore_x_window_show(zone->corner.bottom_right);
940 e_zone_exists_direction(E_Zone *zone, E_Zone_Edge edge)
945 EINA_LIST_FOREACH(zone->container->zones, l, z2)
947 if (zone == z2) continue;
951 case E_ZONE_EDGE_TOP_LEFT:
952 if (((E_SPANS_COMMON(0, zone->x + zone->w, z2->x, z2->w)) &&
953 (z2->y < zone->y)) ||
954 ((E_SPANS_COMMON(0, zone->y + zone->h, z2->y, z2->h)) &&
958 case E_ZONE_EDGE_TOP:
959 if ((E_SPANS_COMMON(zone->x, zone->w, z2->x, z2->w)) &&
963 case E_ZONE_EDGE_TOP_RIGHT:
964 if (((E_SPANS_COMMON(zone->x, 99999, z2->x, z2->w)) &&
965 (z2->y < zone->y)) ||
966 ((E_SPANS_COMMON(0, zone->y + zone->h, z2->y, z2->h)) &&
967 (z2->x >= (zone->x + zone->w))))
971 case E_ZONE_EDGE_LEFT:
972 if ((E_SPANS_COMMON(zone->y, zone->h, z2->y, z2->h)) &&
977 case E_ZONE_EDGE_RIGHT:
978 if ((E_SPANS_COMMON(zone->y, zone->h, z2->y, z2->h)) &&
979 (z2->x >= (zone->x + zone->w)))
983 case E_ZONE_EDGE_BOTTOM_LEFT:
984 if (((E_SPANS_COMMON(0, zone->x + zone->w, z2->x, z2->w)) &&
985 (z2->y >= (zone->y + zone->h))) ||
986 ((E_SPANS_COMMON(zone->y, 99999, z2->y, z2->h)) &&
990 case E_ZONE_EDGE_BOTTOM:
991 if ((E_SPANS_COMMON(zone->x, zone->w, z2->x, z2->w)) &&
992 (z2->y >= (zone->y + zone->h)))
995 case E_ZONE_EDGE_BOTTOM_RIGHT:
996 if (((E_SPANS_COMMON(zone->x, 99999, z2->x, z2->w)) &&
997 (z2->y >= (zone->y + zone->h))) ||
998 ((E_SPANS_COMMON(zone->y, 99999, z2->y, z2->h)) &&
1013 e_zone_edge_flip_eval(E_Zone *zone)
1015 Eina_Bool lf, rf, tf, bf;
1017 lf = rf = tf = bf = EINA_TRUE;
1018 if (zone->desk_x_count <= 1) lf = rf = EINA_FALSE;
1019 else if (!e_config->desk_flip_wrap)
1021 if (zone->desk_x_current == 0) lf = EINA_FALSE;
1022 if (zone->desk_x_current == (zone->desk_x_count - 1)) rf = EINA_FALSE;
1024 if (zone->desk_y_count <= 1) tf = bf = EINA_FALSE;
1025 else if (!e_config->desk_flip_wrap)
1027 if (zone->desk_y_current == 0) tf = EINA_FALSE;
1028 if (zone->desk_y_current == (zone->desk_y_count - 1)) bf = EINA_FALSE;
1030 e_zone_edges_desk_flip_capable(zone, lf, rf, tf, bf);
1034 e_zone_edge_new(E_Zone_Edge edge)
1036 Eina_List *l, *ll, *lll;
1042 // explicitly disallow edge bindings when we have more than 1 root
1043 // window (ie pure old multihead) since we don't know which direction
1044 // other root windows are in
1045 if (eina_list_count(e_manager_list()) > 1) return;
1046 EINA_LIST_FOREACH(e_manager_list(), l, man)
1048 EINA_LIST_FOREACH(man->containers, ll, con)
1050 EINA_LIST_FOREACH(con->zones, lll, zone)
1052 // don't allow bindings on edges that are on the boundary
1054 if (e_zone_exists_direction(zone, edge)) continue;
1055 cw = zone->w * E_ZONE_CORNER_RATIO;
1056 ch = zone->h * E_ZONE_CORNER_RATIO;
1059 case E_ZONE_EDGE_NONE:
1063 case E_ZONE_EDGE_LEFT:
1064 if (!zone->edge.left)
1066 zone->edge.left = ecore_x_window_input_new(con->win,
1067 zone->x, zone->y + ch, 1,
1069 ecore_x_window_show(zone->edge.left);
1073 case E_ZONE_EDGE_RIGHT:
1074 if (!zone->edge.right)
1076 zone->edge.right = ecore_x_window_input_new(con->win,
1077 zone->x + zone->w - 1,
1078 zone->y + ch, 1, zone->h - 2 * ch);
1079 ecore_x_window_show(zone->edge.right);
1083 case E_ZONE_EDGE_TOP:
1084 if (!zone->edge.top)
1086 zone->edge.top = ecore_x_window_input_new(con->win,
1087 zone->x + 1 + cw, zone->y,
1088 zone->w - 2 * cw - 2, 1);
1089 ecore_x_window_show(zone->edge.top);
1093 case E_ZONE_EDGE_BOTTOM:
1094 if (!zone->edge.bottom)
1096 zone->edge.bottom = ecore_x_window_input_new(con->win,
1097 zone->x + 1 + cw, zone->y + zone->h - 1,
1098 zone->w - 2 - 2 * cw, 1);
1099 ecore_x_window_show(zone->edge.bottom);
1103 case E_ZONE_EDGE_TOP_LEFT:
1104 if (!zone->corner.left_top)
1106 zone->corner.left_top = ecore_x_window_input_new(con->win,
1107 zone->x, zone->y, 1, ch);
1108 ecore_x_window_show(zone->corner.left_top);
1110 if (!zone->corner.top_left)
1112 zone->corner.top_left = ecore_x_window_input_new(con->win,
1113 zone->x + 1, zone->y, cw, 1);
1114 ecore_x_window_show(zone->corner.top_left);
1118 case E_ZONE_EDGE_TOP_RIGHT:
1119 if (!zone->corner.top_right)
1121 zone->corner.top_right = ecore_x_window_input_new(con->win,
1122 zone->x + zone->w - cw - 2,
1124 ecore_x_window_show(zone->corner.top_right);
1126 if (!zone->corner.right_top)
1128 zone->corner.right_top = ecore_x_window_input_new(con->win,
1129 zone->x + zone->w - 1,
1131 ecore_x_window_show(zone->corner.right_top);
1135 case E_ZONE_EDGE_BOTTOM_RIGHT:
1136 if (!zone->corner.right_bottom)
1138 zone->corner.right_bottom = ecore_x_window_input_new(con->win,
1139 zone->x + zone->w - 1,
1140 zone->y + zone->h - ch, 1, ch);
1141 ecore_x_window_show(zone->corner.right_bottom);
1143 if (!zone->corner.bottom_right)
1145 zone->corner.bottom_right = ecore_x_window_input_new(con->win,
1146 zone->x + zone->w - cw - 2,
1147 zone->y + zone->h - 1, cw, 1);
1149 ecore_x_window_show(zone->corner.bottom_right);
1153 case E_ZONE_EDGE_BOTTOM_LEFT:
1154 if (!zone->corner.bottom_left)
1156 zone->corner.bottom_left = ecore_x_window_input_new(con->win,
1158 zone->y + zone->h - 1, cw, 1);
1159 ecore_x_window_show(zone->corner.bottom_left);
1161 if (!zone->corner.left_bottom)
1163 zone->corner.left_bottom = ecore_x_window_input_new(con->win,
1164 zone->x, zone->y + zone->h - ch,
1166 ecore_x_window_show(zone->corner.left_bottom);
1170 if (e_config->fullscreen_flip)
1171 e_zone_edge_win_layer_set(zone, 250);
1173 e_zone_edge_win_layer_set(zone, 200);
1180 e_zone_edge_free(E_Zone_Edge edge)
1182 Eina_List *l, *ll, *lll;
1187 EINA_LIST_FOREACH(e_manager_list(), l, man)
1189 EINA_LIST_FOREACH(man->containers, ll, con)
1191 EINA_LIST_FOREACH(con->zones, lll, zone)
1195 case E_ZONE_EDGE_NONE:
1199 case E_ZONE_EDGE_LEFT:
1200 if (zone->edge.left) ecore_x_window_free(zone->edge.left);
1201 zone->edge.left = 0;
1204 case E_ZONE_EDGE_RIGHT:
1205 if (zone->edge.right) ecore_x_window_free(zone->edge.right);
1206 zone->edge.right = 0;
1209 case E_ZONE_EDGE_TOP:
1210 if (zone->edge.top) ecore_x_window_free(zone->edge.top);
1214 case E_ZONE_EDGE_BOTTOM:
1215 if (zone->edge.bottom) ecore_x_window_free(zone->edge.bottom);
1216 zone->edge.bottom = 0;
1219 case E_ZONE_EDGE_TOP_LEFT:
1220 if (zone->corner.left_top) ecore_x_window_free(zone->corner.left_top);
1221 if (zone->corner.top_left) ecore_x_window_free(zone->corner.top_left);
1222 zone->corner.left_top = 0;
1223 zone->corner.top_left = 0;
1226 case E_ZONE_EDGE_TOP_RIGHT:
1227 if (zone->corner.top_right) ecore_x_window_free(zone->corner.top_right);
1228 if (zone->corner.right_top) ecore_x_window_free(zone->corner.right_top);
1229 zone->corner.top_right = 0;
1230 zone->corner.right_top = 0;
1233 case E_ZONE_EDGE_BOTTOM_RIGHT:
1234 if (zone->corner.right_bottom) ecore_x_window_free(zone->corner.right_bottom);
1235 if (zone->corner.bottom_right) ecore_x_window_free(zone->corner.bottom_right);
1236 zone->corner.right_bottom = 0;
1237 zone->corner.bottom_right = 0;
1240 case E_ZONE_EDGE_BOTTOM_LEFT:
1241 if (zone->corner.bottom_left) ecore_x_window_free(zone->corner.bottom_left);
1242 if (zone->corner.left_bottom) ecore_x_window_free(zone->corner.left_bottom);
1243 zone->corner.bottom_left = 0;
1244 zone->corner.left_bottom = 0;
1253 e_zone_edge_win_layer_set(E_Zone *zone,
1256 if (zone->corner.left_bottom) e_container_window_raise(zone->container, zone->corner.left_bottom, layer);
1257 if (zone->corner.left_top) e_container_window_raise(zone->container, zone->corner.left_top, layer);
1258 if (zone->corner.top_left) e_container_window_raise(zone->container, zone->corner.top_left, layer);
1259 if (zone->corner.top_right) e_container_window_raise(zone->container, zone->corner.top_right, layer);
1260 if (zone->corner.right_top) e_container_window_raise(zone->container, zone->corner.right_top, layer);
1261 if (zone->corner.right_bottom) e_container_window_raise(zone->container, zone->corner.right_bottom, layer);
1262 if (zone->corner.bottom_right) e_container_window_raise(zone->container, zone->corner.bottom_right, layer);
1263 if (zone->corner.bottom_left) e_container_window_raise(zone->container, zone->corner.bottom_left, layer);
1265 if (zone->edge.left) e_container_window_raise(zone->container, zone->edge.left, layer);
1266 if (zone->edge.right) e_container_window_raise(zone->container, zone->edge.right, layer);
1267 if (zone->edge.top) e_container_window_raise(zone->container, zone->edge.top, layer);
1268 if (zone->edge.bottom) e_container_window_raise(zone->container, zone->edge.bottom, layer);
1272 _e_zone_useful_geometry_calc(E_Zone *zone)
1275 const E_Shelf *shelf;
1282 EINA_LIST_FOREACH(e_shelf_list(), l, shelf)
1284 E_Config_Shelf_Desk *sd;
1285 E_Gadcon_Orient orient;
1289 if (shelf->zone != zone)
1294 if (shelf->cfg->overlap)
1297 if (shelf->cfg->autohide)
1299 orient = shelf->cfg->orient;
1301 if (shelf->cfg->desk_show_mode)
1304 EINA_LIST_FOREACH(shelf->cfg->desk_list, ll, sd)
1307 if ((sd->x == zone->desk_x_current) && (sd->y == zone->desk_y_current))
1318 orient = shelf->gadcon->orient;
1322 /* these are non-edje orientations */
1323 case E_GADCON_ORIENT_FLOAT:
1324 case E_GADCON_ORIENT_HORIZ:
1325 case E_GADCON_ORIENT_VERT:
1328 case E_GADCON_ORIENT_TOP:
1329 case E_GADCON_ORIENT_CORNER_TL:
1330 case E_GADCON_ORIENT_CORNER_TR:
1335 case E_GADCON_ORIENT_BOTTOM:
1336 case E_GADCON_ORIENT_CORNER_BL:
1337 case E_GADCON_ORIENT_CORNER_BR:
1338 if (y1 > zone->h - shelf->h)
1339 y1 = zone->h - shelf->h;
1343 case E_GADCON_ORIENT_LEFT:
1344 case E_GADCON_ORIENT_CORNER_LT:
1345 case E_GADCON_ORIENT_CORNER_LB:
1350 case E_GADCON_ORIENT_RIGHT:
1351 case E_GADCON_ORIENT_CORNER_RT:
1352 case E_GADCON_ORIENT_CORNER_RB:
1353 if (x1 > zone->w - shelf->w)
1354 x1 = zone->w - shelf->w;
1359 zone->useful_geometry.x = zone->x + x0;
1360 zone->useful_geometry.y = zone->y + y0;
1361 zone->useful_geometry.w = x1 - x0;
1362 zone->useful_geometry.h = y1 - y0;
1363 zone->useful_geometry.dirty = 0;
1367 * Get (or calculate) the useful (or free, without any shelves) area.
1370 e_zone_useful_geometry_get(E_Zone *zone,
1376 E_OBJECT_CHECK(zone);
1377 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
1381 if (!zone->useful_geometry.dirty)
1383 EINA_LIST_FOREACH(e_shelf_list(), l, shelf)
1385 if (!shelf->cfg) continue;
1386 if (shelf->cfg->desk_show_mode)
1388 _e_zone_useful_geometry_calc(zone);
1394 _e_zone_useful_geometry_calc(zone);
1396 if (x) *x = zone->useful_geometry.x;
1397 if (y) *y = zone->useful_geometry.y;
1398 if (w) *w = zone->useful_geometry.w;
1399 if (h) *h = zone->useful_geometry.h;
1403 * Mark as dirty so e_zone_useful_geometry_get() will need to recalculate.
1405 * Call this function when shelves are added or important properties changed.
1408 e_zone_useful_geometry_dirty(E_Zone *zone)
1410 E_Event_Zone_Move_Resize *ev;
1412 E_OBJECT_CHECK(zone);
1413 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
1415 ev = E_NEW(E_Event_Zone_Move_Resize, 1);
1417 e_object_ref(E_OBJECT(ev->zone));
1418 ecore_event_add(E_EVENT_ZONE_MOVE_RESIZE, ev, _e_zone_event_move_resize_free, NULL);
1420 zone->useful_geometry.dirty = 1;
1421 zone->useful_geometry.x = -1;
1422 zone->useful_geometry.y = -1;
1423 zone->useful_geometry.w = -1;
1424 zone->useful_geometry.h = -1;
1427 /* local subsystem functions */
1429 _e_zone_free(E_Zone *zone)
1434 /* Delete the edge windows if they exist */
1435 if (zone->edge.top) ecore_x_window_free(zone->edge.top);
1436 if (zone->edge.bottom) ecore_x_window_free(zone->edge.bottom);
1437 if (zone->edge.left) ecore_x_window_free(zone->edge.left);
1438 if (zone->edge.right) ecore_x_window_free(zone->edge.right);
1439 if (zone->corner.left_bottom) ecore_x_window_free(zone->corner.left_bottom);
1440 if (zone->corner.left_top) ecore_x_window_free(zone->corner.left_top);
1441 if (zone->corner.top_left) ecore_x_window_free(zone->corner.top_left);
1442 if (zone->corner.top_right) ecore_x_window_free(zone->corner.top_right);
1443 if (zone->corner.right_top) ecore_x_window_free(zone->corner.right_top);
1444 if (zone->corner.right_bottom) ecore_x_window_free(zone->corner.right_bottom);
1445 if (zone->corner.bottom_right) ecore_x_window_free(zone->corner.bottom_right);
1446 if (zone->corner.bottom_left) ecore_x_window_free(zone->corner.bottom_left);
1448 /* Delete the object event callbacks */
1449 evas_object_event_callback_del(zone->bg_event_object,
1450 EVAS_CALLBACK_MOUSE_DOWN,
1451 _e_zone_cb_bg_mouse_down);
1452 evas_object_event_callback_del(zone->bg_event_object,
1453 EVAS_CALLBACK_MOUSE_UP,
1454 _e_zone_cb_bg_mouse_up);
1456 if (zone->black_ecore_evas)
1458 e_canvas_del(zone->black_ecore_evas);
1459 ecore_evas_free(zone->black_ecore_evas);
1461 if (zone->cur_mouse_action)
1463 e_object_unref(E_OBJECT(zone->cur_mouse_action));
1464 zone->cur_mouse_action = NULL;
1467 /* remove handlers */
1468 E_FREE_LIST(zone->handlers, ecore_event_handler_del);
1470 con = zone->container;
1471 if (zone->name) eina_stringshare_del(zone->name);
1472 con->zones = eina_list_remove(con->zones, zone);
1473 evas_object_del(zone->bg_event_object);
1474 evas_object_del(zone->bg_clip_object);
1475 evas_object_del(zone->bg_object);
1476 if (zone->prev_bg_object) evas_object_del(zone->prev_bg_object);
1477 if (zone->transition_object) evas_object_del(zone->transition_object);
1480 for (x = 0; x < zone->desk_x_count; x++)
1482 for (y = 0; y < zone->desk_y_count; y++)
1483 e_object_del(E_OBJECT(zone->desks[x + (y * zone->desk_x_count)]));
1487 _e_zone_black_free(zone);
1493 _e_zone_cb_bg_mouse_down(void *data,
1494 Evas *evas __UNUSED__,
1495 Evas_Object *obj __UNUSED__,
1496 void *event_info __UNUSED__)
1501 if (e_menu_grab_window_get()) return;
1503 if (!zone->cur_mouse_action)
1505 if (ecore_event_current_type_get() == ECORE_EVENT_MOUSE_BUTTON_DOWN)
1507 Ecore_Event_Mouse_Button *ev2;
1509 ev2 = ecore_event_current_event_get();
1510 zone->cur_mouse_action =
1511 e_bindings_mouse_down_event_handle(E_BINDING_CONTEXT_ZONE,
1512 E_OBJECT(zone), ev2);
1513 if (zone->cur_mouse_action)
1515 if ((!zone->cur_mouse_action->func.end_mouse) &&
1516 (!zone->cur_mouse_action->func.end))
1517 zone->cur_mouse_action = NULL;
1518 if (zone->cur_mouse_action)
1519 e_object_ref(E_OBJECT(zone->cur_mouse_action));
1526 _e_zone_cb_bg_mouse_up(void *data,
1527 Evas *evas __UNUSED__,
1528 Evas_Object *obj __UNUSED__,
1529 void *event_info __UNUSED__)
1534 if (zone->cur_mouse_action)
1536 if (ecore_event_current_type_get() == ECORE_EVENT_MOUSE_BUTTON_UP)
1538 Ecore_Event_Mouse_Button *ev2;
1540 ev2 = ecore_event_current_event_get();
1541 if (zone->cur_mouse_action->func.end_mouse)
1542 zone->cur_mouse_action->func.end_mouse(E_OBJECT(zone), "", ev2);
1543 else if (zone->cur_mouse_action->func.end)
1544 zone->cur_mouse_action->func.end(E_OBJECT(zone), "");
1546 e_object_unref(E_OBJECT(zone->cur_mouse_action));
1547 zone->cur_mouse_action = NULL;
1551 if (ecore_event_current_type_get() == ECORE_EVENT_MOUSE_BUTTON_UP)
1553 Ecore_Event_Mouse_Button *ev2;
1555 ev2 = ecore_event_current_event_get();
1556 e_bindings_mouse_up_event_handle(E_BINDING_CONTEXT_ZONE,
1557 E_OBJECT(zone), ev2);
1563 _e_zone_event_zone_desk_count_set_free(void *data __UNUSED__,
1566 E_Event_Zone_Desk_Count_Set *e;
1569 e_object_unref(E_OBJECT(e->zone));
1574 _e_zone_cb_mouse_in(void *data,
1575 int type __UNUSED__,
1578 Ecore_X_Event_Mouse_In *ev;
1579 E_Event_Zone_Edge *zev;
1586 edge = _e_zone_detect_edge(zone, ev->win);
1587 if (edge == E_ZONE_EDGE_NONE) return ECORE_CALLBACK_PASS_ON;
1589 zev = E_NEW(E_Event_Zone_Edge, 1);
1592 zev->x = ev->root.x;
1593 zev->y = ev->root.y;
1594 zev->modifiers = ev->modifiers;
1595 ecore_event_add(E_EVENT_ZONE_EDGE_IN, zev, NULL, NULL);
1596 e_bindings_edge_in_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev);
1598 return ECORE_CALLBACK_PASS_ON;
1602 _e_zone_cb_mouse_out(void *data,
1603 int type __UNUSED__,
1606 Ecore_X_Event_Mouse_Out *ev;
1607 E_Event_Zone_Edge *zev;
1614 edge = _e_zone_detect_edge(zone, ev->win);
1615 if (edge == E_ZONE_EDGE_NONE) return ECORE_CALLBACK_PASS_ON;
1617 zev = E_NEW(E_Event_Zone_Edge, 1);
1620 zev->x = ev->root.x;
1621 zev->y = ev->root.y;
1622 zev->modifiers = ev->modifiers;
1623 ecore_event_add(E_EVENT_ZONE_EDGE_OUT, zev, NULL, NULL);
1624 e_bindings_edge_out_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev);
1625 return ECORE_CALLBACK_PASS_ON;
1629 _e_zone_cb_mouse_down(void *data,
1630 int type __UNUSED__,
1633 Ecore_Event_Mouse_Button *ev;
1634 E_Event_Zone_Edge *zev;
1641 edge = _e_zone_detect_edge(zone, ev->window);
1642 if (edge == E_ZONE_EDGE_NONE) return ECORE_CALLBACK_PASS_ON;
1644 zev = E_NEW(E_Event_Zone_Edge, 1);
1647 zev->x = ev->root.x;
1648 zev->y = ev->root.y;
1649 zev->modifiers = ev->modifiers;
1650 ecore_event_add(E_EVENT_ZONE_EDGE_OUT, zev, NULL, NULL);
1651 e_bindings_edge_down_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev);
1652 return ECORE_CALLBACK_PASS_ON;
1656 _e_zone_cb_mouse_up(void *data,
1657 int type __UNUSED__,
1660 Ecore_Event_Mouse_Button *ev;
1661 E_Event_Zone_Edge *zev;
1668 edge = _e_zone_detect_edge(zone, ev->window);
1669 if (edge == E_ZONE_EDGE_NONE) return ECORE_CALLBACK_PASS_ON;
1671 zev = E_NEW(E_Event_Zone_Edge, 1);
1674 zev->x = ev->root.x;
1675 zev->y = ev->root.y;
1676 zev->modifiers = ev->modifiers;
1677 ecore_event_add(E_EVENT_ZONE_EDGE_OUT, zev, NULL, NULL);
1678 e_bindings_edge_up_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev);
1679 return ECORE_CALLBACK_PASS_ON;
1683 _e_zone_cb_mouse_move(void *data,
1684 int type __UNUSED__,
1687 Ecore_Event_Mouse_Move *ev;
1688 E_Event_Zone_Edge *zev;
1695 edge = _e_zone_detect_edge(zone, ev->window);
1696 if (edge == E_ZONE_EDGE_NONE) return ECORE_CALLBACK_PASS_ON;
1698 zev = E_NEW(E_Event_Zone_Edge, 1);
1701 zev->x = ev->root.x;
1702 zev->y = ev->root.y;
1703 zev->modifiers = ev->modifiers;
1704 ecore_event_add(E_EVENT_ZONE_EDGE_MOVE, zev, NULL, NULL);
1705 return ECORE_CALLBACK_PASS_ON;
1709 _e_zone_cb_desk_after_show(void *data,
1710 int type __UNUSED__,
1713 E_Event_Desk_Show *ev;
1718 if (ev->desk->zone != zone) return ECORE_CALLBACK_PASS_ON;
1720 zone->flip.switching = 0;
1721 return ECORE_CALLBACK_PASS_ON;
1725 _e_zone_cb_edge_timer(void *data)
1731 act = e_action_find(zone->flip.bind->action);
1734 E_FREE(zone->flip.ev);
1735 return ECORE_CALLBACK_CANCEL;
1738 if (act->func.go_edge)
1739 act->func.go_edge(E_OBJECT(zone), zone->flip.bind->params, zone->flip.ev);
1740 else if (act->func.go)
1741 act->func.go(E_OBJECT(zone), zone->flip.bind->params);
1743 zone->flip.bind->timer = NULL;
1745 E_FREE(zone->flip.ev);
1746 return ECORE_CALLBACK_CANCEL;
1750 _e_zone_event_move_resize_free(void *data __UNUSED__,
1753 E_Event_Zone_Move_Resize *e;
1756 e_object_unref(E_OBJECT(e->zone));
1761 _e_zone_event_add_free(void *data __UNUSED__,
1764 E_Event_Zone_Add *e;
1767 e_object_unref(E_OBJECT(e->zone));
1772 _e_zone_event_del_free(void *data __UNUSED__,
1775 E_Event_Zone_Del *e;
1778 e_object_unref(E_OBJECT(e->zone));
1783 _e_zone_object_del_attach(void *o)
1786 E_Event_Zone_Del *ev;
1788 if (e_object_is_del(E_OBJECT(o))) return;
1790 ev = E_NEW(E_Event_Zone_Del, 1);
1792 e_object_ref(E_OBJECT(ev->zone));
1793 ecore_event_add(E_EVENT_ZONE_DEL, ev, _e_zone_event_del_free, NULL);
1797 _e_zone_detect_edge(E_Zone *zone,
1800 E_Zone_Edge edge = E_ZONE_EDGE_NONE;
1802 if (win == zone->edge.left)
1803 edge = E_ZONE_EDGE_LEFT;
1804 else if (win == zone->edge.top)
1805 edge = E_ZONE_EDGE_TOP;
1806 else if (win == zone->edge.right)
1807 edge = E_ZONE_EDGE_RIGHT;
1808 else if (win == zone->edge.bottom)
1809 edge = E_ZONE_EDGE_BOTTOM;
1810 else if ((win == zone->corner.left_top) ||
1811 (win == zone->corner.top_left))
1812 edge = E_ZONE_EDGE_TOP_LEFT;
1813 else if ((win == zone->corner.right_top) ||
1814 (win == zone->corner.top_right))
1815 edge = E_ZONE_EDGE_TOP_RIGHT;
1816 else if ((win == zone->corner.right_bottom) ||
1817 (win == zone->corner.bottom_right))
1818 edge = E_ZONE_EDGE_BOTTOM_RIGHT;
1819 else if ((win == zone->corner.left_bottom) ||
1820 (win == zone->corner.bottom_left))
1821 edge = E_ZONE_EDGE_BOTTOM_LEFT;
1826 _e_zone_edge_move_resize(E_Zone *zone)
1831 cw = zone->w * E_ZONE_CORNER_RATIO;
1832 ch = zone->h * E_ZONE_CORNER_RATIO;
1834 if (zone->corner.left_bottom)
1835 ecore_x_window_move_resize(zone->corner.left_bottom,
1836 zone->x, zone->y + zone->h - ch, 1, ch);
1837 if (zone->edge.left)
1838 ecore_x_window_move_resize(zone->edge.left,
1839 zone->x, zone->y + ch, 1, zone->h - 2 * ch);
1840 if (zone->corner.left_top)
1841 ecore_x_window_move_resize(zone->corner.left_top,
1842 zone->x, zone->y, 1, ch);
1844 if (zone->corner.top_left)
1845 ecore_x_window_move_resize(zone->corner.top_left,
1846 zone->x + 1, zone->y, cw, 1);
1848 ecore_x_window_move_resize(zone->edge.top,
1849 zone->x + 1 + cw, zone->y, zone->w - 2 * cw - 2, 1);
1850 if (zone->corner.top_right)
1851 ecore_x_window_move_resize(zone->corner.top_right,
1852 zone->x + zone->w - cw - 2, zone->y, cw, 1);
1854 if (zone->corner.right_top)
1855 ecore_x_window_move_resize(zone->corner.right_top,
1856 zone->x + zone->w - 1, zone->y, 1, ch);
1857 if (zone->edge.right)
1858 ecore_x_window_move_resize(zone->edge.right,
1859 zone->x + zone->w - 1, zone->y + ch, 1, zone->h - 2 * ch);
1860 if (zone->corner.right_bottom)
1861 ecore_x_window_move_resize(zone->corner.right_bottom,
1862 zone->x + zone->w - 1, zone->y + zone->h - ch, 1, ch);
1864 if (zone->corner.bottom_right)
1865 ecore_x_window_move_resize(zone->corner.bottom_right,
1866 zone->x + 1, zone->y + zone->h - 1, cw, 1);
1867 if (zone->edge.bottom)
1868 ecore_x_window_move_resize(zone->edge.bottom,
1869 zone->x + 1 + cw, zone->y + zone->h - 1, zone->w - 2 - 2 * cw, 1);
1870 if (zone->corner.bottom_left)
1871 ecore_x_window_move_resize(zone->corner.bottom_left,
1872 zone->x + zone->w - cw - 2, zone->y + zone->h - 1, cw, 1);