[Xfce4-commits] <thunar:jannis/new-shortcuts-pane> Initial work on the eject/unmount feature. Fix build error.
Jannis Pohlmann
noreply at xfce.org
Tue Jun 7 00:04:01 CEST 2011
Updating branch refs/heads/jannis/new-shortcuts-pane
to c5a0fcfde0cd36357d38595d9b9f8872b0f04d5a (commit)
from 681bf4b525b415b83c0c54751fd0aa58a50af8b3 (commit)
commit c5a0fcfde0cd36357d38595d9b9f8872b0f04d5a
Author: Jannis Pohlmann <jannis at xfce.org>
Date: Tue Jun 7 00:02:21 2011 +0200
Initial work on the eject/unmount feature. Fix build error.
This commit also enforces all rows in a category to have the same height
by configuring the expander VBox properly.
thunar/thunar-shortcut-row.c | 138 ++++++++++++++++++++++++++++++++++++++-
thunar/thunar-shortcuts-model.c | 4 +-
thunar/thunar-shortcuts-view.c | 2 +-
3 files changed, 139 insertions(+), 5 deletions(-)
diff --git a/thunar/thunar-shortcut-row.c b/thunar/thunar-shortcut-row.c
index 4395cc2..c46f57c 100644
--- a/thunar/thunar-shortcut-row.c
+++ b/thunar/thunar-shortcut-row.c
@@ -91,6 +91,12 @@ static void thunar_shortcut_row_button_state_changed (ThunarShortcutRow *row
GtkWidget *button);
static void thunar_shortcut_row_button_clicked (ThunarShortcutRow *row,
GtkButton *button);
+static void thunar_shortcut_row_mount_unmount_finish (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data);
+static void thunar_shortcut_row_mount_eject_finish (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data);
static void thunar_shortcut_row_poke_volume_finish (ThunarBrowser *browser,
GVolume *volume,
ThunarFile *file,
@@ -136,6 +142,8 @@ struct _ThunarShortcutRow
GtkWidget *action_image;
ThunarIconSize icon_size;
+
+ GCancellable *cancellable;
};
@@ -234,6 +242,9 @@ thunar_shortcut_row_init (ThunarShortcutRow *row)
GtkWidget *alignment;
GtkWidget *box;
+ /* create a cancellable for aborting mount/unmount operations */
+ row->cancellable = g_cancellable_new ();
+
/* configure general widget behavior */
gtk_widget_set_can_focus (GTK_WIDGET (row), TRUE);
gtk_widget_set_sensitive (GTK_WIDGET (row), TRUE);
@@ -323,6 +334,9 @@ thunar_shortcut_row_finalize (GObject *object)
if (row->volume != NULL)
g_object_unref (row->volume);
+ /* release the cancellable */
+ g_object_unref (row->cancellable);
+
/* release the preferences */
g_object_unref (row->preferences);
@@ -661,7 +675,123 @@ static void
thunar_shortcut_row_button_clicked (ThunarShortcutRow *row,
GtkButton *button)
{
- g_debug ("left click on the action button");
+ GMountOperation *mount_operation;
+ GtkWidget *toplevel;
+ GMount *mount;
+
+ _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
+
+ if (row->volume != NULL)
+ {
+ toplevel = gtk_widget_get_toplevel (GTK_WIDGET (row));
+ mount_operation = gtk_mount_operation_new (GTK_WINDOW (toplevel));
+ gtk_mount_operation_set_screen (GTK_MOUNT_OPERATION (mount_operation),
+ gtk_widget_get_screen (GTK_WIDGET (row)));
+
+
+ /* check if the volume is mounted */
+ mount = g_volume_get_mount (row->volume);
+ if (mount != NULL)
+ {
+ g_debug ("have mount");
+
+ /* check if we can unmount the mount */
+ if (FALSE && g_mount_can_unmount (mount))
+ {
+ g_debug (" trying to unmount the mount");
+
+ /* try unmounting the mount */
+ g_mount_unmount_with_operation (mount,
+ G_MOUNT_UNMOUNT_NONE,
+ mount_operation,
+ row->cancellable,
+ thunar_shortcut_row_mount_unmount_finish,
+ row);
+ }
+ else if (g_mount_can_eject (mount))
+ {
+ g_debug (" trying to eject the mount");
+
+ /* try ejecting the mount */
+ g_mount_eject_with_operation (mount,
+ G_MOUNT_UNMOUNT_NONE,
+ mount_operation,
+ row->cancellable,
+ thunar_shortcut_row_mount_eject_finish,
+ row);
+ }
+
+ g_object_unref (mount);
+ }
+ else if (g_volume_can_eject (row->volume))
+ {
+ /* TODO try ejecting the volume */
+ g_debug ("trying to eject the volume");
+ }
+ else
+ {
+ /* something is out of sync... */
+ g_debug ("the volume can not be ejected but it can be clicked. what?!");
+ }
+
+ /* release the mount operation */
+ g_object_unref (mount_operation);
+ }
+ else if (row->file != NULL)
+ {
+ }
+ else
+ {
+ _thunar_assert_not_reached ();
+ }
+}
+
+
+
+static void
+thunar_shortcut_row_mount_unmount_finish (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ ThunarShortcutRow *row = THUNAR_SHORTCUT_ROW (user_data);
+ GMount *mount = G_MOUNT (object);
+ GError *error = NULL;
+
+ _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
+ _thunar_return_if_fail (G_IS_MOUNT (mount));
+ _thunar_return_if_fail (G_IS_ASYNC_RESULT (result));
+
+ if (!g_mount_unmount_with_operation_finish (mount, result, &error))
+ {
+ thunar_dialogs_show_error (GTK_WIDGET (row), error,
+ _("Failed to eject \"%s\""),
+ row->label);
+ g_error_free (error);
+ }
+}
+
+
+
+static void
+thunar_shortcut_row_mount_eject_finish (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ ThunarShortcutRow *row = THUNAR_SHORTCUT_ROW (user_data);
+ GMount *mount = G_MOUNT (object);
+ GError *error = NULL;
+
+ _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
+ _thunar_return_if_fail (G_IS_MOUNT (mount));
+ _thunar_return_if_fail (G_IS_ASYNC_RESULT (result));
+
+ if (!g_mount_eject_with_operation_finish (mount, result, &error))
+ {
+ thunar_dialogs_show_error (GTK_WIDGET (row), error,
+ _("Failed to eject \"%s\""),
+ row->label);
+ g_error_free (error);
+ }
}
@@ -734,7 +864,7 @@ thunar_shortcut_row_resolve_and_activate (ThunarShortcutRow *row)
thunar_shortcut_row_poke_volume_finish,
NULL);
}
- else
+ else if (row->file != NULL)
{
file = thunar_file_get (row->file, NULL);
if (file != NULL)
@@ -757,6 +887,10 @@ thunar_shortcut_row_resolve_and_activate (ThunarShortcutRow *row)
g_error_free (error);
}
}
+ else
+ {
+ _thunar_assert_not_reached ();
+ }
}
diff --git a/thunar/thunar-shortcuts-model.c b/thunar/thunar-shortcuts-model.c
index 1021d8d..3b6ad57 100644
--- a/thunar/thunar-shortcuts-model.c
+++ b/thunar/thunar-shortcuts-model.c
@@ -348,7 +348,9 @@ thunar_shortcuts_model_get_iter (GtkTreeModel *tree_model,
if (!thunar_shortcuts_model_parse_path (model, path, &category_index, &shortcut_index))
return FALSE;
+#ifndef NDEBUG
(*iter).stamp = model->stamp;
+#endif
(*iter).user_data = GINT_TO_POINTER (category_index);
(*iter).user_data2 = GINT_TO_POINTER (shortcut_index);
@@ -1074,8 +1076,6 @@ thunar_shortcuts_model_load_volumes (gpointer user_data)
/* create shortcuts for the volumes */
for (lp = volumes; lp != NULL; lp = lp->next)
{
- g_debug ("volume: %s", g_volume_get_name (lp->data));
-
/* create the shortcut */
shortcut = g_slice_new0 (ThunarShortcut);
shortcut->volume = lp->data;
diff --git a/thunar/thunar-shortcuts-view.c b/thunar/thunar-shortcuts-view.c
index 9d79822..b8a4c7f 100644
--- a/thunar/thunar-shortcuts-view.c
+++ b/thunar/thunar-shortcuts-view.c
@@ -255,7 +255,7 @@ thunar_shortcuts_view_constructed (GObject *object)
gtk_widget_show (expander);
/* create a box for the shortcuts of the category */
- box = gtk_vbox_new (FALSE, 0);
+ box = gtk_vbox_new (TRUE, 0);
gtk_container_add (GTK_CONTAINER (expander), box);
gtk_widget_show (box);
}
More information about the Xfce4-commits
mailing list