Enlightenment CVS committal Author : urandom Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_shelf.c e_shelf.h Log Message: Shelf hiding based on Hannes Janetzek's patch. e,state,hidden|visible are still available to themers, to do something interesting while the shelf is being moved. =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_shelf.c,v retrieving revision 1.51 retrieving revision 1.52 diff -u -3 -r1.51 -r1.52 --- e_shelf.c 25 Mar 2007 22:45:00 -0000 1.51 +++ e_shelf.c 6 Apr 2007 19:01:29 -0000 1.52 @@ -20,6 +20,8 @@ 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_id_sort(void *data1, void *data2); +static int _e_shelf_cb_hide_timer(void *data); +static int _e_shelf_cb_hide_animator(void *data); static void _e_shelf_menu_del_hook(void *data); static void _e_shelf_menu_pre_cb(void *data, E_Menu *m); @@ -98,6 +100,7 @@ e_shelf_zone_new(E_Zone *zone, const char *name, const char *style, int popup, int layer, int id) { E_Shelf *es; + const char *option; char buf[1024]; es = E_OBJECT_ALLOC(E_Shelf, E_SHELF_TYPE, _e_shelf_free); @@ -134,7 +137,7 @@ evas_object_event_callback_add(es->o_event, EVAS_CALLBACK_MOUSE_UP, _e_shelf_cb_mouse_up, es); evas_object_event_callback_add(es->o_event, EVAS_CALLBACK_MOUSE_IN, _e_shelf_cb_mouse_in, es); evas_object_event_callback_add(es->o_event, EVAS_CALLBACK_MOUSE_OUT, _e_shelf_cb_mouse_out, es); - + es->o_base = edje_object_add(es->evas); es->name = evas_stringshare_add(name); snprintf(buf, sizeof(buf), "e/shelf/%s/base", es->style); @@ -165,6 +168,7 @@ e_gadcon_min_size_request_callback_set(es->gadcon, _e_shelf_gadcon_min_size_request, es); + e_gadcon_size_request_callback_set(es->gadcon, _e_shelf_gadcon_size_request, es); @@ -187,6 +191,19 @@ shelves = evas_list_append(shelves, es); shelves = evas_list_sort(shelves, -1, _e_shelf_cb_id_sort); + + es->hide_step = 0; + es->hide_timer = NULL; + es->hide_animator = NULL; + + option = edje_object_data_get(es->o_base, "hidden_state_size"); + if (option) + es->hidden_state_size = atoi(option); + else + es->hidden_state_size = 4; + + es->hide_origin = -1; + return es; } @@ -468,12 +485,15 @@ default: break; } + es->hide_step = 0; + e_shelf_move_resize(es, es->x, es->y, es->w, es->h); } EAPI void e_shelf_style_set(E_Shelf *es, const char *style) { + const char *option; char buf[1024]; E_OBJECT_CHECK(es); @@ -493,6 +513,14 @@ if (!e_theme_edje_object_set(es->o_base, "base/theme/shelf", buf)) e_theme_edje_object_set(es->o_base, "base/theme/shelf", "e/shelf/default/base"); + + option = edje_object_data_get(es->o_base, "hidden_state_size"); + if (option) + es->hidden_state_size = atoi(option); + else + es->hidden_state_size = 4; + + es->hide_origin = -1; e_gadcon_unpopulate(es->gadcon); e_gadcon_populate(es->gadcon); } @@ -534,6 +562,12 @@ ecore_timer_del(es->hide_timer); es->hide_timer = NULL; } + if (es->hide_animator) + { + ecore_animator_del(es->hide_animator); + es->hide_animator = NULL; + } + if (es->menu) { e_menu_post_deactivate_callback_set(es->menu, NULL, NULL); @@ -689,7 +723,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; if (nh != es->h) ny = (es->zone->h - nh) / 2; - nx = 0; + // nx = 0; break; case E_GADCON_ORIENT_RIGHT: if (!es->fit_along) nh = es->h; @@ -697,7 +731,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; if (nh != es->h) ny = (es->zone->h - nh) / 2; - nx = es->zone->w - nw; + // nx = es->zone->w - nw; break; case E_GADCON_ORIENT_TOP: if (!es->fit_along) nw = es->w; @@ -705,7 +739,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; if (nw != es->w) nx = (es->zone->w - nw) / 2; - ny = 0; + // ny = 0; break; case E_GADCON_ORIENT_BOTTOM: if (!es->fit_along) nw = es->w; @@ -713,7 +747,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; if (nw != es->w) nx = (es->zone->w - nw) / 2; - ny = es->zone->h - nh; + //ny = es->zone->h - nh; break; case E_GADCON_ORIENT_CORNER_TL: if (!es->fit_along) nw = es->w; @@ -721,7 +755,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; if (nw != es->w) nx = 0; - ny = 0; + // ny = 0; break; case E_GADCON_ORIENT_CORNER_TR: if (!es->fit_along) nw = es->w; @@ -729,7 +763,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; nx = es->zone->w - nw; - ny = 0; + // ny = 0; break; case E_GADCON_ORIENT_CORNER_BL: if (!es->fit_along) nw = es->w; @@ -737,7 +771,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; if (nw != es->w) nx = 0; - ny = es->zone->h - nh; + // ny = es->zone->h - nh; break; case E_GADCON_ORIENT_CORNER_BR: if (!es->fit_along) nw = es->w; @@ -745,7 +779,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; nx = es->zone->w - nw; - ny = es->zone->h - nh; + //ny = es->zone->h - nh; break; case E_GADCON_ORIENT_CORNER_LT: if (!es->fit_along) nh = es->h; @@ -753,7 +787,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; if (nh != es->h) ny = 0; - nx = 0; + // nx = 0; break; case E_GADCON_ORIENT_CORNER_RT: if (!es->fit_along) nh = es->h; @@ -761,7 +795,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; if (nh != es->h) ny = 0; - nx = es->zone->w - nw; + // nx = es->zone->w - nw; break; case E_GADCON_ORIENT_CORNER_LB: if (!es->fit_along) nh = es->h; @@ -769,7 +803,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; if (nh != es->h) ny = es->zone->h - nh; - nx = 0; + // nx = 0; break; case E_GADCON_ORIENT_CORNER_RB: if (!es->fit_along) nh = es->h; @@ -777,7 +811,7 @@ if (nw > es->zone->w) nw = es->zone->w; if (nh > es->zone->h) nh = es->zone->h; if (nh != es->h) ny = es->zone->h - nh; - nx = es->zone->w - nw; + // nx = es->zone->w - nw; break; default: break; @@ -971,41 +1005,25 @@ { Evas_Event_Mouse_In *ev; E_Shelf *es; - + es = data; ev = event_info; edje_object_signal_emit(es->o_base, "e,state,focused", "e"); if (es->cfg->autohide) { - if (es->hidden) - { + if (es->hidden) + { es->hidden = 0; edje_object_signal_emit(es->o_base, "e,state,visible", "e"); + if(!es->hide_animator) + es->hide_animator = ecore_animator_add(_e_shelf_cb_hide_animator, es); + if (es->hide_timer) + { + ecore_timer_del(es->hide_timer); + es->hide_timer = NULL; + } } } - if (es->hide_timer) - { - ecore_timer_del(es->hide_timer); - es->hide_timer = NULL; - } -} - -static int -_e_shelf_cb_hide_timer(void *data) -{ - E_Shelf *es; - - es = data; - if (!e_menu_grab_window_get()) - { - if (!es->hidden) - { - edje_object_signal_emit(es->o_base, "e,state,hidden", "e"); - } - } - es->hide_timer = NULL; - es->hidden = 1; - return 0; } static void @@ -1013,18 +1031,22 @@ { Evas_Event_Mouse_Out *ev; E_Shelf *es; - + es = data; ev = event_info; if (es->cfg->autohide) { Evas_Coord x, y, w, h; - + evas_object_geometry_get(es->o_base, &x, &y, &w, &h); if (!E_INSIDE(ev->canvas.x, ev->canvas.y, x, y, w, h)) { - if (es->hide_timer) ecore_timer_del(es->hide_timer); - es->hide_timer = ecore_timer_add(0.25, _e_shelf_cb_hide_timer, es); + if(!es->hidden) + { + es->hidden = 1; + if(!es->hide_timer) + es->hide_timer = ecore_timer_add(1.0, _e_shelf_cb_hide_timer, es); + } } } edje_object_signal_emit(es->o_base, "e,state,unfocused", "e"); @@ -1038,6 +1060,217 @@ es1 = data1; es2 = data2; return (es1->id) > (es2->id); +} + +static int +_e_shelf_cb_hide_timer(void *data) +{ + E_Shelf *es; + + es = data; + + if(!es->hide_animator) + es->hide_animator = ecore_animator_add(_e_shelf_cb_hide_animator, es); + + edje_object_signal_emit(es->o_base, "e,state,hidden", "e"); + if(es->hide_timer) + { + ecore_timer_del(es->hide_timer); + es->hide_timer = NULL; + } + return 1; +} + +static int +_e_shelf_cb_hide_animator(void *data) +{ + E_Shelf *es; + int step = 2, move = 0; + + es = data; + + switch(es->gadcon->orient) + { + case E_GADCON_ORIENT_TOP: + case E_GADCON_ORIENT_CORNER_TL: + case E_GADCON_ORIENT_CORNER_TR: + /* TODO: step coefficient needs to be configurable */ + step = ((es->h - es->hidden_state_size) / e_config->framerate) * 2; + if(es->hidden) + { + if (es->hide_origin == -1) es->hide_origin = es->y; + if (es->hide_step < es->h - es->hidden_state_size) + { + if (es->hide_step + step > es->h - es->hidden_state_size) + { + move = es->hide_origin - es->h + es->hidden_state_size; + es->hide_step = es->h - es->hidden_state_size; + } + else + { + move = es->y - step; + es->hide_step += step; + } + e_shelf_move(es, es->x, move); + } + else goto end; + } + else + { + if(es->hide_step > 0) + { + if (es->hide_step < step) + { + move = es->hide_origin; + es->hide_step = 0; + } + else + { + move = es->y + step; + es->hide_step -= step; + } + e_shelf_move(es, es->x, move); + } + else goto end; + } + break; + case E_GADCON_ORIENT_BOTTOM: + case E_GADCON_ORIENT_CORNER_BL: + case E_GADCON_ORIENT_CORNER_BR: + step = ((es->h - es->hidden_state_size) / e_config->framerate) * 2; + if(es->hidden) + { + if (es->hide_origin == -1) es->hide_origin = es->y; + if (es->hide_step < es->h - es->hidden_state_size) + { + if (es->hide_step + step > es->h - es->hidden_state_size) + { + move = es->hide_origin + es->h - es->hidden_state_size; + es->hide_step = es->h - es->hidden_state_size; + } + else + { + move = es->y + step; + es->hide_step += step; + } + e_shelf_move(es, es->x, move); + } + else goto end; + } + else + { + if(es->hide_step > 0) + { + if (es->hide_step < step) + { + move = es->hide_origin; + es->hide_step = 0; + } + else + { + move = es->y - step; + es->hide_step -= step; + } + e_shelf_move(es, es->x, move); + } + else goto end; + } + + break; + case E_GADCON_ORIENT_LEFT: + case E_GADCON_ORIENT_CORNER_LB: + case E_GADCON_ORIENT_CORNER_LT: + step = ((es->w - es->hidden_state_size) / e_config->framerate) * 2; + if(es->hidden) + { + if (es->hide_origin == -1) es->hide_origin = es->x; + if (es->hide_step < es->w - es->hidden_state_size) + { + if (es->hide_step + step > es->w - es->hidden_state_size) + { + move = es->hide_origin - es->w + es->hidden_state_size; + es->hide_step = es->w - es->hidden_state_size; + } + else + { + move = es->x - step; + es->hide_step += step; + } + e_shelf_move(es, move, es->y); + } + else goto end; + } + else + { + if (es->hide_step > 0) + { + if (es->hide_step < step) + { + move = es->hide_origin; + es->hide_step = 0; + } + else + { + move = es->x + step; + es->hide_step -= step; + } + e_shelf_move(es, move, es->y); + } + else goto end; + } + + break; + case E_GADCON_ORIENT_RIGHT: + case E_GADCON_ORIENT_CORNER_RB: + case E_GADCON_ORIENT_CORNER_RT: + step = ((es->w - es->hidden_state_size) / e_config->framerate) * 2; + if(es->hidden) + { + if (es->hide_origin == -1) es->hide_origin = es->x; + if (es->hide_step < es->w - es->hidden_state_size) + { + if (es->hide_step + step > es->w - es->hidden_state_size) + { + move = es->hide_origin + es->w - es->hidden_state_size; + es->hide_step = es->w - es->hidden_state_size; + } + else + { + move = es->x + step; + es->hide_step += step; + } + e_shelf_move(es, move, es->y); + } + else goto end; + } + else + { + if (es->hide_step > 0) + { + if (es->hide_step < step) + { + move = es->hide_origin; + es->hide_step = 0; + } + else + { + move = es->x - step; + es->hide_step -= step; + } + e_shelf_move(es, move, es->y); + } + else goto end; + } + break; + default: + break; + } + return 1; + +end: + ecore_animator_del(es->hide_animator); + es->hide_animator = NULL; + return 1; } static void =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_shelf.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -3 -r1.17 -r1.18 --- e_shelf.h 2 Mar 2007 17:00:20 -0000 1.17 +++ e_shelf.h 6 Apr 2007 19:01:29 -0000 1.18 @@ -28,12 +28,16 @@ const char *style; E_Config_Shelf *cfg; unsigned char fit_along : 1; - unsigned char fit_size : 1; - unsigned char hidden : 1; + unsigned char fit_size : 1; + unsigned char hidden : 1; int size; E_Config_Dialog *config_dialog; E_Menu *menu; Ecore_Timer *hide_timer; + Ecore_Animator *hide_animator; + int hide_step; + int hidden_state_size; + int hide_origin; }; EAPI int e_shelf_init(void); ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs