[Xfce4-commits] r30034 - in thunar/branches/migration-to-gio: . thunar

Jannis Pohlmann jannis at xfce.org
Tue Jun 16 19:50:46 CEST 2009


Author: jannis
Date: 2009-06-16 17:50:46 +0000 (Tue, 16 Jun 2009)
New Revision: 30034

Modified:
   thunar/branches/migration-to-gio/ChangeLog
   thunar/branches/migration-to-gio/thunar/thunar-location-entry.c
Log:
	* thunar/thunar-location-entry.c: Split
	  thunar_location_entry_activate() up into two functions,
	  thunar_location_entry_activate() an
	  thunar_location_entry_activate_finished(). Use
	  g_file_mount_enclosing_volume() to make sure the volume is mounted
	  before we switch to the new directory or launch the file. Remote
	  machine browsing, here we come!

Modified: thunar/branches/migration-to-gio/ChangeLog
===================================================================
--- thunar/branches/migration-to-gio/ChangeLog	2009-06-16 17:50:39 UTC (rev 30033)
+++ thunar/branches/migration-to-gio/ChangeLog	2009-06-16 17:50:46 UTC (rev 30034)
@@ -1,5 +1,15 @@
 2009-06-16	Jannis Pohlmann <jannis at xfce.org>
 
+	* thunar/thunar-location-entry.c: Split
+	  thunar_location_entry_activate() up into two functions,
+	  thunar_location_entry_activate() an
+	  thunar_location_entry_activate_finished(). Use
+	  g_file_mount_enclosing_volume() to make sure the volume is mounted
+	  before we switch to the new directory or launch the file. Remote
+	  machine browsing, here we come!
+
+2009-06-16	Jannis Pohlmann <jannis at xfce.org>
+
 	* thunar/thunar-file.c: In thunar_file_reload(), always reload the
 	  file first, before checking if it still exists and needs to be
 	  destroyed.

Modified: thunar/branches/migration-to-gio/thunar/thunar-location-entry.c
===================================================================
--- thunar/branches/migration-to-gio/thunar/thunar-location-entry.c	2009-06-16 17:50:39 UTC (rev 30033)
+++ thunar/branches/migration-to-gio/thunar/thunar-location-entry.c	2009-06-16 17:50:46 UTC (rev 30034)
@@ -400,11 +400,93 @@
 
 
 static void
+thunar_location_entry_activate_finish (GObject      *object,
+                                       GAsyncResult *result,
+                                       gpointer      user_data)
+{
+  ThunarLocationEntry *location_entry = THUNAR_LOCATION_ENTRY (user_data);
+  ThunarFile          *file;
+  GError              *error = NULL;
+
+  _thunar_return_if_fail (G_IS_FILE (object));
+  _thunar_return_if_fail (G_IS_ASYNC_RESULT (result));
+  _thunar_return_if_fail (THUNAR_IS_LOCATION_ENTRY (location_entry));
+
+  /* get the file the path entry currently refers to. We expect the file
+   * to be the same as the one the path entry had when we started this
+   * mount operation */
+  file = thunar_path_entry_get_current_file (THUNAR_PATH_ENTRY (location_entry->path_entry));
+
+  /* finish mounting the volume */
+  if (!g_file_mount_enclosing_volume_finish (G_FILE (object), result, &error))
+    {
+      /* ignore already mounted errors */
+      if (error->domain == G_IO_ERROR && error->code == G_IO_ERROR_ALREADY_MOUNTED)
+        g_clear_error (&error);
+    }
+
+  /* check if mounting succeeded */
+  if (error == NULL)
+    {
+      /* check if we have a current file at all */
+      if (file != NULL)
+        {
+          /* if the file is unknown we reload it, assuming that it was unknown due to
+           * its volume not being mounted before */
+          if (thunar_file_get_kind (file) == G_FILE_TYPE_UNKNOWN)
+            thunar_file_reload (file);
+
+          /* check if we have a new directory or a file to launch */
+          if (thunar_file_is_directory (file))
+            {
+              /* open the new directory */
+              thunar_navigator_change_directory (THUNAR_NAVIGATOR (location_entry), file);
+            }
+          else
+            {
+              /* try to launch the selected file */
+              thunar_file_launch (file, location_entry->path_entry, &error);
+
+              /* be sure to reset the current file of the path entry */
+              if (G_LIKELY (location_entry->current_directory != NULL))
+                {
+                  thunar_path_entry_set_current_file (THUNAR_PATH_ENTRY (location_entry->path_entry), 
+                                                      location_entry->current_directory);
+                }
+            }
+        }
+    }
+  else
+    {
+      /* check if we have a file at all */
+      if (file != NULL)
+        {
+          /* display an error explaining why we couldn't open/mount the file */
+          thunar_dialogs_show_error (location_entry->path_entry, 
+                                     error, _("Failed to launch \"%s\""), 
+                                     thunar_file_get_display_name (file));
+        }
+
+      /* free the error */
+      g_error_free (error);
+    }
+
+  /* release the reference on the location entry */
+  g_object_unref (location_entry);
+}
+
+
+
+
+
+static void
 thunar_location_entry_activate (GtkWidget           *path_entry,
                                 ThunarLocationEntry *location_entry)
 {
-  ThunarFile *file;
-  GError     *error = NULL;
+  GMountOperation *mount_operation;
+  ThunarFile      *file;
+  GtkWidget       *window;
+  GFile           *location;
 
   _thunar_return_if_fail (THUNAR_IS_LOCATION_ENTRY (location_entry));
   _thunar_return_if_fail (location_entry->path_entry == path_entry);
@@ -413,25 +495,24 @@
   file = thunar_path_entry_get_current_file (THUNAR_PATH_ENTRY (path_entry));
   if (G_LIKELY (file != NULL))
     {
-      /* check if we have a new directory or a file to launch */
-      if (thunar_file_is_directory (file))
-        {
-          /* open the new directory */
-          thunar_navigator_change_directory (THUNAR_NAVIGATOR (location_entry), file);
-        }
-      else
-        {
-          /* try to launch the selected file */
-          if (!thunar_file_launch (file, path_entry, &error))
-            {
-              thunar_dialogs_show_error (path_entry, error, _("Failed to launch \"%s\""), thunar_file_get_display_name (file));
-              g_error_free (error);
-            }
+      /* get the GFile of the file */
+      location = thunar_file_get_file (file);
+      
+      /* determine the toplevel window */
+      window = gtk_widget_get_toplevel (path_entry);
 
-          /* be sure to reset the current file of the path entry */
-          if (G_LIKELY (location_entry->current_directory != NULL))
-            thunar_path_entry_set_current_file (THUNAR_PATH_ENTRY (path_entry), location_entry->current_directory);
-        }
+      /* create a GTK+ mount operation */
+      mount_operation = gtk_mount_operation_new (GTK_WINDOW (window));
+
+      /* mount the volume enclosing the file asynchronously. Thunar will switch
+       * to the new directory or launch the activated file in the mount callback */
+      g_file_mount_enclosing_volume (location, G_MOUNT_MOUNT_NONE,
+                                     mount_operation, NULL, 
+                                     thunar_location_entry_activate_finish,
+                                     g_object_ref (location_entry));
+
+      /* we no longer need the mount operation */
+      g_object_unref (mount_operation);
     }
 }
 




More information about the Xfce4-commits mailing list