Author: colossus
Date: 2008-08-26 11:16:54 +0000 (Tue, 26 Aug 2008)
New Revision: 27583

Modified:
   xarchiver/trunk/TODO
   xarchiver/trunk/src/archive.c
   xarchiver/trunk/src/interface.c
   xarchiver/trunk/src/interface.h
   xarchiver/trunk/src/mime.c
   xarchiver/trunk/src/open-with-dlg.c
   xarchiver/trunk/src/open-with-dlg.h
   xarchiver/trunk/src/string_utils.c
   xarchiver/trunk/src/window.c
   xarchiver/trunk/src/window.h
Log:
Completed the "Open With dialog". I'm really grateful to Benedikt Meurer for 
the patience he manifested in replying my numerous emails.
Added another mimetype in mime.c
Added a workaround in string_utils.c for ignoring . and .. only and not the 
hidden dirs.
Updated TODO file.


Modified: xarchiver/trunk/TODO
===================================================================
--- xarchiver/trunk/TODO        2008-08-26 05:52:29 UTC (rev 27582)
+++ xarchiver/trunk/TODO        2008-08-26 11:16:54 UTC (rev 27583)
@@ -1,5 +1,4 @@
 - reduce the loading time when opening large archives.
-- develop the dlg-open dialog.
 - fix crash when opening rar archives produces under winzozz.
 - recurse with opendir for arj when using the switches from cmd-line
 - fix the remaining bugs in bugzilla.xfce.org

Modified: xarchiver/trunk/src/archive.c
===================================================================
--- xarchiver/trunk/src/archive.c       2008-08-26 05:52:29 UTC (rev 27582)
+++ xarchiver/trunk/src/archive.c       2008-08-26 11:16:54 UTC (rev 27583)
@@ -760,7 +760,6 @@
                gtk_tree_model_get(model,&iter,1,&dir,-1);
                g_string_prepend_c(string,'/');
                g_string_prepend(string,dir);
-
                /* Get the memory address of entry so to update the main 
listview */
                gtk_tree_model_get(model,&iter,2,&entry,-1);
                while (gtk_tree_model_iter_parent(model,&parent,&iter))

Modified: xarchiver/trunk/src/interface.c
===================================================================
--- xarchiver/trunk/src/interface.c     2008-08-26 05:52:29 UTC (rev 27582)
+++ xarchiver/trunk/src/interface.c     2008-08-26 11:16:54 UTC (rev 27583)
@@ -836,6 +836,7 @@
        GtkWidget *image6;
        GtkWidget *image7;
        GtkWidget *image8;
+       GtkWidget *image1;
        GtkWidget *separator;
        GtkWidget *open;
        GtkWidget *extract;
@@ -844,7 +845,7 @@
        GtkWidget *image11;
 
        xa_popup_menu = gtk_menu_new();
-       open = gtk_image_menu_item_new_with_mnemonic (_("Open"));
+       open = gtk_image_menu_item_new_with_mnemonic (_("Open With"));
        gtk_widget_show (open);
        gtk_container_add (GTK_CONTAINER (xa_popup_menu),open);
 
@@ -860,6 +861,14 @@
        gtk_widget_show (image9);
        gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (extract),image9);
 
+       view = gtk_image_menu_item_new_with_mnemonic (_("View"));
+       gtk_widget_show (view);
+       gtk_container_add (GTK_CONTAINER (xa_popup_menu),view);
+
+       image1 = gtk_image_new_from_stock ("gtk-find",GTK_ICON_SIZE_MENU);
+       gtk_widget_show (image1);
+       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (view),image1);
+
        separator = gtk_separator_menu_item_new ();
        gtk_widget_show (separator);
        gtk_container_add (GTK_CONTAINER (xa_popup_menu),separator);
@@ -912,10 +921,11 @@
        gtk_widget_show (image11);
        gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (rrename),image11);
 
+       g_signal_connect ((gpointer) open,      "activate",     
G_CALLBACK(xa_open_with_from_popupmenu),(gpointer) 0);
+       g_signal_connect ((gpointer) view,      "activate",     
G_CALLBACK(xa_open_with_from_popupmenu),(gpointer) 1);
        g_signal_connect ((gpointer) cut,       "activate",     
G_CALLBACK(xa_clipboard_cut),NULL);
        g_signal_connect ((gpointer) copy,      "activate",     
G_CALLBACK(xa_clipboard_copy),NULL);
        g_signal_connect ((gpointer) paste,     "activate",     
G_CALLBACK(xa_clipboard_paste),NULL);
-       g_signal_connect ((gpointer) open,      "activate",     
G_CALLBACK(xa_open_file_from_popupmenu),NULL);
        g_signal_connect ((gpointer) 
extract,"activate",G_CALLBACK(xa_extract_archive),NULL);
        g_signal_connect ((gpointer) 
ddelete,"activate",G_CALLBACK(xa_delete_archive),NULL);
        g_signal_connect ((gpointer) 
rrename,"activate",G_CALLBACK(xa_rename_archive),NULL);

Modified: xarchiver/trunk/src/interface.h
===================================================================
--- xarchiver/trunk/src/interface.h     2008-08-26 05:52:29 UTC (rev 27582)
+++ xarchiver/trunk/src/interface.h     2008-08-26 11:16:54 UTC (rev 27583)
@@ -49,7 +49,7 @@
 *prefs_menu,*password_entry_menu, *image1, *image2, *menuitem4, 
*select_all,*deselect_all,*select_pattern, *exe_menu, *menuitem4_menu,
 *about1, *help1, *toolbar1, *toolbar2, *hbox1, *tmp_image, *pad_image, 
*New_button, *Open_button, *back_button, *home_button, *forward_button,
 
*up_button,*separatortoolitem1,*separatortoolitem2,*separatortoolitem3,*AddFile_button,*Extract_button,*Stop_button,*toolitem1,*location_label,
-*location_entry,*hpaned1,*archive_dir_treeview,*scrolledwindow2,*ddelete,*rename_menu,*rrename,*cut,*copy,*paste;
+*location_entry,*hpaned1,*archive_dir_treeview,*scrolledwindow2,*ddelete,*rename_menu,*rrename,*cut,*copy,*paste,*view;
 
 gchar *xa_create_password_dialog(XArchive *);
 void set_label (GtkWidget *label,gchar *);

Modified: xarchiver/trunk/src/mime.c
===================================================================
--- xarchiver/trunk/src/mime.c  2008-08-26 05:52:29 UTC (rev 27582)
+++ xarchiver/trunk/src/mime.c  2008-08-26 11:16:54 UTC (rev 27583)
@@ -52,7 +52,8 @@
                || strcmp (mime,"application/x-bzip") == 0  || strcmp 
(mime,"application/x-gzip") == 0)
                icon_name = "package";
        else if (strcmp(mime,"application/x-shockwave-flash") == 0 || 
strcmp(mime,"video/mpeg") == 0 || strcmp(mime,"video/quicktime") == 0
-               || strcmp(mime,"video/x-msvideo") == 0 || strcmp 
(mime,"video/mp4") == 0 || strcmp(mime,"application/x-flash-video") == 0)
+               || strcmp(mime,"video/x-msvideo") == 0 || strcmp 
(mime,"video/mp4") == 0 || strcmp(mime,"application/x-flash-video") == 0
+               || strcmp(mime,"video/dv") == 0)
                icon_name = "video";
        else if (strcmp(mime,"application/x-cd-image") == 0)
                icon_name = "application-x-cd-image";

Modified: xarchiver/trunk/src/open-with-dlg.c
===================================================================
--- xarchiver/trunk/src/open-with-dlg.c 2008-08-26 05:52:29 UTC (rev 27582)
+++ xarchiver/trunk/src/open-with-dlg.c 2008-08-26 11:16:54 UTC (rev 27583)
@@ -21,26 +21,46 @@
 #include "mime.h"
 #include "support.h"
 
-/*open_with_dialog = xa_create_open_with_dialog(filename);*/
+static void xa_read_desktop_directories(GtkListStore *,const gchar *);
+static void xa_parse_desktop_files(GSList **,GSList **,GSList **,gchar *,gchar 
*);
+static void xa_open_with_dialog_row_selected (GtkTreeSelection *,GtkListStore 
*);
+static void xa_open_with_dialog_browse_custom_command(GtkButton *,gpointer );
 
-GtkWidget *xa_create_open_with_dialog(gchar *filename)
+GtkWidget *custom_command_entry;
+
+gchar *xa_create_open_with_dialog(gchar *filename,int nr)
 {
-       GtkWidget       
*dialog1,*dialog_vbox1,*vbox1,*hbox1,*mime_icon,*open_text,*scrolledwindow1,*apps_treeview,*app_description,*dialog_action_area1,
-                               
*custom_command_expander,*custom_command_entry,*hbox_expander,*browse,*cancelbutton1,*okbutton1;
+       GtkWidget       
*dialog1,*dialog_vbox1,*vbox1,*hbox1,*mime_icon,*open_text,*scrolledwindow1,*apps_treeview,*dialog_action_area1,
+                               
*custom_command_expander,*hbox_expander,*browse,*cancelbutton1,*okbutton1;
+       GtkListStore *apps_liststore;
        GtkCellRenderer         *renderer;
        GtkTreeViewColumn       *column;
+       GtkTreeSelection *selection;
+       GtkTreeIter iter;
+       GtkTreeModel *model;
        GdkPixbuf *pixbuf;
        gchar *text = NULL;
+       gchar *exec = NULL;
+       gchar *title;
+       const gchar *icon_name = NULL;  
+       const gchar* const *desktop_dirs;
+       gint x = 0;
+       gint response;
 
        dialog1 = gtk_dialog_new ();
-       gtk_window_set_title (GTK_WINDOW (dialog1), _("Open With"));
+       if (nr == 1)
+               title = _("Open With");
+       else
+               title = _("Open the selected files with");
+
+       gtk_window_set_title (GTK_WINDOW (dialog1),title);
        gtk_window_set_position (GTK_WINDOW (dialog1), 
GTK_WIN_POS_CENTER_ON_PARENT);
        gtk_window_set_modal (GTK_WINDOW (dialog1), TRUE);
        gtk_window_set_type_hint (GTK_WINDOW (dialog1), 
GDK_WINDOW_TYPE_HINT_DIALOG);
        
gtk_window_set_transient_for(GTK_WINDOW(dialog1),GTK_WINDOW(xa_main_window));
        gtk_dialog_set_has_separator (GTK_DIALOG (dialog1),FALSE);
        gtk_container_set_border_width (GTK_CONTAINER (dialog1),5);
-       gtk_widget_set_size_request(dialog1,-1,380);
+       gtk_widget_set_size_request(dialog1,380,380);
        dialog_vbox1 = GTK_DIALOG (dialog1)->vbox;
 
        vbox1 = gtk_vbox_new (FALSE, 5);
@@ -49,26 +69,32 @@
        hbox1 = gtk_hbox_new (FALSE, 1);
        gtk_box_pack_start (GTK_BOX (vbox1),hbox1,FALSE,FALSE,0);
 
-       pixbuf = xa_get_pixbuf_icon_from_cache(filename,40);
-       mime_icon = gtk_image_new_from_pixbuf(pixbuf);
-       g_object_unref(pixbuf);
-       gtk_box_pack_start (GTK_BOX (hbox1),mime_icon,FALSE,TRUE,0);
-       gtk_misc_set_alignment (GTK_MISC (mime_icon),0,0);
-
-       open_text = gtk_label_new("");
-       text = g_strdup_printf(_("Open <i>%s</i> with:"),filename);
-       gtk_label_set_use_markup (GTK_LABEL (open_text),TRUE);
-       gtk_label_set_markup (GTK_LABEL (open_text),text);
-       g_free(text);
-       gtk_box_pack_start (GTK_BOX (hbox1),open_text,FALSE,FALSE,10);
-
+       if (nr == 1)
+       {
+               icon_name = xa_get_stock_mime_icon(filename);
+               pixbuf = 
gtk_icon_theme_load_icon(icon_theme,icon_name,40,0,NULL);
+               mime_icon = gtk_image_new_from_pixbuf(pixbuf);
+               g_object_unref(pixbuf);
+               gtk_box_pack_start (GTK_BOX (hbox1),mime_icon,FALSE,TRUE,0);
+               gtk_misc_set_alignment (GTK_MISC (mime_icon),0,0);
+       
+               open_text = gtk_label_new("");
+               gtk_box_pack_start (GTK_BOX (hbox1),open_text,FALSE,FALSE,10);
+               text = g_strdup_printf(_("Open <i>%s</i> with:"),filename);
+               gtk_label_set_use_markup (GTK_LABEL (open_text),TRUE);
+               gtk_label_set_markup (GTK_LABEL (open_text),text);
+               g_free(text);
+       }
        scrolledwindow1 = gtk_scrolled_window_new (NULL,NULL);
        gtk_box_pack_start (GTK_BOX (vbox1),scrolledwindow1,TRUE,TRUE,0);
        g_object_set (G_OBJECT 
(scrolledwindow1),"hscrollbar-policy",GTK_POLICY_AUTOMATIC,"shadow-type",GTK_SHADOW_IN,"vscrollbar-policy",GTK_POLICY_AUTOMATIC,NULL);
 
-       apps_treeview = gtk_tree_view_new();
+       apps_liststore = gtk_list_store_new 
(3,GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_STRING);
+       apps_treeview = 
gtk_tree_view_new_with_model(GTK_TREE_MODEL(apps_liststore));
        gtk_container_add (GTK_CONTAINER (scrolledwindow1),apps_treeview);
        gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(apps_treeview),FALSE);
+       GtkTreeSelection *sel = gtk_tree_view_get_selection( GTK_TREE_VIEW 
(apps_treeview));
+       g_signal_connect ((gpointer) sel,"changed",G_CALLBACK 
(xa_open_with_dialog_row_selected),apps_liststore);
 
        /* First column: icon + text */
        column = gtk_tree_view_column_new();
@@ -80,13 +106,14 @@
        gtk_tree_view_column_pack_start(column,renderer, TRUE);
        gtk_tree_view_column_set_attributes( column,renderer,"text",1,NULL);
        gtk_tree_view_column_set_resizable (column, TRUE);
-       gtk_tree_view_column_set_sort_column_id (column, 1);
+       
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(apps_liststore),1,GTK_SORT_ASCENDING);
        gtk_tree_view_append_column (GTK_TREE_VIEW (apps_treeview), column);
        gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
 
-       app_description = gtk_label_new ("This should be the app description");
-       gtk_misc_set_alignment(GTK_MISC(app_description),0.05,0.0);
-       gtk_box_pack_start (GTK_BOX (vbox1),app_description,FALSE,FALSE,0);
+       /* Hidden column with the application executable name */
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_visible(column,FALSE);
+       gtk_tree_view_append_column (GTK_TREE_VIEW (apps_treeview), column);
 
        custom_command_expander = gtk_expander_new_with_mnemonic(_("Use a 
custom command:"));
        gtk_box_pack_start (GTK_BOX 
(vbox1),custom_command_expander,FALSE,FALSE,0);
@@ -95,6 +122,7 @@
 
        custom_command_entry = gtk_entry_new();
        browse = gtk_button_new_with_label(_("Browse"));
+       g_signal_connect (G_OBJECT (browse),"clicked",G_CALLBACK 
(xa_open_with_dialog_browse_custom_command),NULL);
 
        gtk_box_pack_start (GTK_BOX 
(hbox_expander),custom_command_entry,TRUE,TRUE,0);
        gtk_box_pack_start (GTK_BOX (hbox_expander),browse,FALSE,TRUE,0);
@@ -113,5 +141,181 @@
        gtk_dialog_add_action_widget (GTK_DIALOG 
(dialog1),okbutton1,GTK_RESPONSE_OK);
        GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
        gtk_widget_show_all(vbox1);
-       return dialog1;
+
+       /* Let's parse the desktop files in all the system data dirs */
+       desktop_dirs = g_get_system_data_dirs();
+       while (desktop_dirs[x])
+       {
+               xa_read_desktop_directories(apps_liststore,desktop_dirs[x]);
+               x++;
+       }
+       response = gtk_dialog_run(GTK_DIALOG(dialog1));
+       if (response == GTK_RESPONSE_CANCEL || response == 
GTK_RESPONSE_DELETE_EVENT)
+       {
+               gtk_widget_destroy(dialog1);
+               return NULL;
+       }
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(apps_treeview));
+       gtk_tree_selection_get_selected(selection,&model,&iter);
+       gtk_tree_model_get(model,&iter,2,&exec,-1);
+       gtk_widget_destroy(dialog1);
+       return exec;
 }
+
+static void xa_read_desktop_directories(GtkListStore *liststore,const gchar 
*dirname)
+{
+       DIR *dir;
+       gchar *filename = NULL;
+       struct dirent *dirlist;
+       GSList *app_icon = NULL;
+       GSList *app_name  = NULL;
+       GSList *app_exe = NULL;
+       GtkTreeIter iter;
+
+       filename = g_strconcat(dirname,"applications",NULL);
+       dir = opendir(filename);
+
+       if (dir == NULL)
+       {
+               g_free(filename);
+               return;
+       }
+       while ((dirlist = readdir(dir)))
+       {
+               if (g_str_has_suffix(dirlist->d_name,".desktop"))
+                       
xa_parse_desktop_files(&app_name,&app_exe,&app_icon,filename,dirlist->d_name);
+       }
+       while (app_name)
+       {
+               gtk_list_store_append(liststore,&iter);
+               
gtk_list_store_set(liststore,&iter,0,app_icon->data,1,app_name->data,2,app_exe->data,-1);
+               if (app_icon->data != NULL)
+                       g_object_unref(app_icon->data);
+               app_name = app_name->next;
+               app_icon = app_icon->next;
+               app_exe  = app_exe->next;
+       }
+       g_free(filename);
+       closedir(dir);
+
+       g_slist_foreach(app_name,(GFunc)g_free,NULL);
+       g_slist_foreach(app_exe,(GFunc)g_free,NULL);
+       g_slist_free(app_name);
+       g_slist_free(app_exe);
+}
+
+static void xa_parse_desktop_files(GSList **app_name_list,GSList 
**app_exe_list,GSList **app_icon_list,gchar *path,gchar *name)
+{
+       gchar *filename,*line;
+       gchar *app_name = NULL, *app_exe = NULL, *app_icon = NULL;
+       GIOStatus status;
+       GIOChannel *file;
+       gboolean has_mimetype = FALSE;
+
+       filename = g_strconcat(path,"/",name,NULL);
+       file = g_io_channel_new_file(filename,"r",NULL);
+       g_free(filename);
+
+       if (file == FALSE)
+               return;
+
+       do
+       {
+               status = g_io_channel_read_line (file, &line, NULL, NULL, NULL);
+               if (line != NULL)
+               {
+                       if (g_str_has_prefix(line,"Name="))
+                       {
+                               app_name = g_strndup(line + 5,(strlen(line)-6));
+                               continue;
+                       }
+                       if (g_str_has_prefix(line,"Exec="))
+                       {
+                               app_exe = strstr(line," ");
+                               if (app_exe)
+                                       app_exe = g_strndup(line + 5,app_exe - 
(line+5));
+                               else
+                                       app_exe = g_strndup(line + 
5,(strlen(line)-6));
+                               continue;
+                       }
+                       if (g_str_has_prefix(line,"Icon="))
+                       {
+                               app_icon = strstr(line,".");
+                               if (app_icon)
+                                       app_icon = g_strndup(line + 5,app_icon 
- (line+5));
+                               else
+                                       app_icon = g_strndup(line + 
5,(strlen(line)-6));
+                               continue;
+                       }
+                       if (g_str_has_prefix(line,"MimeType="))
+                               has_mimetype = TRUE;
+                       g_free(line);
+               }
+       }
+       while (status != G_IO_STATUS_EOF);
+       if (has_mimetype)
+       {
+               *app_name_list  = g_slist_prepend(*app_name_list,app_name);
+               *app_exe_list   = g_slist_prepend(*app_exe_list ,app_exe);
+               if (app_icon == NULL)
+                       app_icon = "";
+               *app_icon_list = 
g_slist_prepend(*app_icon_list,gtk_icon_theme_load_icon(icon_theme,app_icon,40,0,NULL));
+               g_io_channel_close(file);       
+               return;
+       }
+       if (app_name != NULL)
+       {
+               g_free(app_name);
+               app_name = NULL;
+       }
+       if (app_exe != NULL)
+       {
+               g_free(app_exe);
+               app_exe = NULL;
+       }
+       if (app_icon != NULL)
+       {
+               g_free(app_icon);
+               app_icon = NULL;
+       }
+       g_io_channel_close(file);       
+}
+
+static void xa_open_with_dialog_row_selected (GtkTreeSelection 
*selection,GtkListStore *liststore)
+{
+       gchar *exec;
+       GtkTreeIter iter;
+       GtkTreeModel *model;
+
+       gtk_tree_selection_get_selected(selection,&model,&iter);
+       gtk_tree_model_get(model,&iter,2,&exec,-1);
+       
+       gtk_entry_set_text(GTK_ENTRY(custom_command_entry),exec);
+       g_free(exec);
+}
+
+static void xa_open_with_dialog_browse_custom_command(GtkButton 
*button,gpointer data)
+{
+       GtkWidget *file_selector;
+       gchar *dest_dir;
+       gint response;
+
+       file_selector = gtk_file_chooser_dialog_new (_("Select an application"),
+                                                       GTK_WINDOW 
(xa_main_window),
+                                                       
GTK_FILE_CHOOSER_ACTION_OPEN,
+                                                       GTK_STOCK_CANCEL,
+                                                       GTK_RESPONSE_CANCEL,
+                                                       GTK_STOCK_OPEN,
+                                                       GTK_RESPONSE_ACCEPT,
+                                                       NULL);
+
+       gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER 
(file_selector),"/usr/bin");
+       response = gtk_dialog_run (GTK_DIALOG(file_selector));
+       if (response == GTK_RESPONSE_ACCEPT)
+       {
+               dest_dir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER 
(file_selector));
+               gtk_entry_set_text(GTK_ENTRY(custom_command_entry),dest_dir);
+               g_free(dest_dir);
+       }
+       gtk_widget_destroy(file_selector);
+}

Modified: xarchiver/trunk/src/open-with-dlg.h
===================================================================
--- xarchiver/trunk/src/open-with-dlg.h 2008-08-26 05:52:29 UTC (rev 27582)
+++ xarchiver/trunk/src/open-with-dlg.h 2008-08-26 11:16:54 UTC (rev 27583)
@@ -20,5 +20,5 @@
 #define __DLG_OPEN_H
 #include <gtk/gtk.h>
 
-GtkWidget *xa_create_open_with_dialog(gchar *);
+gchar *xa_create_open_with_dialog(gchar *,int);
 #endif

Modified: xarchiver/trunk/src/string_utils.c
===================================================================
--- xarchiver/trunk/src/string_utils.c  2008-08-26 05:52:29 UTC (rev 27582)
+++ xarchiver/trunk/src/string_utils.c  2008-08-26 11:16:54 UTC (rev 27583)
@@ -375,7 +375,7 @@
 
        while ((dirlist = readdir(dir)))
        {
-               if (dirlist->d_name[0] == '.')
+               if (strcmp(dirlist->d_name,".") == 0 || 
strcmp(dirlist->d_name,"..") == 0)
                        continue;
                fullname = g_strconcat (path,"/",dirlist->d_name,NULL);
                is_dir = g_file_test(fullname,G_FILE_TEST_IS_DIR);

Modified: xarchiver/trunk/src/window.c
===================================================================
--- xarchiver/trunk/src/window.c        2008-08-26 05:52:29 UTC (rev 27582)
+++ xarchiver/trunk/src/window.c        2008-08-26 11:16:54 UTC (rev 27583)
@@ -1598,7 +1598,7 @@
        gint n_elem = 0,pos = 0,dirs = 0;
        unsigned long int total_size = 0;
        unsigned long int size = 0;
-       XEntry *entry;
+       XEntry *entry = NULL;
 
        path = gtk_tree_path_new_first();
        if (! GTK_IS_TREE_MODEL(archive->model) || gtk_tree_model_get_iter 
(archive->model, &iter, path) == FALSE)
@@ -1643,6 +1643,8 @@
        {
                gtk_tree_model_get (archive->model,&iter,pos,&size,-1);
                gtk_tree_model_get 
(archive->model,&iter,archive->nc+1,&entry,-1);
+               if (entry == NULL)
+                       return;
                if (entry->is_dir)
                        dirs++;
                else
@@ -2072,12 +2074,12 @@
 {
        GtkWidget *message;
        GError *error = NULL;
-       gchar *argv[3];
+       gchar **argv;
        GdkScreen *screen;
 
-       argv[0] = program;
-       argv[1] = arg;
-       argv[2] = NULL;
+       gchar *command_line = g_strconcat(program," ",arg,NULL);
+       g_shell_parse_argv(command_line,NULL,&argv,NULL);
+       g_free(command_line);
 
        screen = gtk_widget_get_screen (GTK_WIDGET (xa_main_window));
        if (!gdk_spawn_on_screen 
(screen,NULL,argv,NULL,G_SPAWN_SEARCH_PATH,NULL,NULL,NULL,&error))
@@ -2365,6 +2367,7 @@
 
 int xa_mouse_button_event(GtkWidget *widget,GdkEventButton *event,XArchive 
*archive)
 {
+       XEntry *entry;
        GtkTreePath *path;
        GtkTreeIter  iter;
        GtkTreeSelection *selection;
@@ -2379,15 +2382,22 @@
        {
                gtk_tree_model_get_iter (GTK_TREE_MODEL 
(archive->liststore),&iter,path);
                gtk_tree_path_free (path);
+               
gtk_tree_model_get(archive->model,&iter,archive->nc+1,&entry,-1);
                if (! gtk_tree_selection_iter_is_selected (selection,&iter))
                {
                        gtk_tree_selection_unselect_all (selection);
                        gtk_tree_selection_select_iter (selection,&iter);
                }
-               if (selected > 1)
+               if (selected > 1 || entry->is_dir)
+               {
                        gtk_widget_set_sensitive(rrename,FALSE);
+                       gtk_widget_set_sensitive(view,FALSE);
+               }
                else
+               {
                        gtk_widget_set_sensitive(rrename,TRUE);
+                       gtk_widget_set_sensitive(view,TRUE);
+               }
                if (archive->type == XARCHIVETYPE_BZIP2 || archive->type == 
XARCHIVETYPE_GZIP || archive->type == XARCHIVETYPE_DEB || archive->type == 
XARCHIVETYPE_RPM)
                {
                        gtk_widget_set_sensitive(ddelete,FALSE);
@@ -2684,24 +2694,46 @@
        g_object_set(cell,"editable",FALSE,NULL);
 }
 
-void xa_open_file_from_popupmenu(GtkMenuItem* item,gpointer data)
+void xa_open_with_from_popupmenu(GtkMenuItem* item,gpointer data)
 {
-       gboolean result = FALSE;
-       gint current_index,idx;
+       unsigned short int choice = GPOINTER_TO_UINT(data);
+       gboolean result         = FALSE;
+       gboolean overwrite = FALSE;
+       gint current_index,idx,nr;
        GtkTreeSelection *selection;
        GtkTreeIter iter;
        GList *row_list = NULL;
        GSList *list = NULL;
+       GSList *list_of_files = NULL;
+       GString *names = g_string_new("");
        gchar *dummy = NULL;
        XEntry *entry;
-       GdkPixbuf *pixbuf = NULL;
-       GtkWidget *dlg_open;
+       gchar *program = NULL;
 
        current_index = gtk_notebook_get_current_page(notebook);
        idx = xa_find_archive_index(current_index);
 
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW 
(archive[idx]->treeview));
        row_list = gtk_tree_selection_get_selected_rows(selection, 
&archive[idx]->model);
+       if (row_list == NULL)
+               return;
+       nr = gtk_tree_selection_count_selected_rows(selection);
+       while (row_list)
+       {
+               gtk_tree_model_get_iter(archive[idx]->model, 
&iter,row_list->data);
+               
gtk_tree_model_get(archive[idx]->model,&iter,archive[idx]->nc+1,&entry,-1);
+               gtk_tree_path_free(row_list->data);
+               list = 
g_slist_append(list,xa_build_full_path_name_from_entry(entry));
+               row_list = row_list->next;
+       }
+       g_list_free (row_list);
+       if (choice == 0)
+       {
+               program = xa_create_open_with_dialog(entry->filename,nr);
+               if (program == NULL)
+                       return;
+       }
+
        if (archive[idx]->extraction_path)
        {
                dummy = g_strdup(archive[idx]->extraction_path);
@@ -2710,32 +2742,35 @@
        xa_create_temp_directory(archive[idx]);
        archive[idx]->extraction_path = g_strdup(archive[idx]->tmp);
 
-       if (row_list != NULL)
+       overwrite = archive[idx]->overwrite;
+       archive[idx]->overwrite = TRUE;
+       if (choice == 0)
+               list_of_files = xa_slist_copy(list);
+
+       result = (*archive[idx]->extract) (archive[idx],list);
+       archive[idx]->overwrite = overwrite;
+       g_free(archive[idx]->extraction_path);
+       archive[idx]->extraction_path = NULL;
+       if (dummy)
        {
-               while (row_list)
-               {
-                       gtk_tree_model_get_iter(archive[idx]->model, 
&iter,row_list->data);
-                       
gtk_tree_model_get(archive[idx]->model,&iter,0,&pixbuf,archive[idx]->nc+1,&entry,-1);
-                       gtk_tree_path_free(row_list->data);
-                       list = 
g_slist_append(list,xa_build_full_path_name_from_entry(entry));
-                       row_list = row_list->next;
-               }
-               g_list_free (row_list);
-               result = (*archive[idx]->extract) (archive[idx],list);
-               g_free(archive[idx]->extraction_path);
-               archive[idx]->extraction_path = NULL;
-               if (dummy)
-               {
-                       archive[idx]->extraction_path = g_strdup(dummy);
-                       g_free(dummy);
-               }
-               if (result == FALSE)
-                       return;
-               chdir(archive[idx]->tmp);
-               dlg_open = xa_create_open_with_dialog(entry->filename);
-               gtk_dialog_run(GTK_DIALOG(dlg_open));
-               //xa_determine_program_to_run(entry->filename);
+               archive[idx]->extraction_path = g_strdup(dummy);
+               g_free(dummy);
        }
+       if (result == FALSE)
+               return;
+
+       chdir(archive[idx]->tmp);
+       if (choice == 0)
+       {
+               xa_cat_filenames(archive[idx],list_of_files,names);
+               xa_launch_external_program(program,names->str);
+               g_free(program);
+               g_string_free(names,TRUE);
+               g_slist_foreach(list_of_files,(GFunc)g_free,NULL);
+               g_slist_free(list_of_files);
+       }
+       else
+               xa_determine_program_to_run(entry->filename);
 }
 
 void xa_treeview_row_activated(GtkTreeView *tree_view,GtkTreePath 
*path,GtkTreeViewColumn *column,XArchive *archive)

Modified: xarchiver/trunk/src/window.h
===================================================================
--- xarchiver/trunk/src/window.h        2008-08-26 05:52:29 UTC (rev 27582)
+++ xarchiver/trunk/src/window.h        2008-08-26 11:16:54 UTC (rev 27583)
@@ -112,7 +112,7 @@
 void xa_rename_archive(GtkMenuItem *,gpointer );
 void xa_rename_cell_edited_canceled(GtkCellRenderer *,gpointer );
 void xa_rename_cell_edited (GtkCellRendererText *,const gchar *,const gchar 
*,XArchive * );
-void xa_open_file_from_popupmenu(GtkMenuItem *,gpointer );
+void xa_open_with_from_popupmenu(GtkMenuItem *,gpointer );
 void xa_clipboard_cut_copy_operation(XArchive *, XAClipboardMode );
 void xa_clipboard_get (GtkClipboard *,GtkSelectionData *,guint ,gpointer );
 void xa_clipboard_clear (GtkClipboard *,gpointer );

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to