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_black_new(E_Zone *zone)
90 if (zone->black_ecore_evas) return;
91 zone->black_ecore_evas =
92 e_canvas_new(e_config->evas_engine_zone, zone->container->win,
93 zone->x, zone->y, 1, 1, 1, 1, &(zone->black_win));
94 e_canvas_add(zone->black_ecore_evas);
95 ecore_evas_layer_set(zone->black_ecore_evas, 6);
96 zone->black_evas = ecore_evas_get(zone->black_ecore_evas);
98 o = evas_object_rectangle_add(zone->black_evas);
99 evas_object_move(o, 0, 0);
100 evas_object_resize(o, zone->w, zone->h);
101 evas_object_color_set(o, 0, 0, 0, 255);
104 ecore_evas_name_class_set(zone->black_ecore_evas, "E", "Black_Window");
105 snprintf(name, sizeof(name), "Enlightenment Black Zone (%d)", zone->num);
106 ecore_evas_title_set(zone->black_ecore_evas, name);
110 _e_zone_black_free(E_Zone *zone)
112 if (!zone->black_ecore_evas) return;
113 e_canvas_del(zone->black_ecore_evas);
114 ecore_evas_free(zone->black_ecore_evas);
115 zone->black_ecore_evas = NULL;
120 _e_zone_black_get(E_Zone *zone)
123 if (!zone->black_ecore_evas) return;
124 if (zone->black_need == 1)
126 ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
127 ecore_evas_resize(zone->black_ecore_evas, zone->w, zone->h);
132 _e_zone_black_unget(E_Zone *zone)
135 if (!zone->black_ecore_evas) return;
136 if (zone->black_need == 0)
138 ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
139 ecore_evas_resize(zone->black_ecore_evas, 1, 1);
144 e_zone_new(E_Container *con,
154 E_Event_Zone_Add *ev;
157 zone = E_OBJECT_ALLOC(E_Zone, E_ZONE_TYPE, _e_zone_free);
158 if (!zone) return NULL;
160 zone->container = con;
168 e_zone_useful_geometry_dirty(zone);
171 eina_list_append(zone->handlers,
172 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN,
173 _e_zone_cb_mouse_in, zone));
175 eina_list_append(zone->handlers,
176 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT,
177 _e_zone_cb_mouse_out, zone));
179 eina_list_append(zone->handlers,
180 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
181 _e_zone_cb_mouse_down, zone));
183 eina_list_append(zone->handlers,
184 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
185 _e_zone_cb_mouse_up, zone));
187 eina_list_append(zone->handlers,
188 ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
189 _e_zone_cb_mouse_move, zone));
191 eina_list_append(zone->handlers,
192 ecore_event_handler_add(E_EVENT_DESK_AFTER_SHOW,
193 _e_zone_cb_desk_after_show, zone));
195 snprintf(name, sizeof(name), "Zone %d", zone->num);
196 zone->name = eina_stringshare_add(name);
198 con->zones = eina_list_append(con->zones, zone);
200 o = evas_object_rectangle_add(con->bg_evas);
201 zone->bg_clip_object = o;
202 evas_object_move(o, x, y);
203 evas_object_resize(o, w, h);
204 evas_object_color_set(o, 255, 255, 255, 255);
207 o = evas_object_rectangle_add(con->bg_evas);
208 zone->bg_event_object = o;
209 evas_object_clip_set(o, zone->bg_clip_object);
210 evas_object_move(o, x, y);
211 evas_object_resize(o, w, h);
212 evas_object_color_set(o, 0, 0, 0, 0);
213 evas_object_repeat_events_set(o, 1);
215 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_zone_cb_bg_mouse_down, zone);
216 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _e_zone_cb_bg_mouse_up, zone);
218 /* TODO: config the ecore_evas type. */
220 zone->desk_x_count = 0;
221 zone->desk_y_count = 0;
222 zone->desk_x_current = 0;
223 zone->desk_y_current = 0;
224 e_zone_desk_count_set(zone, e_config->zone_desks_x_count,
225 e_config->zone_desks_y_count);
227 e_object_del_attach_func_set(E_OBJECT(zone), _e_zone_object_del_attach);
229 _e_zone_black_new(zone);
231 ev = E_NEW(E_Event_Zone_Add, 1);
233 e_object_ref(E_OBJECT(ev->zone));
234 ecore_event_add(E_EVENT_ZONE_ADD, ev, _e_zone_event_add_free, NULL);
240 e_zone_name_set(E_Zone *zone,
243 E_OBJECT_CHECK(zone);
244 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
246 if (zone->name) eina_stringshare_del(zone->name);
247 zone->name = eina_stringshare_add(name);
251 e_zone_move(E_Zone *zone,
255 E_Event_Zone_Move_Resize *ev;
257 E_OBJECT_CHECK(zone);
258 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
260 if ((x == zone->x) && (y == zone->y)) return;
263 evas_object_move(zone->bg_object, x, y);
264 if (zone->bg_scrollframe)
265 evas_object_move(zone->bg_scrollframe, x, y);
266 evas_object_move(zone->bg_event_object, x, y);
267 evas_object_move(zone->bg_clip_object, x, y);
269 ev = E_NEW(E_Event_Zone_Move_Resize, 1);
271 e_object_ref(E_OBJECT(ev->zone));
272 ecore_event_add(E_EVENT_ZONE_MOVE_RESIZE, ev, _e_zone_event_move_resize_free, NULL);
274 _e_zone_edge_move_resize(zone);
275 e_zone_bg_reconfigure(zone);
276 if (zone->black_need > 0)
278 ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
279 ecore_evas_resize(zone->black_ecore_evas, zone->w, zone->h);
284 e_zone_resize(E_Zone *zone,
288 E_Event_Zone_Move_Resize *ev;
290 E_OBJECT_CHECK(zone);
291 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
293 if ((w == zone->w) && (h == zone->h)) return;
296 evas_object_resize(zone->bg_object, w, h);
297 if (zone->bg_scrollframe)
298 evas_object_resize(zone->bg_scrollframe, w, h);
299 evas_object_resize(zone->bg_event_object, w, h);
300 evas_object_resize(zone->bg_clip_object, w, h);
302 ev = E_NEW(E_Event_Zone_Move_Resize, 1);
304 e_object_ref(E_OBJECT(ev->zone));
305 ecore_event_add(E_EVENT_ZONE_MOVE_RESIZE, ev,
306 _e_zone_event_move_resize_free, NULL);
308 _e_zone_edge_move_resize(zone);
309 e_zone_bg_reconfigure(zone);
310 if (zone->black_need > 0)
312 ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
313 ecore_evas_resize(zone->black_ecore_evas, zone->w, zone->h);
318 e_zone_move_resize(E_Zone *zone,
324 E_Event_Zone_Move_Resize *ev;
326 E_OBJECT_CHECK(zone);
327 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
329 if ((x == zone->x) && (y == zone->y) && (w == zone->w) && (h == zone->h))
337 evas_object_move(zone->bg_object, x, y);
338 if (zone->bg_scrollframe)
339 evas_object_move(zone->bg_scrollframe, x, y);
340 evas_object_move(zone->bg_event_object, x, y);
341 evas_object_move(zone->bg_clip_object, x, y);
342 evas_object_resize(zone->bg_object, w, h);
343 if (zone->bg_scrollframe)
344 evas_object_resize(zone->bg_scrollframe, w, h);
345 evas_object_resize(zone->bg_event_object, w, h);
346 evas_object_resize(zone->bg_clip_object, w, h);
348 ev = E_NEW(E_Event_Zone_Move_Resize, 1);
350 e_object_ref(E_OBJECT(ev->zone));
351 ecore_event_add(E_EVENT_ZONE_MOVE_RESIZE, ev,
352 _e_zone_event_move_resize_free, NULL);
354 _e_zone_edge_move_resize(zone);
356 e_zone_bg_reconfigure(zone);
357 if (zone->black_need > 0)
359 ecore_evas_move(zone->black_ecore_evas, zone->x, zone->y);
360 ecore_evas_resize(zone->black_ecore_evas, zone->w, zone->h);
365 e_zone_fullscreen_set(E_Zone *zone,
368 E_OBJECT_CHECK(zone);
369 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
371 if ((!zone->fullscreen) && (on))
373 _e_zone_black_get(zone);
374 ecore_evas_show(zone->black_ecore_evas);
375 e_container_window_raise(zone->container, zone->black_win, 150);
376 zone->fullscreen = 1;
378 else if ((zone->fullscreen) && (!on))
380 ecore_evas_hide(zone->black_ecore_evas);
381 zone->fullscreen = 0;
382 _e_zone_black_unget(zone);
387 e_zone_current_get(E_Container *con)
392 E_OBJECT_CHECK_RETURN(con, NULL);
393 E_OBJECT_TYPE_CHECK_RETURN(con, E_CONTAINER_TYPE, NULL);
398 ecore_x_pointer_xy_get(con->win, &x, &y);
399 EINA_LIST_FOREACH(con->zones, l, zone)
401 if (E_INSIDE(x, y, zone->x, zone->y, zone->w, zone->h))
405 if (!con->zones) return NULL;
406 return (E_Zone *)eina_list_data_get(con->zones);
410 e_zone_bg_reconfigure(E_Zone *zone)
412 E_OBJECT_CHECK(zone);
413 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
415 e_bg_zone_update(zone, E_BG_TRANSITION_CHANGE);
419 e_zone_flip_coords_handle(E_Zone *zone,
423 E_Event_Zone_Edge *zev;
424 E_Binding_Edge *bind;
432 E_OBJECT_CHECK(zone);
433 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
435 if (!e_config->edge_flip_dragging || zone->flip.switching) return;
436 /* if we have only 1 row we can flip up/down even if we have xinerama */
437 if (eina_list_count(zone->container->zones) > 1)
443 zones = zone->container->zones;
444 next_zone = (E_Zone *)eina_list_data_get(zones);
447 zones = eina_list_next(zones);
448 EINA_LIST_FOREACH(eina_list_next(zones), zones, next_zone)
450 if (next_zone->x != cx) one_col = 0;
451 if (next_zone->y != cy) one_row = 0;
454 if (eina_list_count(zone->container->manager->containers) > 1)
456 if (!E_INSIDE(x, y, zone->x, zone->y, zone->w, zone->h))
458 if ((one_row) && (y == 0))
459 edge = E_ZONE_EDGE_TOP;
460 else if ((one_col) && (x == (zone->w - 1)))
461 edge = E_ZONE_EDGE_RIGHT;
462 else if ((one_row) && (y == (zone->h - 1)))
463 edge = E_ZONE_EDGE_BOTTOM;
464 else if ((one_col) && (x == 0))
465 edge = E_ZONE_EDGE_LEFT;
471 e_shelf_toggle(zone->flip.es, 0);
472 zone->flip.es = NULL;
475 EINA_LIST_FOREACH(e_shelf_list(), l, es)
477 if (es->zone != zone) continue;
478 switch(es->gadcon->orient)
480 case E_GADCON_ORIENT_TOP:
481 case E_GADCON_ORIENT_CORNER_TL:
482 case E_GADCON_ORIENT_CORNER_TR:
483 if (edge == E_ZONE_EDGE_TOP) ok = 1;
486 case E_GADCON_ORIENT_BOTTOM:
487 case E_GADCON_ORIENT_CORNER_BL:
488 case E_GADCON_ORIENT_CORNER_BR:
489 if (edge == E_ZONE_EDGE_BOTTOM) ok = 1;
492 case E_GADCON_ORIENT_LEFT:
493 case E_GADCON_ORIENT_CORNER_LT:
494 case E_GADCON_ORIENT_CORNER_LB:
495 if (edge == E_ZONE_EDGE_LEFT) ok = 1;
498 case E_GADCON_ORIENT_RIGHT:
499 case E_GADCON_ORIENT_CORNER_RT:
500 case E_GADCON_ORIENT_CORNER_RB:
501 if (edge == E_ZONE_EDGE_RIGHT) ok = 1;
510 if (!E_INSIDE(x, y, es->x, es->y, es->w, es->h))
514 e_shelf_toggle(zone->flip.es, 0);
517 e_shelf_toggle(es, 1);
521 case E_ZONE_EDGE_LEFT:
522 if (E_ZONE_FLIP_LEFT(zone)) ok = 1;
525 case E_ZONE_EDGE_TOP:
526 if (E_ZONE_FLIP_UP(zone)) ok = 1;
529 case E_ZONE_EDGE_RIGHT:
530 if (E_ZONE_FLIP_RIGHT(zone)) ok = 1;
533 case E_ZONE_EDGE_BOTTOM:
534 if (E_ZONE_FLIP_DOWN(zone)) ok = 1;
542 bind = e_bindings_edge_get("desk_flip_in_direction", edge, 0);
545 zev = E_NEW(E_Event_Zone_Edge, 1);
551 zone->flip.bind = bind;
552 zone->flip.switching = 1;
553 bind->timer = ecore_timer_add(((double)bind->delay), _e_zone_cb_edge_timer, zone);
558 e_zone_desk_count_set(E_Zone *zone,
563 E_Desk *desk, *new_desk;
565 E_Event_Zone_Desk_Count_Set *ev;
567 int x, y, xx, yy, moved, nx, ny;
569 E_OBJECT_CHECK(zone);
570 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
577 /* Orphaned window catcher; in case desk count gets reset */
579 if (zone->desk_x_current >= xx) moved = 1;
580 if (zone->desk_y_current >= yy) moved = 1;
583 nx = zone->desk_x_current;
584 ny = zone->desk_y_current;
585 if (zone->desk_x_current >= xx) nx = xx - 1;
586 if (zone->desk_y_current >= yy) ny = yy - 1;
587 e_desk_show(e_desk_at_xy_get(zone, nx, ny));
590 new_desks = malloc(xx * yy * sizeof(E_Desk *));
591 for (x = 0; x < xx; x++)
593 for (y = 0; y < yy; y++)
595 if ((x < zone->desk_x_count) && (y < zone->desk_y_count))
596 desk = zone->desks[x + (y * zone->desk_x_count)];
598 desk = e_desk_new(zone, x, y);
599 new_desks[x + (y * xx)] = desk;
603 /* catch windoes that have fallen off the end if we got smaller */
604 if (xx < zone->desk_x_count)
606 for (y = 0; y < zone->desk_y_count; y++)
608 new_desk = zone->desks[xx - 1 + (y * zone->desk_x_count)];
609 for (x = xx; x < zone->desk_x_count; x++)
611 desk = zone->desks[x + (y * zone->desk_x_count)];
613 bl = e_container_border_list_first(zone->container);
614 while ((bd = e_container_border_list_next(bl)))
616 if (bd->desk == desk)
617 e_border_desk_set(bd, new_desk);
619 e_container_border_list_free(bl);
620 e_object_del(E_OBJECT(desk));
624 if (yy < zone->desk_y_count)
626 for (x = 0; x < zone->desk_x_count; x++)
628 new_desk = zone->desks[x + ((yy - 1) * zone->desk_x_count)];
629 for (y = yy; y < zone->desk_y_count; y++)
631 desk = zone->desks[x + (y * zone->desk_x_count)];
633 bl = e_container_border_list_first(zone->container);
634 while ((bd = e_container_border_list_next(bl)))
636 if (bd->desk == desk)
637 e_border_desk_set(bd, new_desk);
639 e_container_border_list_free(bl);
640 e_object_del(E_OBJECT(desk));
644 if (zone->desks) free(zone->desks);
645 zone->desks = new_desks;
647 zone->desk_x_count = xx;
648 zone->desk_y_count = yy;
649 e_config->zone_desks_x_count = xx;
650 e_config->zone_desks_y_count = yy;
651 e_config_save_queue();
653 /* Cannot call desk_current_get until the zone desk counts have been set
654 * or else we end up with a "white background" because desk_current_get will
657 desk = e_desk_current_get(zone);
664 ev = E_NEW(E_Event_Zone_Desk_Count_Set, 1);
667 e_object_ref(E_OBJECT(ev->zone));
668 ecore_event_add(E_EVENT_ZONE_DESK_COUNT_SET, ev,
669 _e_zone_event_zone_desk_count_set_free, NULL);
673 e_zone_desk_count_get(E_Zone *zone,
677 E_OBJECT_CHECK(zone);
678 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
680 if (x_count) *x_count = zone->desk_x_count;
681 if (y_count) *y_count = zone->desk_y_count;
685 e_zone_desk_flip_by(E_Zone *zone,
689 E_OBJECT_CHECK(zone);
690 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
692 dx = zone->desk_x_current + dx;
693 dy = zone->desk_y_current + dy;
694 e_zone_desk_flip_to(zone, dx, dy);
698 e_zone_desk_flip_to(E_Zone *zone,
704 E_OBJECT_CHECK(zone);
705 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
707 if (e_config->desk_flip_wrap)
709 x = x % zone->desk_x_count;
710 y = y % zone->desk_y_count;
711 if (x < 0) x += zone->desk_x_count;
712 if (y < 0) y += zone->desk_y_count;
717 else if (x >= zone->desk_x_count)
718 x = zone->desk_x_count - 1;
720 else if (y >= zone->desk_y_count)
721 y = zone->desk_y_count - 1;
723 desk = e_desk_at_xy_get(zone, x, y);
724 if (desk) e_desk_show(desk);
728 e_zone_desk_linear_flip_by(E_Zone *zone,
731 E_OBJECT_CHECK(zone);
732 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
734 dx = zone->desk_x_current +
735 (zone->desk_y_current * zone->desk_x_count) + dx;
736 dx = dx % (zone->desk_x_count * zone->desk_y_count);
738 dx += (zone->desk_x_count * zone->desk_y_count);
739 e_zone_desk_linear_flip_to(zone, dx);
743 e_zone_desk_linear_flip_to(E_Zone *zone,
748 E_OBJECT_CHECK(zone);
749 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
751 y = x / zone->desk_x_count;
752 x = x - (y * zone->desk_x_count);
753 e_zone_desk_flip_to(zone, x, y);
757 e_zone_edge_enable(void)
759 Eina_List *l, *ll, *lll;
764 EINA_LIST_FOREACH(e_manager_list(), l, man)
766 EINA_LIST_FOREACH(man->containers, ll, con)
768 EINA_LIST_FOREACH(con->zones, lll, zone)
770 if (zone->edge.left) ecore_x_window_show(zone->edge.left);
771 if (zone->edge.right) ecore_x_window_show(zone->edge.right);
772 if (zone->edge.top) ecore_x_window_show(zone->edge.top);
773 if (zone->edge.bottom) ecore_x_window_show(zone->edge.bottom);
774 if (zone->corner.left_top) ecore_x_window_show(zone->corner.left_top);
775 if (zone->corner.top_left) ecore_x_window_show(zone->corner.top_left);
776 if (zone->corner.top_right) ecore_x_window_show(zone->corner.top_right);
777 if (zone->corner.right_top) ecore_x_window_show(zone->corner.right_top);
778 if (zone->corner.right_bottom) ecore_x_window_show(zone->corner.right_bottom);
779 if (zone->corner.bottom_right) ecore_x_window_show(zone->corner.bottom_right);
780 if (zone->corner.bottom_left) ecore_x_window_show(zone->corner.bottom_left);
781 if (zone->corner.left_bottom) ecore_x_window_show(zone->corner.left_bottom);
788 e_zone_edge_disable(void)
790 Eina_List *l, *ll, *lll;
795 EINA_LIST_FOREACH(e_manager_list(), l, man)
797 EINA_LIST_FOREACH(man->containers, ll, con)
799 EINA_LIST_FOREACH(con->zones, lll, zone)
801 if (zone->edge.left) ecore_x_window_hide(zone->edge.left);
802 if (zone->edge.right) ecore_x_window_hide(zone->edge.right);
803 if (zone->edge.top) ecore_x_window_hide(zone->edge.top);
804 if (zone->edge.bottom) ecore_x_window_hide(zone->edge.bottom);
805 if (zone->corner.left_top) ecore_x_window_hide(zone->corner.left_top);
806 if (zone->corner.top_left) ecore_x_window_hide(zone->corner.top_left);
807 if (zone->corner.top_right) ecore_x_window_hide(zone->corner.top_right);
808 if (zone->corner.right_top) ecore_x_window_hide(zone->corner.right_top);
809 if (zone->corner.right_bottom) ecore_x_window_hide(zone->corner.right_bottom);
810 if (zone->corner.bottom_right) ecore_x_window_hide(zone->corner.bottom_right);
811 if (zone->corner.bottom_left) ecore_x_window_hide(zone->corner.bottom_left);
812 if (zone->corner.left_bottom) ecore_x_window_hide(zone->corner.left_bottom);
819 e_zone_edge_new(E_Zone_Edge edge)
821 Eina_List *l, *ll, *lll;
827 EINA_LIST_FOREACH(e_manager_list(), l, man)
829 EINA_LIST_FOREACH(man->containers, ll, con)
831 EINA_LIST_FOREACH(con->zones, lll, zone)
833 cw = zone->w * E_ZONE_CORNER_RATIO;
834 ch = zone->h * E_ZONE_CORNER_RATIO;
837 case E_ZONE_EDGE_NONE:
841 case E_ZONE_EDGE_LEFT:
842 if (!zone->edge.left)
844 zone->edge.left = ecore_x_window_input_new(con->win,
845 zone->x, zone->y + ch, 1,
847 ecore_x_window_show(zone->edge.left);
851 case E_ZONE_EDGE_RIGHT:
852 if (!zone->edge.right)
854 zone->edge.right = ecore_x_window_input_new(con->win,
855 zone->x + zone->w - 1,
856 zone->y + ch, 1, zone->h - 2 * ch);
857 ecore_x_window_show(zone->edge.right);
861 case E_ZONE_EDGE_TOP:
864 zone->edge.top = ecore_x_window_input_new(con->win,
865 zone->x + 1 + cw, zone->y,
866 zone->w - 2 * cw - 2, 1);
867 ecore_x_window_show(zone->edge.top);
871 case E_ZONE_EDGE_BOTTOM:
872 if (!zone->edge.bottom)
874 zone->edge.bottom = ecore_x_window_input_new(con->win,
875 zone->x + 1 + cw, zone->y + zone->h - 1,
876 zone->w - 2 - 2 * cw, 1);
877 ecore_x_window_show(zone->edge.bottom);
881 case E_ZONE_EDGE_TOP_LEFT:
882 if (!zone->corner.left_top)
884 zone->corner.left_top = ecore_x_window_input_new(con->win,
885 zone->x, zone->y, 1, ch);
886 ecore_x_window_show(zone->corner.left_top);
888 if (!zone->corner.top_left)
890 zone->corner.top_left = ecore_x_window_input_new(con->win,
891 zone->x + 1, zone->y, cw, 1);
892 ecore_x_window_show(zone->corner.top_left);
896 case E_ZONE_EDGE_TOP_RIGHT:
897 if (!zone->corner.top_right)
899 zone->corner.top_right = ecore_x_window_input_new(con->win,
900 zone->x + zone->w - cw - 2,
902 ecore_x_window_show(zone->corner.top_right);
904 if (!zone->corner.right_top)
906 zone->corner.right_top = ecore_x_window_input_new(con->win,
907 zone->x + zone->w - 1,
909 ecore_x_window_show(zone->corner.right_top);
913 case E_ZONE_EDGE_BOTTOM_RIGHT:
914 if (!zone->corner.right_bottom)
916 zone->corner.right_bottom = ecore_x_window_input_new(con->win,
917 zone->x + zone->w - 1,
918 zone->y + zone->h - ch, 1, ch);
919 ecore_x_window_show(zone->corner.right_bottom);
921 if (!zone->corner.bottom_right)
923 zone->corner.bottom_right = ecore_x_window_input_new(con->win,
924 zone->x + zone->w - cw - 2,
925 zone->y + zone->h - 1, cw, 1);
927 ecore_x_window_show(zone->corner.bottom_right);
931 case E_ZONE_EDGE_BOTTOM_LEFT:
932 if (!zone->corner.bottom_left)
934 zone->corner.bottom_left = ecore_x_window_input_new(con->win,
936 zone->y + zone->h - 1, cw, 1);
937 ecore_x_window_show(zone->corner.bottom_left);
939 if (!zone->corner.left_bottom)
941 zone->corner.left_bottom = ecore_x_window_input_new(con->win,
942 zone->x, zone->y + zone->h - ch,
944 ecore_x_window_show(zone->corner.left_bottom);
948 if (e_config->fullscreen_flip)
949 e_zone_edge_win_layer_set(zone, 250);
951 e_zone_edge_win_layer_set(zone, 200);
958 e_zone_edge_free(E_Zone_Edge edge)
960 Eina_List *l, *ll, *lll;
965 EINA_LIST_FOREACH(e_manager_list(), l, man)
967 EINA_LIST_FOREACH(man->containers, ll, con)
969 EINA_LIST_FOREACH(con->zones, lll, zone)
973 case E_ZONE_EDGE_NONE:
977 case E_ZONE_EDGE_LEFT:
978 if (zone->edge.left) ecore_x_window_free(zone->edge.left);
982 case E_ZONE_EDGE_RIGHT:
983 if (zone->edge.right) ecore_x_window_free(zone->edge.right);
984 zone->edge.right = 0;
987 case E_ZONE_EDGE_TOP:
988 if (zone->edge.top) ecore_x_window_free(zone->edge.top);
992 case E_ZONE_EDGE_BOTTOM:
993 if (zone->edge.bottom) ecore_x_window_free(zone->edge.bottom);
994 zone->edge.bottom = 0;
997 case E_ZONE_EDGE_TOP_LEFT:
998 if (zone->corner.left_top) ecore_x_window_free(zone->corner.left_top);
999 if (zone->corner.top_left) ecore_x_window_free(zone->corner.top_left);
1000 zone->corner.left_top = 0;
1001 zone->corner.top_left = 0;
1004 case E_ZONE_EDGE_TOP_RIGHT:
1005 if (zone->corner.top_right) ecore_x_window_free(zone->corner.top_right);
1006 if (zone->corner.right_top) ecore_x_window_free(zone->corner.right_top);
1007 zone->corner.top_right = 0;
1008 zone->corner.right_top = 0;
1011 case E_ZONE_EDGE_BOTTOM_RIGHT:
1012 if (zone->corner.right_bottom) ecore_x_window_free(zone->corner.right_bottom);
1013 if (zone->corner.bottom_right) ecore_x_window_free(zone->corner.bottom_right);
1014 zone->corner.right_bottom = 0;
1015 zone->corner.bottom_right = 0;
1018 case E_ZONE_EDGE_BOTTOM_LEFT:
1019 if (zone->corner.bottom_left) ecore_x_window_free(zone->corner.bottom_left);
1020 if (zone->corner.left_bottom) ecore_x_window_free(zone->corner.left_bottom);
1021 zone->corner.bottom_left = 0;
1022 zone->corner.left_bottom = 0;
1031 e_zone_edge_win_layer_set(E_Zone *zone,
1034 if (zone->corner.left_bottom) e_container_window_raise(zone->container, zone->corner.left_bottom, layer);
1035 if (zone->corner.left_top) e_container_window_raise(zone->container, zone->corner.left_top, layer);
1036 if (zone->corner.top_left) e_container_window_raise(zone->container, zone->corner.top_left, layer);
1037 if (zone->corner.top_right) e_container_window_raise(zone->container, zone->corner.top_right, layer);
1038 if (zone->corner.right_top) e_container_window_raise(zone->container, zone->corner.right_top, layer);
1039 if (zone->corner.right_bottom) e_container_window_raise(zone->container, zone->corner.right_bottom, layer);
1040 if (zone->corner.bottom_right) e_container_window_raise(zone->container, zone->corner.bottom_right, layer);
1041 if (zone->corner.bottom_left) e_container_window_raise(zone->container, zone->corner.bottom_left, layer);
1043 if (zone->edge.left) e_container_window_raise(zone->container, zone->edge.left, layer);
1044 if (zone->edge.right) e_container_window_raise(zone->container, zone->edge.right, layer);
1045 if (zone->edge.top) e_container_window_raise(zone->container, zone->edge.top, layer);
1046 if (zone->edge.bottom) e_container_window_raise(zone->container, zone->edge.bottom, layer);
1050 _e_zone_useful_geometry_calc(E_Zone *zone)
1053 const E_Shelf *shelf;
1060 EINA_LIST_FOREACH(e_shelf_list(), l, shelf)
1062 E_Config_Shelf_Desk *sd;
1063 E_Gadcon_Orient orient;
1067 if (shelf->zone != zone)
1072 if (shelf->cfg->overlap)
1075 if (shelf->cfg->autohide)
1077 orient = shelf->cfg->orient;
1079 if (shelf->cfg->desk_show_mode)
1082 EINA_LIST_FOREACH(shelf->cfg->desk_list, ll, sd)
1085 if ((sd->x == zone->desk_x_current) && (sd->y == zone->desk_y_current))
1096 orient = shelf->gadcon->orient;
1100 /* these are non-edje orientations */
1101 case E_GADCON_ORIENT_FLOAT:
1102 case E_GADCON_ORIENT_HORIZ:
1103 case E_GADCON_ORIENT_VERT:
1106 case E_GADCON_ORIENT_TOP:
1107 case E_GADCON_ORIENT_CORNER_TL:
1108 case E_GADCON_ORIENT_CORNER_TR:
1113 case E_GADCON_ORIENT_BOTTOM:
1114 case E_GADCON_ORIENT_CORNER_BL:
1115 case E_GADCON_ORIENT_CORNER_BR:
1116 if (y1 > zone->h - shelf->h)
1117 y1 = zone->h - shelf->h;
1121 case E_GADCON_ORIENT_LEFT:
1122 case E_GADCON_ORIENT_CORNER_LT:
1123 case E_GADCON_ORIENT_CORNER_LB:
1128 case E_GADCON_ORIENT_RIGHT:
1129 case E_GADCON_ORIENT_CORNER_RT:
1130 case E_GADCON_ORIENT_CORNER_RB:
1131 if (x1 > zone->w - shelf->w)
1132 x1 = zone->w - shelf->w;
1137 zone->useful_geometry.x = zone->x + x0;
1138 zone->useful_geometry.y = zone->y + y0;
1139 zone->useful_geometry.w = x1 - x0;
1140 zone->useful_geometry.h = y1 - y0;
1141 zone->useful_geometry.dirty = 0;
1145 * Get (or calculate) the useful (or free, without any shelves) area.
1148 e_zone_useful_geometry_get(E_Zone *zone,
1154 E_OBJECT_CHECK(zone);
1155 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
1159 if (!zone->useful_geometry.dirty)
1161 EINA_LIST_FOREACH(e_shelf_list(), l, shelf)
1163 if (!shelf->cfg) continue;
1164 if (shelf->cfg->desk_show_mode)
1166 _e_zone_useful_geometry_calc(zone);
1172 _e_zone_useful_geometry_calc(zone);
1174 if (x) *x = zone->useful_geometry.x;
1175 if (y) *y = zone->useful_geometry.y;
1176 if (w) *w = zone->useful_geometry.w;
1177 if (h) *h = zone->useful_geometry.h;
1181 * Mark as dirty so e_zone_useful_geometry_get() will need to recalculate.
1183 * Call this function when shelves are added or important properties changed.
1186 e_zone_useful_geometry_dirty(E_Zone *zone)
1188 E_Event_Zone_Move_Resize *ev;
1190 E_OBJECT_CHECK(zone);
1191 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
1193 ev = E_NEW(E_Event_Zone_Move_Resize, 1);
1195 e_object_ref(E_OBJECT(ev->zone));
1196 ecore_event_add(E_EVENT_ZONE_MOVE_RESIZE, ev, _e_zone_event_move_resize_free, NULL);
1198 zone->useful_geometry.dirty = 1;
1199 zone->useful_geometry.x = -1;
1200 zone->useful_geometry.y = -1;
1201 zone->useful_geometry.w = -1;
1202 zone->useful_geometry.h = -1;
1205 /* local subsystem functions */
1207 _e_zone_free(E_Zone *zone)
1210 Ecore_Animator *anim;
1214 /* Delete the edge windows if they exist */
1215 if (zone->edge.top) ecore_x_window_free(zone->edge.top);
1216 if (zone->edge.bottom) ecore_x_window_free(zone->edge.bottom);
1217 if (zone->edge.left) ecore_x_window_free(zone->edge.left);
1218 if (zone->edge.right) ecore_x_window_free(zone->edge.right);
1219 if (zone->corner.left_bottom) ecore_x_window_free(zone->corner.left_bottom);
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 if (zone->corner.top_right) ecore_x_window_free(zone->corner.top_right);
1223 if (zone->corner.right_top) ecore_x_window_free(zone->corner.right_top);
1224 if (zone->corner.right_bottom) ecore_x_window_free(zone->corner.right_bottom);
1225 if (zone->corner.bottom_right) ecore_x_window_free(zone->corner.bottom_right);
1226 if (zone->corner.bottom_left) ecore_x_window_free(zone->corner.bottom_left);
1228 /* Delete the object event callbacks */
1229 evas_object_event_callback_del(zone->bg_event_object,
1230 EVAS_CALLBACK_MOUSE_DOWN,
1231 _e_zone_cb_bg_mouse_down);
1232 evas_object_event_callback_del(zone->bg_event_object,
1233 EVAS_CALLBACK_MOUSE_UP,
1234 _e_zone_cb_bg_mouse_up);
1236 if (zone->black_ecore_evas)
1238 e_canvas_del(zone->black_ecore_evas);
1239 ecore_evas_free(zone->black_ecore_evas);
1241 if (zone->cur_mouse_action)
1243 e_object_unref(E_OBJECT(zone->cur_mouse_action));
1244 zone->cur_mouse_action = NULL;
1247 /* remove handlers */
1248 E_FREE_LIST(zone->handlers, ecore_event_handler_del);
1250 con = zone->container;
1251 if (zone->name) eina_stringshare_del(zone->name);
1252 con->zones = eina_list_remove(con->zones, zone);
1253 anim = evas_object_data_get(zone->bg_object, "switch_animator");
1254 if (anim) ecore_animator_del(anim);
1255 data = evas_object_data_get(zone->bg_object, "switch_animator_params");
1256 if (data) E_FREE(data);
1257 evas_object_del(zone->bg_event_object);
1258 evas_object_del(zone->bg_clip_object);
1259 evas_object_del(zone->bg_object);
1260 evas_object_del(zone->bg_scrollframe);
1261 if (zone->prev_bg_object) evas_object_del(zone->prev_bg_object);
1262 if (zone->transition_object) evas_object_del(zone->transition_object);
1265 for (x = 0; x < zone->desk_x_count; x++)
1267 for (y = 0; y < zone->desk_y_count; y++)
1268 e_object_del(E_OBJECT(zone->desks[x + (y * zone->desk_x_count)]));
1272 _e_zone_black_free(zone);
1278 _e_zone_cb_bg_mouse_down(void *data,
1279 Evas *evas __UNUSED__,
1280 Evas_Object *obj __UNUSED__,
1281 void *event_info __UNUSED__)
1286 if (e_menu_grab_window_get()) return;
1288 if (!zone->cur_mouse_action)
1290 if (ecore_event_current_type_get() == ECORE_EVENT_MOUSE_BUTTON_DOWN)
1292 Ecore_Event_Mouse_Button *ev2;
1294 ev2 = ecore_event_current_event_get();
1295 zone->cur_mouse_action =
1296 e_bindings_mouse_down_event_handle(E_BINDING_CONTEXT_ZONE,
1297 E_OBJECT(zone), ev2);
1298 if (zone->cur_mouse_action)
1300 if ((!zone->cur_mouse_action->func.end_mouse) &&
1301 (!zone->cur_mouse_action->func.end))
1302 zone->cur_mouse_action = NULL;
1303 if (zone->cur_mouse_action)
1304 e_object_ref(E_OBJECT(zone->cur_mouse_action));
1311 _e_zone_cb_bg_mouse_up(void *data,
1312 Evas *evas __UNUSED__,
1313 Evas_Object *obj __UNUSED__,
1314 void *event_info __UNUSED__)
1319 if (zone->cur_mouse_action)
1321 if (ecore_event_current_type_get() == ECORE_EVENT_MOUSE_BUTTON_UP)
1323 Ecore_Event_Mouse_Button *ev2;
1325 ev2 = ecore_event_current_event_get();
1326 if (zone->cur_mouse_action->func.end_mouse)
1327 zone->cur_mouse_action->func.end_mouse(E_OBJECT(zone), "", ev2);
1328 else if (zone->cur_mouse_action->func.end)
1329 zone->cur_mouse_action->func.end(E_OBJECT(zone), "");
1331 e_object_unref(E_OBJECT(zone->cur_mouse_action));
1332 zone->cur_mouse_action = NULL;
1336 if (ecore_event_current_type_get() == ECORE_EVENT_MOUSE_BUTTON_UP)
1338 Ecore_Event_Mouse_Button *ev2;
1340 ev2 = ecore_event_current_event_get();
1341 e_bindings_mouse_up_event_handle(E_BINDING_CONTEXT_ZONE,
1342 E_OBJECT(zone), ev2);
1348 _e_zone_event_zone_desk_count_set_free(void *data __UNUSED__,
1351 E_Event_Zone_Desk_Count_Set *e;
1354 e_object_unref(E_OBJECT(e->zone));
1359 _e_zone_cb_mouse_in(void *data,
1360 int type __UNUSED__,
1363 Ecore_X_Event_Mouse_In *ev;
1364 E_Event_Zone_Edge *zev;
1371 edge = _e_zone_detect_edge(zone, ev->win);
1372 if (edge == E_ZONE_EDGE_NONE) return ECORE_CALLBACK_PASS_ON;
1374 zev = E_NEW(E_Event_Zone_Edge, 1);
1377 zev->x = ev->root.x;
1378 zev->y = ev->root.y;
1379 zev->modifiers = ev->modifiers;
1380 ecore_event_add(E_EVENT_ZONE_EDGE_IN, zev, NULL, NULL);
1381 e_bindings_edge_in_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev);
1383 return ECORE_CALLBACK_PASS_ON;
1387 _e_zone_cb_mouse_out(void *data,
1388 int type __UNUSED__,
1391 Ecore_X_Event_Mouse_Out *ev;
1392 E_Event_Zone_Edge *zev;
1399 edge = _e_zone_detect_edge(zone, ev->win);
1400 if (edge == E_ZONE_EDGE_NONE) return ECORE_CALLBACK_PASS_ON;
1402 zev = E_NEW(E_Event_Zone_Edge, 1);
1405 zev->x = ev->root.x;
1406 zev->y = ev->root.y;
1407 zev->modifiers = ev->modifiers;
1408 ecore_event_add(E_EVENT_ZONE_EDGE_OUT, zev, NULL, NULL);
1409 e_bindings_edge_out_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev);
1410 return ECORE_CALLBACK_PASS_ON;
1414 _e_zone_cb_mouse_down(void *data,
1415 int type __UNUSED__,
1418 Ecore_Event_Mouse_Button *ev;
1419 E_Event_Zone_Edge *zev;
1426 edge = _e_zone_detect_edge(zone, ev->window);
1427 if (edge == E_ZONE_EDGE_NONE) return ECORE_CALLBACK_PASS_ON;
1429 zev = E_NEW(E_Event_Zone_Edge, 1);
1432 zev->x = ev->root.x;
1433 zev->y = ev->root.y;
1434 zev->modifiers = ev->modifiers;
1435 ecore_event_add(E_EVENT_ZONE_EDGE_OUT, zev, NULL, NULL);
1436 e_bindings_edge_down_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev);
1437 return ECORE_CALLBACK_PASS_ON;
1441 _e_zone_cb_mouse_up(void *data,
1442 int type __UNUSED__,
1445 Ecore_Event_Mouse_Button *ev;
1446 E_Event_Zone_Edge *zev;
1453 edge = _e_zone_detect_edge(zone, ev->window);
1454 if (edge == E_ZONE_EDGE_NONE) return ECORE_CALLBACK_PASS_ON;
1456 zev = E_NEW(E_Event_Zone_Edge, 1);
1459 zev->x = ev->root.x;
1460 zev->y = ev->root.y;
1461 zev->modifiers = ev->modifiers;
1462 ecore_event_add(E_EVENT_ZONE_EDGE_OUT, zev, NULL, NULL);
1463 e_bindings_edge_up_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev);
1464 return ECORE_CALLBACK_PASS_ON;
1468 _e_zone_cb_mouse_move(void *data,
1469 int type __UNUSED__,
1472 Ecore_Event_Mouse_Move *ev;
1473 E_Event_Zone_Edge *zev;
1480 edge = _e_zone_detect_edge(zone, ev->window);
1481 if (edge == E_ZONE_EDGE_NONE) return ECORE_CALLBACK_PASS_ON;
1483 zev = E_NEW(E_Event_Zone_Edge, 1);
1486 zev->x = ev->root.x;
1487 zev->y = ev->root.y;
1488 zev->modifiers = ev->modifiers;
1489 ecore_event_add(E_EVENT_ZONE_EDGE_MOVE, zev, NULL, NULL);
1490 return ECORE_CALLBACK_PASS_ON;
1494 _e_zone_cb_desk_after_show(void *data,
1495 int type __UNUSED__,
1498 E_Event_Desk_Show *ev;
1503 if (ev->desk->zone != zone) return ECORE_CALLBACK_PASS_ON;
1505 zone->flip.switching = 0;
1506 return ECORE_CALLBACK_PASS_ON;
1510 _e_zone_cb_edge_timer(void *data)
1516 act = e_action_find(zone->flip.bind->action);
1519 E_FREE(zone->flip.ev);
1520 return ECORE_CALLBACK_CANCEL;
1523 if (act->func.go_edge)
1524 act->func.go_edge(E_OBJECT(zone), zone->flip.bind->params, zone->flip.ev);
1525 else if (act->func.go)
1526 act->func.go(E_OBJECT(zone), zone->flip.bind->params);
1528 zone->flip.bind->timer = NULL;
1530 E_FREE(zone->flip.ev);
1531 return ECORE_CALLBACK_RENEW;
1535 _e_zone_event_move_resize_free(void *data __UNUSED__,
1538 E_Event_Zone_Move_Resize *e;
1541 e_object_unref(E_OBJECT(e->zone));
1546 _e_zone_event_add_free(void *data __UNUSED__,
1549 E_Event_Zone_Add *e;
1552 e_object_unref(E_OBJECT(e->zone));
1557 _e_zone_event_del_free(void *data __UNUSED__,
1560 E_Event_Zone_Del *e;
1563 e_object_unref(E_OBJECT(e->zone));
1568 _e_zone_object_del_attach(void *o)
1571 E_Event_Zone_Del *ev;
1573 if (e_object_is_del(E_OBJECT(o))) return;
1575 ev = E_NEW(E_Event_Zone_Del, 1);
1577 e_object_ref(E_OBJECT(ev->zone));
1578 ecore_event_add(E_EVENT_ZONE_DEL, ev, _e_zone_event_del_free, NULL);
1582 _e_zone_detect_edge(E_Zone *zone,
1585 E_Zone_Edge edge = E_ZONE_EDGE_NONE;
1587 if (win == zone->edge.left)
1588 edge = E_ZONE_EDGE_LEFT;
1589 else if (win == zone->edge.top)
1590 edge = E_ZONE_EDGE_TOP;
1591 else if (win == zone->edge.right)
1592 edge = E_ZONE_EDGE_RIGHT;
1593 else if (win == zone->edge.bottom)
1594 edge = E_ZONE_EDGE_BOTTOM;
1595 else if ((win == zone->corner.left_top) ||
1596 (win == zone->corner.top_left))
1597 edge = E_ZONE_EDGE_TOP_LEFT;
1598 else if ((win == zone->corner.right_top) ||
1599 (win == zone->corner.top_right))
1600 edge = E_ZONE_EDGE_TOP_RIGHT;
1601 else if ((win == zone->corner.right_bottom) ||
1602 (win == zone->corner.bottom_right))
1603 edge = E_ZONE_EDGE_BOTTOM_RIGHT;
1604 else if ((win == zone->corner.left_bottom) ||
1605 (win == zone->corner.bottom_left))
1606 edge = E_ZONE_EDGE_BOTTOM_LEFT;
1611 _e_zone_edge_move_resize(E_Zone *zone)
1616 cw = zone->w * E_ZONE_CORNER_RATIO;
1617 ch = zone->h * E_ZONE_CORNER_RATIO;
1619 if (zone->corner.left_bottom)
1620 ecore_x_window_move_resize(zone->corner.left_bottom,
1621 zone->x, zone->y + zone->h - ch, 1, ch);
1622 if (zone->edge.left)
1623 ecore_x_window_move_resize(zone->edge.left,
1624 zone->x, zone->y + ch, 1, zone->h - 2 * ch);
1625 if (zone->corner.left_top)
1626 ecore_x_window_move_resize(zone->corner.left_top,
1627 zone->x, zone->y, 1, ch);
1629 if (zone->corner.top_left)
1630 ecore_x_window_move_resize(zone->corner.top_left,
1631 zone->x + 1, zone->y, cw, 1);
1633 ecore_x_window_move_resize(zone->edge.top,
1634 zone->x + 1 + cw, zone->y, zone->w - 2 * cw - 2, 1);
1635 if (zone->corner.top_right)
1636 ecore_x_window_move_resize(zone->corner.top_right,
1637 zone->x + zone->w - cw - 2, zone->y, cw, 1);
1639 if (zone->corner.right_top)
1640 ecore_x_window_move_resize(zone->corner.right_top,
1641 zone->x + zone->w - 1, zone->y, 1, ch);
1642 if (zone->edge.right)
1643 ecore_x_window_move_resize(zone->edge.right,
1644 zone->x + zone->w - 1, zone->y + ch, 1, zone->h - 2 * ch);
1645 if (zone->corner.right_bottom)
1646 ecore_x_window_move_resize(zone->corner.right_bottom,
1647 zone->x + zone->w - 1, zone->y + zone->h - ch, 1, ch);
1649 if (zone->corner.bottom_right)
1650 ecore_x_window_move_resize(zone->corner.bottom_right,
1651 zone->x + 1, zone->y + zone->h - 1, cw, 1);
1652 if (zone->edge.bottom)
1653 ecore_x_window_move_resize(zone->edge.bottom,
1654 zone->x + 1 + cw, zone->y + zone->h - 1, zone->w - 2 - 2 * cw, 1);
1655 if (zone->corner.bottom_left)
1656 ecore_x_window_move_resize(zone->corner.bottom_left,
1657 zone->x + zone->w - cw - 2, zone->y + zone->h - 1, cw, 1);