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

Stephan Arts stephan at xfce.org
Tue Oct 17 18:52:58 UTC 2006


Author: stephan
Date: 2006-10-17 18:52:57 +0000 (Tue, 17 Oct 2006)
New Revision: 23446

Modified:
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
   xarchiver/branches/xarchiver-psybsd/src/archive_store.c
   xarchiver/branches/xarchiver-psybsd/src/main_window.c
   xarchiver/branches/xarchiver-psybsd/src/navigation_bar.c
   xarchiver/branches/xarchiver-psybsd/src/navigation_bar.h
   xarchiver/branches/xarchiver-psybsd/src/path_bar.c
   xarchiver/branches/xarchiver-psybsd/src/path_bar.h
   xarchiver/branches/xarchiver-psybsd/src/tool_bar.c
   xarchiver/branches/xarchiver-psybsd/src/tool_bar.h
Log:
Peter and I fixed stuff.



Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c	2006-10-17 18:35:58 UTC (rev 23445)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c	2006-10-17 18:52:57 UTC (rev 23446)
@@ -197,10 +197,10 @@
 	LXAEntry *tmp_entry = NULL, *parent = NULL;
 	path_items = g_strsplit_set(path, "/\n", -1);
 	parent = archive->root_entry;
-	if(path_items[i]?strlen(path_items[i])==0:0)
+	if(path_items[i]?path_items[i][0]=='\0':0)
 	{
 		/* has leading / */
-		tmp_entry = lxa_entry_get_child(parent, path_items[i]);
+		tmp_entry = lxa_entry_get_child(parent, "/");
 		if(!tmp_entry)
 		{
 			tmp_entry = g_new0(LXAEntry, 1);

Modified: xarchiver/branches/xarchiver-psybsd/src/archive_store.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-17 18:35:58 UTC (rev 23445)
+++ xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-17 18:52:57 UTC (rev 23446)
@@ -51,6 +51,7 @@
 /* signals */
 enum {
 	XA_ARCHIVE_STORE_SIGNAL_PWD_CHANGED = 0,
+	XA_ARCHIVE_STORE_SIGNAL_NEW_ARCHIVE,
 	XA_ARCHIVE_STORE_SIGNAL_NUMBER
 };
 static gint xa_archive_store_signals[XA_ARCHIVE_STORE_SIGNAL_NUMBER];
@@ -239,7 +240,7 @@
 		G_PARAM_READWRITE);
 	g_object_class_install_property(object_class, XA_ARCHIVE_STORE_SORT_CASE_SENSITIVE, pspec);
 
-	xa_archive_store_signals[XA_ARCHIVE_STORE_SIGNAL_PWD_CHANGED] = g_signal_new("xa_pwd_changed",
+	xa_archive_store_signals[XA_ARCHIVE_STORE_SIGNAL_PWD_CHANGED] = g_signal_new("xa-pwd-changed",
 	   G_TYPE_FROM_CLASS(as_class),
 		 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
 		 0,
@@ -250,6 +251,17 @@
 		 0,
 		 NULL);
 
+	xa_archive_store_signals[XA_ARCHIVE_STORE_SIGNAL_NEW_ARCHIVE] = g_signal_new("xa-new-archive",
+	   G_TYPE_FROM_CLASS(as_class),
+		 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+		 0,
+		 NULL,
+		 NULL,
+		 g_cclosure_marshal_VOID__VOID,
+		 G_TYPE_NONE,
+		 0,
+		 NULL);
+
 	xa_archive_store_up_entry.filename = "..";
 	xa_archive_store_up_entry.props = NULL;
 	xa_archive_store_up_entry.children = NULL;
@@ -463,7 +475,7 @@
 		{
 			if(entry == &xa_archive_store_up_entry)
 			{
-				g_value_set_string(value, "gtk-go-up");
+				g_value_set_string(value, GTK_STOCK_GO_UP);
 			}
 			else
 			{
@@ -1032,7 +1044,9 @@
 		/* TODO Signal file-activated */
 		if(strcmp(entry->mime_type, "inode/directory"))
 		{
+#ifdef DEBUG
 			g_debug("file clicked");
+#endif
 			return;
 		}
 
@@ -1119,6 +1133,7 @@
 	{
 		store->archive = NULL;
 		store->current_entry = NULL;
+		g_signal_emit(store, xa_archive_store_signals[XA_ARCHIVE_STORE_SIGNAL_NEW_ARCHIVE], 0,NULL);
 		return;
 	}
 
@@ -1146,6 +1161,7 @@
 		gtk_tree_path_free(path_);
 	}
 
+	g_signal_emit(store, xa_archive_store_signals[XA_ARCHIVE_STORE_SIGNAL_NEW_ARCHIVE], 0,NULL);
 	g_signal_emit(store, xa_archive_store_signals[XA_ARCHIVE_STORE_SIGNAL_PWD_CHANGED], 0,NULL);
 }
 
@@ -1192,7 +1208,7 @@
 		}
 	}
 
-	if(buf[0][0] == '/')
+	if(buf[0] != lastfile && buf[0][0] == '/')
 	{
 		buf[0] = "";
 	}
@@ -1243,7 +1259,7 @@
 	if(!store->archive)
 		return FALSE;
 
-	gchar **buf = g_strsplit_set(path, "/\\\n", -1);
+	gchar **buf = g_strsplit_set(path, "/\n", -1);
 	gchar **iter = buf;
 	LXAEntry *entry = store->archive->root_entry;
 	GSList *stack = g_slist_prepend(NULL, entry);

Modified: xarchiver/branches/xarchiver-psybsd/src/main_window.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main_window.c	2006-10-17 18:35:58 UTC (rev 23445)
+++ xarchiver/branches/xarchiver-psybsd/src/main_window.c	2006-10-17 18:52:57 UTC (rev 23446)
@@ -32,14 +32,14 @@
 #include "archive_store.h"
 #include "navigation_bar.h"
 
+#ifdef ENABLE_PATHBAR
+#include "path_bar.h"
+#endif /* ENABLE_PATHBAR */
+
 #ifdef ENABLE_TOOLBAR
 #include "tool_bar.h"
 #endif /* ENABLE_TOOLBAR */
 
-#ifdef ENABLE_PATHBAR
-#include "path_bar.h"
-#endif /* ENABLE_PATHBAR */
-
 #include "main_window.h"
 #include "new_dialog.h"
 #include "extract_dialog.h"
@@ -117,7 +117,7 @@
 	object_class->get_property = xa_main_window_get_property;
 	object_class->finalize     = xa_main_window_finalize;
 
-	pspec = g_param_spec_boolean("show_icons",
+	pspec = g_param_spec_boolean("show-icons",
 		_("Show icons"),
 		_("Show icons"),
 		FALSE,
@@ -129,20 +129,31 @@
 xa_main_window_finalize(GObject *object)
 {
 	XAMainWindow *window = XA_MAIN_WINDOW(object);
+
+	xa_archive_store_set_contents(XA_ARCHIVE_STORE(window->treemodel), NULL);
+
 	xa_settings_set_group(window->settings, "Global");
 	if(!window->navigationbar)
+	{
 		xa_settings_write_entry(window->settings, "NavigationBar", "None");
-	else
+	}
+#ifdef ENABLE_TOOLBAR
+	else if(XA_IS_TOOL_BAR(window->navigationbar))
 	{
+		xa_settings_write_entry(window->settings, "NavigationBar", "ToolBar");
+	}	
+#endif
 #ifdef ENABLE_PATHBAR
-		if(G_OBJECT_TYPE(window->navigationbar) == XA_TYPE_PATH_BAR)
-			xa_settings_write_entry(window->settings, "NavigationBar", "PathBar");
+	else if(XA_IS_PATH_BAR(window->navigationbar))
+	{
+		xa_settings_write_entry(window->settings, "NavigationBar", "PathBar");
+	}
 #endif
-#ifdef ENABLE_TOOLBAR
-		if(G_OBJECT_TYPE(window->navigationbar) == XA_TYPE_TOOL_BAR)
-			xa_settings_write_entry(window->settings, "NavigationBar", "ToolBar");
-#endif
+	else
+	{
+		xa_settings_write_entry(window->settings, "NavigationBar", "None");
 	}
+	gtk_widget_unref(GTK_WIDGET(window->navigationbar));
 	xa_settings_save(window->settings);
 }
 
@@ -156,6 +167,7 @@
 	GtkWidget     *tmp_image;
 	GtkAccelGroup *accel_group = gtk_accel_group_new();
 	const gchar   *nav_bar;
+	gboolean up_dir = TRUE;
 
 	window->working_node = NULL;
 	window->parent_node = g_new0(GValue, 1);
@@ -186,25 +198,25 @@
 	gtk_menu_item_set_submenu(GTK_MENU_ITEM(window->menubar.menu_item_help), window->menubar.menu_help);
 
 /* Archive menu */
-	window->menubar.menu_item_new = gtk_image_menu_item_new_from_stock("gtk-new", accel_group);
+	window->menubar.menu_item_new = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW, accel_group);
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_archive), window->menubar.menu_item_new);
 
-	window->menubar.menu_item_open = gtk_image_menu_item_new_from_stock("gtk-open", accel_group);
+	window->menubar.menu_item_open = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, accel_group);
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_archive), window->menubar.menu_item_open);
 
 	menu_separator = gtk_separator_menu_item_new();
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_archive), menu_separator);
 
-	window->menubar.menu_item_properties = gtk_image_menu_item_new_from_stock("gtk-properties", accel_group);
+	window->menubar.menu_item_properties = gtk_image_menu_item_new_from_stock(GTK_STOCK_PROPERTIES, accel_group);
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_archive), window->menubar.menu_item_properties);
 
-	window->menubar.menu_item_close = gtk_image_menu_item_new_from_stock("gtk-close", accel_group);
+	window->menubar.menu_item_close = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE, accel_group);
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_archive), window->menubar.menu_item_close);
 
 	menu_separator = gtk_separator_menu_item_new();
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_archive), menu_separator);
 
-	window->menubar.menu_item_quit = gtk_image_menu_item_new_from_stock("gtk-quit", accel_group);
+	window->menubar.menu_item_quit = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group);
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_archive), window->menubar.menu_item_quit);
 
 	g_signal_connect(G_OBJECT(window->menubar.menu_item_new), "activate", G_CALLBACK(cb_xa_main_new_archive), window);
@@ -224,13 +236,13 @@
 	gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (window->menubar.menu_item_extract), tmp_image);
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_action), window->menubar.menu_item_extract);
 
-	window->menubar.menu_item_remove = gtk_image_menu_item_new_from_stock("gtk-delete", accel_group);
+	window->menubar.menu_item_remove = gtk_image_menu_item_new_from_stock(GTK_STOCK_DELETE, accel_group);
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_action), window->menubar.menu_item_remove);
 
 	menu_separator = gtk_separator_menu_item_new();
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_action), menu_separator);
 
-	window->menubar.menu_item_settings = gtk_image_menu_item_new_from_stock("gtk-preferences", accel_group);
+	window->menubar.menu_item_settings = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, accel_group);
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_action), window->menubar.menu_item_settings);
 
 	g_signal_connect(G_OBJECT(window->menubar.menu_item_add), "activate", G_CALLBACK(cb_xa_main_add_to_archive), window);
@@ -243,12 +255,12 @@
 	gtk_widget_set_sensitive(GTK_WIDGET(window->menubar.menu_item_close), FALSE);
 
 /* Help menu */
-	window->menubar.menu_item_about = gtk_image_menu_item_new_from_stock("gtk-about", accel_group);
+	window->menubar.menu_item_about = gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, accel_group);
 	gtk_container_add(GTK_CONTAINER(window->menubar.menu_help), window->menubar.menu_item_about);
 
 /* Archive pane */
-	window->toolbar.tool_item_new = gtk_tool_button_new_from_stock("gtk-new");
-	window->toolbar.tool_item_open = gtk_tool_button_new_from_stock("gtk-open");
+	window->toolbar.tool_item_new = gtk_tool_button_new_from_stock(GTK_STOCK_NEW);
+	window->toolbar.tool_item_open = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
 	tool_separator = gtk_separator_tool_item_new ();
 
 	gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(window->toolbar.tool_item_new));
@@ -267,7 +279,7 @@
 	window->toolbar.tool_item_extract = gtk_tool_button_new(tmp_image, _("Extract"));
 	gtk_widget_set_sensitive(GTK_WIDGET(window->toolbar.tool_item_extract), FALSE);
 
-	window->toolbar.tool_item_remove = gtk_tool_button_new_from_stock("gtk-delete");
+	window->toolbar.tool_item_remove = gtk_tool_button_new_from_stock(GTK_STOCK_DELETE);
 	gtk_widget_set_sensitive(GTK_WIDGET(window->toolbar.tool_item_remove), FALSE);
 
 	tool_separator = gtk_separator_tool_item_new ();
@@ -282,7 +294,7 @@
 
 /* control pane */
 
-	window->toolbar.tool_item_stop = gtk_tool_button_new_from_stock("gtk-stop");
+	window->toolbar.tool_item_stop = gtk_tool_button_new_from_stock(GTK_STOCK_STOP);
 	gtk_widget_set_sensitive(GTK_WIDGET(window->toolbar.tool_item_stop), FALSE);
 
 	gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(window->toolbar.tool_item_stop));
@@ -292,26 +304,36 @@
 	xa_settings_set_group(window->settings, "Global");
 	nav_bar = xa_settings_read_entry(window->settings, "NavigationBar", "PathBar");
 	window->navigationbar = NULL;
+
 #ifdef ENABLE_TOOLBAR
 	if(!strcmp(nav_bar, "ToolBar"))
+	{
 		window->navigationbar = xa_tool_bar_new(NULL); 
+		up_dir = FALSE;
+	}
 #endif
 #ifdef ENABLE_PATHBAR
 	if(!strcmp(nav_bar, "PathBar"))
+	{
 		window->navigationbar = xa_path_bar_new(NULL);
+		gtk_container_set_border_width(GTK_CONTAINER(window->navigationbar), 3);
+		up_dir = FALSE;
+	}
 #endif
 
-	if(window->navigationbar)
+	if(!window->navigationbar)
 	{
-		gtk_container_set_border_width(GTK_CONTAINER(window->navigationbar), 3);
+		window->navigationbar = xa_navigation_bar_new(NULL);
 	}
 
+	gtk_widget_ref(GTK_WIDGET(window->navigationbar));
+
 /* main view */
 	window->scrollwindow = gtk_scrolled_window_new(NULL, NULL);
 	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window->scrollwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 
 	window->treeview = gtk_tree_view_new();
-	gtk_tree_view_set_rules_hint(window->treeview, TRUE);
+	/* gtk_tree_view_set_rules_hint(window->treeview, TRUE); */
 
 	gtk_tree_view_set_enable_search(GTK_TREE_VIEW(window->treeview), TRUE);
 	GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW (window->treeview) );
@@ -342,12 +364,11 @@
 	gtk_container_add(GTK_CONTAINER(window), main_vbox);
 
 	/* archive model */
-	if(window->navigationbar)
-		window->treemodel = xa_archive_store_new(NULL, TRUE, FALSE, window->icon_theme);
-	else
-		window->treemodel = xa_archive_store_new(NULL, TRUE, TRUE, window->icon_theme);
+	window->treemodel = xa_archive_store_new(NULL, TRUE, up_dir, window->icon_theme);
+
 	xa_archive_store_connect_treeview(XA_ARCHIVE_STORE(window->treemodel), GTK_TREE_VIEW(window->treeview));
 	gtk_tree_view_set_model(GTK_TREE_VIEW(window->treeview), GTK_TREE_MODEL(window->treemodel));
+
 	if(window->navigationbar)
 		xa_navigation_bar_set_store(window->navigationbar, XA_ARCHIVE_STORE(window->treemodel));
 }
@@ -522,8 +543,6 @@
 		open_archive_path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
 		if(window->lp_xa_archive)
 		{
-			if(window->navigationbar)
-				xa_navigation_bar_clear_history(window->navigationbar);
 			xa_archive_store_set_contents(XA_ARCHIVE_STORE(window->treemodel), NULL);
 			g_object_unref(window->lp_xa_archive);
 			window->lp_xa_archive = NULL;
@@ -610,8 +629,6 @@
 	GtkTreeModel *liststore = window->treemodel;
 	GList *columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(window->treeview));
 
-	if(window->navigationbar)
-		xa_navigation_bar_clear_history(window->navigationbar);
 	xa_archive_store_set_contents(XA_ARCHIVE_STORE(liststore), NULL);
 /*	xa_archive_tree_store_set_contents(XA_ARCHIVE_TREE_STORE(liststore), NULL); */
 

Modified: xarchiver/branches/xarchiver-psybsd/src/navigation_bar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/navigation_bar.c	2006-10-17 18:35:58 UTC (rev 23445)
+++ xarchiver/branches/xarchiver-psybsd/src/navigation_bar.c	2006-10-17 18:52:57 UTC (rev 23446)
@@ -39,6 +39,9 @@
 cb_xa_navigation_bar_pwd_changed(XAArchiveStore *store, XANavigationBar *bar);
 
 static void
+cb_xa_navigation_bar_new_archive(XAArchiveStore *store, XANavigationBar *bar);
+
+static void
 xa_navigation_bar_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
 static void
 xa_navigation_bar_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
@@ -96,7 +99,11 @@
 static void
 xa_navigation_bar_init(XANavigationBar *navigation_bar)
 {
+	GTK_WIDGET_SET_FLAGS(navigation_bar, GTK_NO_WINDOW);
+	gtk_widget_set_redraw_on_allocate(GTK_WIDGET(navigation_bar), FALSE);
+
 	navigation_bar->_cb_pwd_changed = (GCallback)cb_xa_navigation_bar_pwd_changed;
+	navigation_bar->_cb_new_archive = (GCallback)cb_xa_navigation_bar_new_archive;
 	navigation_bar->max_history = XA_NAVIGATION_BAR_MAX_HISTORY;
 	navigation_bar->pwd = NULL;
 	navigation_bar->history = NULL;
@@ -113,10 +120,13 @@
 
 	navigation_bar->store = store;
 	if(store)
-		g_signal_connect(G_OBJECT(store), "xa_pwd_changed", (GCallback)navigation_bar->_cb_pwd_changed, navigation_bar);
+	{
+		g_signal_connect(G_OBJECT(store), "xa-pwd-changed", (GCallback)navigation_bar->_cb_pwd_changed, navigation_bar);
+		g_signal_connect(G_OBJECT(store), "xa-new-archive", (GCallback)navigation_bar->_cb_new_archive, navigation_bar);
+	}
 }
 
-GtkWidget *
+XANavigationBar *
 xa_navigation_bar_new(XAArchiveStore *store)
 {
 	XANavigationBar *bar;
@@ -126,7 +136,7 @@
 	if(store)
 		xa_navigation_bar_set_store(bar, store);
 
-	return GTK_WIDGET(bar);
+	return bar;
 }
 
 static void
@@ -137,6 +147,12 @@
 	g_free(path);
 }
 
+static void
+cb_xa_navigation_bar_new_archive(XAArchiveStore *store, XANavigationBar *bar)
+{
+	xa_navigation_bar_clear_history(bar);
+}
+
 void
 xa_navigation_bar_history_push(XANavigationBar *nav_bar, const gchar *path)
 {

Modified: xarchiver/branches/xarchiver-psybsd/src/navigation_bar.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/navigation_bar.h	2006-10-17 18:35:58 UTC (rev 23445)
+++ xarchiver/branches/xarchiver-psybsd/src/navigation_bar.h	2006-10-17 18:52:57 UTC (rev 23446)
@@ -50,6 +50,7 @@
 	GList *pwd;
 	gint max_history;
 	GCallback _cb_pwd_changed;
+	GCallback _cb_new_archive;
 };
 
 typedef struct _XANavigationBarClass XANavigationBarClass;
@@ -60,7 +61,7 @@
 };
 
 GType      xa_navigation_bar_get_type();
-GtkWidget *xa_navigation_bar_new();
+XANavigationBar *xa_navigation_bar_new();
 void       xa_navigation_bar_history_push(XANavigationBar *nav_bar, const gchar *path);
 void       xa_navigation_bar_set_store(XANavigationBar *navigation_bar, XAArchiveStore *store);
 gint       xa_navigation_bar_history_get_length(XANavigationBar *nav_bar);

Modified: xarchiver/branches/xarchiver-psybsd/src/path_bar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/path_bar.c	2006-10-17 18:35:58 UTC (rev 23445)
+++ xarchiver/branches/xarchiver-psybsd/src/path_bar.c	2006-10-17 18:52:57 UTC (rev 23446)
@@ -15,6 +15,9 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
+/*
+ * Based on code written by Benedikt Meurer <benny at xfce.org>
+ */
 
 #include <config.h>
 #include <string.h>
@@ -26,6 +29,9 @@
 #include "navigation_bar.h"
 #include "path_bar.h"
 
+#ifndef XA_PATH_BAR_SCROLL_TIMEOUT
+#define XA_PATH_BAR_SCROLL_TIMEOUT 200
+#endif
 
 static void
 xa_path_bar_class_init(XAPathBarClass *archive_class);
@@ -49,14 +55,33 @@
 
 static void
 cb_xa_path_bar_pwd_changed(XAArchiveStore *store, XAPathBar *bar);
+static void
+cb_xa_path_bar_new_archive(XAArchiveStore *store, XAPathBar *bar);
 
 static void
 cb_xa_path_bar_path_button_clicked(GtkRadioButton *button, XAPathBar *path_bar);
+
 static void
-cb_xa_path_bar_scroll_left(GtkWidget *widget, gpointer user_data);
+cb_xa_path_bar_scroll_timeout_destroy(gpointer user_data);
+
+static gboolean
+cb_xa_path_bar_scroll_left_timeout(gpointer user_data);
+static gboolean
+cb_xa_path_bar_left_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer user_data);
+static gboolean
+cb_xa_path_bar_left_button_released(GtkWidget *widget, GdkEventButton *event, gpointer user_data);
 static void
