From 2270cc87bd0f5eabc6be9cbaa580f24d2b0e28e4 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Fri, 6 Mar 2009 07:48:27 +0000 Subject: [PATCH] hide shelf also on mouse out triggered by deskflip SVN revision: 39388 --- src/bin/e_shelf.c | 61 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/src/bin/e_shelf.c b/src/bin/e_shelf.c index 30f80ec2e..80b3a1141 100644 --- a/src/bin/e_shelf.c +++ b/src/bin/e_shelf.c @@ -127,6 +127,8 @@ e_shelf_zone_new(E_Zone *zone, const char *name, const char *style, int popup, i /* TODO: We should have a mouse out on the evas object if we are on the desktop */ es->handlers = eina_list_append(es->handlers, ecore_event_handler_add(E_EVENT_ZONE_EDGE_IN, _e_shelf_cb_mouse_in, es)); + es->handlers = eina_list_append(es->handlers, + ecore_event_handler_add(E_EVENT_ZONE_EDGE_OUT, _e_shelf_cb_mouse_out, es)); es->handlers = eina_list_append(es->handlers, ecore_event_handler_add(E_EVENT_ZONE_EDGE_MOVE, _e_shelf_cb_mouse_in, es)); es->handlers = eina_list_append(es->handlers, @@ -1367,16 +1369,63 @@ _e_shelf_cb_mouse_in(void *data, int type, void *event) static int _e_shelf_cb_mouse_out(void *data, int type, void *event) { - Ecore_X_Event_Mouse_Out *ev; E_Shelf *es; Ecore_X_Window win; - ev = event; es = data; - if (es->popup) win = es->popup->evas_win; - else win = es->zone->container->event_win; - if (ev->win != win) return 1; - e_shelf_toggle(es, 0); + + if (type == E_EVENT_ZONE_EDGE_OUT) + { + E_Event_Zone_Edge *ev; + int show = 1; + + ev = event; + if (es->zone != ev->zone) return 1; + switch (es->gadcon->orient) + { + case E_GADCON_ORIENT_LEFT: + case E_GADCON_ORIENT_CORNER_LT: + case E_GADCON_ORIENT_CORNER_LB: + if ((ev->edge == E_ZONE_EDGE_LEFT) && (ev->x >= es->x + es->w)) + show = 0; + break; + case E_GADCON_ORIENT_RIGHT: + case E_GADCON_ORIENT_CORNER_RT: + case E_GADCON_ORIENT_CORNER_RB: + if ((ev->edge == E_ZONE_EDGE_RIGHT) && (ev->x < es->x)) + show = 0; + break; + case E_GADCON_ORIENT_TOP: + case E_GADCON_ORIENT_CORNER_TL: + case E_GADCON_ORIENT_CORNER_TR: + if ((ev->edge == E_ZONE_EDGE_TOP) && (ev->y > es->y + es->h)) + show = 0; + break; + case E_GADCON_ORIENT_BOTTOM: + case E_GADCON_ORIENT_CORNER_BL: + case E_GADCON_ORIENT_CORNER_BR: + if ((ev->edge == E_ZONE_EDGE_BOTTOM) && (ev->y < es->y)) + show = 0; + break; + default: + break; + + } + + if (!show) e_shelf_toggle(es, 0); + } + else if (type == ECORE_X_EVENT_MOUSE_OUT) + { + Ecore_X_Event_Mouse_Out *ev; + + ev = event; + + if (es->popup) win = es->popup->evas_win; + else win = es->zone->container->event_win; + if (ev->win != win) return 1; + + e_shelf_toggle(es, 0); + } return 1; }