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