Index: src/main.c =================================================================== --- src/main.c (revision 3651) +++ src/main.c (working copy) @@ -55,7 +55,7 @@ GdkColor *bg_color = NULL; GError *cli_error = NULL; gchar *path_dir = NULL; - gint n; + gint i, n; #ifdef ENABLE_NLS bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); @@ -115,9 +115,20 @@ GtkRecentManager *recent_manager = rstto_main_window_get_recent_manager(RSTTO_MAIN_WINDOW(window)); rstto_navigator_set_timeout(navigator, slideshow_timeout); + /* Process arguments */ + gchar **loaded_dirs = malloc(sizeof(gchar)*argc); + gint loaded_dirs_count = 0; + gboolean navigator_is_set = FALSE; + for (n = 1; n < argc; ++n) { - ThunarVfsPath *path; + ThunarVfsPath *path, *file_path; + ThunarVfsInfo *info, *file_info; + gboolean path_is_new = TRUE; + gchar *path_string; + gchar *navigator_target_file = NULL; + + /* If path is relative, build an absolute path out of it */ if (g_path_is_absolute(argv[n])) path = thunar_vfs_path_new(argv[n], NULL); else @@ -130,94 +141,97 @@ g_free(base_dir); } - if (path) + if(path && (info = thunar_vfs_info_new_for_path(path, NULL))) { - - ThunarVfsInfo *info = thunar_vfs_info_new_for_path(path, NULL); - if(info) + if(strcmp(thunar_vfs_mime_info_get_name(info->mime_info), "inode/directory")) { - if(strcmp(thunar_vfs_mime_info_get_name(info->mime_info), "inode/directory")) + /* Argument is a file, get the parent directory */ + if(argc == 2) { - ThunarVfsPath *_path = thunar_vfs_path_get_parent(path); - thunar_vfs_path_unref(path); - path = _path; + /* Only one file given, record the name to match later */ + navigator_target_file = thunar_vfs_path_dup_string(path); + } + ThunarVfsPath *_path = thunar_vfs_path_get_parent(path); + thunar_vfs_path_unref(path); + path = _path; + } + path_string = thunar_vfs_path_dup_string(path); - gchar *path_string = thunar_vfs_path_dup_string(path); - - GDir *dir = g_dir_open(path_string, 0, NULL); - const gchar *filename = g_dir_read_name(dir); - while (filename) - { - gchar *path_name = g_strconcat(path_string, "/", filename, NULL); - ThunarVfsPath *file_path = thunar_vfs_path_new(path_name, NULL); - if (file_path) - { - ThunarVfsInfo *file_info = thunar_vfs_info_new_for_path(file_path, NULL); - gchar *file_media = thunar_vfs_mime_info_get_media(file_info->mime_info); - if(!strcmp(file_media, "image")) - { - RsttoNavigatorEntry *entry = rstto_navigator_entry_new(navigator, file_info); - gint i = rstto_navigator_add (navigator, entry); - if (path_dir == NULL) - { - if (!strcmp(path_name, argv[n])) - { - rstto_navigator_set_file(navigator, i); - } - } - else - { - if (!strcmp(path_name, path_dir)) - { - rstto_navigator_set_file(navigator, i); - } + /* Check if the path name has been loaded before */ + for(i = 0; path_is_new && i < loaded_dirs_count; i++) + { + if(!strcmp(loaded_dirs[i], path_string)) + path_is_new = FALSE; + } - } - } - g_free(file_media); - thunar_vfs_path_unref(file_path); - } - g_free(path_name); - filename = g_dir_read_name(dir); - } - g_dir_close(dir); - g_free(path_string); - } - else + if(path_is_new) + { + /* Record new paths to avoid opening the same one multiple times */ + loaded_dirs[loaded_dirs_count] = path_string; + loaded_dirs_count++; + + GDir *dir = g_dir_open(path_string, 0, NULL); + const gchar* filename; + + /* Loop over files in the directory */ + while(filename = g_dir_read_name(dir)) { - GDir *dir = g_dir_open(argv[n], 0, NULL); - const gchar *filename = g_dir_read_name(dir); - while (filename) + gchar *path_name = g_strconcat(path_string, "/", filename, NULL); + + if((file_path = thunar_vfs_path_new(path_name, NULL)) + && (file_info = thunar_vfs_info_new_for_path(file_path, NULL))) { - gchar *path_name = g_strconcat(argv[n], "/", filename, NULL); - ThunarVfsPath *file_path = thunar_vfs_path_new(path_name, NULL); - if (file_path) + gchar *file_media = thunar_vfs_mime_info_get_media(file_info->mime_info); + if(!strcmp(file_media, "image")) { - ThunarVfsInfo *file_info = thunar_vfs_info_new_for_path(file_path, NULL); - gchar *file_media = thunar_vfs_mime_info_get_media(file_info->mime_info); - if(!strcmp(file_media, "image")) + RsttoNavigatorEntry *entry = rstto_navigator_entry_new(navigator, file_info); + gint i = rstto_navigator_add(navigator, entry); + + /* If single argument and matches current file - set the navigator */ + if(navigator_target_file != NULL && !strcmp(navigator_target_file, path_name)) { - RsttoNavigatorEntry *entry = rstto_navigator_entry_new(navigator, file_info); - rstto_navigator_add (navigator, entry); + rstto_navigator_set_file(navigator, i); + navigator_is_set = TRUE; } - g_free(file_media); - thunar_vfs_path_unref(file_path); } + + thunar_vfs_path_unref(file_path); g_free(path_name); - filename = g_dir_read_name(dir); + g_free(file_media); } - rstto_navigator_jump_first(navigator); - g_dir_close(dir); } + + /* Add path to recent items */ gchar *uri = thunar_vfs_path_dup_uri(info->path); gtk_recent_manager_add_item(recent_manager, uri); g_free(uri); + + if(navigator_target_file != NULL) + { + g_free(navigator_target_file); + } + g_dir_close(dir); + g_free(filename); } - thunar_vfs_path_unref(path); } + thunar_vfs_path_unref(path); } + /* If the navigator wasn't set before, set it here */ + if(!navigator_is_set) + { + rstto_navigator_jump_first(navigator); + } + + /* Clean up directories array */ + for(i = 0; i < loaded_dirs_count; i++) + { + g_free(loaded_dirs[i]); + } + g_free(loaded_dirs); + loaded_dirs = NULL; + g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK(cb_rstto_main_window_configure_event), NULL);