gimp r25093 - in trunk: . plug-ins/uri



Author: neo
Date: Wed Mar 12 16:06:15 2008
New Revision: 25093
URL: http://svn.gnome.org/viewvc/gimp?rev=25093&view=rev

Log:
2008-03-12  Sven Neumann  <sven gimp org>

	* plug-ins/uri/uri-backend-gio.c: added password and question
	dialogs needed for mounting volumes. This code is untested.




Modified:
   trunk/ChangeLog
   trunk/plug-ins/uri/uri-backend-gio.c

Modified: trunk/plug-ins/uri/uri-backend-gio.c
==============================================================================
--- trunk/plug-ins/uri/uri-backend-gio.c	(original)
+++ trunk/plug-ins/uri/uri-backend-gio.c	Wed Mar 12 16:06:15 2008
@@ -21,6 +21,8 @@
 
 #include "config.h"
 
+#include <string.h>
+
 #include <gio/gio.h>
 
 #include <libgimp/gimp.h>
@@ -38,6 +40,8 @@
 } Mode;
 
 
+static GType      mount_operation_get_type (void) G_GNUC_CONST;
+
 static gchar    * get_protocols (void);
 static gboolean   copy_uri      (const gchar  *src_uri,
                                  const gchar  *dest_uri,
@@ -230,7 +234,9 @@
 mount_enclosing_volume (GFile   *file,
                         GError **error)
 {
-  GMountOperation *operation = g_mount_operation_new ();
+  GMountOperation *operation;
+
+  operation = g_object_new (mount_operation_get_type (), NULL);
 
   g_file_mount_enclosing_volume (file, G_MOUNT_MOUNT_NONE,
                                  operation,
@@ -273,12 +279,13 @@
                          uri_progress_callback, GINT_TO_POINTER (mode),
                          error);
 
-#if 0
   if (! success &&
       run_mode == GIMP_RUN_INTERACTIVE &&
       (*error)->domain == G_IO_ERROR   &&
       (*error)->code   == G_IO_ERROR_NOT_MOUNTED)
     {
+      g_clear_error (error);
+
       if (mount_enclosing_volume (mode == DOWNLOAD ? src_file : dest_file,
                                   error))
         {
@@ -288,10 +295,294 @@
 
         }
     }
-#endif
 
   g_object_unref (src_file);
   g_object_unref (dest_file);
 
   return success;
 }
+
+
+/*************************************************************
+ * The code below is partly copied from eel-mount-operation.c.
+ * It should become obsolete with the next GTK+ release.
+ *************************************************************/
+
+#define MOUNT_OPERATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), mount_operation_get_type (), MountOperation))
+
+
+typedef struct _MountOperation  MountOperation;
+typedef GMountOperationClass    MountOperationClass;
+
+struct _MountOperation
+{
+  GMountOperation  parent_instance;
+
+  GtkWidget       *username_entry;
+  GtkWidget       *anon_toggle;
+  GtkWidget       *domain_entry;
+  GtkWidget       *password_entry;
+};
+
+static void mount_operation_ask_password (GMountOperation   *operation,
+                                          const char        *message,
+                                          const char        *default_user,
+                                          const char        *default_domain,
+                                          GAskPasswordFlags  flags);
+static void mount_operation_ask_question (GMountOperation   *operation,
+                                          const char        *message,
+                                          const char        *choices[]);
+
+
+G_DEFINE_TYPE (MountOperation, mount_operation, G_TYPE_MOUNT_OPERATION)
+
+
+static void
+mount_operation_class_init (MountOperationClass *klass)
+{
+  GMountOperationClass *operation_class = G_MOUNT_OPERATION_CLASS (klass);
+
+  operation_class->ask_password = mount_operation_ask_password;
+  operation_class->ask_question = mount_operation_ask_question;
+}
+
+static void
+mount_operation_init (MountOperation *operation)
+{
+}
+
+static void
+mount_operation_password_response (GtkWidget      *dialog,
+                                   gint            response_id,
+                                   MountOperation *operation)
+{
+  const gchar *text;
+
+  switch (response_id)
+    {
+    case GTK_RESPONSE_OK:
+      if (operation->username_entry)
+        {
+          text = gtk_entry_get_text (GTK_ENTRY (operation->username_entry));
+          g_mount_operation_set_username (G_MOUNT_OPERATION (operation), text);
+        }
+
+      if (operation->domain_entry)
+        {
+          text = gtk_entry_get_text (GTK_ENTRY (operation->domain_entry));
+          g_mount_operation_set_domain (G_MOUNT_OPERATION (operation), text);
+        }
+
+      if (operation->password_entry)
+        {
+          text = gtk_entry_get_text (GTK_ENTRY (operation->domain_entry));
+          g_mount_operation_set_password (G_MOUNT_OPERATION (operation), text);
+        }
+
+      g_mount_operation_reply (G_MOUNT_OPERATION (operation),
+                               G_MOUNT_OPERATION_HANDLED);
+      break;
+
+    case GTK_RESPONSE_CANCEL:
+      g_mount_operation_reply (G_MOUNT_OPERATION (operation),
+                               G_MOUNT_OPERATION_ABORTED);
+      break;
+    }
+
+  gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
+mount_operation_anon_toggled (GtkWidget      *button,
+                              MountOperation *operation)
+{
+  if (operation->username_entry)
+    {
+      gboolean active;
+
+      active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
+
+      gtk_widget_set_sensitive (operation->username_entry, active);
+    }
+}
+
+static void
+mount_operation_ask_password (GMountOperation   *operation,
+                              const char        *message,
+                              const char        *default_user,
+                              const char        *default_domain,
+                              GAskPasswordFlags  flags)
+{
+  MountOperation *mount = MOUNT_OPERATION (operation);
+  GtkWidget      *dialog;
+  GtkWidget      *hbox;
+  GtkWidget      *image;
+  GtkWidget      *table;
+  gint            row = 0;
+
+  dialog = gtk_dialog_new_with_buttons (_("Enter Password"),
+                                        NULL, 0,
+                                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                        GTK_STOCK_OK,     GTK_RESPONSE_OK,
+                                        NULL);
+
+  hbox = gtk_hbox_new (12, FALSE);
+  gtk_container_set_border_width (GTK_CONTAINER (hbox), 12);
+  gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox);
+  gtk_widget_show (hbox);
+
+  image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION,
+                                    GTK_ICON_SIZE_DIALOG);
+  gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0);
+  gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+  gtk_widget_show (image);
+
+  table = gtk_table_new (0, 2, FALSE);
+  gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
+  gtk_widget_show (table);
+
+  if (flags & G_ASK_PASSWORD_NEED_USERNAME)
+    {
+      mount->username_entry = gtk_entry_new ();
+
+      if (default_user)
+        gtk_entry_set_text (GTK_ENTRY (mount->username_entry), default_user);
+
+      gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
+                                 _("_User:"), 0.0, 0.5,
+                                 mount->username_entry, 0, FALSE);
+    }
+  else
+    {
+      mount->username_entry = NULL;
+    }
+
+  if (flags & G_ASK_PASSWORD_ANONYMOUS_SUPPORTED)
+    {
+      mount->anon_toggle =
+        gtk_check_button_new_with_mnemonic (_("Log in _anonymously"));
+
+      g_signal_connect (mount->anon_toggle, "toggled",
+                        G_CALLBACK (mount_operation_anon_toggled),
+                        mount);
+
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mount->anon_toggle),
+                                    TRUE);
+    }
+  else
+    {
+      mount->anon_toggle = NULL;
+    }
+
+  if (flags & G_ASK_PASSWORD_NEED_DOMAIN)
+    {
+      mount->domain_entry = gtk_entry_new ();
+
+      if (default_domain)
+        gtk_entry_set_text (GTK_ENTRY (mount->domain_entry), default_domain);
+
+      gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
+                                 _("_Domain:"), 0.0, 0.5,
+                                 mount->domain_entry, 0, FALSE);
+    }
+  else
+    {
+      mount->domain_entry = NULL;
+    }
+
+  if (flags & G_ASK_PASSWORD_NEED_PASSWORD)
+    {
+      mount->password_entry = gtk_entry_new ();
+      gtk_entry_set_visibility (GTK_ENTRY (mount->password_entry), FALSE);
+
+      gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
+                                 _("_Password:"), 0.0, 0.5,
+                                 mount->password_entry, 0, FALSE);
+    }
+  else
+    {
+      mount->password_entry = NULL;
+    }
+
+  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+                                           GTK_RESPONSE_OK,
+                                           GTK_RESPONSE_CANCEL,
+                                           -1);
+
+  g_signal_connect (dialog, "response",
+                    G_CALLBACK (mount_operation_password_response),
+                    operation);
+
+  gimp_window_set_transient (GTK_WINDOW (dialog));
+
+  gtk_widget_show (dialog);
+}
+
+static void
+mount_operation_question_response (GtkWidget      *dialog,
+                                   gint            response_id,
+                                   MountOperation *operation)
+{
+  if (response_id >= 0)
+    {
+      g_mount_operation_set_choice (G_MOUNT_OPERATION (operation), response_id);
+      g_mount_operation_reply (G_MOUNT_OPERATION (operation),
+                               G_MOUNT_OPERATION_HANDLED);
+    }
+  else
+    {
+      g_mount_operation_reply (G_MOUNT_OPERATION (operation),
+                               G_MOUNT_OPERATION_ABORTED);
+    }
+
+  gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
+mount_operation_ask_question (GMountOperation *operation,
+                              const char      *message,
+                              const char      *choices[])
+
+{
+  GtkWidget   *dialog;
+  gchar       *primary;
+  const gchar *secondary = NULL;
+
+  primary = strstr (message, "\n");
+  if (primary)
+    {
+      secondary = primary + 1;
+      primary = g_strndup (message, strlen (message) - strlen (primary));
+    }
+
+  dialog = gtk_message_dialog_new (NULL,
+                                   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);
+
+  if (choices)
+    {
+      gint i, len;
+
+      /* First count the items in the list then
+       * add the buttons in reverse order */
+      for (len = 0; choices[len] != NULL; len++)
+        ;
+
+      for (i = len - 1; i >= 0; i--)
+        gtk_dialog_add_button (GTK_DIALOG (dialog), choices[i], i);
+    }
+
+  g_signal_connect (dialog, "response",
+                    G_CALLBACK (mount_operation_question_response),
+                    operation);
+
+  gimp_window_set_transient (GTK_WINDOW (dialog));
+
+  gtk_widget_show (GTK_WIDGET (dialog));
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]