diff --git a/src/bin/e_gadcon.c b/src/bin/e_gadcon.c index af151e9a2..32a87322c 100644 --- a/src/bin/e_gadcon.c +++ b/src/bin/e_gadcon.c @@ -1349,6 +1349,9 @@ _e_gadcon_cb_client_scroll_animator(void *data) return 0; } + if (gcc->scroll_cb.func) + gcc->scroll_cb.func(gcc->scroll_cb.data); + return 1; } @@ -1397,6 +1400,13 @@ e_gadcon_client_autoscroll_update(E_Gadcon_Client *gcc, Evas_Coord x, Evas_Coord } } +EAPI void +e_gadcon_client_autoscroll_cb_set(E_Gadcon_Client *gcc, void (*func)(void *data), void *data) +{ + gcc->scroll_cb.func = func; + gcc->scroll_cb.data = data; +} + static void _e_gadcon_cb_client_frame_moveresize(void *data, Evas *e, Evas_Object *obj, void *event_info) { diff --git a/src/bin/e_gadcon.h b/src/bin/e_gadcon.h index d3f073fe7..700c0a4a3 100644 --- a/src/bin/e_gadcon.h +++ b/src/bin/e_gadcon.h @@ -131,6 +131,11 @@ struct _E_Gadcon_Client Ecore_Animator *scroll_animator; double scroll_pos; double scroll_wanted; + struct { + void *data; + void (*func) (void *data); + } scroll_cb; + E_Menu *menu; const char *style; unsigned char autoscroll : 1; @@ -139,6 +144,7 @@ struct _E_Gadcon_Client unsigned char moving : 1; unsigned char resizing : 1; Evas_Coord dx, dy; + }; EAPI int e_gadcon_init(void); @@ -176,6 +182,7 @@ EAPI void e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Co EAPI void e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h); EAPI void e_gadcon_client_autoscroll_set(E_Gadcon_Client *gcc, int autoscroll); EAPI void e_gadcon_client_autoscroll_update(E_Gadcon_Client *gcc, int mx, int my); +EAPI void e_gadcon_client_autoscroll_cb_set(E_Gadcon_Client *gcc, void (*func)(void *data), void *data); EAPI void e_gadcon_client_resizable_set(E_Gadcon_Client *gcc, int resizable); EAPI void e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu, int flags); diff --git a/src/modules/ibar/e_mod_main.c b/src/modules/ibar/e_mod_main.c index cdf983e06..015ac39a1 100644 --- a/src/modules/ibar/e_mod_main.c +++ b/src/modules/ibar/e_mod_main.c @@ -56,6 +56,7 @@ struct _IBar Evas_List *icons; int show_label; int eap_label; + Evas_Coord dnd_x, dnd_y; }; struct _IBar_Icon @@ -110,6 +111,8 @@ static void _ibar_inst_cb_enter(void *data, const char *type, void *event_info); static void _ibar_inst_cb_move(void *data, const char *type, void *event_info); static void _ibar_inst_cb_leave(void *data, const char *type, void *event_info); static void _ibar_inst_cb_drop(void *data, const char *type, void *event_info); +static void _ibar_drop_position_update(Instance *inst, Evas_Coord x, Evas_Coord y); +static void _ibar_inst_cb_scroll(void *data); static E_Config_DD *conf_edd = NULL; static E_Config_DD *conf_item_edd = NULL; @@ -1060,82 +1063,31 @@ _ibar_cb_drop_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) } static void -_ibar_inst_cb_enter(void *data, const char *type, void *event_info) +_ibar_inst_cb_scroll(void *data) { - E_Event_Dnd_Enter *ev; Instance *inst; - Evas_Object *o, *o2; - IBar_Icon *ic; - Evas_Coord xx, yy; - int x, y; - - ev = event_info; + + /* Update the position of the dnd to handle for autoscrolling + * gadgets. */ inst = data; - o = edje_object_add(evas_object_evas_get(inst->ibar->o_box)); - inst->ibar->o_drop = o; - o2 = edje_object_add(evas_object_evas_get(inst->ibar->o_box)); - inst->ibar->o_drop_over = o2; - evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _ibar_cb_drop_move, inst->ibar); - evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _ibar_cb_drop_resize, inst->ibar); - e_theme_edje_object_set(o, "base/theme/modules/ibar", - "e/modules/ibar/drop"); - e_theme_edje_object_set(o2, "base/theme/modules/ibar", - "e/modules/ibar/drop_overlay"); - evas_object_layer_set(o2, 19999); - evas_object_show(o); - evas_object_show(o2); - evas_object_geometry_get(inst->ibar->o_box, &xx, &yy, NULL, NULL); - e_box_align_pixel_offset_get(inst->gcc->o_box, &x, &y); - ic = _ibar_icon_at_coord(inst->ibar, ev->x + xx + x, ev->y + yy + y); - inst->ibar->ic_drop_before = ic; - if (ic) - { - Evas_Coord ix, iy, iw, ih; - int before = 0; - - evas_object_geometry_get(ic->o_holder, &ix, &iy, &iw, &ih); - if (e_box_orientation_get(inst->ibar->o_box)) - { - if ((ev->x + xx) < (ix + (iw / 2))) before = 1; - } - else - { - if ((ev->y + yy) < (iy + (ih / 2))) before = 1; - } - if (before) - e_box_pack_before(inst->ibar->o_box, inst->ibar->o_drop, ic->o_holder); - else - e_box_pack_after(inst->ibar->o_box, inst->ibar->o_drop, ic->o_holder); - inst->ibar->drop_before = before; - } - else e_box_pack_end(inst->ibar->o_box, o); - e_box_pack_options_set(o, - 1, 1, /* fill */ - 0, 0, /* expand */ - 0.5, 0.5, /* align */ - 1, 1, /* min */ - -1, -1 /* max */ - ); - _ibar_resize_handle(inst->ibar); - _gc_orient(inst->gcc); - e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y); + _ibar_drop_position_update(inst, inst->ibar->dnd_x, inst->ibar->dnd_y); } static void -_ibar_inst_cb_move(void *data, const char *type, void *event_info) +_ibar_drop_position_update(Instance *inst, Evas_Coord x, Evas_Coord y) { - E_Event_Dnd_Move *ev; - Instance *inst; - IBar_Icon *ic; Evas_Coord xx, yy; - int x, y; - - ev = event_info; - inst = data; - e_box_unpack(inst->ibar->o_drop); + int ox, oy; + IBar_Icon *ic; + + inst->ibar->dnd_x = x; + inst->ibar->dnd_y = y; + + if (inst->ibar->o_drop) + e_box_unpack(inst->ibar->o_drop); evas_object_geometry_get(inst->ibar->o_box, &xx, &yy, NULL, NULL); - e_box_align_pixel_offset_get(inst->gcc->o_box, &x, &y); - ic = _ibar_icon_at_coord(inst->ibar, ev->x + xx + x, ev->y + yy + y); + e_box_align_pixel_offset_get(inst->gcc->o_box, &ox, &oy); + ic = _ibar_icon_at_coord(inst->ibar, x + xx + ox, y + yy + oy); inst->ibar->ic_drop_before = ic; if (ic) { @@ -1145,11 +1097,11 @@ _ibar_inst_cb_move(void *data, const char *type, void *event_info) evas_object_geometry_get(ic->o_holder, &ix, &iy, &iw, &ih); if (e_box_orientation_get(inst->ibar->o_box)) { - if ((ev->x + xx) < (ix + (iw / 2))) before = 1; + if ((x + xx) < (ix + (iw / 2))) before = 1; } else { - if ((ev->y + yy) < (iy + (ih / 2))) before = 1; + if ((y + yy) < (iy + (ih / 2))) before = 1; } if (before) e_box_pack_before(inst->ibar->o_box, inst->ibar->o_drop, ic->o_holder); @@ -1167,6 +1119,50 @@ _ibar_inst_cb_move(void *data, const char *type, void *event_info) ); _ibar_resize_handle(inst->ibar); _gc_orient(inst->gcc); +} + +static void +_ibar_inst_cb_enter(void *data, const char *type, void *event_info) +{ + E_Event_Dnd_Enter *ev; + Instance *inst; + Evas_Object *o, *o2; + + ev = event_info; + inst = data; + o = edje_object_add(evas_object_evas_get(inst->ibar->o_box)); + inst->ibar->o_drop = o; + o2 = edje_object_add(evas_object_evas_get(inst->ibar->o_box)); + inst->ibar->o_drop_over = o2; + evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _ibar_cb_drop_move, inst->ibar); + evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _ibar_cb_drop_resize, inst->ibar); + e_theme_edje_object_set(o, "base/theme/modules/ibar", + "e/modules/ibar/drop"); + e_theme_edje_object_set(o2, "base/theme/modules/ibar", + "e/modules/ibar/drop_overlay"); + evas_object_layer_set(o2, 19999); + evas_object_show(o); + evas_object_show(o2); + + _ibar_drop_position_update(inst, ev->x, ev->y); + e_gadcon_client_autoscroll_cb_set(inst->gcc, _ibar_inst_cb_scroll, inst); + e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y); +} + +static void +_ibar_inst_cb_move(void *data, const char *type, void *event_info) +{ + E_Event_Dnd_Move *ev; + Instance *inst; + IBar_Icon *ic; + Evas_Coord xx, yy; + int x, y; + int wx, wy; + + ev = event_info; + inst = data; + + _ibar_drop_position_update(inst, ev->x, ev->y); e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y); } @@ -1184,6 +1180,7 @@ _ibar_inst_cb_leave(void *data, const char *type, void *event_info) evas_object_del(inst->ibar->o_drop_over); inst->ibar->o_drop_over = NULL; _ibar_resize_handle(inst->ibar); + e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL); _gc_orient(inst->gcc); } @@ -1198,6 +1195,7 @@ _ibar_inst_cb_drop(void *data, const char *type, void *event_info) ev = event_info; inst = data; + if (!strcmp(type, "enlightenment/eapp")) { app = ev->data; @@ -1282,9 +1280,11 @@ _ibar_inst_cb_drop(void *data, const char *type, void *event_info) inst->ibar->o_drop = NULL; evas_object_del(inst->ibar->o_drop_over); inst->ibar->o_drop_over = NULL; + e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL); _ibar_empty_handle(inst->ibar); _ibar_resize_handle(inst->ibar); _gc_orient(inst->gcc); + } /***************************************************************************/ diff --git a/src/modules/ibox/e_mod_main.c b/src/modules/ibox/e_mod_main.c index a656341a7..a19693a8a 100644 --- a/src/modules/ibox/e_mod_main.c +++ b/src/modules/ibox/e_mod_main.c @@ -57,6 +57,7 @@ struct _IBox int show_desk; int icon_label; E_Zone *zone; + Evas_Coord dnd_x, dnd_y; }; struct _IBox_Icon @@ -108,6 +109,8 @@ static void _ibox_inst_cb_enter(void *data, const char *type, void *event_info); static void _ibox_inst_cb_move(void *data, const char *type, void *event_info); static void _ibox_inst_cb_leave(void *data, const char *type, void *event_info); static void _ibox_inst_cb_drop(void *data, const char *type, void *event_info); +static void _ibox_drop_position_update(Instance *inst, Evas_Coord x, Evas_Coord y); +static void _ibox_inst_cb_scroll(void *data); static int _ibox_cb_event_border_add(void *data, int type, void *event); static int _ibox_cb_event_border_remove(void *data, int type, void *event); static int _ibox_cb_event_border_iconify(void *data, int type, void *event); @@ -812,6 +815,65 @@ _ibox_cb_drop_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) evas_object_resize(b->o_drop_over, w, h); } +static void +_ibox_inst_cb_scroll(void *data) +{ + Instance *inst; + + /* Update the position of the dnd to handle for autoscrolling + * gadgets. */ + inst = data; + _ibox_drop_position_update(inst, inst->ibox->dnd_x, inst->ibox->dnd_y); +} + +static void +_ibox_drop_position_update(Instance *inst, Evas_Coord x, Evas_Coord y) +{ + Evas_Coord xx, yy; + int ox, oy; + IBox_Icon *ic; + + inst->ibox->dnd_x = x; + inst->ibox->dnd_y = y; + + if (inst->ibox->o_drop) + e_box_unpack(inst->ibox->o_drop); + evas_object_geometry_get(inst->ibox->o_box, &xx, &yy, NULL, NULL); + e_box_align_pixel_offset_get(inst->gcc->o_box, &ox, &oy); + ic = _ibox_icon_at_coord(inst->ibox, x + xx + ox, y + yy + oy); + inst->ibox->ic_drop_before = ic; + if (ic) + { + Evas_Coord ix, iy, iw, ih; + int before = 0; + + evas_object_geometry_get(ic->o_holder, &ix, &iy, &iw, &ih); + if (e_box_orientation_get(inst->ibox->o_box)) + { + if ((x + xx) < (ix + (iw / 2))) before = 1; + } + else + { + if ((y + yy) < (iy + (ih / 2))) before = 1; + } + if (before) + e_box_pack_before(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder); + else + e_box_pack_after(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder); + inst->ibox->drop_before = before; + } + else e_box_pack_end(inst->ibox->o_box, inst->ibox->o_drop); + e_box_pack_options_set(inst->ibox->o_drop, + 1, 1, /* fill */ + 0, 0, /* expand */ + 0.5, 0.5, /* align */ + 1, 1, /* min */ + -1, -1 /* max */ + ); + _ibox_resize_handle(inst->ibox); + _gc_orient(inst->gcc); +} + static void _ibox_inst_cb_enter(void *data, const char *type, void *event_info) { @@ -837,40 +899,8 @@ _ibox_inst_cb_enter(void *data, const char *type, void *event_info) evas_object_layer_set(o2, 19999); evas_object_show(o); evas_object_show(o2); - evas_object_geometry_get(inst->ibox->o_box, &xx, &yy, NULL, NULL); - e_box_align_pixel_offset_get(inst->gcc->o_box, &x, &y); - ic = _ibox_icon_at_coord(inst->ibox, ev->x + xx + x, ev->y + yy + y); - inst->ibox->ic_drop_before = ic; - if (ic) - { - Evas_Coord ix, iy, iw, ih; - int before = 0; - - evas_object_geometry_get(ic->o_holder, &ix, &iy, &iw, &ih); - if (e_box_orientation_get(inst->ibox->o_box)) - { - if ((ev->x + xx) < (ix + (iw / 2))) before = 1; - } - else - { - if ((ev->y + yy) < (iy + (ih / 2))) before = 1; - } - if (before) - e_box_pack_before(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder); - else - e_box_pack_after(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder); - inst->ibox->drop_before = before; - } - else e_box_pack_end(inst->ibox->o_box, o); - e_box_pack_options_set(o, - 1, 1, /* fill */ - 0, 0, /* expand */ - 0.5, 0.5, /* align */ - 1, 1, /* min */ - -1, -1 /* max */ - ); - _ibox_resize_handle(inst->ibox); - _gc_orient(inst->gcc); + _ibox_drop_position_update(inst, ev->x, ev->y); + e_gadcon_client_autoscroll_cb_set(inst->gcc, _ibox_inst_cb_scroll, inst); e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y); } @@ -885,41 +915,7 @@ _ibox_inst_cb_move(void *data, const char *type, void *event_info) ev = event_info; inst = data; - e_box_unpack(inst->ibox->o_drop); - evas_object_geometry_get(inst->ibox->o_box, &xx, &yy, NULL, NULL); - e_box_align_pixel_offset_get(inst->gcc->o_box, &x, &y); - ic = _ibox_icon_at_coord(inst->ibox, ev->x + xx + x, ev->y + yy + y); - inst->ibox->ic_drop_before = ic; - if (ic) - { - Evas_Coord ix, iy, iw, ih; - int before = 0; - - evas_object_geometry_get(ic->o_holder, &ix, &iy, &iw, &ih); - if (e_box_orientation_get(inst->ibox->o_box)) - { - if ((ev->x + xx) < (ix + (iw / 2))) before = 1; - } - else - { - if ((ev->y + yy) < (iy + (ih / 2))) before = 1; - } - if (before) - e_box_pack_before(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder); - else - e_box_pack_after(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder); - inst->ibox->drop_before = before; - } - else e_box_pack_end(inst->ibox->o_box, inst->ibox->o_drop); - e_box_pack_options_set(inst->ibox->o_drop, - 1, 1, /* fill */ - 0, 0, /* expand */ - 0.5, 0.5, /* align */ - 1, 1, /* min */ - -1, -1 /* max */ - ); - _ibox_resize_handle(inst->ibox); - _gc_orient(inst->gcc); + _ibox_drop_position_update(inst, ev->x, ev->y); e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y); } @@ -936,6 +932,7 @@ _ibox_inst_cb_leave(void *data, const char *type, void *event_info) inst->ibox->o_drop = NULL; evas_object_del(inst->ibox->o_drop_over); inst->ibox->o_drop_over = NULL; + e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL); _ibox_resize_handle(inst->ibox); _gc_orient(inst->gcc); } @@ -1002,6 +999,7 @@ _ibox_inst_cb_drop(void *data, const char *type, void *event_info) evas_object_del(inst->ibox->o_drop_over); inst->ibox->o_drop_over = NULL; _ibox_empty_handle(b); + e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL); _ibox_resize_handle(inst->ibox); _gc_orient(inst->gcc); } diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c index 654ed4459..14ba1afb9 100644 --- a/src/modules/pager/e_mod_main.c +++ b/src/modules/pager/e_mod_main.c @@ -55,6 +55,7 @@ struct _Pager E_Drag *drag; unsigned char dragging : 1; unsigned char just_dragged : 1; + Evas_Coord dnd_x, dnd_y; }; struct _Pager_Desk @@ -124,6 +125,8 @@ static void _pager_inst_cb_enter(void *data, const char *type, void *event_info) static void _pager_inst_cb_move(void *data, const char *type, void *event_info); static void _pager_inst_cb_leave(void *data, const char *type, void *event_info); static void _pager_inst_cb_drop(void *data, const char *type, void *event_info); +static void _pager_inst_cb_scroll(void *data); +static void _pager_update_drop_position(Instance *inst, Evas_Coord x, Evas_Coord y); static void _pager_desk_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _pager_desk_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _pager_desk_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info); @@ -1503,30 +1506,27 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped) } static void -_pager_inst_cb_enter(void *data, const char *type, void *event_info) +_pager_inst_cb_scroll(void *data) { - E_Event_Dnd_Enter *ev; - Instance *inst; + Instance * inst; - ev = event_info; inst = data; + _pager_update_drop_position(inst, inst->pager->dnd_x, inst->pager->dnd_y); } static void -_pager_inst_cb_move(void *data, const char *type, void *event_info) +_pager_update_drop_position(Instance *inst, Evas_Coord x, Evas_Coord y) { - E_Event_Dnd_Move *ev; - Instance *inst; Pager_Desk *pd, *pd2; - Evas_List *l; Evas_Coord xx, yy; - int x, y; + int ox, oy; + Evas_List *l; - ev = event_info; - inst = data; + inst->pager->dnd_x = x; + inst->pager->dnd_y = y; evas_object_geometry_get(inst->pager->o_table, &xx, &yy, NULL, NULL); - e_box_align_pixel_offset_get(inst->gcc->o_box, &x, &y); - pd = _pager_desk_at_coord(inst->pager, ev->x + xx + x, ev->y + yy + y); + e_box_align_pixel_offset_get(inst->gcc->o_box, &ox, &oy); + pd = _pager_desk_at_coord(inst->pager, x + xx + ox, y + yy + oy); /* FIXME: keep track which one its over so we only emit drag in/out * when it actually goes form one desk to another */ for (l = inst->pager->desks; l; l = l->next) @@ -1537,6 +1537,30 @@ _pager_inst_cb_move(void *data, const char *type, void *event_info) else edje_object_signal_emit(pd2->o_desk, "e,action,drag,out", "e"); } +} + +static void +_pager_inst_cb_enter(void *data, const char *type, void *event_info) +{ + E_Event_Dnd_Enter *ev; + Instance *inst; + + ev = event_info; + inst = data; + _pager_update_drop_position(inst, ev->x, ev->y); + e_gadcon_client_autoscroll_cb_set(inst->gcc, _pager_inst_cb_scroll, inst); + e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y); +} + +static void +_pager_inst_cb_move(void *data, const char *type, void *event_info) +{ + E_Event_Dnd_Move *ev; + Instance *inst; + + ev = event_info; + inst = data; + _pager_update_drop_position(inst, ev->x, ev->y); e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y); } @@ -1558,6 +1582,8 @@ _pager_inst_cb_leave(void *data, const char *type, void *event_info) pd = l->data; edje_object_signal_emit(pd->o_desk, "e,action,drag,out", "e"); } + + e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL); } static void @@ -1627,6 +1653,8 @@ _pager_inst_cb_drop(void *data, const char *type, void *event_info) pd = l->data; edje_object_signal_emit(pd->o_desk, "e,action,drag,out", "e"); } + + e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL); } static void