-cb_xa_path_bar_scroll_right(GtkWidget *widget, gpointer user_data);
+cb_xa_path_bar_left_button_clicked(GtkWidget *button, gpointer user_data);
 
+static gboolean
+cb_xa_path_bar_scroll_right_timeout(gpointer user_data);
+static gboolean
+cb_xa_path_bar_right_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer user_data);
+static gboolean
+cb_xa_path_bar_right_button_released(GtkWidget *widget, GdkEventButton *event, gpointer user_data);
+static void
+cb_xa_path_bar_right_button_clicked(GtkWidget *button, gpointer user_data);
+
 GType
 xa_path_bar_get_type ()
 {
@@ -113,12 +138,15 @@
 {
 	GtkWidget *arrow;
 	XA_NAVIGATION_BAR(path_bar)->_cb_pwd_changed = (GCallback)cb_xa_path_bar_pwd_changed;
+	XA_NAVIGATION_BAR(path_bar)->_cb_new_archive = (GCallback)cb_xa_path_bar_new_archive;
 
 	GTK_WIDGET_SET_FLAGS(path_bar, GTK_NO_WINDOW);
 	gtk_widget_set_redraw_on_allocate(GTK_WIDGET(path_bar), FALSE);
 
 	path_bar->left_button = GTK_BUTTON(gtk_button_new());
-	g_signal_connect(G_OBJECT(path_bar->left_button), "clicked", G_CALLBACK(cb_xa_path_bar_scroll_left), path_bar);
+/*	g_signal_connect(G_OBJECT(path_bar->left_button), "button-press-event", G_CALLBACK(cb_xa_path_bar_left_button_pressed), path_bar);
+	g_signal_connect(G_OBJECT(path_bar->left_button), "button-release-event", G_CALLBACK(cb_xa_path_bar_left_button_released), path_bar);*/
+	g_signal_connect(G_OBJECT(path_bar->left_button), "clicked", G_CALLBACK(cb_xa_path_bar_left_button_clicked), path_bar);
 	gtk_container_add(GTK_CONTAINER(path_bar), GTK_WIDGET(path_bar->left_button));
 	gtk_widget_show(GTK_WIDGET(path_bar->left_button));
 	gtk_widget_ref(GTK_WIDGET(path_bar->left_button));
@@ -128,7 +156,9 @@
 	gtk_widget_show (arrow);
 
 	path_bar->right_button = GTK_BUTTON(gtk_button_new());
-	g_signal_connect(G_OBJECT(path_bar->right_button), "clicked", G_CALLBACK(cb_xa_path_bar_scroll_right), path_bar);
+/*	g_signal_connect(G_OBJECT(path_bar->right_button), "button-press-event", G_CALLBACK(cb_xa_path_bar_right_button_pressed), path_bar);
+	g_signal_connect(G_OBJECT(path_bar->right_button), "button-release-event", G_CALLBACK(cb_xa_path_bar_right_button_released), path_bar);*/
+	g_signal_connect(G_OBJECT(path_bar->right_button), "clicked", G_CALLBACK(cb_xa_path_bar_right_button_clicked), path_bar);
 	gtk_container_add(GTK_CONTAINER(path_bar), GTK_WIDGET(path_bar->right_button));
 	gtk_widget_show(GTK_WIDGET(path_bar->right_button));
 	gtk_widget_ref(GTK_WIDGET(path_bar->right_button));
@@ -141,12 +171,17 @@
 	gtk_container_add(GTK_CONTAINER(path_bar), GTK_WIDGET(path_bar->home_button));
 	g_signal_connect(G_OBJECT(path_bar->home_button), "clicked", (GCallback)cb_xa_path_bar_path_button_clicked, path_bar);
 	gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(path_bar->home_button), FALSE);
+	gtk_widget_set_sensitive(GTK_WIDGET(path_bar->home_button), FALSE);
 	gtk_widget_show(GTK_WIDGET(path_bar->home_button));
 	gtk_widget_ref(GTK_WIDGET(path_bar->home_button));
 
+	arrow = gtk_image_new_from_stock(GTK_STOCK_HOME, GTK_ICON_SIZE_MENU);
+	gtk_container_add (GTK_CONTAINER (path_bar->home_button), arrow);
+	gtk_widget_show (arrow);
 
 	path_bar->path_button = g_slist_prepend(NULL, path_bar->home_button);
 	path_bar->first_button = NULL;
+	path_bar->scroll_timeout = 0;
 
 	gtk_widget_ref(GTK_WIDGET(path_bar));
 }
@@ -412,12 +447,31 @@
 }
 
 static void
+cb_xa_path_bar_new_archive(XAArchiveStore *store, XAPathBar *path_bar)
+{
+	GSList *buttons = path_bar->path_button->next;
+
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(path_bar->path_button->data), TRUE);
+
+	while(buttons)
+	{
+		gtk_container_remove(GTK_CONTAINER(path_bar), GTK_WIDGET(buttons->data));
+		gtk_widget_unref(GTK_WIDGET(buttons->data));
+		buttons = buttons->next;
+	}
+	g_slist_free(path_bar->path_button->next);
+	path_bar->path_button->next = NULL;
+
+	gtk_widget_set_sensitive(GTK_WIDGET(path_bar->home_button), store->archive?TRUE:FALSE);
+}
+
+static void
 cb_xa_path_bar_pwd_changed(XAArchiveStore *store, XAPathBar *path_bar)
 {
 	GSList *path = xa_archive_store_get_pwd_list(store);
 	GSList *iter = path;
 	GSList *buttons = path_bar->path_button->next;
-	GSList *lastbutton = NULL;
+	GSList *lastbutton = path_bar->path_button;
 	GtkRadioButton *button = GTK_RADIO_BUTTON(path_bar->home_button);
 	const gchar *label = xa_archive_store_get_pwd(store);
 	gint cmp = 0;
@@ -510,10 +564,18 @@
 }
 
 static void
-cb_xa_path_bar_scroll_left(GtkWidget *widget, gpointer user_data)
+cb_xa_path_bar_scroll_timeout_destroy(gpointer user_data)
 {
 	XAPathBar *path_bar = XA_PATH_BAR(user_data);
 
+	path_bar->scroll_timeout = 0;
+}
+
+static gboolean
+cb_xa_path_bar_scroll_left_timeout(gpointer user_data)
+{
+	XAPathBar *path_bar = XA_PATH_BAR(user_data);
+
 	GSList *iter = path_bar->path_button;
 	GSList *prev = NULL;
 
@@ -528,11 +590,46 @@
 		prev = iter;
 		iter = iter->next;
 	}
+
+	return FALSE;
 }
 
+static gboolean
+cb_xa_path_bar_left_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+	XAPathBar *path_bar = XA_PATH_BAR(user_data);
+
+	if(event->type != GDK_BUTTON_PRESS || event->button != 1)
+		return FALSE;
+
+	path_bar->scroll_timeout = g_timeout_add_full(G_PRIORITY_LOW, XA_PATH_BAR_SCROLL_TIMEOUT, cb_xa_path_bar_scroll_left_timeout, user_data, cb_xa_path_bar_scroll_timeout_destroy);
+
+	return FALSE;
+}
+
+static gboolean
+cb_xa_path_bar_left_button_released(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+	XAPathBar *path_bar = XA_PATH_BAR(user_data);
+
+	if(event->type != GDK_BUTTON_RELEASE || event->button != 1)
+		return FALSE;
+
+	if(path_bar->scroll_timeout)
+		g_source_remove(path_bar->scroll_timeout);
+
+	return FALSE;
+}
+
 static void
-cb_xa_path_bar_scroll_right(GtkWidget *widget, gpointer user_data)
+cb_xa_path_bar_left_button_clicked(GtkWidget *widget, gpointer user_data)
 {
+	cb_xa_path_bar_scroll_left_timeout(user_data);
+}
+
+static gboolean
+cb_xa_path_bar_scroll_right_timeout(gpointer user_data)
+{
 	XAPathBar *path_bar = XA_PATH_BAR(user_data);
 
 	if(!path_bar->first_button)
@@ -542,3 +639,36 @@
 		path_bar->first_button = path_bar->first_button->next;
 }
 
+static gboolean
+cb_xa_path_bar_right_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+	XAPathBar *path_bar = XA_PATH_BAR(user_data);
+
+	if(event->type != GDK_BUTTON_PRESS || event->button != 1)
+		return FALSE;
+
+	path_bar->scroll_timeout = g_timeout_add_full(G_PRIORITY_LOW, XA_PATH_BAR_SCROLL_TIMEOUT, cb_xa_path_bar_scroll_right_timeout, user_data, cb_xa_path_bar_scroll_timeout_destroy);
+
+	return FALSE;
+}
+
+static gboolean
+cb_xa_path_bar_right_button_released(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+	XAPathBar *path_bar = XA_PATH_BAR(user_data);
+
+	if(event->type != GDK_BUTTON_RELEASE || event->button != 1)
+		return FALSE;
+
+	if(path_bar->scroll_timeout)
+		g_source_remove(path_bar->scroll_timeout);
+
+	return FALSE;
+}
+
+static void
+cb_xa_path_bar_right_button_clicked(GtkWidget *widget, gpointer user_data)
+{
+	cb_xa_path_bar_scroll_right_timeout(user_data);
+}
+

Modified: xarchiver/branches/xarchiver-psybsd/src/path_bar.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/path_bar.h	2006-10-17 18:35:58 UTC (rev 23445)
+++ xarchiver/branches/xarchiver-psybsd/src/path_bar.h	2006-10-17 18:52:57 UTC (rev 23446)
@@ -50,6 +50,7 @@
 	GtkButton *home_button;
 	GSList *path_button;
 	GSList *first_button;
+	guint scroll_timeout;
 };
 
 typedef struct _XAPathBarClass XAPathBarClass;

Modified: xarchiver/branches/xarchiver-psybsd/src/tool_bar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/tool_bar.c	2006-10-17 18:35:58 UTC (rev 23445)
+++ xarchiver/branches/xarchiver-psybsd/src/tool_bar.c	2006-10-17 18:52:57 UTC (rev 23446)
@@ -121,22 +121,22 @@
 	gtk_container_add(GTK_CONTAINER(tool_bar), GTK_WIDGET(tool_bar->bar));
 	gtk_widget_show(GTK_WIDGET(tool_bar->bar));
 
-	tool_bar->back_button = gtk_tool_button_new_from_stock("gtk-go-back");
+	tool_bar->back_button = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK);
 	gtk_toolbar_insert(GTK_TOOLBAR(tool_bar->bar), tool_bar->back_button, 0);
 	g_signal_connect(G_OBJECT(tool_bar->back_button), "clicked", (GCallback)cb_xa_tool_bar_history_back, tool_bar);
 	gtk_widget_set_sensitive(GTK_WIDGET(tool_bar->back_button), 0);
 
-	tool_bar->forward_button = gtk_tool_button_new_from_stock("gtk-go-forward");
+	tool_bar->forward_button = gtk_tool_button_new_from_stock(GTK_STOCK_GO_FORWARD);
 	gtk_toolbar_insert(GTK_TOOLBAR(tool_bar->bar), tool_bar->forward_button, 1);
 	g_signal_connect(G_OBJECT(tool_bar->forward_button), "clicked", (GCallback)cb_xa_tool_bar_history_forward, tool_bar);
 	gtk_widget_set_sensitive(GTK_WIDGET(tool_bar->forward_button), 0);
 
-	tool_bar->up_button = gtk_tool_button_new_from_stock("gtk-go-up");
+	tool_bar->up_button = gtk_tool_button_new_from_stock(GTK_STOCK_GO_UP);
 	gtk_toolbar_insert(GTK_TOOLBAR(tool_bar->bar), tool_bar->up_button, 2);
 	g_signal_connect(G_OBJECT(tool_bar->up_button), "clicked", (GCallback)cb_xa_tool_bar_up, tool_bar);
 	gtk_widget_set_sensitive(GTK_WIDGET(tool_bar->up_button), 0);
 
-	tool_bar->home_button = gtk_tool_button_new_from_stock("gtk-home");
+	tool_bar->home_button = gtk_tool_button_new_from_stock(GTK_STOCK_HOME);
 	gtk_toolbar_insert(GTK_TOOLBAR(tool_bar->bar), tool_bar->home_button, 3);
 	g_signal_connect(G_OBJECT(tool_bar->home_button), "clicked", (GCallback)cb_xa_tool_bar_home, tool_bar);
 	gtk_widget_set_sensitive(GTK_WIDGET(tool_bar->home_button), 0);

Modified: xarchiver/branches/xarchiver-psybsd/src/tool_bar.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/tool_bar.h	2006-10-17 18:35:58 UTC (rev 23445)
+++ xarchiver/branches/xarchiver-psybsd/src/tool_bar.h	2006-10-17 18:52:57 UTC (rev 23446)
@@ -61,7 +61,7 @@
 	XANavigationBarClass parent_class;
 };
 
-GType      xa_tool_bar_get_type();
+GType            xa_tool_bar_get_type();
 XANavigationBar *xa_tool_bar_new();
 
 G_END_DECLS



More information about the Xfce4-commits mailing list