Author: jannis Date: 2009-06-17 17:57:37 +0000 (Wed, 17 Jun 2009) New Revision: 30042
Modified: thunar/branches/migration-to-gio/ChangeLog thunar/branches/migration-to-gio/thunar/thunar-location-entry.c Log: * thunar/thunar-location-entry.c: Check if files are mounted before mounting their volumes asynchronously. If they are, just open them directly. Rework the code a bit, add a new private method thunar_location_entry_open_or_launch(). Modified: thunar/branches/migration-to-gio/ChangeLog =================================================================== --- thunar/branches/migration-to-gio/ChangeLog 2009-06-17 17:57:30 UTC (rev 30041) +++ thunar/branches/migration-to-gio/ChangeLog 2009-06-17 17:57:37 UTC (rev 30042) @@ -1,5 +1,12 @@ 2009-06-17 Jannis Pohlmann <jan...@xfce.org> + * thunar/thunar-location-entry.c: Check if files are mounted before + mounting their volumes asynchronously. If they are, just open them + directly. Rework the code a bit, add a new private method + thunar_location_entry_open_or_launch(). + +2009-06-17 Jannis Pohlmann <jan...@xfce.org> + * thunar/thunar-file.{c,h}: Add new boolean is_mounted member to ThunarFile. It is FALSE iff the GFileInfo of the file couldn't be loaded due to G_IO_ERROR_NO_MOUNTED. Return TRUE from Modified: thunar/branches/migration-to-gio/thunar/thunar-location-entry.c =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-location-entry.c 2009-06-17 17:57:30 UTC (rev 30041) +++ thunar/branches/migration-to-gio/thunar/thunar-location-entry.c 2009-06-17 17:57:37 UTC (rev 30042) @@ -36,6 +36,10 @@ +typedef struct _ActivateData ActivateData; + + + /* Property identifiers */ enum { @@ -99,8 +103,14 @@ GtkWidget *path_entry; }; +struct _ActivateData +{ + ThunarLocationEntry *location_entry; + ThunarFile *file; +}; + static GObjectClass *thunar_location_entry_parent_class; @@ -400,79 +410,106 @@ static void +thunar_location_entry_open_or_launch (ThunarLocationEntry *location_entry, + ThunarFile *file) +{ + GError *error = NULL; + + _thunar_return_if_fail (THUNAR_IS_LOCATION_ENTRY (location_entry)); + _thunar_return_if_fail (THUNAR_IS_FILE (file)); + + /* check if the file is mounted */ + if (thunar_file_is_mounted (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 + { + g_set_error (&error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("File does not exist")); + } + + /* check if we need to display an error dialog */ + if (error != NULL) + { + thunar_dialogs_show_error (location_entry->path_entry, error, + _("Failed to open \"%s\""), + thunar_file_get_display_name (file)); + g_error_free (error); + } +} + + + +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; + ActivateData *data = user_data; + 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)); + _thunar_return_if_fail (data != NULL); + _thunar_return_if_fail (THUNAR_IS_LOCATION_ENTRY (data->location_entry)); + _thunar_return_if_fail (THUNAR_IS_FILE (data->file)); - /* 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); + if (error->domain == G_IO_ERROR) + { + /* ignore already mounted and unsupported errors */ + if (error->code == G_IO_ERROR_ALREADY_MOUNTED + || error->code == G_IO_ERROR_NOT_SUPPORTED) + { + 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); + /* reload the file if it wasn't mounted before */ + if (!thunar_file_is_mounted (data->file)) + thunar_file_reload (data->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); - } - } - } + /* we then try to open or launch it */ + thunar_location_entry_open_or_launch (data->location_entry, data->file); } 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)); - } + /* display an error explaining why we couldn't open/mount the file */ + thunar_dialogs_show_error (data->location_entry->path_entry, + error, _("Failed to open \"%s\""), + thunar_file_get_display_name (data->file)); /* free the error */ g_error_free (error); } - /* release the reference on the location entry */ - g_object_unref (location_entry); + /* destroy the activate data */ + g_object_unref (data->file); + g_object_unref (data->location_entry); + _thunar_slice_free (ActivateData, data); } @@ -484,6 +521,7 @@ ThunarLocationEntry *location_entry) { GMountOperation *mount_operation; + ActivateData *data; ThunarFile *file; GtkWidget *window; GFile *location; @@ -495,24 +533,38 @@ file = thunar_path_entry_get_current_file (THUNAR_PATH_ENTRY (path_entry)); if (G_LIKELY (file != NULL)) { - /* get the GFile of the file */ - location = thunar_file_get_file (file); - - /* determine the toplevel window */ - window = gtk_widget_get_toplevel (path_entry); + /* check if the file is mounted */ + if (thunar_file_is_mounted (file)) + { + /* it is, we don't need to mount its volume first */ + thunar_location_entry_open_or_launch (location_entry, file); + } + else + { + /* get the GFile of the file */ + location = thunar_file_get_file (file); + + /* determine the toplevel window */ + window = gtk_widget_get_toplevel (path_entry); - /* create a GTK+ mount operation */ - mount_operation = gtk_mount_operation_new (GTK_WINDOW (window)); + /* allocate a new activate data struct */ + data = _thunar_slice_new0 (ActivateData); + data->file = g_object_ref (file); + data->location_entry = g_object_ref (location_entry); - /* 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)); + /* create a GTK+ mount operation */ + mount_operation = gtk_mount_operation_new (GTK_WINDOW (window)); - /* we no longer need the mount operation */ - g_object_unref (mount_operation); + /* 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, + data); + + /* we no longer need the mount operation */ + g_object_unref (mount_operation); + } } } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits