[Xfce4-commits] <gigolo:master> Implement folder property for bookmarks

Enrico Tröger noreply at xfce.org
Sun Oct 4 21:42:06 CEST 2009


Updating branch refs/heads/master
         to 29b14fe406065f1037effd849d0d7e2c5cc8c7df (commit)
       from 7d95e8a6eebbf5dfa8133441e690a21b8e69a653 (commit)

commit 29b14fe406065f1037effd849d0d7e2c5cc8c7df
Author: Enrico Tröger <enrico at xfce.org>
Date:   Sun Oct 4 20:50:48 2009 +0200

    Implement folder property for bookmarks

 src/bookmark.c           |   26 +++++++++++++++++++++
 src/bookmark.h           |    3 ++
 src/bookmarkdialog.c     |    2 +
 src/bookmarkeditdialog.c |   55 ++++++++++++++++++++++++++++++++++++++++------
 src/common.h             |    9 +++++++
 src/settings.c           |    7 +++++-
 src/window.c             |   11 +++++++++
 7 files changed, 105 insertions(+), 8 deletions(-)

diff --git a/src/bookmark.c b/src/bookmark.c
index b3ef1bb..d4d9269 100644
--- a/src/bookmark.c
+++ b/src/bookmark.c
@@ -37,6 +37,7 @@ struct _GigoloBookmarkPrivate
 	gchar	*name;
 	gchar	*scheme;
 	gchar	*host;
+	gchar	*folder;
 	gchar	*domain;
 	gchar	*share;
 	guint	 port;
@@ -59,6 +60,7 @@ void gigolo_bookmark_bookmark_clear(GigoloBookmark *bookmark)
 	g_free(priv->name);
 	g_free(priv->scheme);
 	g_free(priv->host);
+	g_free(priv->folder);
 	g_free(priv->domain);
 	g_free(priv->share);
 	g_free(priv->user);
@@ -68,6 +70,7 @@ void gigolo_bookmark_bookmark_clear(GigoloBookmark *bookmark)
 	priv->host = NULL;
 	priv->port = 0;
 	priv->domain = NULL;
+	priv->folder = NULL;
 	priv->share = NULL;
 	priv->user = NULL;
 
@@ -271,6 +274,7 @@ void gigolo_bookmark_clone(GigoloBookmark *dst, const GigoloBookmark *src)
 	priv_dst->host = g_strdup(priv_src->host);
 	priv_dst->scheme = g_strdup(priv_src->scheme);
 	priv_dst->domain = g_strdup(priv_src->domain);
+	priv_dst->folder = g_strdup(priv_src->folder);
 	priv_dst->share = g_strdup(priv_src->share);
 	priv_dst->user = g_strdup(priv_src->user);
 	priv_dst->port = priv_src->port;
@@ -411,6 +415,28 @@ void gigolo_bookmark_set_host(GigoloBookmark *bookmark, const gchar *host)
 }
 
 
+const gchar *gigolo_bookmark_get_folder(GigoloBookmark *bookmark)
+{
+	g_return_val_if_fail(bookmark != NULL, NULL);
+
+	return GIGOLO_BOOKMARK_GET_PRIVATE(bookmark)->folder;
+}
+
+
+void gigolo_bookmark_set_folder(GigoloBookmark *bookmark, const gchar *folder)
+{
+	GigoloBookmarkPrivate *priv;
+
+	g_return_if_fail(bookmark != NULL);
+	g_return_if_fail(NZV(folder));
+
+	priv = GIGOLO_BOOKMARK_GET_PRIVATE(bookmark);
+
+	g_free(priv->folder);
+	priv->folder = g_strdup(folder);
+}
+
+
 guint gigolo_bookmark_get_port(GigoloBookmark *bookmark)
 {
 	g_return_val_if_fail(bookmark != NULL, 0);
diff --git a/src/bookmark.h b/src/bookmark.h
index b50e318..569b685 100644
--- a/src/bookmark.h
+++ b/src/bookmark.h
@@ -65,6 +65,9 @@ void				gigolo_bookmark_set_scheme		(GigoloBookmark *bookmark, const gchar *sche
 const gchar*		gigolo_bookmark_get_host		(GigoloBookmark *bookmark);
 void				gigolo_bookmark_set_host		(GigoloBookmark *bookmark, const gchar *host);
 
+const gchar*		gigolo_bookmark_get_folder		(GigoloBookmark *bookmark);
+void				gigolo_bookmark_set_folder		(GigoloBookmark *bookmark, const gchar *folder);
+
 guint				gigolo_bookmark_get_port		(GigoloBookmark *bookmark);
 void				gigolo_bookmark_set_port		(GigoloBookmark *bookmark, guint port);
 
diff --git a/src/bookmarkdialog.c b/src/bookmarkdialog.c
index 7c72c6e..3192813 100644
--- a/src/bookmarkdialog.c
+++ b/src/bookmarkdialog.c
@@ -90,6 +90,8 @@ static void update_row_in_model(GigoloBookmarkDialog *dialog, GtkTreeIter *iter,
 	else
 		port[0] = '\0';
 
+	if (NZV(tmp = gigolo_bookmark_get_folder(bm)))
+		g_string_append_printf(other_text, _("Folder: %s"), tmp);
 	if (NZV(tmp = gigolo_bookmark_get_domain(bm)))
 		g_string_append_printf(other_text, _("Domain: %s"), tmp);
 	if (NZV(tmp = gigolo_bookmark_get_share(bm)))
diff --git a/src/bookmarkeditdialog.c b/src/bookmarkeditdialog.c
index a833595..65d4398 100644
--- a/src/bookmarkeditdialog.c
+++ b/src/bookmarkeditdialog.c
@@ -43,6 +43,7 @@ typedef struct _GigoloBookmarkEditDialogPrivate			GigoloBookmarkEditDialogPrivat
 struct _GigoloBookmarkEditDialogPrivate
 {
 	GigoloWindow *parent;
+	gint dialog_type;
 
 	GtkWidget *table;
 
@@ -61,6 +62,9 @@ struct _GigoloBookmarkEditDialogPrivate
 	GtkWidget *host_label;
 	GtkWidget *host_entry;
 
+	GtkWidget *folder_label;
+	GtkWidget *folder_entry;
+
 	GtkWidget *port_label;
 	GtkWidget *port_spin;
 
@@ -109,7 +113,8 @@ enum {
 	SHOW_PORT      = 0x00000020,
 	SHOW_USER      = 0x00000040,
 	SHOW_DOMAIN    = 0x00000080,
-	SHOW_DEVICE    = 0x00000100
+	SHOW_DEVICE    = 0x00000100,
+	SHOW_FOLDER    = 0x00000200
 };
 
 enum {
@@ -130,11 +135,11 @@ enum {
 };
 
 static struct MethodInfo methods[] = {
-	{ "ftp",  21,	SHOW_PORT | SHOW_USER },
-	{ "sftp", 22,	SHOW_PORT | SHOW_USER },
-	{ "smb",  0,	SHOW_SHARE | SHOW_USER | SHOW_DOMAIN },
-	{ "dav",  80,	SHOW_PORT | SHOW_USER },
-	{ "davs", 443,	SHOW_PORT | SHOW_USER },
+	{ "ftp",  21,	SHOW_PORT | SHOW_USER | SHOW_FOLDER },
+	{ "sftp", 22,	SHOW_PORT | SHOW_USER | SHOW_FOLDER },
+	{ "smb",  0,	SHOW_SHARE | SHOW_USER | SHOW_DOMAIN | SHOW_FOLDER },
+	{ "dav",  80,	SHOW_PORT | SHOW_USER | SHOW_FOLDER },
+	{ "davs", 443,	SHOW_PORT | SHOW_USER | SHOW_FOLDER },
 	{ "obex", 0,	SHOW_DEVICE },
 	{ NULL,   0,	0 }
 };
@@ -162,6 +167,8 @@ static void gigolo_bookmark_edit_dialog_destroy(GtkObject *object)
 	gtk_widget_destroy(priv->uri_label);
 	gtk_widget_destroy(priv->host_entry);
 	gtk_widget_destroy(priv->host_label);
+	gtk_widget_destroy(priv->folder_entry);
+	gtk_widget_destroy(priv->folder_label);
 	gtk_widget_destroy(priv->port_label);
 	gtk_widget_destroy(priv->port_spin);
 	gtk_widget_destroy(priv->user_entry);
@@ -407,6 +414,10 @@ static void init_values(GigoloBookmarkEditDialog *dialog)
 		gtk_entry_set_text(GTK_ENTRY(priv->user_entry), user);
 		g_free(user);
 	}
+	/* Folder */
+	tmp = gigolo_bookmark_get_folder(priv->bookmark_init);
+	if (tmp != NULL)
+		gtk_entry_set_text(GTK_ENTRY(priv->folder_entry), tmp);
 	/* Share */
 	tmp = gigolo_bookmark_get_share(priv->bookmark_init);
 	if (tmp != NULL)
@@ -459,6 +470,11 @@ static void setup_for_type(GigoloBookmarkEditDialog *dialog)
 		gtk_container_remove(GTK_CONTAINER(priv->table), priv->host_label);
 		gtk_container_remove(GTK_CONTAINER(priv->table), priv->host_entry);
 	}
+	if (gtk_widget_get_parent(priv->folder_entry) != NULL)
+	{
+		gtk_container_remove(GTK_CONTAINER(priv->table), priv->folder_label);
+		gtk_container_remove(GTK_CONTAINER(priv->table), priv->folder_entry);
+	}
 	if (gtk_widget_get_parent(priv->port_spin) != NULL)
 	{
 		gtk_container_remove(GTK_CONTAINER(priv->table), priv->port_label);
@@ -565,6 +581,21 @@ static void setup_for_type(GigoloBookmarkEditDialog *dialog)
 			i++;
 		}
 
+		if (meth->flags & SHOW_FOLDER && priv->dialog_type != GIGOLO_BE_MODE_CONNECT)
+		{
+			gtk_misc_set_alignment(GTK_MISC(priv->folder_label), 0.0, 0.5);
+			gtk_widget_show(priv->folder_label);
+			gtk_table_attach(GTK_TABLE(table), priv->folder_label,
+					  0, 1, i, i+1, GTK_FILL, GTK_FILL, 0, 0);
+
+			gtk_label_set_mnemonic_widget(GTK_LABEL(priv->folder_label), priv->folder_entry);
+			gtk_widget_show(priv->folder_entry);
+			gtk_table_attach(GTK_TABLE(table), priv->folder_entry,
+					  1, 2, i, i+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+
+			i++;
+		}
+
 		if (meth->flags & SHOW_DOMAIN)
 		{
 			gtk_misc_set_alignment(GTK_MISC(priv->domain_label), 0.0, 0.5);
@@ -720,6 +751,8 @@ static void update_bookmark(GigoloBookmarkEditDialog *dialog)
 
 		tmp = gtk_entry_get_text(GTK_ENTRY(priv->host_entry));
 		gigolo_bookmark_set_host(priv->bookmark_update, tmp);
+		tmp = gtk_entry_get_text(GTK_ENTRY(priv->folder_entry));
+		gigolo_bookmark_set_folder(priv->bookmark_update, tmp);
 		tmp = gtk_entry_get_text(GTK_ENTRY(priv->user_entry));
 		gigolo_bookmark_set_user(priv->bookmark_update, tmp);
 		tmp = gtk_entry_get_text(GTK_ENTRY(priv->domain_entry));
@@ -756,8 +789,9 @@ static void gigolo_bookmark_edit_dialog_set_property(GObject *object, guint prop
 		const gchar *title;
 		const gchar *stock_id;
 		const gchar *button_stock_id;
+		gint mode = g_value_get_int(value);
 
-		switch (g_value_get_int(value))
+		switch (mode)
 		{
 			case GIGOLO_BE_MODE_CREATE:
 			{
@@ -789,6 +823,7 @@ static void gigolo_bookmark_edit_dialog_set_property(GObject *object, guint prop
 		gtk_window_set_title(GTK_WINDOW(dialog), title);
 		gtk_window_set_icon_name(GTK_WINDOW(dialog), stock_id);
 		gtk_dialog_add_buttons(GTK_DIALOG(dialog), button_stock_id, GTK_RESPONSE_OK, NULL);
+		priv->dialog_type = mode;
 
 		setup_for_type(dialog);
         break;
@@ -856,6 +891,7 @@ static void gigolo_bookmark_edit_dialog_init(GigoloBookmarkEditDialog *dialog)
 	GigoloBookmarkEditDialogPrivate *priv = GIGOLO_BOOKMARK_EDIT_DIALOG_GET_PRIVATE(dialog);
 
 	priv->browse_host_signal_id = 0;
+	priv->dialog_type = GIGOLO_BE_MODE_EDIT;
 
 	gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
 	gtk_box_set_spacing(GTK_BOX(gigolo_dialog_get_content_area(GTK_DIALOG(dialog))), 2);
@@ -915,6 +951,7 @@ static void gigolo_bookmark_edit_dialog_init(GigoloBookmarkEditDialog *dialog)
 
 	priv->uri_entry = gtk_entry_new();
 	priv->host_entry = gtk_entry_new();
+	priv->folder_entry = gtk_entry_new();
 	priv->port_spin = gtk_spin_button_new_with_range(0, 65535, 1);
 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(priv->port_spin), 0.0);
 	gtk_widget_set_tooltip_text(priv->port_spin, _("Set the port to 0 to use the default port"));
@@ -925,6 +962,7 @@ static void gigolo_bookmark_edit_dialog_init(GigoloBookmarkEditDialog *dialog)
 
 	priv->uri_label = gtk_label_new_with_mnemonic(_("_Location (URI):"));
 	priv->host_label = gtk_label_new_with_mnemonic(_("_Server:"));
+	priv->folder_label = gtk_label_new_with_mnemonic(_("_Folder:"));
 	priv->user_label = gtk_label_new_with_mnemonic(_("_User Name:"));
 	priv->information_label = gtk_label_new(_("Optional information:"));
 	priv->port_label = gtk_label_new_with_mnemonic(_("_Port:"));
@@ -933,6 +971,7 @@ static void gigolo_bookmark_edit_dialog_init(GigoloBookmarkEditDialog *dialog)
 
 	gtk_entry_set_activates_default(GTK_ENTRY(priv->name_entry), TRUE);
 	gtk_entry_set_activates_default(GTK_ENTRY(priv->uri_entry), TRUE);
+	gtk_entry_set_activates_default(GTK_ENTRY(priv->folder_entry), TRUE);
 	gtk_entry_set_activates_default(GTK_ENTRY(priv->host_entry), TRUE);
 	gtk_entry_set_activates_default(GTK_ENTRY(priv->port_spin), TRUE);
 	gtk_entry_set_activates_default(GTK_ENTRY(priv->user_entry), TRUE);
@@ -951,6 +990,8 @@ static void gigolo_bookmark_edit_dialog_init(GigoloBookmarkEditDialog *dialog)
 	g_object_ref(priv->uri_label);
 	g_object_ref(priv->host_entry);
 	g_object_ref(priv->host_label);
+	g_object_ref(priv->folder_entry);
+	g_object_ref(priv->folder_label);
 	g_object_ref(priv->port_label);
 	g_object_ref(priv->port_spin);
 	g_object_ref(priv->user_entry);
diff --git a/src/common.h b/src/common.h
index f682474..a0e6c8f 100644
--- a/src/common.h
+++ b/src/common.h
@@ -27,6 +27,15 @@
 #define NZV(ptr) \
 	((ptr) && (ptr)[0])
 
+/* Free's ptr (if not NULL), then assigns result to it.
+ * result can be an expression using the 'old' value of ptr.
+ * It prevents a memory leak compared with: ptr = func(ptr); */
+#define setptr(ptr, result) \
+	{\
+		gpointer setptr_tmp = ptr;\
+		ptr = result;\
+		g_free(setptr_tmp);\
+	}
 
 #ifdef DEBUG
 void debug(gchar const *format, ...) G_GNUC_PRINTF (1, 2);
diff --git a/src/settings.c b/src/settings.c
index 8e6d4a6..cbb230e 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -458,6 +458,7 @@ static void write_settings_bookmarks(GigoloSettings *settings)
 		{
 			name = gigolo_bookmark_get_name(bm);
 			set_setting_string(k, name, "host", gigolo_bookmark_get_host(bm));
+			set_setting_string(k, name, "folder", gigolo_bookmark_get_folder(bm));
 			set_setting_string(k, name, "user", gigolo_bookmark_get_user(bm));
 			set_setting_string(k, name, "scheme", gigolo_bookmark_get_scheme(bm));
 			set_setting_string(k, name, "share", gigolo_bookmark_get_share(bm));
@@ -570,7 +571,7 @@ static void load_settings_read_bookmarks(GigoloSettingsPrivate *priv)
 	GError *error = NULL;
 	gsize len, i;
 	gchar **groups;
-	gchar *scheme, *host, *user, *domain, *share;
+	gchar *scheme, *host, *user, *domain, *share, *folder;
 	gint port;
 	gboolean autoconnect;
 	GigoloBookmark *bm;
@@ -589,6 +590,7 @@ static void load_settings_read_bookmarks(GigoloSettingsPrivate *priv)
 	{
 		scheme = get_setting_string(k, groups[i], "scheme", "");
 		host = get_setting_string(k, groups[i], "host", "");
+		folder = get_setting_string(k, groups[i], "folder", "");
 		user = get_setting_string(k, groups[i], "user", "");
 		domain = get_setting_string(k, groups[i], "domain", "");
 		share = get_setting_string(k, groups[i], "share", "");
@@ -600,6 +602,8 @@ static void load_settings_read_bookmarks(GigoloSettingsPrivate *priv)
 		gigolo_bookmark_set_scheme(bm, scheme);
 		if (NZV(host))
 			gigolo_bookmark_set_host(bm, host);
+		if (NZV(folder))
+			gigolo_bookmark_set_folder(bm, folder);
 		if (NZV(user))
 			gigolo_bookmark_set_user(bm, user);
 		if (NZV(domain))
@@ -613,6 +617,7 @@ static void load_settings_read_bookmarks(GigoloSettingsPrivate *priv)
 
 		g_free(scheme);
 		g_free(host);
+		g_free(folder);
 		g_free(user);
 		g_free(domain);
 		g_free(share);
diff --git a/src/window.c b/src/window.c
index 7b80d28..ea1f1dc 100644
--- a/src/window.c
+++ b/src/window.c
@@ -522,8 +522,14 @@ static void action_copy_uri_cb(G_GNUC_UNUSED GtkAction *action, GigoloWindow *wi
 		if (gigolo_backend_gvfs_is_mount(mnt))
 		{
 			gchar *uri;
+			GigoloBookmark *b;
 
 			gigolo_backend_gvfs_get_name_and_uri_from_mount(mnt, NULL, &uri);
+
+			b = gigolo_window_find_bookmark_by_uri(window, uri);
+			if (b != NULL)
+				setptr(uri, g_build_filename(uri, gigolo_bookmark_get_folder(b), NULL));
+
 			gtk_clipboard_set_text(gtk_clipboard_get(gdk_atom_intern("CLIPBOARD", FALSE)), uri, -1);
 
 			g_free(uri);
@@ -552,9 +558,14 @@ static void action_open_cb(G_GNUC_UNUSED GtkAction *action, GigoloWindow *window
 			gchar *uri;
 			gchar *file_manager;
 			gchar *cmd;
+			GigoloBookmark *b;
 
 			file_manager = gigolo_settings_get_string(priv->settings, "file-manager");
 			gigolo_backend_gvfs_get_name_and_uri_from_mount(mnt, NULL, &uri);
+			b = gigolo_window_find_bookmark_by_uri(window, uri);
+			if (b != NULL)
+				setptr(uri, g_build_filename(uri, gigolo_bookmark_get_folder(b), NULL));
+
 			cmd = g_strconcat(file_manager, " ", uri, NULL);
 
 			if (! g_spawn_command_line_async(cmd, &error))



More information about the Xfce4-commits mailing list