From: Enlightenment S. <no-...@en...> - 2010-01-23 20:06:10
|
Log: Fix #483 For corner shelves, detect movement in corner windows Use ev->root.{x,y} as event coordinates, we do not care where the mouse moves within the edge windows. Convenience function for window -> edge detection. Author: englebass Date: 2010-01-23 12:06:02 -0800 (Sat, 23 Jan 2010) New Revision: 45498 Modified: trunk/e/src/bin/e_shelf.c trunk/e/src/bin/e_zone.c Modified: trunk/e/src/bin/e_shelf.c =================================================================== --- trunk/e/src/bin/e_shelf.c 2010-01-23 19:53:27 UTC (rev 45497) +++ trunk/e/src/bin/e_shelf.c 2010-01-23 20:06:02 UTC (rev 45498) @@ -1366,6 +1366,9 @@ if (es->zone != ev->zone) return 1; switch (ev->edge) { + case E_ZONE_EDGE_NONE: + /* noop */ + break; case E_ZONE_EDGE_LEFT: if (((es->gadcon->orient == E_GADCON_ORIENT_LEFT) || (es->gadcon->orient == E_GADCON_ORIENT_CORNER_TL) || @@ -1394,8 +1397,30 @@ (ev->x >= es->x) && (ev->x <= (es->x + es->w))) show = 1; break; - default: - break; + case E_ZONE_EDGE_TOP_LEFT: + if ((es->gadcon->orient == E_GADCON_ORIENT_CORNER_TL) && + ((ev->x >= es->x) && (ev->x <= (es->x + es->w))) && + ((ev->y >= es->y) && (ev->y <= (es->y + es->h)))) + show = 1; + break; + case E_ZONE_EDGE_TOP_RIGHT: + if ((es->gadcon->orient == E_GADCON_ORIENT_CORNER_TR) && + ((ev->x >= es->x) && (ev->x <= (es->x + es->w))) && + ((ev->y >= es->y) && (ev->y <= (es->y + es->h)))) + show = 1; + break; + case E_ZONE_EDGE_BOTTOM_RIGHT: + if ((es->gadcon->orient == E_GADCON_ORIENT_CORNER_BR) && + ((ev->x >= es->x) && (ev->x <= (es->x + es->w))) && + ((ev->y >= es->y) && (ev->y <= (es->y + es->h)))) + show = 1; + break; + case E_ZONE_EDGE_BOTTOM_LEFT: + if ((es->gadcon->orient == E_GADCON_ORIENT_CORNER_BL) && + ((ev->x >= es->x) && (ev->x <= (es->x + es->w))) && + ((ev->y >= es->y) && (ev->y <= (es->y + es->h)))) + show = 1; + break; } if (show) @@ -1771,6 +1796,7 @@ { char buf[1024]; + /* TODO: This might delete edge windows, and then add them again further down. Should prevent this. */ _e_shelf_bindings_del(es); /* Don't need edge binding if we don't hide shelf */ @@ -1800,21 +1826,25 @@ case E_GADCON_ORIENT_CORNER_LT: e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_LEFT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); + e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP_LEFT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); break; case E_GADCON_ORIENT_CORNER_TR: case E_GADCON_ORIENT_CORNER_RT: e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_RIGHT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); + e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP_RIGHT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); break; case E_GADCON_ORIENT_CORNER_BL: case E_GADCON_ORIENT_CORNER_LB: e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_LEFT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); + e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM_LEFT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); break; case E_GADCON_ORIENT_CORNER_BR: case E_GADCON_ORIENT_CORNER_RB: e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_RIGHT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); + e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM_RIGHT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); break; } } @@ -1823,11 +1853,9 @@ _e_shelf_bindings_del(E_Shelf *es) { char buf[1024]; + E_Zone_Edge edge; snprintf(buf, sizeof(buf), "shelf.%d", es->id); - e_bindings_edge_del(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_LEFT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); - e_bindings_edge_del(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_RIGHT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); - e_bindings_edge_del(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); - e_bindings_edge_del(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); + for (edge = E_ZONE_EDGE_LEFT; edge <= E_ZONE_EDGE_BOTTOM_LEFT; edge++) + e_bindings_edge_del(E_BINDING_CONTEXT_ZONE, edge, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0); } - Modified: trunk/e/src/bin/e_zone.c =================================================================== --- trunk/e/src/bin/e_zone.c 2010-01-23 19:53:27 UTC (rev 45497) +++ trunk/e/src/bin/e_zone.c 2010-01-23 20:06:02 UTC (rev 45498) @@ -22,6 +22,7 @@ static void _e_zone_event_add_free(void *data, void *ev); static void _e_zone_event_del_free(void *data, void *ev); static void _e_zone_object_del_attach(void *o); +static E_Zone_Edge _e_zone_detect_edge(E_Zone *zone, Ecore_X_Window win); EAPI int E_EVENT_ZONE_DESK_COUNT_SET = 0; EAPI int E_EVENT_POINTER_WARP = 0; @@ -1291,33 +1292,14 @@ ev = event; zone = data; - if (ev->win == zone->edge.left) - edge = E_ZONE_EDGE_LEFT; - else if (ev->win == zone->edge.top) - edge = E_ZONE_EDGE_TOP; - else if (ev->win == zone->edge.right) - edge = E_ZONE_EDGE_RIGHT; - else if (ev->win == zone->edge.bottom) - edge = E_ZONE_EDGE_BOTTOM; - else if ((ev->win == zone->corner.left_top) || - (ev->win == zone->corner.top_left)) - edge = E_ZONE_EDGE_TOP_LEFT; - else if ((ev->win == zone->corner.right_top) || - (ev->win == zone->corner.top_right)) - edge = E_ZONE_EDGE_TOP_RIGHT; - else if ((ev->win == zone->corner.right_bottom) || - (ev->win == zone->corner.bottom_right)) - edge = E_ZONE_EDGE_BOTTOM_RIGHT; - else if ((ev->win == zone->corner.left_bottom) || - (ev->win == zone->corner.bottom_left)) - edge = E_ZONE_EDGE_BOTTOM_LEFT; - else return 1; + edge = _e_zone_detect_edge(zone, ev->win); + if (edge == E_ZONE_EDGE_NONE) return 1; zev = E_NEW(E_Event_Zone_Edge, 1); zev->zone = zone; zev->edge = edge; - zev->x = ev->x; - zev->y = ev->y; + zev->x = ev->root.x; + zev->y = ev->root.y; zev->modifiers = ev->modifiers; ecore_event_add(E_EVENT_ZONE_EDGE_IN, zev, NULL, NULL); e_bindings_edge_in_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev); @@ -1336,33 +1318,14 @@ ev = event; zone = data; - if (ev->win == zone->edge.left) - edge = E_ZONE_EDGE_LEFT; - else if (ev->win == zone->edge.top) - edge = E_ZONE_EDGE_TOP; - else if (ev->win == zone->edge.right) - edge = E_ZONE_EDGE_RIGHT; - else if (ev->win == zone->edge.bottom) - edge = E_ZONE_EDGE_BOTTOM; - else if ((ev->win == zone->corner.left_top) || - (ev->win == zone->corner.top_left)) - edge = E_ZONE_EDGE_TOP_LEFT; - else if ((ev->win == zone->corner.right_top) || - (ev->win == zone->corner.top_right)) - edge = E_ZONE_EDGE_TOP_RIGHT; - else if ((ev->win == zone->corner.right_bottom) || - (ev->win == zone->corner.bottom_right)) - edge = E_ZONE_EDGE_BOTTOM_RIGHT; - else if ((ev->win == zone->corner.left_bottom) || - (ev->win == zone->corner.bottom_left)) - edge = E_ZONE_EDGE_BOTTOM_LEFT; - else return 1; + edge = _e_zone_detect_edge(zone, ev->win); + if (edge == E_ZONE_EDGE_NONE) return 1; zev = E_NEW(E_Event_Zone_Edge, 1); zev->zone = zone; zev->edge = edge; - zev->x = ev->x; - zev->y = ev->y; + zev->x = ev->root.x; + zev->y = ev->root.y; zev->modifiers = ev->modifiers; ecore_event_add(E_EVENT_ZONE_EDGE_OUT, zev, NULL, NULL); e_bindings_edge_out_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev); @@ -1380,33 +1343,14 @@ ev = event; zone = data; - if (ev->event_window == zone->edge.left) - edge = E_ZONE_EDGE_LEFT; - else if (ev->event_window == zone->edge.top) - edge = E_ZONE_EDGE_TOP; - else if (ev->event_window == zone->edge.right) - edge = E_ZONE_EDGE_RIGHT; - else if (ev->event_window == zone->edge.bottom) - edge = E_ZONE_EDGE_BOTTOM; - else if ((ev->event_window == zone->corner.left_top) || - (ev->event_window == zone->corner.top_left)) - edge = E_ZONE_EDGE_TOP_LEFT; - else if ((ev->event_window == zone->corner.right_top) || - (ev->event_window == zone->corner.top_right)) - edge = E_ZONE_EDGE_TOP_RIGHT; - else if ((ev->event_window == zone->corner.right_bottom) || - (ev->event_window == zone->corner.bottom_right)) - edge = E_ZONE_EDGE_BOTTOM_RIGHT; - else if ((ev->event_window == zone->corner.left_bottom) || - (ev->event_window == zone->corner.bottom_left)) - edge = E_ZONE_EDGE_BOTTOM_LEFT; - else return 1; + edge = _e_zone_detect_edge(zone, ev->window); + if (edge == E_ZONE_EDGE_NONE) return 1; zev = E_NEW(E_Event_Zone_Edge, 1); zev->zone = zone; zev->edge = edge; - zev->x = ev->x; - zev->y = ev->y; + zev->x = ev->root.x; + zev->y = ev->root.y; zev->modifiers = ev->modifiers; ecore_event_add(E_EVENT_ZONE_EDGE_OUT, zev, NULL, NULL); e_bindings_edge_down_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev); @@ -1424,33 +1368,14 @@ ev = event; zone = data; - if (ev->event_window == zone->edge.left) - edge = E_ZONE_EDGE_LEFT; - else if (ev->event_window == zone->edge.top) - edge = E_ZONE_EDGE_TOP; - else if (ev->event_window == zone->edge.right) - edge = E_ZONE_EDGE_RIGHT; - else if (ev->event_window == zone->edge.bottom) - edge = E_ZONE_EDGE_BOTTOM; - else if ((ev->event_window == zone->corner.left_top) || - (ev->event_window == zone->corner.top_left)) - edge = E_ZONE_EDGE_TOP_LEFT; - else if ((ev->event_window == zone->corner.right_top) || - (ev->event_window == zone->corner.top_right)) - edge = E_ZONE_EDGE_TOP_RIGHT; - else if ((ev->event_window == zone->corner.right_bottom) || - (ev->event_window == zone->corner.bottom_right)) - edge = E_ZONE_EDGE_BOTTOM_RIGHT; - else if ((ev->event_window == zone->corner.left_bottom) || - (ev->event_window == zone->corner.bottom_left)) - edge = E_ZONE_EDGE_BOTTOM_LEFT; - else return 1; + edge = _e_zone_detect_edge(zone, ev->window); + if (edge == E_ZONE_EDGE_NONE) return 1; zev = E_NEW(E_Event_Zone_Edge, 1); zev->zone = zone; zev->edge = edge; - zev->x = ev->x; - zev->y = ev->y; + zev->x = ev->root.x; + zev->y = ev->root.y; zev->modifiers = ev->modifiers; ecore_event_add(E_EVENT_ZONE_EDGE_OUT, zev, NULL, NULL); e_bindings_edge_up_event_handle(E_BINDING_CONTEXT_ZONE, E_OBJECT(zone), zev); @@ -1468,33 +1393,14 @@ ev = event; zone = data; - if (ev->window == zone->edge.left) - edge = E_ZONE_EDGE_LEFT; - else if (ev->window == zone->edge.top) - edge = E_ZONE_EDGE_TOP; - else if (ev->window == zone->edge.right) - edge = E_ZONE_EDGE_RIGHT; - else if (ev->window == zone->edge.bottom) - edge = E_ZONE_EDGE_BOTTOM; - else if ((ev->window == zone->corner.left_top) || - (ev->window == zone->corner.top_left)) - edge = E_ZONE_EDGE_TOP_LEFT; - else if ((ev->window == zone->corner.right_top) || - (ev->window == zone->corner.top_right)) - edge = E_ZONE_EDGE_TOP_RIGHT; - else if ((ev->window == zone->corner.right_bottom) || - (ev->window == zone->corner.bottom_right)) - edge = E_ZONE_EDGE_BOTTOM_RIGHT; - else if ((ev->window == zone->corner.left_bottom) || - (ev->window == zone->corner.bottom_left)) - edge = E_ZONE_EDGE_BOTTOM_LEFT; - else return 1; + edge = _e_zone_detect_edge(zone, ev->window); + if (edge == E_ZONE_EDGE_NONE) return 1; zev = E_NEW(E_Event_Zone_Edge, 1); zev->zone = zone; zev->edge = edge; - zev->x = ev->x; - zev->y = ev->y; + zev->x = ev->root.x; + zev->y = ev->root.y; zev->modifiers = ev->modifiers; ecore_event_add(E_EVENT_ZONE_EDGE_MOVE, zev, NULL, NULL); return 1; @@ -1582,3 +1488,31 @@ e_object_ref(E_OBJECT(ev->zone)); ecore_event_add(E_EVENT_ZONE_DEL, ev, _e_zone_event_del_free, NULL); } + +static E_Zone_Edge +_e_zone_detect_edge(E_Zone *zone, Ecore_X_Window win) +{ + E_Zone_Edge edge = E_ZONE_EDGE_NONE; + + if (win == zone->edge.left) + edge = E_ZONE_EDGE_LEFT; + else if (win == zone->edge.top) + edge = E_ZONE_EDGE_TOP; + else if (win == zone->edge.right) + edge = E_ZONE_EDGE_RIGHT; + else if (win == zone->edge.bottom) + edge = E_ZONE_EDGE_BOTTOM; + else if ((win == zone->corner.left_top) || + (win == zone->corner.top_left)) + edge = E_ZONE_EDGE_TOP_LEFT; + else if ((win == zone->corner.right_top) || + (win == zone->corner.top_right)) + edge = E_ZONE_EDGE_TOP_RIGHT; + else if ((win == zone->corner.right_bottom) || + (win == zone->corner.bottom_right)) + edge = E_ZONE_EDGE_BOTTOM_RIGHT; + else if ((win == zone->corner.left_bottom) || + (win == zone->corner.bottom_left)) + edge = E_ZONE_EDGE_BOTTOM_LEFT; + return edge; +} |