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.

SVN revision: 45498
This commit is contained in:
Sebastian Dransfeld 2010-01-23 20:06:02 +00:00
parent 1f0929c9d5
commit 2de0425541
2 changed files with 84 additions and 122 deletions

View File

@ -1366,6 +1366,9 @@ _e_shelf_cb_mouse_in(void *data, int type, void *event)
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 @@ _e_shelf_cb_mouse_in(void *data, int type, void *event)
(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 @@ _e_shelf_bindings_add(E_Shelf *es)
{
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 @@ _e_shelf_bindings_add(E_Shelf *es)
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 @@ static void
_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);
}

View File

@ -22,6 +22,7 @@ static void _e_zone_event_move_resize_free(void *data, void *ev);
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 @@ _e_zone_cb_mouse_in(void *data, int type, void *event)
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 @@ _e_zone_cb_mouse_out(void *data, int type, void *event)
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 @@ _e_zone_cb_mouse_down(void *data, int type, void *event)
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 @@ _e_zone_cb_mouse_up(void *data, int type, void *event)
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 @@ _e_zone_cb_mouse_move(void *data, int type, void *event)
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_zone_object_del_attach(void *o)
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;
}