[Goodies-commits] r6813 - in gigolo/trunk: . po src
Enrico Troeger
enrico at xfce.org
Sun Mar 1 10:55:09 CET 2009
Author: enrico
Date: 2009-03-01 09:55:09 +0000 (Sun, 01 Mar 2009)
New Revision: 6813
Added:
gigolo/trunk/src/mountoperation.c
gigolo/trunk/src/mountoperation.h
Removed:
gigolo/trunk/src/passworddialog.c
gigolo/trunk/src/passworddialog.h
Modified:
gigolo/trunk/ChangeLog
gigolo/trunk/po/POTFILES.in
gigolo/trunk/src/Makefile.am
gigolo/trunk/src/backendgvfs.c
gigolo/trunk/src/backendgvfs.h
gigolo/trunk/src/compat.c
gigolo/trunk/src/compat.h
gigolo/trunk/src/window.c
gigolo/trunk/wscript
Log:
Use the native GtkMountOperation dialog when additional authentication information are needed.
This implicitly allows choosing the method to store passwords (never, session, forever).
Modified: gigolo/trunk/ChangeLog
===================================================================
--- gigolo/trunk/ChangeLog 2009-02-28 21:57:48 UTC (rev 6812)
+++ gigolo/trunk/ChangeLog 2009-03-01 09:55:09 UTC (rev 6813)
@@ -1,3 +1,14 @@
+2009-03-01 Enrico Tröger <enrico(at)xfce(dot)org>
+
+ * po/POTFILES.in, src/Makefile.am, src/backendgvfs.c,
+ src/backendgvfs.h, src/compat.c, src/compat.h, src/mountoperation.c,
+ src/mountoperation.h, src/window.c, wscript:
+ Use the native GtkMountOperation dialog when additional
+ authentication information are needed.
+ This implicitly allows choosing the method to store passwords
+ (never, session, forever).
+
+
2009-02-28 Enrico Tröger <enrico(at)xfce(dot)org>
* src/backendgvfs.c:
Modified: gigolo/trunk/po/POTFILES.in
===================================================================
--- gigolo/trunk/po/POTFILES.in 2009-02-28 21:57:48 UTC (rev 6812)
+++ gigolo/trunk/po/POTFILES.in 2009-03-01 09:55:09 UTC (rev 6813)
@@ -7,7 +7,7 @@
src/bookmark.c
src/settings.c
src/menubuttonaction.c
-src/passworddialog.c
+src/mountoperation.c
src/bookmarkdialog.c
src/bookmarkeditdialog.c
src/preferencesdialog.c
Modified: gigolo/trunk/src/Makefile.am
===================================================================
--- gigolo/trunk/src/Makefile.am 2009-02-28 21:57:48 UTC (rev 6812)
+++ gigolo/trunk/src/Makefile.am 2009-03-01 09:55:09 UTC (rev 6813)
@@ -11,7 +11,7 @@
backendgvfs.c backendgvfs.h \
menubuttonaction.c menubuttonaction.h \
mountdialog.c mountdialog.h \
- passworddialog.c passworddialog.h \
+ mountoperation.c mountoperation.h \
bookmarkdialog.c bookmarkdialog.h \
bookmarkeditdialog.c bookmarkeditdialog.h \
preferencesdialog.c preferencesdialog.h
Modified: gigolo/trunk/src/backendgvfs.c
===================================================================
--- gigolo/trunk/src/backendgvfs.c 2009-02-28 21:57:48 UTC (rev 6812)
+++ gigolo/trunk/src/backendgvfs.c 2009-03-01 09:55:09 UTC (rev 6813)
@@ -25,7 +25,7 @@
#include "common.h"
#include "backendgvfs.h"
-#include "passworddialog.h"
+#include "mountoperation.h"
#include "main.h"
typedef struct _GigoloBackendGVFSPrivate GigoloBackendGVFSPrivate;
@@ -461,48 +461,9 @@
}
-static void set_password_cb(GMountOperation *op, G_GNUC_UNUSED gchar *message, gchar *default_user,
- G_GNUC_UNUSED gchar *default_domain, GAskPasswordFlags flags,
- G_GNUC_UNUSED gpointer data)
+void gigolo_backend_gvfs_mount_uri(GigoloBackendGVFS *backend, const gchar *uri,
+ GtkWindow *parent, GtkWidget *dialog)
{
- GMountOperationResult result;
- GtkWidget *dialog;
-
- dialog = gigolo_password_dialog_new(flags, default_user);
-
- if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
- {
- result = G_MOUNT_OPERATION_HANDLED;
-
- if (flags & G_ASK_PASSWORD_NEED_DOMAIN)
- g_mount_operation_set_domain(op,
- gigolo_password_dialog_get_domain(GIGOLO_PASSWORD_DIALOG(dialog)));
- if (flags & G_ASK_PASSWORD_NEED_USERNAME)
- g_mount_operation_set_username(op,
- gigolo_password_dialog_get_username(GIGOLO_PASSWORD_DIALOG(dialog)));
- if (flags & G_ASK_PASSWORD_NEED_PASSWORD)
- {
- g_mount_operation_set_password(op,
- gigolo_password_dialog_get_password(GIGOLO_PASSWORD_DIALOG(dialog)));
- /* TODO make this configurable? */
- /* g_mount_operation_set_password_save(op, G_PASSWORD_SAVE_FOR_SESGIGOLO); */
- /* g_mount_operation_set_password_save(op, G_PASSWORD_SAVE_NEVER); */
- g_mount_operation_set_password_save(op, G_PASSWORD_SAVE_PERMANENTLY);
- }
- }
- else
- {
- result = G_MOUNT_OPERATION_ABORTED;
- }
-
- gtk_widget_destroy(dialog);
-
- g_mount_operation_reply(op, result);
-}
-
-
-void gigolo_backend_gvfs_mount_uri(GigoloBackendGVFS *backend, const gchar *uri, GtkWidget *dialog)
-{
GMountOperation *op;
GFile *file;
MountInfo *mi;
@@ -510,14 +471,12 @@
g_return_if_fail(uri != NULL);
g_return_if_fail(backend != NULL);
- op = g_mount_operation_new();
+ op = gigolo_mount_operation_new(GTK_WINDOW(parent));
file = g_file_new_for_uri(uri);
mi = g_new0(MountInfo, 1);
mi->self = backend;
mi->dialog = dialog;
- g_signal_connect(op, "ask-password", G_CALLBACK(set_password_cb), NULL);
-
g_file_mount_enclosing_volume(file, G_MOUNT_MOUNT_NONE, op, NULL,
(GAsyncReadyCallback) mount_ready_cb, mi);
Modified: gigolo/trunk/src/backendgvfs.h
===================================================================
--- gigolo/trunk/src/backendgvfs.h 2009-02-28 21:57:48 UTC (rev 6812)
+++ gigolo/trunk/src/backendgvfs.h 2009-03-01 09:55:09 UTC (rev 6813)
@@ -58,6 +58,7 @@
void gigolo_backend_gvfs_mount_uri (GigoloBackendGVFS *backend,
const gchar *uri,
+ GtkWindow *parent,
GtkWidget *dialog);
gchar* gigolo_backend_gvfs_get_volume_identifier (GVolume *volume);
Modified: gigolo/trunk/src/compat.c
===================================================================
--- gigolo/trunk/src/compat.c 2009-02-28 21:57:48 UTC (rev 6812)
+++ gigolo/trunk/src/compat.c 2009-03-01 09:55:09 UTC (rev 6813)
@@ -45,6 +45,16 @@
}
+GtkWidget *gigolo_dialog_get_action_area(GtkDialog *dialog)
+{
+#if GTK_CHECK_VERSION(2, 14, 0)
+ return gtk_dialog_get_action_area(dialog);
+#else
+ return dialog->action_area;
+#endif
+}
+
+
guint32 gigolo_widget_get_flags(GtkWidget *widget)
{
#ifdef GSEAL_ENABLE
Modified: gigolo/trunk/src/compat.h
===================================================================
--- gigolo/trunk/src/compat.h 2009-02-28 21:57:48 UTC (rev 6812)
+++ gigolo/trunk/src/compat.h 2009-03-01 09:55:09 UTC (rev 6813)
@@ -25,6 +25,8 @@
GtkWidget *gigolo_dialog_get_content_area(GtkDialog *dialog);
+GtkWidget *gigolo_dialog_get_action_area(GtkDialog *dialog);
+
void gigolo_status_icon_set_tooltip_text(GtkStatusIcon *status_icon, const gchar *tooltip_text);
guint32 gigolo_widget_get_flags(GtkWidget *widget);
Added: gigolo/trunk/src/mountoperation.c
===================================================================
--- gigolo/trunk/src/mountoperation.c (rev 0)
+++ gigolo/trunk/src/mountoperation.c 2009-03-01 09:55:09 UTC (rev 6813)
@@ -0,0 +1,623 @@
+/*
+ * mountoperation.c
+ *
+ * Copyright 2009 Enrico Tröger <enrico(at)xfce(dot)org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <gtk/gtk.h>
+#include <string.h>
+
+#include "compat.h"
+#include "mountoperation.h"
+
+
+/* This is a "light" version of GtkMountOperation for the case when Gigolo is compiled
+ * against GTK 2.12. When compild against GTK 2.14 or later, the native GTK dialog is used.
+ * Changes: removed the properties which we don't use and adjust coding style.
+ * Strings are not marked as translatable on purpose to ease the life of translators because
+ * the whole code in here is only used on GTK 2.12, GTK 2.14 and later provide the same dialog
+ * with translated strings.
+ */
+
+#if ! GTK_CHECK_VERSION(2, 14, 0)
+
+typedef struct _GigoloMountOperationPrivate GigoloMountOperationPrivate;
+
+#define GIGOLO_MOUNT_OPERATION_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj),\
+ GIGOLO_MOUNT_OPERATION_TYPE, GigoloMountOperationPrivate))
+
+struct _GigoloMountOperation
+{
+ GMountOperation parent;
+};
+
+struct _GigoloMountOperationClass
+{
+ GMountOperationClass parent_class;
+};
+
+struct _GigoloMountOperationPrivate
+{
+ GtkWindow *parent_window;
+ GtkDialog *dialog;
+
+ /* for the ask-password dialog */
+ GtkWidget *entry_container;
+ GtkWidget *username_entry;
+ GtkWidget *domain_entry;
+ GtkWidget *password_entry;
+ GtkWidget *anonymous_toggle;
+
+ GAskPasswordFlags ask_flags;
+ GPasswordSave password_save;
+ gboolean anonymous;
+};
+
+
+static void gigolo_mount_operation_ask_password(GMountOperation *op,
+ const gchar *message,
+ const gchar *default_user,
+ const gchar *default_domain,
+ GAskPasswordFlags flags);
+static void gigolo_mount_operation_ask_question(GMountOperation *op,
+ const gchar *message,
+ const gchar *choices[]);
+#if GLIB_CHECK_VERSION(2, 20, 0)
+static void gigolo_mount_operation_aborted(GMountOperation *op);
+#endif
+
+
+G_DEFINE_TYPE(GigoloMountOperation, gigolo_mount_operation, G_TYPE_MOUNT_OPERATION);
+
+
+static void gigolo_mount_operation_finalize(GObject *object)
+{
+ GigoloMountOperation *self;
+
+ g_return_if_fail(object != NULL);
+ g_return_if_fail(IS_GIGOLO_MOUNT_OPERATION(object));
+
+ self = GIGOLO_MOUNT_OPERATION(object);
+
+ G_OBJECT_CLASS(gigolo_mount_operation_parent_class)->finalize(object);
+}
+
+
+static void gigolo_mount_operation_init(G_GNUC_UNUSED GigoloMountOperation *self)
+{
+ /* nothing to do */
+}
+
+
+static void remember_button_toggled(GtkToggleButton *button, GigoloMountOperation *operation)
+{
+ if (gtk_toggle_button_get_active(button))
+ {
+ gpointer data;
+ GigoloMountOperationPrivate *priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(operation);
+
+ data = g_object_get_data(G_OBJECT(button), "password-save");
+ priv->password_save = GPOINTER_TO_INT(data);
+ }
+}
+
+
+static void pw_dialog_got_response(GtkDialog *dialog, gint response_id, GigoloMountOperation *g_op)
+{
+ GigoloMountOperationPrivate *priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(g_op);
+ GMountOperation *op = G_MOUNT_OPERATION(g_op);
+
+ if (response_id == GTK_RESPONSE_OK)
+ {
+ const char *text;
+
+ if (priv->ask_flags & G_ASK_PASSWORD_ANONYMOUS_SUPPORTED)
+ g_mount_operation_set_anonymous(op, priv->anonymous);
+
+ if (priv->username_entry)
+ {
+ text = gtk_entry_get_text(GTK_ENTRY(priv->username_entry));
+ g_mount_operation_set_username(op, text);
+ }
+
+ if (priv->domain_entry)
+ {
+ text = gtk_entry_get_text(GTK_ENTRY(priv->domain_entry));
+ g_mount_operation_set_domain(op, text);
+ }
+
+ if (priv->password_entry)
+ {
+ text = gtk_entry_get_text(GTK_ENTRY(priv->password_entry));
+ g_mount_operation_set_password(op, text);
+ }
+
+ if (priv->ask_flags & G_ASK_PASSWORD_SAVING_SUPPORTED)
+ g_mount_operation_set_password_save(op, priv->password_save);
+
+ g_mount_operation_reply(op, G_MOUNT_OPERATION_HANDLED);
+ }
+ else
+ g_mount_operation_reply(op, G_MOUNT_OPERATION_ABORTED);
+
+ priv->dialog = NULL;
+ gtk_widget_destroy(GTK_WIDGET(dialog));
+ g_object_unref(op);
+}
+
+
+static gboolean entry_has_input(GtkWidget *entry_widget)
+{
+ const gchar *text;
+
+ if (entry_widget == NULL)
+ return TRUE;
+
+ text = gtk_entry_get_text(GTK_ENTRY(entry_widget));
+
+ return text != NULL && text[0] != '\0';
+}
+
+
+static gboolean pw_dialog_input_is_valid(GigoloMountOperation *operation)
+{
+ GigoloMountOperationPrivate *priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(operation);
+ gboolean is_valid = TRUE;
+
+ is_valid = entry_has_input(priv->username_entry) &&
+ entry_has_input(priv->domain_entry) &&
+ entry_has_input(priv->password_entry);
+
+ return is_valid;
+}
+
+
+static void pw_dialog_verify_input(G_GNUC_UNUSED GtkEditable *editable, GigoloMountOperation *op)
+{
+ GigoloMountOperationPrivate *priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(op);
+ gboolean is_valid;
+
+ is_valid = pw_dialog_input_is_valid(op);
+ gtk_dialog_set_response_sensitive(GTK_DIALOG(priv->dialog), GTK_RESPONSE_OK, is_valid);
+}
+
+
+static void pw_dialog_anonymous_toggled(GtkWidget *widget, GigoloMountOperation *operation)
+{
+ GigoloMountOperationPrivate *priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(operation);
+ gboolean is_valid;
+
+ priv->anonymous = (widget == priv->anonymous_toggle);
+
+ if (priv->anonymous)
+ is_valid = TRUE;
+ else
+ is_valid = pw_dialog_input_is_valid(operation);
+
+ gtk_widget_set_sensitive(priv->entry_container, (priv->anonymous == FALSE));
+ gtk_dialog_set_response_sensitive(GTK_DIALOG(priv->dialog), GTK_RESPONSE_OK, is_valid);
+}
+
+
+static void pw_dialog_cycle_focus(GtkWidget *widget, GigoloMountOperation *operation)
+{
+ GigoloMountOperationPrivate *priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(operation);
+ GtkWidget *next_widget = NULL;
+
+ priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(operation);
+
+ if (widget == priv->username_entry)
+ {
+ if (priv->domain_entry != NULL)
+ next_widget = priv->domain_entry;
+ else if (priv->password_entry != NULL)
+ next_widget = priv->password_entry;
+ }
+ else if (widget == priv->domain_entry && priv->password_entry)
+ next_widget = priv->password_entry;
+
+ if (next_widget)
+ gtk_widget_grab_focus(next_widget);
+ else if (pw_dialog_input_is_valid(operation))
+ gtk_window_activate_default(GTK_WINDOW(priv->dialog));
+}
+
+
+static GtkWidget *table_add_entry(GtkWidget *table, gint row, const gchar *label_text,
+ const gchar *value, gpointer user_data)
+{
+ GtkWidget *entry;
+ GtkWidget *label;
+
+ label = gtk_label_new_with_mnemonic(label_text);
+ gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+
+ entry = gtk_entry_new();
+
+ if (value)
+ gtk_entry_set_text(GTK_ENTRY(entry), value);
+
+ gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row + 1, GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+ gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, row, row + 1);
+ gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry);
+
+ g_signal_connect(entry, "changed", G_CALLBACK(pw_dialog_verify_input), user_data);
+ g_signal_connect(entry, "activate", G_CALLBACK(pw_dialog_cycle_focus), user_data);
+
+ return entry;
+}
+
+
+static void gigolo_mount_operation_ask_password(GMountOperation *mount_op,
+ const gchar *message,
+ const gchar *default_user,
+ const gchar *default_domain,
+ GAskPasswordFlags flags)
+{
+ GigoloMountOperation *operation;
+ GigoloMountOperationPrivate *priv;
+ GtkWidget *widget;
+ GtkDialog *dialog;
+ GtkWindow *window;
+ GtkWidget *entry_container;
+ GtkWidget *hbox, *main_vbox, *vbox, *icon;
+ GtkWidget *table;
+ GtkWidget *message_label;
+ gboolean can_anonymous;
+ guint rows;
+ const gchar *secondary;
+
+ operation = GIGOLO_MOUNT_OPERATION(mount_op);
+ priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(operation);
+
+ priv->ask_flags = flags;
+
+ widget = gtk_dialog_new();
+ dialog = GTK_DIALOG(widget);
+ window = GTK_WINDOW(widget);
+
+ priv->dialog = dialog;
+
+ /* Set the dialog up with HIG properties */
+ gtk_dialog_set_has_separator(dialog, FALSE);
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
+ gtk_box_set_spacing(GTK_BOX(gigolo_dialog_get_content_area(dialog)), 2);
+ /* 2 * 5 + 2 = 12 */
+ gtk_container_set_border_width(GTK_CONTAINER(gigolo_dialog_get_action_area(dialog)), 5);
+ gtk_box_set_spacing(GTK_BOX(gigolo_dialog_get_action_area(dialog)), 6);
+
+ gtk_window_set_resizable(window, FALSE);
+ gtk_window_set_title(window, "");
+ gtk_window_set_icon_name(window, GTK_STOCK_DIALOG_AUTHENTICATION);
+
+ gtk_dialog_add_buttons(dialog, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ "Co_nnect", GTK_RESPONSE_OK, NULL);
+ gtk_dialog_set_default_response(dialog, GTK_RESPONSE_OK);
+
+ gtk_dialog_set_alternative_button_order(dialog, GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, -1);
+
+ /* Build contents */
+ hbox = gtk_hbox_new(FALSE, 12);
+ gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
+ gtk_box_pack_start(GTK_BOX(gigolo_dialog_get_content_area(dialog)), hbox, TRUE, TRUE, 0);
+
+ icon = gtk_image_new_from_stock(GTK_STOCK_DIALOG_AUTHENTICATION, GTK_ICON_SIZE_DIALOG);
+
+ gtk_misc_set_alignment(GTK_MISC(icon), 0.5, 0.0);
+ gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0);
+
+ main_vbox = gtk_vbox_new(FALSE, 18);
+ gtk_box_pack_start(GTK_BOX(hbox), main_vbox, TRUE, TRUE, 0);
+
+ secondary = strstr(message, "\n");
+ if (secondary != NULL)
+ {
+ gchar *s;
+ gchar *primary;
+
+ primary = g_strndup(message, secondary - message + 1);
+ s = g_strdup_printf("<big><b>%s</b></big>%s", primary, secondary);
+
+ message_label = gtk_label_new(NULL);
+ gtk_label_set_markup(GTK_LABEL(message_label), s);
+ gtk_misc_set_alignment(GTK_MISC(message_label), 0.0, 0.5);
+ gtk_label_set_line_wrap(GTK_LABEL(message_label), TRUE);
+ gtk_box_pack_start(GTK_BOX(main_vbox), GTK_WIDGET(message_label), FALSE, TRUE, 0);
+
+ g_free(s);
+ g_free(primary);
+ }
+ else
+ {
+ message_label = gtk_label_new(message);
+ gtk_misc_set_alignment(GTK_MISC(message_label), 0.0, 0.5);
+ gtk_label_set_line_wrap(GTK_LABEL(message_label), TRUE);
+ gtk_box_pack_start(GTK_BOX(main_vbox), GTK_WIDGET(message_label), FALSE, FALSE, 0);
+ }
+
+ vbox = gtk_vbox_new(FALSE, 6);
+ gtk_box_pack_start(GTK_BOX(main_vbox), vbox, FALSE, FALSE, 0);
+
+ can_anonymous = flags & G_ASK_PASSWORD_ANONYMOUS_SUPPORTED;
+
+ if (can_anonymous)
+ {
+ GtkWidget *anon_box;
+ GtkWidget *choice;
+ GSList *group;
+
+ anon_box = gtk_vbox_new(FALSE, 6);
+ gtk_box_pack_start(GTK_BOX(vbox), anon_box, FALSE, FALSE, 0);
+
+ choice = gtk_radio_button_new_with_mnemonic(NULL, "Connect _anonymously");
+ gtk_box_pack_start(GTK_BOX(anon_box), choice, FALSE, FALSE, 0);
+ g_signal_connect(choice, "toggled", G_CALLBACK(pw_dialog_anonymous_toggled), operation);
+ priv->anonymous_toggle = choice;
+
+ group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(choice));
+ choice = gtk_radio_button_new_with_mnemonic(group, "Connect as u_ser:");
+ gtk_box_pack_start(GTK_BOX(anon_box), choice, FALSE, FALSE, 0);
+ g_signal_connect(choice, "toggled", G_CALLBACK(pw_dialog_anonymous_toggled), operation);
+ }
+
+ rows = 0;
+
+ if (flags & G_ASK_PASSWORD_NEED_PASSWORD)
+ rows++;
+
+ if (flags & G_ASK_PASSWORD_NEED_USERNAME)
+ rows++;
+
+ if (flags &G_ASK_PASSWORD_NEED_DOMAIN)
+ rows++;
+
+ /* The table that holds the entries */
+ entry_container = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
+
+ gtk_alignment_set_padding(GTK_ALIGNMENT(entry_container), 0, 0, can_anonymous ? 12 : 0, 0);
+
+ gtk_box_pack_start(GTK_BOX(vbox), entry_container, FALSE, FALSE, 0);
+ priv->entry_container = entry_container;
+
+ table = gtk_table_new(rows, 2, FALSE);
+ gtk_table_set_col_spacings(GTK_TABLE(table), 12);
+ gtk_table_set_row_spacings(GTK_TABLE(table), 6);
+ gtk_container_add(GTK_CONTAINER(entry_container), table);
+
+ rows = 0;
+
+ if (flags & G_ASK_PASSWORD_NEED_USERNAME)
+ priv->username_entry = table_add_entry(table, rows++, "_Username:", default_user, operation);
+
+ if (flags & G_ASK_PASSWORD_NEED_DOMAIN)
+ priv->domain_entry = table_add_entry(table, rows++, "_Domain:", default_domain, operation);
+
+ if (flags & G_ASK_PASSWORD_NEED_PASSWORD)
+ {
+ priv->password_entry = table_add_entry(table, rows++, "_Password:", NULL, operation);
+ gtk_entry_set_visibility(GTK_ENTRY(priv->password_entry), FALSE);
+ }
+
+ if (flags & G_ASK_PASSWORD_SAVING_SUPPORTED)
+ {
+ GtkWidget *choice;
+ GtkWidget *remember_box;
+ GSList *group;
+ GPasswordSave password_save;
+
+ remember_box = gtk_vbox_new(FALSE, 6);
+ gtk_box_pack_start(GTK_BOX(vbox), remember_box, FALSE, FALSE, 0);
+
+ password_save = g_mount_operation_get_password_save(mount_op);
+
+ choice = gtk_radio_button_new_with_mnemonic(NULL, "Forget password _immediately");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(choice), password_save == G_PASSWORD_SAVE_NEVER);
+ g_object_set_data(G_OBJECT(choice), "password-save", GINT_TO_POINTER(G_PASSWORD_SAVE_NEVER));
+ g_signal_connect(choice, "toggled", G_CALLBACK(remember_button_toggled), operation);
+ gtk_box_pack_start(GTK_BOX(remember_box), choice, FALSE, FALSE, 0);
+
+ group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(choice));
+ choice = gtk_radio_button_new_with_mnemonic(group, "Remember password until you _logout");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(choice), password_save == G_PASSWORD_SAVE_FOR_SESSION);
+ g_object_set_data(G_OBJECT(choice), "password-save", GINT_TO_POINTER(G_PASSWORD_SAVE_FOR_SESSION));
+ g_signal_connect(choice, "toggled", G_CALLBACK(remember_button_toggled), operation);
+ gtk_box_pack_start(GTK_BOX(remember_box), choice, FALSE, FALSE, 0);
+
+ group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(choice));
+ choice = gtk_radio_button_new_with_mnemonic(group, "Remember _forever");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(choice), password_save == G_PASSWORD_SAVE_PERMANENTLY);
+ g_object_set_data(G_OBJECT(choice), "password-save", GINT_TO_POINTER(G_PASSWORD_SAVE_PERMANENTLY));
+ g_signal_connect(choice, "toggled", G_CALLBACK(remember_button_toggled), operation);
+ gtk_box_pack_start(GTK_BOX(remember_box), choice, FALSE, FALSE, 0);
+ }
+
+ g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(pw_dialog_got_response), operation);
+
+ if (can_anonymous)
+ {
+ /* The anonymous option will be active by default,
+ * ensure the toggled signal is emitted for it.
+ */
+ gtk_toggle_button_toggled(GTK_TOGGLE_BUTTON(priv->anonymous_toggle));
+ }
+ else if (! pw_dialog_input_is_valid(operation))
+ gtk_dialog_set_response_sensitive(dialog, GTK_RESPONSE_OK, FALSE);
+
+ if (priv->parent_window)
+ {
+ gtk_window_set_transient_for(window, priv->parent_window);
+ gtk_window_set_modal(window, TRUE);
+ }
+
+ gtk_widget_show_all(GTK_WIDGET(dialog));
+ g_object_ref(operation);
+}
+
+
+static void question_dialog_button_clicked(GtkDialog *dialog, gint button_number, GMountOperation *op)
+{
+ GigoloMountOperationPrivate *priv;
+ GigoloMountOperation *operation;
+
+ operation = GIGOLO_MOUNT_OPERATION(op);
+ priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(priv);
+
+ if (button_number >= 0)
+ {
+ g_mount_operation_set_choice(op, button_number);
+ g_mount_operation_reply(op, G_MOUNT_OPERATION_HANDLED);
+ }
+ else
+ g_mount_operation_reply(op, G_MOUNT_OPERATION_ABORTED);
+
+ priv->dialog = NULL;
+ gtk_widget_destroy(GTK_WIDGET(dialog));
+ g_object_unref(op);
+}
+
+
+static void gigolo_mount_operation_ask_question(GMountOperation *op, const gchar *message,
+ const gchar *choices[])
+{
+ GigoloMountOperationPrivate *priv;
+ GtkWidget *dialog;
+ const gchar *secondary = NULL;
+ gchar *primary;
+ gint count, len = 0;
+
+ g_return_if_fail(IS_GIGOLO_MOUNT_OPERATION(op));
+ g_return_if_fail(message != NULL);
+ g_return_if_fail(choices != NULL);
+
+ priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(priv);
+
+ primary = strstr(message, "\n");
+ if (primary)
+ {
+ secondary = primary + 1;
+ primary = g_strndup(message, primary - message);
+ }
+
+ dialog = gtk_message_dialog_new(priv->parent_window, 0,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE, "%s",
+ primary != NULL ? primary : message);
+ g_free(primary);
+
+ if (secondary)
+ gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", secondary);
+
+ /* First count the items in the list then add the buttons in reverse order */
+ while (choices[len] != NULL)
+ len++;
+
+ for (count = len - 1; count >= 0; count--)
+ gtk_dialog_add_button(GTK_DIALOG(dialog), choices[count], count);
+
+ g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(question_dialog_button_clicked), op);
+
+ priv->dialog = GTK_DIALOG(dialog);
+
+ gtk_widget_show(dialog);
+ g_object_ref(op);
+}
+
+
+#if GLIB_CHECK_VERSION(2, 20, 0)
+static void gigolo_mount_operation_aborted(GMountOperation *op)
+{
+ GigoloMountOperationPrivate *priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(priv);
+
+ if (priv->dialog != NULL)
+ {
+ gtk_widget_destroy(GTK_WIDGET(priv->dialog));
+ priv->dialog = NULL;
+ g_object_unref(op);
+ }
+}
+#endif
+
+
+static void gigolo_mount_operation_set_parent(GigoloMountOperation *op, GtkWindow *parent)
+{
+ GigoloMountOperationPrivate *priv;
+
+ g_return_if_fail(IS_GIGOLO_MOUNT_OPERATION(op));
+ g_return_if_fail(parent == NULL || GTK_IS_WINDOW(parent));
+
+ priv = GIGOLO_MOUNT_OPERATION_GET_PRIVATE(op);
+
+ if (priv->parent_window == parent)
+ return;
+
+ if (priv->parent_window)
+ {
+ g_signal_handlers_disconnect_by_func(priv->parent_window,
+ gtk_widget_destroyed, &priv->parent_window);
+ priv->parent_window = NULL;
+ }
+
+ if (parent)
+ {
+ priv->parent_window = g_object_ref(parent);
+
+ g_signal_connect(parent, "destroy", G_CALLBACK(gtk_widget_destroyed), &priv->parent_window);
+ if (priv->dialog)
+ gtk_window_set_transient_for(GTK_WINDOW(priv->dialog), parent);
+ }
+}
+
+
+static void gigolo_mount_operation_class_init(GigoloMountOperationClass *klass)
+{
+ GObjectClass *g_object_class;
+ GMountOperationClass *mount_op_class = G_MOUNT_OPERATION_CLASS(klass);
+
+ g_object_class = G_OBJECT_CLASS(klass);
+
+ g_object_class->finalize = gigolo_mount_operation_finalize;
+
+ g_type_class_add_private(klass, sizeof(GigoloMountOperationPrivate));
+
+ mount_op_class->ask_password = gigolo_mount_operation_ask_password;
+ mount_op_class->ask_question = gigolo_mount_operation_ask_question;
+#if GLIB_CHECK_VERSION(2, 20, 0)
+ mount_op_class->aborted = gigolo_mount_operation_aborted;
+#endif
+}
+#endif
+
+
+GMountOperation *gigolo_mount_operation_new(GtkWindow *parent)
+{
+#if GTK_CHECK_VERSION(2, 14, 0)
+ return gtk_mount_operation_new(parent);
+#else
+ GMountOperation *op;
+
+ op = g_object_new(GIGOLO_MOUNT_OPERATION_TYPE, NULL);
+ gigolo_mount_operation_set_parent(GIGOLO_MOUNT_OPERATION(op), parent);
+
+ return op;
+#endif
+}
+
+
Property changes on: gigolo/trunk/src/mountoperation.c
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native
Added: gigolo/trunk/src/mountoperation.h
===================================================================
--- gigolo/trunk/src/mountoperation.h (rev 0)
+++ gigolo/trunk/src/mountoperation.h 2009-03-01 09:55:09 UTC (rev 6813)
@@ -0,0 +1,51 @@
+/*
+ * mountoperation.h
+ *
+ * Copyright 2009 Enrico Tröger <enrico(at)xfce(dot)org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef __MOUNTOPERATION_H__
+#define __MOUNTOPERATION_H__
+
+G_BEGIN_DECLS
+
+#if ! GTK_CHECK_VERSION(2, 14, 0)
+
+#define GIGOLO_MOUNT_OPERATION_TYPE (gigolo_mount_operation_get_type())
+#define GIGOLO_MOUNT_OPERATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\
+ GIGOLO_MOUNT_OPERATION_TYPE, GigoloMountOperation))
+#define GIGOLO_MOUNT_OPERATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\
+ GIGOLO_MOUNT_OPERATION_TYPE, GigoloMountOperationClass))
+#define IS_GIGOLO_MOUNT_OPERATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\
+ GIGOLO_MOUNT_OPERATION_TYPE))
+#define IS_GIGOLO_MOUNT_OPERATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\
+ GIGOLO_MOUNT_OPERATION_TYPE))
+
+typedef struct _GigoloMountOperation GigoloMountOperation;
+typedef struct _GigoloMountOperationClass GigoloMountOperationClass;
+
+
+GType gigolo_mount_operation_get_type (void);
+
+#endif
+
+GMountOperation* gigolo_mount_operation_new (GtkWindow *parent);
+
+G_END_DECLS
+
+#endif /* __MOUNTOPERATION_H__ */
Property changes on: gigolo/trunk/src/mountoperation.h
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native
Modified: gigolo/trunk/src/window.c
===================================================================
--- gigolo/trunk/src/window.c 2009-02-28 21:57:48 UTC (rev 6812)
+++ gigolo/trunk/src/window.c 2009-03-01 09:55:09 UTC (rev 6813)
@@ -289,7 +289,7 @@
g_free(label);
}
- gigolo_backend_gvfs_mount_uri(priv->backend_gvfs, uri, dialog);
+ gigolo_backend_gvfs_mount_uri(priv->backend_gvfs, uri, GTK_WINDOW(window), dialog);
if (gigolo_bookmark_get_autoconnect(bookmark))
gigolo_bookmark_set_should_not_autoconnect(bookmark, FALSE);
Modified: gigolo/trunk/wscript
===================================================================
--- gigolo/trunk/wscript 2009-02-28 21:57:48 UTC (rev 6812)
+++ gigolo/trunk/wscript 2009-03-01 09:55:09 UTC (rev 6813)
@@ -34,7 +34,7 @@
sources = [ 'src/main.c', 'src/compat.c', 'src/window.c', 'src/bookmark.c', 'src/settings.c',
- 'src/menubuttonaction.c', 'src/passworddialog.c', 'src/bookmarkdialog.c',
+ 'src/menubuttonaction.c', 'src/mountoperation.c', 'src/bookmarkdialog.c',
'src/bookmarkeditdialog.c', 'src/preferencesdialog.c', 'src/backendgvfs.c',
'src/common.c', 'src/mountdialog.c' ]
More information about the Goodies-commits
mailing list