//Popup the menu at the position (x, y) void eclair_menu_popup_at_xy(Eclair_Menu *menu, int x, int y) { if (!menu) return; if (!_eclair_menu_input_window) { Ecore_X_Window root, parent; int root_x, root_y, root_w, root_h; root = menu->x_window; while ((parent = ecore_x_window_parent_get(root)) != 0) root = parent; ecore_x_window_geometry_get(root, &root_x, &root_y, &root_w, &root_h); _eclair_menu_input_window = ecore_x_window_input_new(root, root_x, root_y, root_w, root_h); } if (!_eclair_menu_root) { _eclair_menu_mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _eclair_menu_mouse_up_cb, menu); _eclair_menu_mouse_move_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _eclair_menu_mouse_move_cb, menu); ecore_x_window_show(_eclair_menu_input_window); ecore_x_keyboard_grab(_eclair_menu_input_window); ecore_x_pointer_confine_grab(_eclair_menu_input_window); _eclair_menu_root = menu; } ecore_evas_move(menu->window, x, y); ecore_evas_show(menu->window); evas_event_feed_mouse_move(menu->evas, -100000, -100000, ecore_x_current_time_get(), NULL); evas_event_feed_mouse_in(menu->evas, ecore_x_current_time_get(), NULL); _eclair_menu_popped_menus = eina_list_append(_eclair_menu_popped_menus, menu); _eclair_menu_update_slide_timer(menu); }
static void _cb_item_open(void *data, Evas_Object *obj, const char *emission, const char *source) { News_Item *ni; E_Manager *man; E_Zone *zone; int cx, cy; ni = data; switch (ni->config->openmethod) { case NEWS_ITEM_OPENMETHOD_VIEWER: if (!ni->viewer) news_viewer_create(ni); else news_viewer_destroy(ni->viewer); break; case NEWS_ITEM_OPENMETHOD_BROWSER: news_menu_browser_show(ni); man = e_manager_current_get(); zone = e_util_zone_current_get(man); ecore_x_pointer_xy_get(man->root, &cx, &cy); e_menu_activate_mouse(ni->menu_browser, zone, cx, cy, 1, 1, E_MENU_POP_DIRECTION_DOWN, ecore_x_current_time_get()); break; } }
int e_mouse_down(void *data, int type, void * ev) { Ecore_X_Event_Mouse_Button_Down *e; Evas_Engine_Info_Software_X11 *info; e = (Ecore_X_Event_Mouse_Button_Down *) ev; info = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(evas); if (e->win != info->info.drawable) return 1; evas_event_feed_mouse_down(evas, e->button, EVAS_BUTTON_NONE, ecore_x_current_time_get(), NULL); return 1; data = NULL; type = 0; }
int e_mouse_move(void *data, int type, void * ev) { Ecore_X_Event_Mouse_Move *e; Evas_Engine_Info_Software_X11 *info; e = (Ecore_X_Event_Mouse_Move *) ev; info = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(evas); if (e->win != info->info.drawable) return 1; evas_event_feed_mouse_move(evas, e->x, e->y, ecore_x_current_time_get(), NULL); return 1; data = NULL; type = 0; }
static void _itask_item_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Move *ev; Itask_Item *ic; int dx, dy; ev = event_info; ic = data; if (!ic->drag.start) return; dx = ev->cur.output.x - ic->drag.x; dy = ev->cur.output.y - ic->drag.y; if (((dx * dx) + (dy * dy)) > (e_config->drag_resist * e_config->drag_resist)) { E_Drag *d; Evas_Object *o; Evas_Coord x, y, w, h; const char *drag_types[] = { "enlightenment/border" }; ic->drag.dnd = 1; ic->drag.start = 0; evas_object_geometry_get(ic->o_icon, &x, &y, &w, &h); d = e_drag_new(ic->itask->gcc->gadcon->zone->container, x, y, drag_types, 1, ic->border, -1, NULL, _itask_item_cb_drag_finished); o = e_border_icon_add(ic->border, e_drag_evas_get(d)); e_drag_object_set(d, o); e_drag_resize(d, w, h); e_drag_start(d, ic->drag.x, ic->drag.y); evas_event_feed_mouse_up(ic->itask->gcc->gadcon->evas, 1, EVAS_BUTTON_NONE, ecore_x_current_time_get(), NULL); e_object_ref(E_OBJECT(ic->border)); } }
//Slide the menu (called every 1/60 sec) static int _eclair_menu_slide_timer_cb(void *data) { Eclair_Menu *menu = NULL, *m; Eina_List *l; Eclair_Menu_Screen_Edge mouse_edge, menu_edge = ECLAIR_MENU_NO_EDGE; int root_x, root_y, root_w, root_h; int menu_x, menu_y, menu_w, menu_h; int x, y; int dx = 0, dy = 0, max_delta = (int)(1.0 / 60.0 * 800); //TODO: FIXME: We could have problem with menus bigger than the screen width //We first look the menu that is over an edge of the screen for (l = _eclair_menu_popped_menus; l; l = l->next) { if (!(m = l->data)) continue; if ((menu_edge = _eclair_menu_over_screen_edge(m)) != ECLAIR_MENU_NO_EDGE) { menu = m; break; } } if (!menu) { _eclair_menu_slide_timer = NULL; return 0; } //Then we move all the menu windows in the right direction mouse_edge = _eclair_menu_mouse_on_screen_edge(); ecore_x_window_geometry_get(_eclair_menu_input_window, &root_x, &root_y, &root_w, &root_h); ecore_evas_geometry_get(menu->window, &menu_x, &menu_y, &menu_w, &menu_h); if (mouse_edge & menu_edge & ECLAIR_MENU_LEFT_EDGE) { if (max_delta < root_x - menu_x) dx = max_delta; else dx = root_x - menu_x; } if (mouse_edge & menu_edge & ECLAIR_MENU_RIGHT_EDGE) { if (max_delta < menu_w - root_x - root_w + menu_x) dx = -max_delta; else dx = -menu_w + root_x + root_w - menu_x; } if (mouse_edge & menu_edge & ECLAIR_MENU_TOP_EDGE) { if (max_delta < root_y - menu_y) dy = max_delta; else dy = root_y - menu_y; } if (mouse_edge & menu_edge & ECLAIR_MENU_BOTTOM_EDGE) { if (max_delta < menu_h - root_y - root_h + menu_y) dy = -max_delta; else dy = -menu_h + root_y + root_h - menu_y; } if (dx == 0 && dy == 0) { _eclair_menu_slide_timer = NULL; return 0; } for (l = _eclair_menu_popped_menus; l; l = l->next) { if (!(m = l->data)) continue; ecore_evas_geometry_get(m->window, &x, &y, NULL, NULL); ecore_evas_move(m->window, x + dx, y + dy); //We feed a mouse move event since the relative position between //the mouse pointer and the menu window has changed evas_event_feed_mouse_move(m->evas, _eclair_menu_mouse_x - x, _eclair_menu_mouse_y - y, ecore_x_current_time_get(), NULL); } return 1; }