diff --git a/src/modules/illume-indicator/e_mod_main.h b/src/modules/illume-indicator/e_mod_main.h index a0405fd9f..6dc9f3275 100644 --- a/src/modules/illume-indicator/e_mod_main.h +++ b/src/modules/illume-indicator/e_mod_main.h @@ -13,6 +13,12 @@ struct _Il_Ind_Win E_Menu *menu; E_Gadcon *gadcon; Evas_Object *o_base, *o_event; + struct + { + unsigned char start : 1; + unsigned char dnd : 1; + int x, y; + } drag; }; EAPI extern E_Module_Api e_modapi; diff --git a/src/modules/illume-indicator/e_mod_win.c b/src/modules/illume-indicator/e_mod_win.c index b641f7dc0..326e150fb 100644 --- a/src/modules/illume-indicator/e_mod_win.c +++ b/src/modules/illume-indicator/e_mod_win.c @@ -7,6 +7,8 @@ static void _il_ind_win_cb_free(Il_Ind_Win *iwin); static void _il_ind_win_cb_resize(E_Win *ewin); static void _il_ind_win_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event); +static void _il_ind_win_cb_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event); +static void _il_ind_win_cb_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event); static int _il_ind_win_gadcon_client_add(void *data, const E_Gadcon_Client_Class *cc); static void _il_ind_win_gadcon_client_del(void *data, E_Gadcon_Client *gcc); static void _il_ind_win_gadcon_min_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h); @@ -72,6 +74,10 @@ e_mod_ind_win_new(void) evas_object_resize(iwin->o_event, zone->w, 32); evas_object_event_callback_add(iwin->o_event, EVAS_CALLBACK_MOUSE_DOWN, _il_ind_win_cb_mouse_down, iwin); + evas_object_event_callback_add(iwin->o_event, EVAS_CALLBACK_MOUSE_UP, + _il_ind_win_cb_mouse_up, iwin); + evas_object_event_callback_add(iwin->o_event, EVAS_CALLBACK_MOUSE_MOVE, + _il_ind_win_cb_mouse_move, iwin); evas_object_show(iwin->o_event); evas_object_layer_set(iwin->o_event, 200); @@ -153,7 +159,14 @@ _il_ind_win_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event) if (!(iwin = data)) return; ev = event; - if (ev->button == 3) + if (ev->button == 1) + { + iwin->drag.x = ev->output.x; + iwin->drag.y = ev->output.y; + iwin->drag.start = 1; + iwin->drag.dnd = 0; + } + else if (ev->button == 3) { E_Menu *mn; E_Zone *zone; @@ -172,6 +185,71 @@ _il_ind_win_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event) } } +static void +_il_ind_win_cb_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event) +{ + Il_Ind_Win *iwin; + Evas_Event_Mouse_Up *ev; + + if (!(iwin = data)) return; + ev = event; + if ((ev->button == 1) && (!iwin->drag.dnd)) + { + iwin->drag.start = 0; + iwin->drag.dnd = 0; + } +} + +static void +_il_ind_win_cb_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event) +{ + Il_Ind_Win *iwin; + Evas_Event_Mouse_Move *ev; + int dx, dy; + + if (!(iwin = data)) return; + ev = event; + if (!iwin->drag.start) return; + dx = ev->cur.output.x - iwin->drag.x; + dy = ev->cur.output.y - iwin->drag.y; + if (((dx * dx) + (dy * dy)) > + (e_config->drag_resist * e_config->drag_resist)) + { + E_Drag *d; + Evas *evas; + Evas_Object *o; + int x, y, w, h; + const char *drag_types[] = { "illume/indicator" }; + + iwin->drag.dnd = 1; + iwin->drag.start = 0; + x = iwin->win->x; + y = iwin->win->y; + w = iwin->win->w; + h = iwin->win->h; + + d = e_drag_new(iwin->win->container, x, y, drag_types, + 1, iwin->win, -1, NULL, NULL); + + evas = e_drag_evas_get(d); + o = edje_object_add(evas); + if (!e_theme_edje_object_set(o, "base/theme/modules/illume-indicator", + "modules/illume-indicator/shelf")) + { + char buff[PATH_MAX]; + + snprintf(buff, sizeof(buff), "%s/e-module-illume-indicator.edj", + il_ind_cfg->mod_dir); + edje_object_file_set(o, buff, "modules/illume-indicator/shelf"); + } + evas_object_show(o); + + e_drag_object_set(d, o); + e_drag_resize(d, w, h); + e_drag_start(d, iwin->drag.x, iwin->drag.y); + } +} + static void _il_ind_win_cb_menu_post(void *data, E_Menu *m) {