forked from enlightenment/enlightenment
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. SVN revision: 45498
This commit is contained in:
parent
1f0929c9d5
commit
2de0425541
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
164
src/bin/e_zone.c
164
src/bin/e_zone.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue