[Xfce4-commits] r23224 - in xarchiver/branches/xarchiver-psybsd: libxarchiver src

Stephan Arts stephan at xfce.org
Thu Sep 28 11:03:18 UTC 2006


Author: stephan
Date: 2006-09-28 11:03:18 +0000 (Thu, 28 Sep 2006)
New Revision: 23224

Modified:
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c
   xarchiver/branches/xarchiver-psybsd/src/main_window.c
   xarchiver/branches/xarchiver-psybsd/src/main_window.h
Log:
Added 'extract-selection'


Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c	2006-09-28 09:44:20 UTC (rev 23223)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c	2006-09-28 11:03:18 UTC (rev 23224)
@@ -470,7 +470,7 @@
 
 	gpointer props = NULL; 
 	gpointer props_iter = NULL;
-	gint n = 0, a = 0, i = 0;
+	gint n = 0, a = 0, i = 0, o = 0;
 	gchar *temp_filename = NULL;
 	gchar *_size = NULL;
 
@@ -480,7 +480,7 @@
 
 	if(cond & (G_IO_PRI | G_IO_IN))
 	{
-		while(TRUE)
+		for(o = 0; o < 500; o++)
 		{
 			i = 0;
 

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c	2006-09-28 09:44:20 UTC (rev 23223)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c	2006-09-28 11:03:18 UTC (rev 23224)
@@ -39,11 +39,6 @@
 	{
 		if(archive->status != LXA_ARCHIVESTATUS_REFRESH)
 			lxa_archive_set_status(archive, LXA_ARCHIVESTATUS_IDLE);
-		if(archive->files)
-		{
-			g_free(archive->files);
-			archive->files = NULL;
-		}
 	}
 }
 

Modified: xarchiver/branches/xarchiver-psybsd/src/main_window.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main_window.c	2006-09-28 09:44:20 UTC (rev 23223)
+++ xarchiver/branches/xarchiver-psybsd/src/main_window.c	2006-09-28 11:03:18 UTC (rev 23224)
@@ -255,6 +255,8 @@
 	window->treeview = gtk_tree_view_new();
 
 	gtk_tree_view_set_enable_search(GTK_TREE_VIEW(window->treeview), TRUE);
+	GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW (window->treeview) );
+	gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
 
 	gtk_container_add(GTK_CONTAINER(window->scrollwindow), window->treeview);
 
@@ -510,16 +512,43 @@
 	gint result = 0;
 	XAMainWindow *window = XA_MAIN_WINDOW(userdata);
 	LXAArchiveSupport *lp_support = NULL;
+	GSList *filenames = NULL;
+	GValue *value = g_new0(GValue, 1);
+	GtkTreeModel *treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(window->treeview));
+	GtkTreeIter iter;
+	GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW (window->treeview) );
 
 	lp_support = lxa_get_support_for_mime(window->lp_xa_archive->mime);
 
-	dialog = xa_extract_archive_dialog_new(lp_support, window->lp_xa_archive, FALSE);
+
+	dialog = xa_extract_archive_dialog_new(lp_support, window->lp_xa_archive, gtk_tree_selection_count_selected_rows (selection));
 	result = gtk_dialog_run (GTK_DIALOG (dialog) );
 	if(result == GTK_RESPONSE_OK)
 	{
 		gtk_widget_hide(GTK_WIDGET(dialog));
 		extract_archive_path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
-		lxa_archive_support_extract(lp_support, window->lp_xa_archive, extract_archive_path, NULL);
+		if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(XA_EXTRACT_ARCHIVE_DIALOG(dialog)->sel_files_radio)))
+		{
+			GList *rows = gtk_tree_selection_get_selected_rows(selection, &treemodel);
+			GList *_rows = rows;
+			gchar *working_dir = xa_main_window_get_working_dir(window);
+			while(_rows != NULL)
+			{
+				gtk_tree_model_get_iter(GTK_TREE_MODEL(treemodel), &iter, rows->data);
+				if(window->props._show_icons)
+					gtk_tree_model_get_value(GTK_TREE_MODEL(treemodel), &iter, 1, value);
+				else
+					gtk_tree_model_get_value(GTK_TREE_MODEL(treemodel), &iter, 0, value);
+
+				filenames = g_slist_prepend(filenames, g_strconcat(working_dir, g_value_get_string(value), NULL));
+				g_value_unset(value);
+				_rows = _rows->next;
+			}
+			g_free(working_dir);
+			g_list_free(rows);
+			lxa_archive_support_extract(lp_support, window->lp_xa_archive, extract_archive_path, filenames);
+		} else
+			lxa_archive_support_extract(lp_support, window->lp_xa_archive, extract_archive_path, NULL);
 		g_free(extract_archive_path);
 		extract_archive_path = NULL;
 	}
@@ -868,3 +897,22 @@
 	g_free(value);
 }
 
+gchar *
+xa_main_window_get_working_dir(XAMainWindow *window)
+{
+	gchar *temp = ((LXAEntry *)window->working_node->data)->filename;
+	gchar *path = NULL, *_temp = NULL;
+	GSList *_path = window->working_node->next;
+	while(_path)
+	{
+		_temp = path;
+		if(temp)
+			path = g_strconcat(((LXAEntry *)_path->data)->filename, "/", temp, NULL);
+		else
+			path = g_strconcat(((LXAEntry *)_path->data)->filename, "/", _temp,NULL);
+	
+		g_free(_temp);
+		_path = _path->next;
+	}
+	return temp;
+}

Modified: xarchiver/branches/xarchiver-psybsd/src/main_window.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main_window.h	2006-09-28 09:44:20 UTC (rev 23223)
+++ xarchiver/branches/xarchiver-psybsd/src/main_window.h	2006-09-28 11:03:18 UTC (rev 23224)
@@ -119,6 +119,7 @@
 
 void xa_main_window_archive_status_changed(LXAArchive *archive, gpointer userdata);
 gint xa_main_window_open_archive(XAMainWindow *window, gchar *archive_path);
+gchar *xa_main_window_get_working_dir(XAMainWindow *window);
 
 G_END_DECLS
 #endif /* __XARCHIVER_MAIN_WINDOW_H__ */



More information about the Xfce4-commits mailing list