Author: jannis Date: 2009-06-19 15:34:16 +0000 (Fri, 19 Jun 2009) New Revision: 30049
Modified: thunar/branches/migration-to-gio/ChangeLog thunar/branches/migration-to-gio/thunar/thunar-shortcuts-view.c Log: * thunar/thunar-shortcuts-view.c: Dramatically simplify the way directories and volumes are mounted and opened by deriving from ThunarBrowser and calling thunar_browser_poke_file() and thunar_browser_poke_volume() to resolve directories and volumes before opening them. Modified: thunar/branches/migration-to-gio/ChangeLog =================================================================== --- thunar/branches/migration-to-gio/ChangeLog 2009-06-19 15:34:11 UTC (rev 30048) +++ thunar/branches/migration-to-gio/ChangeLog 2009-06-19 15:34:16 UTC (rev 30049) @@ -1,5 +1,13 @@ 2009-06-19 Jannis Pohlmann <jan...@xfce.org> + * thunar/thunar-shortcuts-view.c: Dramatically simplify the way + directories and volumes are mounted and opened by deriving from + ThunarBrowser and calling thunar_browser_poke_file() and + thunar_browser_poke_volume() to resolve directories and volumes + before opening them. + +2009-06-19 Jannis Pohlmann <jan...@xfce.org> + * thunar/thunar-browser.{c,h}: Add a new interface with two convenience functions for browsing (possibly not yet mounted or resolved) volumes and files. thunar_browser_poke_file() can be used Modified: thunar/branches/migration-to-gio/thunar/thunar-shortcuts-view.c =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-shortcuts-view.c 2009-06-19 15:34:11 UTC (rev 30048) +++ thunar/branches/migration-to-gio/thunar/thunar-shortcuts-view.c 2009-06-19 15:34:16 UTC (rev 30049) @@ -33,6 +33,7 @@ #endif #include <thunar/thunar-application.h> +#include <thunar/thunar-browser.h> #include <thunar/thunar-dialogs.h> #include <thunar/thunar-dnd.h> #include <thunar/thunar-gio-extensions.h> @@ -45,10 +46,6 @@ -typedef struct _MountData MountData; - - - /* Identifiers for signals */ enum { @@ -65,8 +62,6 @@ -static void thunar_shortcuts_view_class_init (ThunarShortcutsViewClass *klass); -static void thunar_shortcuts_view_init (ThunarShortcutsView *view); static void thunar_shortcuts_view_finalize (GObject *object); static gboolean thunar_shortcuts_view_button_press_event (GtkWidget *widget, GdkEventButton *event); @@ -125,12 +120,11 @@ GtkTreePath *dst_path); static void thunar_shortcuts_view_open_clicked (ThunarShortcutsView *view); static void thunar_shortcuts_view_open (ThunarShortcutsView *view, - gboolean new_window, - gboolean mount_only); + gboolean new_window); static void thunar_shortcuts_view_open_in_new_window_clicked (ThunarShortcutsView *view); static void thunar_shortcuts_view_empty_trash (ThunarShortcutsView *view); static void thunar_shortcuts_view_eject (ThunarShortcutsView *view); -static void thunar_shortcuts_view_mount_clicked (ThunarShortcutsView *view); +static void thunar_shortcuts_view_mount (ThunarShortcutsView *view); static gboolean thunar_shortcuts_view_separator_func (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data); @@ -167,17 +161,8 @@ gint queue_resize_signal_id; }; -struct _MountData -{ - ThunarShortcutsView *view; - ThunarFile *file; - GVolume *volume; - guint new_window : 1; - guint mount_only : 1; -}; - /* Target types for dragging from the shortcuts view */ static const GtkTargetEntry drag_targets[] = { { "GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_WIDGET, GTK_TREE_MODEL_ROW }, @@ -191,40 +176,15 @@ -static GObjectClass *thunar_shortcuts_view_parent_class; -static guint view_signals[LAST_SIGNAL]; +static guint view_signals[LAST_SIGNAL]; -GType -thunar_shortcuts_view_get_type (void) -{ - static GType type = G_TYPE_INVALID; +G_DEFINE_TYPE_WITH_CODE (ThunarShortcutsView, thunar_shortcuts_view, GTK_TYPE_TREE_VIEW, + G_IMPLEMENT_INTERFACE (THUNAR_TYPE_BROWSER, NULL)); - if (G_UNLIKELY (type == G_TYPE_INVALID)) - { - static const GTypeInfo info = - { - sizeof (ThunarShortcutsViewClass), - NULL, - NULL, - (GClassInitFunc) thunar_shortcuts_view_class_init, - NULL, - NULL, - sizeof (ThunarShortcutsView), - 0, - (GInstanceInitFunc) thunar_shortcuts_view_init, - NULL, - }; - type = g_type_register_static (GTK_TYPE_TREE_VIEW, I_("ThunarShortcutsView"), &info, 0); - } - return type; -} - - - static void thunar_shortcuts_view_class_init (ThunarShortcutsViewClass *klass) { @@ -232,9 +192,6 @@ GtkWidgetClass *gtkwidget_class; GObjectClass *gobject_class; - /* determine the parent type class */ - thunar_shortcuts_view_parent_class = g_type_class_peek_parent (klass); - gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = thunar_shortcuts_view_finalize; @@ -428,9 +385,9 @@ { /* check if we should simply open or open in new window */ if (G_LIKELY (event->button == 1)) - thunar_shortcuts_view_open (view, FALSE, FALSE); + thunar_shortcuts_view_open (view, FALSE); else if (G_UNLIKELY (event->button == 2)) - thunar_shortcuts_view_open (view, TRUE, FALSE); + thunar_shortcuts_view_open (view, TRUE); } /* reset the pressed button state */ @@ -787,7 +744,7 @@ (*GTK_TREE_VIEW_CLASS (thunar_shortcuts_view_parent_class)->row_activated) (tree_view, path, column); /* open the selected shortcut */ - thunar_shortcuts_view_open (view, FALSE, FALSE); + thunar_shortcuts_view_open (view, FALSE); } @@ -852,7 +809,7 @@ /* append the "Mount Volume" menu action */ item = gtk_image_menu_item_new_with_mnemonic (_("_Mount Volume")); gtk_widget_set_sensitive (item, !g_volume_is_mounted (volume)); - g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_mount_clicked), view); + g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_mount), view); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show (item); @@ -1240,307 +1197,87 @@ thunar_shortcuts_view_open_clicked (ThunarShortcutsView *view) { _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view)); - thunar_shortcuts_view_open (view, FALSE, FALSE); + thunar_shortcuts_view_open (view, FALSE); } static void -thunar_shortcuts_view_mount_data_free (MountData *data) +thunar_shortcuts_view_poke_file_finish (ThunarBrowser *browser, + ThunarFile *file, + ThunarFile *target_file, + GError *error, + gpointer user_data) { - _thunar_return_if_fail (data != NULL); - _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (data->view)); - - g_object_unref (data->view); - - if (data->file != NULL) - g_object_unref (data->file); - - if (data->volume != NULL) - g_object_unref (data->volume); - - _thunar_slice_free (MountData, data); -} - - - -static void -thunar_shortcuts_view_open_real (MountData *data) -{ ThunarApplication *application; - GError *error = NULL; + gboolean new_window = GPOINTER_TO_UINT (user_data); - _thunar_return_if_fail (data != NULL); - _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (data->view)); - _thunar_return_if_fail (THUNAR_IS_FILE (data->file)); + _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (browser)); + _thunar_return_if_fail (THUNAR_IS_FILE (file)); - if (thunar_file_is_mounted (data->file)) + if (error == NULL) { - if (data->new_window) + if (new_window) { - /* open a new window for the shortcut target folder */ + /* open a new window for the target folder */ application = thunar_application_get (); - thunar_application_open_window (application, data->file, - gtk_widget_get_screen (GTK_WIDGET (data->view))); + thunar_application_open_window (application, target_file, + gtk_widget_get_screen (GTK_WIDGET (browser))); g_object_unref (application); } else { /* invoke the signal to change to that folder */ - g_signal_emit (data->view, view_signals[SHORTCUT_ACTIVATED], 0, data->file); + g_signal_emit (browser, view_signals[SHORTCUT_ACTIVATED], 0, target_file); } } else { - g_set_error (&error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED, _("Mounting failed")); - thunar_dialogs_show_error (data->view, error, _("Failed to open \"%s\""), - thunar_file_get_display_name (data->file)); - g_error_free (error); + thunar_dialogs_show_error (GTK_WIDGET (browser), error, _("Failed to open \"%s\""), + thunar_file_get_display_name (file)); } } static void -thunar_shortcuts_view_open_async_finish (GObject *object, - GAsyncResult *result, - gpointer user_data) +thunar_shortcuts_view_poke_volume_finish (ThunarBrowser *browser, + GVolume *volume, + ThunarFile *mount_point, + GError *error, + gpointer user_data) { - MountData *data = user_data; - GError *error = NULL; + gboolean new_window = GPOINTER_TO_UINT (user_data); + gchar *volume_name; - _thunar_return_if_fail (G_IS_FILE (object)); - _thunar_return_if_fail (G_IS_ASYNC_RESULT (result)); - _thunar_return_if_fail (data != NULL); - _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (data->view)); - _thunar_return_if_fail (THUNAR_IS_FILE (data->file)); + _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (browser)); + _thunar_return_if_fail (G_IS_VOLUME (volume)); - /* finish mounting the volume */ - if (!g_file_mount_enclosing_volume_finish (G_FILE (object), result, &error)) - { - if (error->domain == G_IO_ERROR) - { - /* ignore already mounted and not supported 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) { - /* reload the file if it couldn't be loaded before */ - if (!thunar_file_is_mounted (data->file)) - thunar_file_reload (data->file); - - /* now try to open the file */ - thunar_shortcuts_view_open_real (data); + thunar_browser_poke_file (browser, mount_point, GTK_WIDGET (browser), + thunar_shortcuts_view_poke_file_finish, + GUINT_TO_POINTER (new_window)); } else { - /* show the error dialog */ - thunar_dialogs_show_error (data->view, error, _("Failed to open \"%s\""), - thunar_file_get_display_name (data->file)); - - /* free the error */ - g_error_free (error); - } - - /* free the mount data struct */ - thunar_shortcuts_view_mount_data_free (data); -} - - - -static void -thunar_shortcuts_view_open_async (MountData *data) -{ - GMountOperation *mount_operation; - GtkWidget *window; - GFile *location; - - _thunar_return_if_fail (data != NULL); - _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (data->view)); - _thunar_return_if_fail (THUNAR_IS_FILE (data->file)); - - /* check if the file is mounted */ - if (thunar_file_is_mounted (data->file)) - { - /* it is, open it now */ - thunar_shortcuts_view_open_real (data); - - /* destroy the mount data */ - thunar_shortcuts_view_mount_data_free (data); - } - else - { - /* it is not, determine its location */ - location = thunar_file_get_file (data->file); - - /* allocate a GTK+ mount operation */ - window = gtk_widget_get_toplevel (GTK_WIDGET (data->view)); - mount_operation = gtk_mount_operation_new (GTK_WINDOW (window)); - - /* mount the enclosing volume and open the file in the callback */ - g_file_mount_enclosing_volume (location, G_MOUNT_MOUNT_NONE, - mount_operation, NULL, - thunar_shortcuts_view_open_async_finish, - data); - - /* release the mount operation */ - g_object_unref (mount_operation); - } -} - - - -static void -thunar_shortcuts_view_mount_async_finish (GObject *object, - GAsyncResult *result, - gpointer user_data) -{ - MountData *data = user_data; - ThunarFile *file; - GError *error = NULL; - GMount *mount; - GFile *location; - gchar *volume_name; - - _thunar_return_if_fail (G_IS_VOLUME (object)); - _thunar_return_if_fail (G_IS_ASYNC_RESULT (result)); - _thunar_return_if_fail (data != NULL); - _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (data->view)); - _thunar_return_if_fail (G_IS_VOLUME (data->volume)); - - /* check if there was an error */ - if (!g_volume_mount_finish (G_VOLUME (object), result, &error)) - { - if (error->domain == G_IO_ERROR) - { - /* ignore already handled and pending mount errors */ - if (error->code == G_IO_ERROR_FAILED_HANDLED - || error->code == G_IO_ERROR_ALREADY_MOUNTED - || error->code == G_IO_ERROR_PENDING) - { - g_clear_error (&error); - } - } - } - - if (error == NULL) - { - if (data->mount_only) - return; - - mount = g_volume_get_mount (data->volume); - - /* mounting succeeded, so if the mount still doesn't exist, that's a bug */ - _thunar_assert (G_IS_MOUNT (mount)); - - location = g_mount_get_root (mount); - file = thunar_file_get (location, NULL); - - /* mounting succeeded, so we should be able to load a file for the mount point */ - _thunar_assert (THUNAR_IS_FILE (file)); - - g_object_ref (location); - g_object_unref (mount); - - if (!thunar_file_is_mounted (file)) - thunar_file_reload (file); - - g_object_unref (data->volume); - data->volume = NULL; - data->file = file; - - thunar_shortcuts_view_open_real (data); - } - - if (error != NULL) - { - /* display an error dialog to inform the user */ - volume_name = g_volume_get_name (data->volume); - thunar_dialogs_show_error (data->view, error, _("Failed to mount \"%s\""), - volume_name); + volume_name = g_volume_get_name (volume); + thunar_dialogs_show_error (GTK_WIDGET (browser), error, + _("Failed to mount \"%s\""), volume_name); g_free (volume_name); - - /* free the error */ - g_error_free (error); } - - /* free the mount data struct */ - thunar_shortcuts_view_mount_data_free (data); } static void -thunar_shortcuts_view_mount_async (MountData *data) -{ - GMountOperation *mount_operation; - ThunarFile *file; - GtkWidget *window; - GMount *mount; - GFile *location; - - _thunar_return_if_fail (data != NULL); - _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (data->view)); - _thunar_return_if_fail (G_IS_VOLUME (data->volume)); - - if (g_volume_is_mounted (data->volume)) - { - if (data->mount_only) - return; - - mount = g_volume_get_mount (data->volume); - - _thunar_assert (G_IS_MOUNT (mount)); - - location = g_mount_get_root (mount); - file = thunar_file_get (location, NULL); - - _thunar_assert (THUNAR_IS_FILE (file)); - - g_object_unref (data->volume); - data->volume = NULL; - data->file = file; - - thunar_shortcuts_view_open_real (data); - - g_object_unref (location); - g_object_unref (mount); - - thunar_shortcuts_view_mount_data_free (data); - } - else - { - window = gtk_widget_get_toplevel (GTK_WIDGET (data->view)); - mount_operation = gtk_mount_operation_new (GTK_WINDOW (window)); - - g_volume_mount (data->volume, G_MOUNT_MOUNT_NONE, - mount_operation, NULL, - thunar_shortcuts_view_mount_async_finish, - data); - - g_object_unref (mount_operation); - } -} - - - -static void thunar_shortcuts_view_open (ThunarShortcutsView *view, - gboolean new_window, - gboolean mount_only) + gboolean new_window) { GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; ThunarFile *file; - MountData *mount_data; GVolume *volume; _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view)); @@ -1562,32 +1299,22 @@ if (G_LIKELY (volume != NULL)) { - mount_data = _thunar_slice_new0 (MountData); - mount_data->view = g_object_ref (view); - mount_data->new_window = new_window; - mount_data->mount_only = mount_only; - mount_data->volume = volume; - mount_data->file = NULL; - - thunar_shortcuts_view_mount_async (mount_data); - - if (file != NULL) - g_object_unref (file); + thunar_browser_poke_volume (THUNAR_BROWSER (view), volume, view, + thunar_shortcuts_view_poke_volume_finish, + GUINT_TO_POINTER (new_window)); } else if (file != NULL) { - mount_data = _thunar_slice_new0 (MountData); - mount_data->view = g_object_ref (view); - mount_data->new_window = new_window; - mount_data->mount_only = mount_only; - mount_data->file = file; - mount_data->volume = NULL; + thunar_browser_poke_file (THUNAR_BROWSER (view), file, view, + thunar_shortcuts_view_poke_file_finish, + GUINT_TO_POINTER (new_window)); + } - thunar_shortcuts_view_open_async (mount_data); + if (file != NULL) + g_object_unref (file); - if (volume != NULL) - g_object_unref (volume); - } + if (volume != NULL) + g_object_unref (volume); } } @@ -1597,7 +1324,7 @@ thunar_shortcuts_view_open_in_new_window_clicked (ThunarShortcutsView *view) { _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view)); - thunar_shortcuts_view_open (view, TRUE, FALSE); + thunar_shortcuts_view_open (view, TRUE); } @@ -1743,10 +1470,61 @@ static void -thunar_shortcuts_view_mount_clicked (ThunarShortcutsView *view) +thunar_shortcuts_view_poke_volume_mount_finish (ThunarBrowser *browser, + GVolume *volume, + ThunarFile *mount_point, + GError *error, + gpointer ignored) { + gchar *volume_name; + + _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (browser)); + _thunar_return_if_fail (G_IS_VOLUME (volume)); + + if (error != NULL) + { + volume_name = g_volume_get_name (volume); + thunar_dialogs_show_error (GTK_WIDGET (browser), error, + _("Failed to mount \"%s\""), volume_name); + g_free (volume_name); + } +} + + + + +static void +thunar_shortcuts_view_mount (ThunarShortcutsView *view) +{ + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + GVolume *volume; + _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view)); - thunar_shortcuts_view_open (view, FALSE, TRUE); + + /* determine the selected item */ + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + + /* avoid dealing with invalid selections */ + if (!GTK_IS_TREE_SELECTION (selection)) + return; + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) + { + /* determine the file for the shortcut at the given tree iterator */ + gtk_tree_model_get (model, &iter, + THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME, &volume, + -1); + + if (G_LIKELY (volume != NULL)) + { + thunar_browser_poke_volume (THUNAR_BROWSER (view), volume, view, + thunar_shortcuts_view_poke_volume_mount_finish, + NULL); + g_object_unref (volume); + } + } } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits