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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs