[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