From 2eb12fddf347fe1ff1cbead0be95f3254bee5fc9 Mon Sep 17 00:00:00 2001 From: Sebastian Dransfeld Date: Thu, 22 Nov 2007 21:39:45 +0000 Subject: [PATCH] Show shelf on edge trap and hide on mouse out on window. SVN revision: 32833 --- src/bin/e_shelf.c | 111 +++++++++++++++++++++++++++++++++------------- src/bin/e_shelf.h | 3 +- 2 files changed, 82 insertions(+), 32 deletions(-) diff --git a/src/bin/e_shelf.c b/src/bin/e_shelf.c index 87ffe5444..f8b0dc1fe 100644 --- a/src/bin/e_shelf.c +++ b/src/bin/e_shelf.c @@ -17,8 +17,8 @@ static void _e_shelf_cb_menu_delete(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_shelf_menu_append(E_Shelf *es, E_Menu *mn); static void _e_shelf_cb_menu_items_append(void *data, E_Menu *mn); static void _e_shelf_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info); -static void _e_shelf_cb_mouse_in(void *data, Evas *evas, Evas_Object *obj, void *event_info); -static void _e_shelf_cb_mouse_out(void *data, Evas *evas, Evas_Object *obj, void *event_info); +static int _e_shelf_cb_mouse_in(void *data, int type, void *event); +static int _e_shelf_cb_mouse_out(void *data, int type, void *event); static int _e_shelf_cb_id_sort(void *data1, void *data2); static int _e_shelf_cb_hide_animator(void *data); static int _e_shelf_cb_hide_animator_timer(void *data); @@ -107,12 +107,15 @@ e_shelf_zone_new(E_Zone *zone, const char *name, const char *style, int popup, i e_popup_layer_set(es->popup, layer); es->ee = es->popup->ecore_evas; es->evas = es->popup->evas; + es->win = es->popup->evas_win; } else { e_drop_xdnd_register_set(zone->container->event_win, 1); es->ee = zone->container->bg_ecore_evas; es->evas = zone->container->bg_evas; + /* TODO: We should have a mouse out on the evas object if we are on the desktop */ + es->win = zone->container->event_win; } es->fit_along = 1; es->layer = layer; @@ -124,12 +127,10 @@ e_shelf_zone_new(E_Zone *zone, const char *name, const char *style, int popup, i evas_object_resize(es->o_event, es->w, es->h); evas_object_event_callback_add(es->o_event, EVAS_CALLBACK_MOUSE_DOWN, _e_shelf_cb_mouse_down, es); - es->o_hide = evas_object_rectangle_add(es->evas); - evas_object_color_set(es->o_hide, 0, 0, 0, 0); - evas_object_resize(es->o_hide, es->w, es->h); - evas_object_event_callback_add(es->o_hide, EVAS_CALLBACK_MOUSE_IN, _e_shelf_cb_mouse_in, es); - evas_object_event_callback_add(es->o_hide, EVAS_CALLBACK_MOUSE_OUT, _e_shelf_cb_mouse_out, es); - evas_object_repeat_events_set(es->o_hide, 1); + es->handlers = evas_list_append(es->handlers, + ecore_event_handler_add(E_EVENT_ZONE_EDGE_IN, _e_shelf_cb_mouse_in, es)); + es->handlers = evas_list_append(es->handlers, + ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT, _e_shelf_cb_mouse_out, es)); es->o_base = edje_object_add(es->evas); es->name = evas_stringshare_add(name); @@ -140,18 +141,14 @@ e_shelf_zone_new(E_Zone *zone, const char *name, const char *style, int popup, i "e/shelf/default/base"); if (es->popup) { - evas_object_layer_set(es->o_hide, 1); - evas_object_show(es->o_hide); evas_object_show(es->o_event); evas_object_show(es->o_base); e_popup_edje_bg_object_set(es->popup, es->o_base); } else { - evas_object_move(es->o_hide, es->zone->x + es->x, es->zone->y + es->y); evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y); evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y); - evas_object_layer_set(es->o_hide, layer + 1); evas_object_layer_set(es->o_event, layer); evas_object_layer_set(es->o_base, layer); } @@ -234,7 +231,6 @@ e_shelf_show(E_Shelf *es) e_popup_show(es->popup); else { - evas_object_show(es->o_hide); evas_object_show(es->o_event); evas_object_show(es->o_base); } @@ -249,7 +245,6 @@ e_shelf_hide(E_Shelf *es) e_popup_hide(es->popup); else { - evas_object_hide(es->o_hide); evas_object_hide(es->o_event); evas_object_hide(es->o_base); } @@ -315,7 +310,6 @@ e_shelf_move(E_Shelf *es, int x, int y) e_popup_move(es->popup, es->x, es->y); else { - evas_object_move(es->o_hide, es->zone->x + es->x, es->zone->y + es->y); evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y); evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y); } @@ -330,7 +324,6 @@ e_shelf_resize(E_Shelf *es, int w, int h) es->h = h; if (es->popup) e_popup_resize(es->popup, es->w, es->h); - evas_object_resize(es->o_hide, es->w, es->h); evas_object_resize(es->o_event, es->w, es->h); evas_object_resize(es->o_base, es->w, es->h); } @@ -348,11 +341,9 @@ e_shelf_move_resize(E_Shelf *es, int x, int y, int w, int h) e_popup_move_resize(es->popup, es->x, es->y, es->w, es->h); else { - evas_object_move(es->o_hide, es->zone->x + es->x, es->zone->y + es->y); evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y); evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y); } - evas_object_resize(es->o_hide, es->w, es->h); evas_object_resize(es->o_event, es->w, es->h); evas_object_resize(es->o_base, es->w, es->h); } @@ -368,7 +359,6 @@ e_shelf_layer_set(E_Shelf *es, int layer) e_popup_layer_set(es->popup, es->layer); else { - evas_object_layer_set(es->o_hide, es->layer + 1); evas_object_layer_set(es->o_event, es->layer); evas_object_layer_set(es->o_base, es->layer); } @@ -600,17 +590,15 @@ e_shelf_popup_set(E_Shelf *es, int popup) e_popup_layer_set(es->popup, es->cfg->layer); es->ee = es->popup->ecore_evas; es->evas = es->popup->evas; - evas_object_show(es->o_hide); + es->win = es->popup->evas_win; evas_object_show(es->o_event); evas_object_show(es->o_base); e_popup_edje_bg_object_set(es->popup, es->o_base); } else { - evas_object_move(es->o_hide, es->zone->x + es->x, es->zone->y + es->y); evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y); evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y); - evas_object_layer_set(es->o_hide, es->cfg->layer); evas_object_layer_set(es->o_event, es->cfg->layer); evas_object_layer_set(es->o_base, es->cfg->layer); } @@ -664,6 +652,7 @@ e_shelf_config_new(E_Zone *zone, E_Config_Shelf *cf_es) static void _e_shelf_free(E_Shelf *es) { + E_FREE_LIST(es->handlers, ecore_event_handler_del); if (es->hide_animator) { ecore_animator_del(es->hide_animator); @@ -686,7 +675,6 @@ _e_shelf_free(E_Shelf *es) e_object_del(E_OBJECT(es->gadcon)); evas_stringshare_del(es->name); evas_stringshare_del(es->style); - evas_object_del(es->o_hide); evas_object_del(es->o_event); evas_object_del(es->o_base); if (es->popup) @@ -1205,23 +1193,84 @@ _e_shelf_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_inf } } -static void -_e_shelf_cb_mouse_in(void *data, Evas *evas, Evas_Object *obj, void *event_info) +static int +_e_shelf_cb_mouse_in(void *data, int type, void *event) { - E_Shelf *es; + E_Event_Zone_Edge_In *ev; + E_Shelf *es; + int show = 0; + ev = event; es = data; - edje_object_signal_emit(es->o_base, "e,state,focused", "e"); - if (!es->cfg->autohide_show_action) e_shelf_toggle(es, 1); + switch (es->gadcon->orient) + { + case E_GADCON_ORIENT_LEFT: + if ((ev->edge == E_ZONE_EDGE_LEFT) && (ev->y >= es->y) && (ev->y <= (es->y + es->h))) + show = 1; + break; + case E_GADCON_ORIENT_RIGHT: + if ((ev->edge == E_ZONE_EDGE_RIGHT) && (ev->y >= es->y) && (ev->y <= (es->y + es->h))) + show = 1; + break; + case E_GADCON_ORIENT_TOP: + if ((ev->edge == E_ZONE_EDGE_TOP) && (ev->x >= es->x) && (ev->x <= (es->x + es->w))) + show = 1; + break; + case E_GADCON_ORIENT_BOTTOM: + if ((ev->edge == E_ZONE_EDGE_BOTTOM) && (ev->x >= es->x) && (ev->x <= (es->x + es->w))) + show = 1; + break; + case E_GADCON_ORIENT_CORNER_TL: + case E_GADCON_ORIENT_CORNER_LT: + if ((ev->edge == E_ZONE_EDGE_TOP) && (ev->x >= es->x) && (ev->x <= (es->x + es->w))) + show = 1; + else if ((ev->edge == E_ZONE_EDGE_LEFT) && (ev->y >= es->y) && (ev->y <= (es->y + es->h))) + show = 1; + break; + case E_GADCON_ORIENT_CORNER_TR: + case E_GADCON_ORIENT_CORNER_RT: + if ((ev->edge == E_ZONE_EDGE_TOP) && (ev->x >= es->x) && (ev->x <= (es->x + es->w))) + show = 1; + else if ((ev->edge == E_ZONE_EDGE_RIGHT) && (ev->y >= es->y) && (ev->y <= (es->y + es->h))) + show = 1; + break; + case E_GADCON_ORIENT_CORNER_BL: + case E_GADCON_ORIENT_CORNER_LB: + if ((ev->edge == E_ZONE_EDGE_BOTTOM) && (ev->x >= es->x) && (ev->x <= (es->x + es->w))) + show = 1; + else if ((ev->edge == E_ZONE_EDGE_LEFT) && (ev->y >= es->y) && (ev->y <= (es->y + es->h))) + show = 1; + break; + case E_GADCON_ORIENT_CORNER_BR: + case E_GADCON_ORIENT_CORNER_RB: + if ((ev->edge == E_ZONE_EDGE_BOTTOM) && (ev->x >= es->x) && (ev->x <= (es->x + es->w))) + show = 1; + else if ((ev->edge == E_ZONE_EDGE_RIGHT) && (ev->y >= es->y) && (ev->y <= (es->y + es->h))) + show = 1; + break; + default: + break; + } + + if (show) + { + edje_object_signal_emit(es->o_base, "e,state,focused", "e"); + if (!es->cfg->autohide_show_action) e_shelf_toggle(es, 1); + } + return 1; } -static void -_e_shelf_cb_mouse_out(void *data, Evas *evas, Evas_Object *obj, void *event_info) +static int +_e_shelf_cb_mouse_out(void *data, int type, void *event) { - E_Shelf *es; + Ecore_X_Event_Mouse_Out *ev; + E_Shelf *es; + ev = event; es = data; + if (ev->win != es->win) return 1; e_shelf_toggle(es, 0); + return 1; } static int diff --git a/src/bin/e_shelf.h b/src/bin/e_shelf.h index 8da870781..385b28434 100644 --- a/src/bin/e_shelf.h +++ b/src/bin/e_shelf.h @@ -21,9 +21,9 @@ struct _E_Shelf E_Zone *zone; Evas_Object *o_base; Evas_Object *o_event; - Evas_Object *o_hide; Ecore_Evas *ee; Evas *evas; + Ecore_X_Window win; E_Gadcon *gadcon; const char *name; const char *style; @@ -42,6 +42,7 @@ struct _E_Shelf int interrupted; float instant_delay; Ecore_Timer *instant_timer; + Evas_List *handlers; }; EAPI int e_shelf_init(void);