Enlightenment CVS committal Author : onefang Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_int_menus.c e_menu.c e_menu.h Log Message: Added Drag'n'Drop from application menus to ibar and anything else that can accept an E_App drop. =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_int_menus.c,v retrieving revision 1.151 retrieving revision 1.152 diff -u -3 -r1.151 -r1.152 --- e_int_menus.c 22 Aug 2006 02:05:58 -0000 1.151 +++ e_int_menus.c 22 Aug 2006 08:38:24 -0000 1.152 @@ -33,6 +33,8 @@ static void _e_int_menus_apps_del_hook (void *obj); static void _e_int_menus_apps_free_hook (void *obj); static void _e_int_menus_apps_run (void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_int_menus_apps_drag (void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_int_menus_apps_drag_finished(E_Drag *drag, int dropped); static void _e_int_menus_config_pre_cb (void *data, E_Menu *m); static void _e_int_menus_config_free_hook (void *obj); static void _e_int_menus_config_item_cb (void *data, E_Menu *m, E_Menu_Item *mi); @@ -472,6 +474,7 @@ if (a->icon_path) e_menu_item_icon_path_set(mi, a->icon_path); } e_menu_item_callback_set(mi, _e_int_menus_apps_run, a); + e_menu_item_drag_callback_set(mi, _e_int_menus_apps_drag, a); app_count++; } else @@ -538,6 +541,41 @@ a = data; e_zone_app_exec(m->zone, a); e_exehist_add("menu/apps", a->exe); +} + +static void +_e_int_menus_apps_drag(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_App *a; + + a = data; + + /* start drag! */ + if (mi->icon_object) + { + E_Drag *drag; + Evas_Object *o = NULL; + Evas_Coord x, y, w, h; + const char *file = NULL, *part = NULL; + const char *drag_types[] = { "enlightenment/eapp" }; + + evas_object_geometry_get(mi->icon_object, + &x, &y, &w, &h); + drag = e_drag_new(m->zone->container, x, y, + drag_types, 1, a, -1, _e_int_menus_apps_drag_finished); + + o = e_app_icon_add(e_drag_evas_get(drag), a); + e_drag_object_set(drag, o); + e_drag_resize(drag, w, h); + e_object_ref(E_OBJECT(a)); + e_drag_start(drag, mi->drag.x + w, mi->drag.y + h); + } +} + +static void +_e_int_menus_apps_drag_finished(E_Drag *drag, int dropped) +{ + e_object_unref(E_OBJECT(drag->data)); } static void =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_menu.c,v retrieving revision 1.61 retrieving revision 1.62 diff -u -3 -r1.61 -r1.62 --- e_menu.c 22 Aug 2006 07:39:10 -0000 1.61 +++ e_menu.c 22 Aug 2006 08:38:24 -0000 1.62 @@ -92,6 +92,8 @@ static Evas_Hash *_e_menu_categories = NULL; static Ecore_X_Time _e_menu_activate_time = 0; static int _e_menu_activate_floating = 0; +static int _e_menu_activate_maybe_drag = 0; +static int _e_menu_activate_dragging = 0; static Ecore_Timer *_e_menu_scroll_timer = NULL; static double _e_menu_scroll_start = 0.0; static int _e_menu_x = 0; @@ -779,6 +781,15 @@ } EAPI void +e_menu_item_drag_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data) +{ + E_OBJECT_CHECK(mi); + E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE); + mi->drag_cb.func = func; + mi->drag_cb.data = data; +} + +EAPI void e_menu_item_active_set(E_Menu_Item *mi, int active) { E_OBJECT_CHECK(mi); @@ -1778,6 +1789,9 @@ m->parent_item = NULL; e_object_unref(E_OBJECT(m)); } + _e_menu_activate_floating = 0; + _e_menu_activate_maybe_drag = 0; + _e_menu_activate_dragging = 0; } static void @@ -2473,9 +2487,24 @@ _e_menu_cb_item_out(void *data, Evas *evas, Evas_Object *obj, void *event_info) { E_Menu_Item *mi; + Evas_Event_Mouse_In *ev; mi = data; + ev = event_info; e_menu_item_active_set(mi, 0); + if (_e_menu_activate_maybe_drag) + { + if (mi->drag_cb.func) + { + /* User is dragging a draggable item elsewhere. */ + mi->drag.x = ev->output.x - (ev->output.x - mi->x); + mi->drag.y = ev->output.y - (ev->output.y - mi->y); + _e_menu_deactivate_all(); + mi->drag_cb.func(mi->drag_cb.data, mi->menu, mi); + } + /* Either way, the maybe drag stops here. */ + _e_menu_activate_maybe_drag = 0; + } } static int @@ -2560,6 +2589,15 @@ ev = event; if (ev->win != _e_menu_win) return 1; + + /* Only allow dragging from floating menus for now. + * The reason for this is that for non floating menus, + * the mouse is already down and dragging, so the decision + * to start a drag is much more complex. + */ + if (_e_menu_activate_floating) + _e_menu_activate_maybe_drag = 1; + return 1; } @@ -2568,11 +2606,11 @@ { Ecore_X_Event_Mouse_Button_Up *ev; Ecore_X_Time t; - int ret; + int ret = 0; ev = event; if (ev->win != _e_menu_win) return 1; - + t = ev->time - _e_menu_activate_time; if ((_e_menu_activate_time != 0) && (t < (e_config->menus_click_drag_timeout * 1000))) @@ -2581,7 +2619,16 @@ return 1; } - ret = _e_menu_active_call(); + if (_e_menu_activate_dragging) + { + /* FIXME: This is a drop, which is not allowed for now. + * Once dragging is working, this will be subject to some experimenattion. + */ + } + else + ret = _e_menu_active_call(); + _e_menu_activate_maybe_drag = 0; + _e_menu_activate_dragging = 0; if (ret == 1) { /* allow mouse to pop down menu if clicked elsewhere */ @@ -2617,6 +2664,7 @@ is_fast = 1; // printf("d=%i dt=%3.9f fast_move_threshold=%3.3f ---> FAST=%i\n", // d, dt, fast_move_threshold, is_fast); + for (l = _e_active_menus; l; l = l->next) { tmp = evas_list_append(tmp, l->data); =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_menu.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -3 -r1.21 -r1.22 --- e_menu.h 21 Aug 2006 20:03:09 -0000 1.21 +++ e_menu.h 22 Aug 2006 08:38:24 -0000 1.22 @@ -130,6 +130,15 @@ void (*func) (void *data, E_Menu *m, E_Menu_Item *mi); } submenu_post_cb; + struct { + void *data; + void (*func) (void *data, E_Menu *m, E_Menu_Item *mi); + } drag_cb; /* Callback for menu item dragging */ + + struct { + int x, y; + } drag; + unsigned char separator : 1; unsigned char radio : 1; unsigned char check : 1; @@ -190,6 +199,7 @@ EAPI void e_menu_item_realize_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data); EAPI void e_menu_item_submenu_pre_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data); EAPI void e_menu_item_submenu_post_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data); +EAPI void e_menu_item_drag_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data); EAPI void e_menu_item_active_set(E_Menu_Item *mi, int active); EAPI void e_menu_idler_before(void); ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs