decode .desktop link and directory uris in fileman menus

fix T1922
This commit is contained in:
Mike Blumenkrantz 2015-09-21 16:15:28 -04:00
parent 8491e11570
commit 6aa2342b7e
1 changed files with 25 additions and 12 deletions

View File

@ -122,7 +122,9 @@ _e_mod_menu_populate_filter(void *data EINA_UNUSED, Eio_File *handler, const Ein
return (info->path[info->name_start] != '.');
if (lstat(info->path, &st)) return EINA_FALSE;
/* don't show links to prevent infinite submenus */
return (info->path[info->name_start] != '.') && (info->type == EINA_FILE_DIR) && (!S_ISLNK(st.st_mode));
return (info->path[info->name_start] != '.') &&
((info->type == EINA_FILE_DIR) || eina_str_has_extension(info->path + info->name_start, "desktop")) &&
(!S_ISLNK(st.st_mode));
}
static void
@ -174,30 +176,41 @@ _e_mod_menu_populate_item(void *data, Eio_File *handler EINA_UNUSED, const Eina_
ed = efreet_desktop_get(info->path);
if (ed)
{
/* FIXME: need to loop here for idiots who link desktops to other desktops */
const char *type;
const char *uri;
Efreet_Uri *uri;
if (ed->type == EFREET_DESKTOP_TYPE_APPLICATION)
{
e_object_del(E_OBJECT(mi));
return;
}
e_util_menu_item_theme_icon_set(mi, ed->icon);
uri = ed->url;
if (ed->name)
e_menu_item_label_set(mi, ed->name);
uri = efreet_uri_decode(ed->url);
if ((!uri) || (!uri->path)) goto end;
if (ed->type == EFREET_DESKTOP_TYPE_LINK)
{
type = efreet_desktop_x_field_get(ed, "X-Enlightenment-Type");
if (!strncmp(ed->url, "file://", 7))
uri += 6; // need first slash
if (e_util_strcmp(type, "Removable"))
{
const char *p = uri->path;
char *esc = NULL;
dev = eina_stringshare_add("/");
e_object_data_set(E_OBJECT(mi), eina_stringshare_add(uri));
if (p[0] == '$')
esc = e_util_shell_env_path_eval(p);
e_object_data_set(E_OBJECT(mi), eina_stringshare_add(esc ?: p));
free(esc);
}
else
{
E_Volume *vol;
vol = e_fm2_device_volume_find(uri);
vol = e_fm2_device_volume_find(ed->url);
if (vol)
{
dev = eina_stringshare_printf("removable:%s", uri);
dev = eina_stringshare_printf("removable:%s", ed->url);
e_menu_item_callback_set(mi, _e_mod_menu_volume_cb, vol);
}
//FIXME: else
@ -206,10 +219,9 @@ _e_mod_menu_populate_item(void *data, Eio_File *handler EINA_UNUSED, const Eina_
else
{
eina_stringshare_ref(dev);
if (!strncmp(ed->url, "file://", 7))
uri += 6; // need first slash
e_object_data_set(E_OBJECT(mi), eina_stringshare_add(uri));
e_object_data_set(E_OBJECT(mi), eina_stringshare_add(uri->path));
}
efreet_uri_free(uri);
efreet_desktop_free(ed);
}
else
@ -218,6 +230,7 @@ _e_mod_menu_populate_item(void *data, Eio_File *handler EINA_UNUSED, const Eina_
eina_stringshare_ref(dev);
e_object_data_set(E_OBJECT(mi), eina_stringshare_printf("%s/%s", path ?: "", info->path + info->name_start));
}
end:
e_menu_item_submenu_pre_callback_set(mi, _e_mod_menu_populate, dev);
//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);