From b19ee965ee1e59f8245c5e2aab9fb1a2ef2db4c2 Mon Sep 17 00:00:00 2001 From: Davide Andreoli Date: Mon, 2 Mar 2009 22:46:40 +0000 Subject: [PATCH] First step to merge Places module with efm. * Make the fileman menu as it is in Places module (still need to fix icons) Just a doubt: why efm was called using ecore_idle_enterer_add ? it is necessary ? I need to reenable it? SVN revision: 39335 --- src/bin/e_fm.c | 2 + src/bin/e_fm_hal.c | 6 + src/bin/e_fm_hal.h | 2 + src/modules/fileman/e_mod_main.c | 191 ++++++++++++++++++++++++++++--- 4 files changed, 187 insertions(+), 14 deletions(-) diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index 7f4108093..7602449c8 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -2801,6 +2801,8 @@ _e_fm2_dev_path_map(const char *dev, const char *path) } ecore_file_mkpath(buf); } + else if (strcmp(dev, "temp") == 0) + PRT("/tmp"); /* FIXME: replace all this removable, dvd and like with hal */ else if (strncmp(dev, "removable:", sizeof("removable:") - 1) == 0) { diff --git a/src/bin/e_fm_hal.c b/src/bin/e_fm_hal.c index eb67d3ba0..786af485a 100644 --- a/src/bin/e_fm_hal.c +++ b/src/bin/e_fm_hal.c @@ -554,3 +554,9 @@ e_fm2_hal_hide_desktop_icons(void) } } } + +EAPI Eina_List* +e_fm2_hal_volume_list_get(void) +{ + return _e_vols; +} diff --git a/src/bin/e_fm_hal.h b/src/bin/e_fm_hal.h index 4691e7b8a..9c7e708b4 100644 --- a/src/bin/e_fm_hal.h +++ b/src/bin/e_fm_hal.h @@ -28,4 +28,6 @@ EAPI void e_fm2_hal_unmount(E_Fm2_Mount *m); EAPI void e_fm2_hal_show_desktop_icons(void); EAPI void e_fm2_hal_hide_desktop_icons(void); +EAPI Eina_List *e_fm2_hal_volume_list_get(void); + #endif diff --git a/src/modules/fileman/e_mod_main.c b/src/modules/fileman/e_mod_main.c index 66f997bbd..fca850e31 100644 --- a/src/modules/fileman/e_mod_main.c +++ b/src/modules/fileman/e_mod_main.c @@ -2,13 +2,16 @@ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #include "e.h" +#include "e_fm_hal.h" #include "e_mod_main.h" #include "e_mod_config.h" #include "e_mod_dbus.h" /* actual module specifics */ static void _e_mod_action_fileman_cb(E_Object *obj, const char *params); -static void _e_mod_fileman_cb(void *data, E_Menu *m, E_Menu_Item *mi); +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_menu_add(void *data, E_Menu *m); static void _e_mod_fileman_config_load(void); static void _e_mod_fileman_config_free(void); @@ -197,33 +200,193 @@ _e_mod_action_fileman_cb(E_Object *obj, const char *params) } /* menu item callback(s) */ -static int -_e_mod_fileman_defer_cb(void *data) -{ - E_Zone *zone; +//~ static int +//~ _e_mod_fileman_defer_cb(void *data) +//~ { + //~ E_Zone *zone; - zone = data; - if (zone) e_fwin_new(zone->container, "favorites", "/"); - return 0; + //~ 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 +_mount_ok(void *data) +{ + E_Volume *vol = data; + e_fwin_new(e_container_current_get(e_manager_current_get()), + NULL, vol->mount_point); } -static void -_e_mod_fileman_cb(void *data, E_Menu *m, E_Menu_Item *mi) +static void +_mount_fail(void *data) { - ecore_idle_enterer_add(_e_mod_fileman_defer_cb, m->zone); + //TODO alert the user +} + +static void +_e_mod_menu_gtk_cb(void *data, E_Menu *m, E_Menu_Item *mi) +{ + char *path = data; + if (m->zone) e_fwin_new(m->zone->container, NULL, path); + free(path); +} + +static void +_e_mod_menu_virtual_cb(void *data, E_Menu *m, E_Menu_Item *mi) +{ + 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) +{ + E_Volume *vol = data; + if (vol->mounted) + { + if (m->zone) + e_fwin_new(m->zone->container, NULL, vol->mount_point); + } + else //TODO need to remove the mount? + e_fm2_hal_mount(vol, _mount_ok, _mount_fail, NULL, NULL, vol); +} + +static void +_e_mod_fileman_parse_gtk_bookmarks(E_Menu *m) +{ + char line[PATH_MAX]; + 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)) + { + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, alias ? alias : + ecore_file_file_get(uri->path)); + e_util_menu_item_edje_icon_set(mi, "fileman/folder"); + e_menu_item_callback_set(mi, _e_mod_menu_gtk_cb, + strdup(uri->path)); + } + } + if (uri) efreet_uri_free(uri); + } + fclose(fp); + } } /* menu item add hook */ -static void +void +_e_mod_menu_generate(void *data, E_Menu *m) +{ + E_Menu_Item *mi; + char buf[PATH_MAX]; + + /* Home */ + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Home")); + e_util_menu_item_edje_icon_set(mi, "fileman/home"); + e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, "~/"); + + /* Desktop */ + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Desktop")); + e_util_menu_item_edje_icon_set(mi, "fileman/desktop"); + e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, "desktop"); + + /* Favorites */ + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Favorites")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/favorites"); + e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, "favorites"); + + /* Trash */ + //~ mi = e_menu_item_new(em); + //~ e_menu_item_label_set(mi, D_("Trash")); + //~ e_util_menu_item_edje_icon_set(mi, "fileman/folder"); + //~ 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_edje_icon_set(mi, "fileman/root"); + e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, "/"); + + /* Temp */ + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Temporary")); + e_util_menu_item_edje_icon_set(mi, "fileman/tmp"); + e_menu_item_callback_set(mi, _e_mod_menu_virtual_cb, "temp"); + + //separator + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); + + /* Volumes */ + Eina_Bool volumes_visible = 0; + const Eina_List *l; + E_Volume *vol; + EINA_LIST_FOREACH(e_fm2_hal_volume_list_get(), l, vol) + { + if (vol->mount_point && !strcmp(vol->mount_point, "/")) continue; + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, vol->label); + e_menu_item_callback_set(mi, _e_mod_menu_volume_cb, vol); + volumes_visible = 1; + } + + /* Favorites */ + //~ if (places_conf->show_bookm) + //~ { + if (volumes_visible) + { + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); + } + _e_mod_fileman_parse_gtk_bookmarks(m); + //~ } + + e_menu_pre_activate_callback_set(m, NULL, NULL); +} + +void _e_mod_menu_add(void *data, E_Menu *m) { E_Menu_Item *mi; - + E_Menu *sub; + #ifdef ENABLE_FILES mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Files")); e_util_menu_item_edje_icon_set(mi, "enlightenment/fileman"); - e_menu_item_callback_set(mi, _e_mod_fileman_cb, NULL); + sub = e_menu_new(); + e_menu_item_submenu_set(mi, sub); + e_menu_pre_activate_callback_set(sub, _e_mod_menu_generate, NULL); #endif }