diff --git a/src/modules/fileman/Makefile.am b/src/modules/fileman/Makefile.am index 461875b50..6fd3e6d3f 100644 --- a/src/modules/fileman/Makefile.am +++ b/src/modules/fileman/Makefile.am @@ -19,6 +19,7 @@ INCLUDES = -I. \ pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH) pkg_LTLIBRARIES = module.la module_la_SOURCES = e_mod_main.c \ + e_mod_menu.c \ e_mod_main.h \ e_mod_config.c \ e_mod_config.h \ diff --git a/src/modules/fileman/e_fwin.c b/src/modules/fileman/e_fwin.c index fd7ccb1f7..218b23a93 100644 --- a/src/modules/fileman/e_fwin.c +++ b/src/modules/fileman/e_fwin.c @@ -2094,6 +2094,12 @@ _e_fwin_cb_menu_extend_start(void *data, selected = e_fm2_selected_list_get(page->fm_obj); if (!selected) return; +#ifdef ENABLE_FILES + e_mod_menu_add(m); + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, EINA_TRUE); +#endif + mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Open")); e_util_menu_item_theme_icon_set(mi, "document-open"); diff --git a/src/modules/fileman/e_mod_main.c b/src/modules/fileman/e_mod_main.c index deb30d5dd..40333cdbf 100644 --- a/src/modules/fileman/e_mod_main.c +++ b/src/modules/fileman/e_mod_main.c @@ -7,21 +7,7 @@ /* actual module specifics */ static void _e_mod_action_fileman_cb(E_Object *obj, const char *params); -static E_Menu *_e_mod_menu_top_get(E_Menu *m); -static void _e_mod_menu_gtk_cb(void *data, - E_Menu *m, - E_Menu_Item *mi); -static void _e_mod_menu_virtual_cb(void *data, - E_Menu *m, - E_Menu_Item *mi); -static void _e_mod_menu_volume_cb(void *data, - E_Menu *m, - E_Menu_Item *mi); -static void _e_mod_main_menu_cb(E_Menu *m, void *category_data, void *data); -static void _e_mod_menu_populate(void *d __UNUSED__, E_Menu *m, E_Menu_Item *mi); -static void _e_mod_menu_cleanup_cb(void *obj); -static void _e_mod_menu_add(void *data, - E_Menu *m); +static void _e_mod_menu_add(void *data, E_Menu *m); static void _e_mod_fileman_config_load(void); static void _e_mod_fileman_config_free(void); static Eina_Bool _e_mod_zone_add(void *data, @@ -31,7 +17,6 @@ static Eina_Bool _e_mod_zone_add(void *data, static E_Module *conf_module = NULL; static E_Action *act = NULL; static E_Int_Menu_Augmentation *maug = NULL; -static E_Menu_Category_Callback *mcb = NULL; static Ecore_Event_Handler *zone_add_handler = NULL; static E_Config_DD *paths_edd = NULL, *conf_edd = NULL; @@ -77,7 +62,6 @@ e_modapi_init(E_Module *m) "fileman", NULL, "syntax: /path/to/dir or ~/path/to/dir or favorites or desktop, examples: /boot/grub, ~/downloads", 1); } maug = e_int_menus_menu_augmentation_add_sorted("main/1", _("Navigate"), _e_mod_menu_add, NULL, NULL, NULL); - mcb = e_menu_category_callback_add("e/fileman/action", _e_mod_main_menu_cb, NULL, NULL); e_module_delayed_set(m, 1); /* Hook into zones */ @@ -146,11 +130,6 @@ e_modapi_shutdown(E_Module *m __UNUSED__) e_int_menus_menu_augmentation_del("main/1", maug); maug = NULL; } - if (mcb) - { - e_menu_category_callback_del(mcb); - mcb = NULL; - } /* remove module-supplied action */ if (act) { @@ -227,420 +206,10 @@ _e_mod_action_fileman_cb(E_Object *obj, } } -/* menu item callback(s) */ -//~ static int -//~ _e_mod_fileman_defer_cb(void *data) -//~ { -//~ E_Zone *zone; - -//~ zone = data; -//~ if (zone) e_fwin_new(zone->container, "favorites", "/"); -//~ return 0; -//~ } - -//~ static void -//~ _e_mod_fileman_cb(void *data, E_Menu *m, E_Menu_Item *mi) -//~ { -//~ ecore_idle_enterer_add(_e_mod_fileman_defer_cb, m->zone); -//~ } - -static void -_e_mod_menu_gtk_cb(void *data, - E_Menu *m, - E_Menu_Item *mi __UNUSED__) -{ - Evas_Object *fm; - - m = _e_mod_menu_top_get(m); - fm = e_object_data_get(E_OBJECT(m)); - if (fm && ((fileman_config->view.open_dirs_in_place && evas_object_data_get(fm, "page_is_window")) || - (fileman_config->view.desktop_navigation && evas_object_data_get(fm, "page_is_zone")))) - e_fm2_path_set(fm, NULL, data); - else if (m->zone) e_fwin_new(m->zone->container, NULL, data); -} - -static void -_e_mod_menu_virtual_cb(void *data, - E_Menu *m, - E_Menu_Item *mi __UNUSED__) -{ - Evas_Object *fm; - - m = _e_mod_menu_top_get(m); - fm = e_object_data_get(E_OBJECT(m)); - if (fm && ((fileman_config->view.open_dirs_in_place && evas_object_data_get(fm, "page_is_window")) || - (fileman_config->view.desktop_navigation && evas_object_data_get(fm, "page_is_zone")))) - e_fm2_path_set(fm, data, "/"); - else if (m->zone) e_fwin_new(m->zone->container, data, "/"); -} - -static void -_e_mod_menu_volume_cb(void *data, - E_Menu *m, - E_Menu_Item *mi __UNUSED__) -{ - E_Volume *vol = data; - Evas_Object *fm; - - m = _e_mod_menu_top_get(m); - fm = e_object_data_get(E_OBJECT(m)); - if (vol->mounted) - { - if (fm && ((fileman_config->view.open_dirs_in_place && evas_object_data_get(fm, "page_is_window")) || - (fileman_config->view.desktop_navigation && evas_object_data_get(fm, "page_is_zone")))) - e_fm2_path_set(fm, NULL, vol->mount_point); - else if (m->zone) - e_fwin_new(m->zone->container, NULL, vol->mount_point); - } - else - { - char buf[PATH_MAX + sizeof("removable:")]; - - snprintf(buf, sizeof(buf), "removable:%s", vol->udi); - if (fm && ((fileman_config->view.open_dirs_in_place && evas_object_data_get(fm, "page_is_window")) || - (fileman_config->view.desktop_navigation && evas_object_data_get(fm, "page_is_zone")))) - e_fm2_path_set(fm, buf, "/"); - else if (m->zone) - e_fwin_new(m->zone->container, buf, "/"); - } -} - -static void -_e_mod_fileman_parse_gtk_bookmarks(E_Menu *m, - Eina_Bool need_separator) -{ - char line[4096]; - char buf[PATH_MAX]; - E_Menu_Item *mi; - Efreet_Uri *uri; - char *alias; - FILE *fp; - - snprintf(buf, sizeof(buf), "%s/.gtk-bookmarks", e_user_homedir_get()); - fp = fopen(buf, "r"); - if (fp) - { - while(fgets(line, sizeof(line), fp)) - { - alias = NULL; - line[strlen(line) - 1] = '\0'; - alias = strchr(line, ' '); - if (alias) - { - line[alias - line] = '\0'; - alias++; - } - uri = efreet_uri_decode(line); - if (uri && uri->path) - { - if (ecore_file_exists(uri->path)) - { - if (need_separator) - { - mi = e_menu_item_new(m); - e_menu_item_separator_set(mi, 1); - need_separator = 0; - } - - mi = e_menu_item_new(m); - e_object_data_set(E_OBJECT(mi), uri->path); - e_menu_item_label_set(mi, alias ? alias : - ecore_file_file_get(uri->path)); - e_util_menu_item_theme_icon_set(mi, "folder"); - e_menu_item_callback_set(mi, _e_mod_menu_gtk_cb, - (void *)eina_stringshare_add(uri->path)); - e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, eina_stringshare_add("/")); - } - } - if (uri) efreet_uri_free(uri); - } - fclose(fp); - } -} - -static E_Menu * -_e_mod_menu_top_get(E_Menu *m) -{ - while (m->parent_item) - { - if (m->parent_item->menu->header.title) - break; - m = m->parent_item->menu; - } - return m; -} - -static void -_e_mod_menu_populate_cb(void *data, - E_Menu *m, - E_Menu_Item *mi) -{ - const char *path; - Evas_Object *fm; - - if (!m->zone) return; - m = _e_mod_menu_top_get(m); - - fm = e_object_data_get(E_OBJECT(m)); - path = e_object_data_get(E_OBJECT(mi)); - if (fm && ((fileman_config->view.open_dirs_in_place && evas_object_data_get(fm, "page_is_window")) || - (fileman_config->view.desktop_navigation && evas_object_data_get(fm, "page_is_zone")))) - e_fm2_path_set(fm, data, path ?: "/"); - else if (m->zone) - e_fwin_new(m->zone->container, data, path ?: "/"); -} - -static void -_e_mod_menu_cleanup_cb(void *obj) -{ - eina_stringshare_del(e_object_data_get(E_OBJECT(obj))); -} - -static Eina_Bool -_e_mod_menu_populate_filter(void *data __UNUSED__, Eio_File *handler __UNUSED__, const Eina_File_Direct_Info *info) -{ - /* don't show .dotfiles */ - if (fileman_config->view.menu_shows_files) - return (info->path[info->name_start] != '.'); - return (info->path[info->name_start] != '.') && (info->type == EINA_FILE_DIR); -} - -static void -_e_mod_menu_populate_item(void *data, Eio_File *handler __UNUSED__, const Eina_File_Direct_Info *info) -{ - E_Menu *m = data; - E_Menu_Item *mi; - const char *dev, *path; - - mi = m->parent_item; - dev = e_object_data_get(E_OBJECT(m)); - path = mi ? e_object_data_get(E_OBJECT(mi)) : "/"; - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, info->path + info->name_start); - if (fileman_config->view.menu_shows_files) - { - if (info->type != EINA_FILE_DIR) - { - const char *mime = NULL; - Efreet_Desktop *ed = NULL; - char group[1024]; - - if (eina_str_has_extension(mi->label, "desktop")) - { - ed = efreet_desktop_new(info->path); - if (ed) - { - e_util_menu_item_theme_icon_set(mi, ed->icon); - efreet_desktop_free(ed); - return; - } - } - mime = efreet_mime_type_get(mi->label); - if (!mime) return; - if (!strncmp(mime, "image/", 6)) - { - e_menu_item_icon_file_set(mi, info->path); - return; - } - snprintf(group, sizeof(group), "fileman/mime/%s", mime); - if (e_util_menu_item_theme_icon_set(mi, group)) - return; - e_util_menu_item_theme_icon_set(mi, "fileman/mime/unknown"); - return; - } - } - e_util_menu_item_theme_icon_set(mi, "folder"); - e_object_data_set(E_OBJECT(mi), eina_stringshare_printf("%s/%s", path ?: "/", info->path + info->name_start)); - //fprintf(stderr, "PATH SET: %s\n", e_object_data_get(E_OBJECT(mi))); - e_object_free_attach_func_set(E_OBJECT(mi), _e_mod_menu_cleanup_cb); - e_menu_item_callback_set(mi, _e_mod_menu_populate_cb, dev); - e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, eina_stringshare_ref(dev)); -} - -static void -_e_mod_menu_populate_err(void *data, Eio_File *handler __UNUSED__, int error __UNUSED__) -{ - if (!e_object_unref(data)) return; - e_menu_thaw(data); -} - -static int -_e_mod_menu_populate_sort(E_Menu_Item *a, E_Menu_Item *b) -{ - return strcmp(a->label, b->label); -} - -static void -_e_mod_menu_populate_done(void *data, Eio_File *handler __UNUSED__) -{ - E_Menu *m = data; - if (!e_object_unref(data)) return; - if (!m->items) - { - e_menu_deactivate(m); - if (m->parent_item) - e_menu_item_submenu_set(m->parent_item, NULL); - return; - } - m->items = eina_list_sort(m->items, 0, (Eina_Compare_Cb)_e_mod_menu_populate_sort); - e_menu_thaw(m); -} - -static void -_e_mod_menu_populate(void *d, E_Menu *m __UNUSED__, E_Menu_Item *mi) -{ - E_Menu *subm; - const char *dev, *path, *rp; - Eio_File *ls; - - subm = mi->submenu; - if (subm && subm->items) return; - if (!subm) - { - subm = e_menu_new(); - e_object_data_set(E_OBJECT(subm), d); - e_object_free_attach_func_set(E_OBJECT(subm), _e_mod_menu_cleanup_cb); - e_menu_item_submenu_set(mi, subm); - e_menu_freeze(subm); - } - dev = d; - path = mi ? e_object_data_get(E_OBJECT(mi)) : NULL; - rp = e_fm2_real_path_map(dev, path ?: "/"); - ls = eio_file_stat_ls(rp, _e_mod_menu_populate_filter, _e_mod_menu_populate_item, _e_mod_menu_populate_done, _e_mod_menu_populate_err, subm); - EINA_SAFETY_ON_NULL_RETURN(ls); - e_object_ref(E_OBJECT(subm)); - eina_stringshare_del(rp); -} - -static void -_e_mod_menu_free(void *data) -{ - Eina_List *l; - E_Menu_Item *mi; - E_Menu *m = data; - - EINA_LIST_FOREACH(m->items, l, mi) - if (mi->submenu) - { - //INF("SUBMENU %p REF: %d", mi->submenu, e_object_ref_get(E_OBJECT(mi->submenu)) - 1); - _e_mod_menu_free(mi->submenu); - e_object_unref(E_OBJECT(mi->submenu)); - } -} - -/* menu item add hook */ -static void -_e_mod_menu_generate(void *data __UNUSED__, E_Menu *m) -{ - E_Volume *vol; - E_Menu_Item *mi; - const char *s; - const Eina_List *l; - Eina_Bool need_separator; - Eina_Bool volumes_visible = 0; - - if (m->items) return; - e_object_free_attach_func_set(E_OBJECT(m), _e_mod_menu_free); - - /* Home */ - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Home")); - e_util_menu_item_theme_icon_set(mi, "user-home"); - s = eina_stringshare_add("~/"); - e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, s); - e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, s); - - /* Desktop */ - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Desktop")); - e_util_menu_item_theme_icon_set(mi, "user-desktop"); - s = eina_stringshare_add("desktop"); - e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, s); - e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, s); - - /* Favorites */ - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Favorites")); - e_util_menu_item_theme_icon_set(mi, "user-bookmarks"); - s = eina_stringshare_add("favorites"); - e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, s); - e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, s); - - /* Trash */ - //~ mi = e_menu_item_new(em); - //~ e_menu_item_label_set(mi, D_("Trash")); - //~ e_util_menu_item_theme_icon_set(mi, "user-trash"); - //~ e_menu_item_callback_set(mi, _places_run_fm, "trash:///"); - - /* Root */ - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Root")); - e_util_menu_item_theme_icon_set(mi, "computer"); - s = eina_stringshare_add("/"); - e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, s); - e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, s); - need_separator = 1; - - /* Volumes */ - EINA_LIST_FOREACH(e_fm2_device_volume_list_get(), l, vol) - { - if (vol->mount_point && !strcmp(vol->mount_point, "/")) continue; - - if (need_separator) - { - mi = e_menu_item_new(m); - e_menu_item_separator_set(mi, 1); - need_separator = 0; - } - - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, vol->label); - e_util_menu_item_theme_icon_set(mi, vol->icon); - e_menu_item_callback_set(mi, _e_mod_menu_volume_cb, vol); - volumes_visible = 1; - } - - /* Favorites */ - //~ if (places_conf->show_bookm) - //~ { - _e_mod_fileman_parse_gtk_bookmarks(m, need_separator || volumes_visible > 0); - //~ } - - e_menu_pre_activate_callback_set(m, NULL, NULL); -} - void -_e_mod_menu_add(void *data __UNUSED__, - E_Menu *m) +_e_mod_menu_add(void *data __UNUSED__, E_Menu *m) { -#ifdef ENABLE_FILES - E_Menu_Item *mi; - E_Menu *sub; - - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Navigate...")); - e_util_menu_item_theme_icon_set(mi, "system-file-manager"); - sub = e_menu_new(); - e_menu_item_submenu_set(mi, sub); - e_object_unref(E_OBJECT(sub)); //allow deletion whenever main menu deletes - e_menu_pre_activate_callback_set(sub, _e_mod_menu_generate, NULL); -#else - (void)m; -#endif -} - -static void -_e_mod_main_menu_cb(E_Menu *m, void *category_data __UNUSED__, void *data __UNUSED__) -{ -#ifdef ENABLE_FILES - E_Menu_Item *mi; - _e_mod_menu_add(NULL, m); - m->items = eina_list_promote_list(m->items, eina_list_last(m->items)); - mi = e_menu_item_new_relative(m, m->items->data); - e_menu_item_separator_set(mi, EINA_TRUE); -#else - (void)m; -#endif + e_mod_menu_add(m); } /* Abstract fileman config load/create to one function for maintainability */ diff --git a/src/modules/fileman/e_mod_main.h b/src/modules/fileman/e_mod_main.h index bbe9c0aa6..3cb679d6b 100644 --- a/src/modules/fileman/e_mod_main.h +++ b/src/modules/fileman/e_mod_main.h @@ -120,6 +120,8 @@ EAPI int e_modapi_save(E_Module *m); extern Config *fileman_config; Fileman_Path *e_mod_fileman_path_find(E_Zone *zone); +void e_mod_menu_add(E_Menu *m); + /** * @addtogroup Optional_Fileman * @{