Index: ChangeLog =================================================================== --- ChangeLog (revision 6410) +++ ChangeLog (working copy) @@ -1,3 +1,18 @@ +2009-01-07 Colin Leroy + + * src/bookmark.c, src/bookmark.h, src/settings.c: + Add autoconnect (boolean) setting. + * src/bookmarkeditdialog.c: + Add a checkbox for automatic connection; Fix "This bookmark + already exists" warning when editing an existing bookmark. + * src/bookmarkdialog.c: + Add a column to show autoconnection status. + * src/window.c, src/window.h: + Try to connect to auto-connect bookmarks at startup and every + minute. Clicking Disconnect cancels autoconnection for the + current run. + + 2009-01-06 Enrico Tröger * src/bookmarkdialog.c, src/bookmarkeditdialog.c, Index: src/bookmark.h =================================================================== --- src/bookmark.h (revision 6410) +++ src/bookmark.h (working copy) @@ -76,6 +76,13 @@ const gchar* sion_bookmark_get_domain (SionBookmark *bookmark); void sion_bookmark_set_domain (SionBookmark *bookmark, const gchar *domain); +gboolean sion_bookmark_get_autoconnect (SionBookmark *bookmark); +void sion_bookmark_set_autoconnect (SionBookmark *bookmark, gboolean autoconnect); + +gboolean sion_bookmark_get_should_not_autoconnect (SionBookmark *bookmark); +void sion_bookmark_set_should_not_autoconnect (SionBookmark *bookmark, gboolean should_not_autoconnect); + + G_END_DECLS #endif /* __BOOKMARK_H__ */ Index: src/bookmark.c =================================================================== --- src/bookmark.c (revision 6410) +++ src/bookmark.c (working copy) @@ -42,6 +42,8 @@ gchar *share; guint port; gchar *user; + gboolean autoconnect; + gboolean should_not_autoconnect; gboolean is_valid; }; @@ -412,6 +414,46 @@ } +gboolean sion_bookmark_get_autoconnect(SionBookmark *bookmark) +{ + g_return_val_if_fail(bookmark != NULL, 0); + + return SION_BOOKMARK_GET_PRIVATE(bookmark)->autoconnect; +} + + +void sion_bookmark_set_autoconnect(SionBookmark *bookmark, gboolean autoconnect) +{ + SionBookmarkPrivate *priv; + + g_return_if_fail(bookmark != NULL); + + priv = SION_BOOKMARK_GET_PRIVATE(bookmark); + + priv->autoconnect = autoconnect; +} + + +gboolean sion_bookmark_get_should_not_autoconnect(SionBookmark *bookmark) +{ + g_return_val_if_fail(bookmark != NULL, 0); + + return SION_BOOKMARK_GET_PRIVATE(bookmark)->should_not_autoconnect; +} + + +void sion_bookmark_set_should_not_autoconnect(SionBookmark *bookmark, gboolean should_not_autoconnect) +{ + SionBookmarkPrivate *priv; + + g_return_if_fail(bookmark != NULL); + + priv = SION_BOOKMARK_GET_PRIVATE(bookmark); + + priv->should_not_autoconnect = should_not_autoconnect; +} + + const gchar *sion_bookmark_get_user(SionBookmark *bookmark) { g_return_val_if_fail(bookmark != NULL, NULL); Index: src/settings.c =================================================================== --- src/settings.c (revision 6410) +++ src/settings.c (working copy) @@ -394,6 +394,7 @@ set_setting_string(k, name, "share", sion_bookmark_get_share(bm)); set_setting_string(k, name, "domain", sion_bookmark_get_domain(bm)); set_setting_int(k, name, "port", sion_bookmark_get_port(bm)); + set_setting_int(k, name, "autoconnect", sion_bookmark_get_autoconnect(bm)); } } @@ -489,6 +490,7 @@ gchar **groups; gchar *scheme, *host, *user, *domain, *share; gint port; + gboolean autoconnect; SionBookmark *bm; k = g_key_file_new(); @@ -509,6 +511,7 @@ domain = get_setting_string(k, groups[i], "domain", ""); share = get_setting_string(k, groups[i], "share", ""); port = get_setting_int(k, groups[i], "port", 0); + autoconnect = get_setting_int(k, groups[i], "autoconnect", FALSE); bm = sion_bookmark_new(); sion_bookmark_set_name(bm, groups[i]); @@ -522,6 +525,7 @@ if (NZV(share)) sion_bookmark_set_share(bm, share); sion_bookmark_set_port(bm, port); + sion_bookmark_set_autoconnect(bm, autoconnect); g_ptr_array_add(priv->bookmarks, bm); Index: src/bookmarkeditdialog.c =================================================================== --- src/bookmarkeditdialog.c (revision 6410) +++ src/bookmarkeditdialog.c (working copy) @@ -48,6 +48,8 @@ GtkWidget *name_label; GtkWidget *name_entry; + GtkWidget *autoconnect_checkbtn; + GtkWidget *uri_label; GtkWidget *uri_entry; @@ -202,6 +204,8 @@ for (i = 0; i < bml->len && ! error; i++) { bm = g_ptr_array_index(bml, i); + if (bm == priv->bookmark_init) + continue; if (sion_str_equal(tmp, sion_bookmark_get_name(bm))) { error = TRUE; @@ -371,6 +375,10 @@ idx = scheme_to_index(sion_bookmark_get_scheme(priv->bookmark_init)); if (port == 0) port = methods[idx].port; + + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(priv->autoconnect_checkbtn), + sion_bookmark_get_autoconnect(priv->bookmark_init)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(priv->port_spin), port); combo_set_active(priv->type_combo, (gint) idx); @@ -429,7 +437,7 @@ gtk_container_remove(GTK_CONTAINER(priv->table), priv->information_label); } - i = 3; + i = 4; table = priv->table; if (meth->scheme == NULL) @@ -597,6 +605,7 @@ const gchar *tmp; gint idx; GtkTreeIter iter; + gboolean autoconnect; g_return_if_fail(dialog != NULL); @@ -618,7 +627,6 @@ idx = 0; if (methods[idx].scheme == NULL) { - sion_bookmark_set_name(priv->bookmark_update, "Custom"); sion_bookmark_set_uri(priv->bookmark_update, gtk_entry_get_text(GTK_ENTRY(priv->uri_entry))); } else @@ -636,6 +644,9 @@ sion_bookmark_set_port(priv->bookmark_update, gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(priv->port_spin))); } + + autoconnect = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->autoconnect_checkbtn)); + sion_bookmark_set_autoconnect(priv->bookmark_update, autoconnect); } @@ -685,6 +696,7 @@ combo_set_active(priv->type_combo, 0); gtk_widget_hide(priv->name_label); gtk_widget_hide(priv->name_entry); + gtk_widget_hide(priv->autoconnect_checkbtn); break; } } @@ -730,7 +742,7 @@ hbox = gtk_hbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); - priv->table = table = gtk_table_new(8, 2, FALSE); + priv->table = table = gtk_table_new(9, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 6); gtk_table_set_col_spacings(GTK_TABLE(table), 12); gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 0); @@ -743,15 +755,23 @@ gtk_label_set_mnemonic_widget(GTK_LABEL(priv->name_label), entry); gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); - label = gtk_label_new_with_mnemonic(_("Service _type:")); + label = gtk_label_new_with_mnemonic(_("_Autoconnect")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); + priv->autoconnect_checkbtn = gtk_check_button_new(); + gtk_label_set_mnemonic_widget(GTK_LABEL(label), priv->autoconnect_checkbtn); + gtk_table_attach(GTK_TABLE(table), priv->autoconnect_checkbtn, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); + + label = gtk_label_new_with_mnemonic(_("Service _type:")); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); + priv->type_combo = combo = gtk_combo_box_new(); - gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); label_tmp = gtk_label_new(" "); - gtk_table_attach(GTK_TABLE(table), label_tmp, 0, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label_tmp, 0, 2, 3, 4, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE); Index: src/bookmarkdialog.c =================================================================== --- src/bookmarkdialog.c (revision 6410) +++ src/bookmarkdialog.c (working copy) @@ -59,9 +59,11 @@ COL_SCHEME, COL_HOST, COL_PORT, + COL_AUTOMOUNT, COL_USERNAME, COL_OTHER, COL_BMREF, + N_COLUMNS, ACTION_ADD, ACTION_EDIT, ACTION_DELETE @@ -131,6 +133,7 @@ COL_SCHEME, sion_describe_scheme(sion_bookmark_get_scheme(bm)), COL_HOST, sion_bookmark_get_host(bm), COL_PORT, port, + COL_AUTOMOUNT, sion_bookmark_get_autoconnect(bm), COL_USERNAME, sion_bookmark_get_user(bm), COL_OTHER, other_text->str, COL_BMREF, bm, @@ -189,6 +192,7 @@ update_row_in_model(SION_BOOKMARK_DIALOG(dialog), &iter, bm); sion_window_update_bookmarks(SION_WINDOW(priv->parent)); + sion_window_do_autoconnect(SION_WINDOW(priv->parent)); } gtk_widget_destroy(edit_dialog); } @@ -306,9 +310,9 @@ SionBookmarkDialogPrivate *priv = SION_BOOKMARK_DIALOG_GET_PRIVATE(dialog); priv->tree = gtk_tree_view_new(); - priv->store = gtk_list_store_new(7, + priv->store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); + G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes( @@ -342,6 +346,14 @@ gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->tree), column); + renderer = gtk_cell_renderer_toggle_new(); + column = gtk_tree_view_column_new_with_attributes( + _("Automount"), renderer, "active", COL_AUTOMOUNT, NULL); + gtk_tree_view_column_set_sort_indicator(column, TRUE); + gtk_tree_view_column_set_sort_column_id(column, COL_AUTOMOUNT); + gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE); + gtk_tree_view_append_column(GTK_TREE_VIEW(priv->tree), column); + renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes( _("Username"), renderer, "text", COL_USERNAME, NULL); Index: src/window.c =================================================================== --- src/window.c (revision 6410) +++ src/window.c (working copy) @@ -243,6 +243,28 @@ } +static SionBookmark *get_bookmark_from_uri(SionWindow *window, const gchar *uri) +{ + SionWindowPrivate *priv = SION_WINDOW_GET_PRIVATE(window); + SionBookmarkList *bml = sion_settings_get_bookmarks(priv->settings); + SionBookmark *bm = NULL; + gboolean found = FALSE; + gchar *tmp_uri; + gint i; + + for (i = 0; i < bml->len && !found; i++) + { + bm = g_ptr_array_index(bml, i); + tmp_uri = sion_bookmark_get_uri(bm); + if (sion_str_equal(uri, tmp_uri)) + found = TRUE; + + g_free(tmp_uri); + } + return bm; +} + + static void mount_from_bookmark(SionWindow *window, SionBookmark *bookmark) { gchar *uri; @@ -255,6 +277,10 @@ uri = sion_bookmark_get_uri(bookmark); sion_backend_gvfs_mount_uri(priv->backend_gvfs, uri, sion_bookmark_get_domain(bookmark)); + if (sion_bookmark_get_autoconnect(bookmark)) { + sion_bookmark_set_should_not_autoconnect(bookmark, FALSE); + } + g_free(uri); } @@ -318,6 +344,7 @@ { SionWindowPrivate *priv = SION_WINDOW_GET_PRIVATE(window); GtkTreeIter iter; + SionBookmark *bm; get_selected_iter(window, &iter); if (gtk_list_store_iter_is_valid(priv->store, &iter)) @@ -327,7 +354,19 @@ gtk_tree_model_get(model, &iter, SION_WINDOW_COL_REF, &mnt, -1); if (sion_backend_gvfs_is_mount(mnt)) - { + { + gchar *uri; + SionBookmark *bm; + sion_backend_gvfs_get_name_and_uri_from_mount(mnt, NULL, &uri); + bm = get_bookmark_from_uri(window, uri); + if (bm && sion_bookmark_get_autoconnect(bm)) { + /* we don't want auto-connection to reconnect this + * bookmark right after we unmount it. + */ + sion_bookmark_set_should_not_autoconnect(bm, TRUE); + } + g_free(uri); + sion_backend_gvfs_unmount_mount(priv->backend_gvfs, mnt); } } @@ -478,22 +517,12 @@ gchar *uri; gchar *tmp_uri; guint i; - SionWindowPrivate *priv = SION_WINDOW_GET_PRIVATE(window); - SionBookmarkList *bml = sion_settings_get_bookmarks(priv->settings); - SionBookmark *bm; gboolean found = FALSE; sion_backend_gvfs_get_name_and_uri_from_mount(ref, NULL, &uri); + + found = (get_bookmark_from_uri(window, uri) != NULL); - for (i = 0; i < bml->len && ! found; i++) - { - bm = g_ptr_array_index(bml, i); - tmp_uri = sion_bookmark_get_uri(bm); - if (sion_str_equal(uri, tmp_uri)) - found = TRUE; - - g_free(tmp_uri); - } g_free(uri); return found; } @@ -709,6 +738,31 @@ } +gboolean sion_window_do_autoconnect(gpointer data) +{ + static gboolean timeout_added = FALSE; + SionWindow *window = SION_WINDOW(data); + SionWindowPrivate *priv = SION_WINDOW_GET_PRIVATE(window); + SionBookmarkList *bookmarks = sion_settings_get_bookmarks(priv->settings); + int i; + + for (i = 0; i < bookmarks->len; i++) + { + SionBookmark *bm = g_ptr_array_index(bookmarks, i); + if (sion_bookmark_get_autoconnect(bm) && + !sion_bookmark_get_should_not_autoconnect(bm)) { + mount_from_bookmark(window, bm); + } + } + + if (!timeout_added) { + g_timeout_add_seconds(60, sion_window_do_autoconnect, data); + timeout_added = TRUE; + } + return TRUE; +} + + static void action_create_bookmark_cb(G_GNUC_UNUSED GtkAction *button, SionWindow *window) { SionWindowPrivate *priv = SION_WINDOW_GET_PRIVATE(window); @@ -725,24 +779,14 @@ { gchar *uri, *tmp_uri, *name; guint i; - gboolean found = FALSE; SionBookmark *bm; - SionBookmarkList *bml = sion_settings_get_bookmarks(priv->settings); sion_backend_gvfs_get_name_and_uri_from_mount(mnt, &name, &uri); - // check whether the current mount is already a bookmark ... - for (i = 0; i < bml->len && ! found; i++) + + bm = get_bookmark_from_uri(window, uri); + + if (bm == NULL) { - bm = g_ptr_array_index(bml, i); - tmp_uri = sion_bookmark_get_uri(bm); - if (sion_str_equal(uri, tmp_uri)) - found = TRUE; - - g_free(tmp_uri); - } - // ... and add it if not - if (! found) - { bm = sion_bookmark_new_from_uri(name, uri); if (sion_bookmark_is_valid(bm)) { @@ -1200,7 +1244,7 @@ mounts_changed_cb(NULL, SION_WINDOW(window)); sion_window_update_bookmarks(SION_WINDOW(window)); - + sion_window_do_autoconnect(SION_WINDOW(window)); return window; } Index: src/window.h =================================================================== --- src/window.h (revision 6410) +++ src/window.h (working copy) @@ -49,6 +49,7 @@ GtkWidget* sion_window_new (SionSettings *settings); void sion_window_update_bookmarks (SionWindow *window); +gboolean sion_window_do_autoconnect (gpointer data); const gchar* sion_window_get_icon_name (void);