--- a/exo-open/main.c 2015-05-26 02:04:45.000000000 +0800 +++ b/exo-open/main.c 2015-07-19 00:17:30.810170375 +0800 @@ -206,12 +206,18 @@ { gchar *current_dir; gchar *uri; + gchar *escaped_uri; gchar *path; /* is an absolute path, return file uri */ if (g_path_is_absolute (string)) - return g_strconcat ("file://", string, NULL); - + { + uri = g_strconcat ("file://", string, NULL); + escaped_uri = g_uri_escape_string (uri, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, TRUE); + g_free(uri); + return escaped_uri; + } + /* treat it like a relative path */ current_dir = g_get_current_dir (); path = g_build_filename (current_dir, string, NULL); @@ -221,8 +227,10 @@ if (g_file_test (path, G_FILE_TEST_EXISTS)) { uri = g_strconcat ("file://", path, NULL); + escaped_uri = g_uri_escape_string (uri, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, TRUE); g_free (path); - return uri; + g_free (uri); + return escaped_uri; } g_free (path); @@ -307,7 +315,6 @@ { GFile *file; gchar *scheme; - gchar *escaped; GFileInfo *file_info; gboolean succeed = FALSE; gboolean retval = FALSE; @@ -331,18 +338,15 @@ g_free (scheme); #endif - escaped = g_uri_escape_string (uri, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, TRUE); - file = g_file_new_for_uri (escaped); + file = g_file_new_for_uri (uri); scheme = g_file_get_uri_scheme (file); /* try to launch common schemes for know preferred applications */ if (scheme != NULL && exo_open_uri_known_category (uri, scheme, &retval)) { g_free (scheme); - g_free (escaped); return retval; } - /* handle the uri as a file, maybe we succeed... */ file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, @@ -356,7 +360,7 @@ g_debug ("file is directory, use filemanager"); #endif /* directories should go fine with a file manager */ - retval = exo_open_launch_category ("FileManager", escaped); + retval = exo_open_launch_category ("FileManager", uri); succeed = TRUE; } else @@ -382,7 +386,7 @@ if (executable == NULL || strcmp (executable, "exo-open") != 0) { - fake_list.data = (gpointer) escaped; + fake_list.data = (gpointer) uri; fake_list.prev = fake_list.next = NULL; /* launch it */ @@ -410,7 +414,7 @@ /* found scheme, open in file manager */ if (strcmp (scheme, schemes[i]) == 0) { - retval = succeed = exo_open_launch_category ("FileManager", escaped); + retval = succeed = exo_open_launch_category ("FileManager", uri); break; } } @@ -429,13 +433,12 @@ /* try ftp uris if the file manager/gio failed to recognize it */ if (scheme != NULL && (strcmp (scheme, "ftp") == 0 || strcmp (scheme, "ftps") == 0)) - retval = exo_open_launch_category ("WebBrowser", escaped); + retval = exo_open_launch_category ("WebBrowser", uri); else - retval = gtk_show_uri (NULL, escaped, 0, error); + retval = gtk_show_uri (NULL, uri, 0, error); } g_free (scheme); - g_free (escaped); if (!retval && error != NULL) *error = err;