[Xfce4-commits] <thunar:jannis/new-shortcuts-pane> Further work on mount/unmonut/disconnect context menu actions.

Jannis Pohlmann noreply at xfce.org
Fri Jul 15 21:10:40 CEST 2011


Updating branch refs/heads/jannis/new-shortcuts-pane
         to 1a525b93f6564443c3170eac256601f7f1e984b3 (commit)
       from 0b1a3bac5d4573cd9dd2701b18615ac478e2779f (commit)

commit 1a525b93f6564443c3170eac256601f7f1e984b3
Author: Jannis Pohlmann <jannis at xfce.org>
Date:   Mon Jun 13 00:07:03 2011 +0200

    Further work on mount/unmonut/disconnect context menu actions.

 thunar/thunar-shortcut-row.c   |  323 +++++++++++++++++++++++-----------------
 thunar/thunar-shortcut-row.h   |    4 +-
 thunar/thunar-shortcuts-view.c |   49 ++++++-
 3 files changed, 233 insertions(+), 143 deletions(-)

diff --git a/thunar/thunar-shortcut-row.c b/thunar/thunar-shortcut-row.c
index 504d861..ae98671 100644
--- a/thunar/thunar-shortcut-row.c
+++ b/thunar/thunar-shortcut-row.c
@@ -873,10 +873,6 @@ static void
 thunar_shortcut_row_button_clicked (ThunarShortcutRow *row,
                                     GtkButton         *button)
 {
-  GMountOperation *mount_operation;
-  GtkWidget       *toplevel;
-  GMount          *mount;
-
   _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
 
   /* check if we are currently mounting/ejecting something */
@@ -889,109 +885,8 @@ thunar_shortcut_row_button_clicked (ThunarShortcutRow *row,
       return;
     }
 
-  /* create a mount operation */
-  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)));
-
-  if (row->shortcut_type == THUNAR_SHORTCUT_STANDALONE_MOUNT)
-    {
-      /* if this fails there is something out of sync with the model */
-      g_assert (row->mount != NULL);
-
-      if (g_mount_can_unmount (row->mount))
-        {
-          /* start spinning */
-          thunar_shortcut_row_set_spinning (row, TRUE, THUNAR_SHORTCUT_ROW_EJECTING);
-
-          /* try unmounting the mount */
-          g_mount_unmount_with_operation (row->mount,
-                                          G_MOUNT_UNMOUNT_NONE,
-                                          mount_operation,
-                                          row->cancellable,
-                                          thunar_shortcut_row_mount_unmount_finish,
-                                          row);
-        }
-      else if (g_mount_can_eject (row->mount))
-        {
-          g_debug ("need to eject the mount");
-
-          /* start spinning */
-          thunar_shortcut_row_set_spinning (row, TRUE, THUNAR_SHORTCUT_ROW_EJECTING);
-
-          /* try ejecting the mount */
-          g_mount_eject_with_operation (row->mount,
-                                        G_MOUNT_UNMOUNT_NONE,
-                                        mount_operation,
-                                        row->cancellable,
-                                        thunar_shortcut_row_mount_eject_finish,
-                                        row);
-        }
-      else
-        {
-          /* something is out of sync... */
-        }
-    }
-  else if (row->shortcut_type == THUNAR_SHORTCUT_REGULAR_VOLUME
-           || row->shortcut_type == THUNAR_SHORTCUT_EJECTABLE_VOLUME)
-    {
-      /* if this fails there is something out of sync with the model */
-      g_assert (row->volume != NULL);
-
-      /* 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 (g_mount_can_unmount (mount))
-            {
-              g_debug ("  trying to unmount the mount");
-
-              /* start spinning */
-              thunar_shortcut_row_set_spinning (row, TRUE, THUNAR_SHORTCUT_ROW_EJECTING);
-
-              /* 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");
-
-              /* start spinning */
-              thunar_shortcut_row_set_spinning (row, TRUE, THUNAR_SHORTCUT_ROW_EJECTING);
-
-              /* 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... */
-        }
-    }
-
-  /* release the mount operation */
-  g_object_unref (mount_operation);
+  /* disconnect the shortcut */
+  thunar_shortcut_row_disconnect (row);
 }
 
 
@@ -1122,6 +1017,14 @@ thunar_shortcut_row_resolve_and_activate (ThunarShortcutRow *row,
 
   _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
 
+  /* check if we are currently mounting/ejecting something */
+  if (row->state != THUNAR_SHORTCUT_ROW_NORMAL)
+    {
+      /* abort the current mount/eject process */
+      g_cancellable_cancel (row->cancellable);
+      g_cancellable_reset (row->cancellable);
+    }
+
   if (row->volume != NULL)
     {
       /* activate the spinner */
@@ -1666,21 +1569,110 @@ thunar_shortcut_row_set_icon_size (ThunarShortcutRow *row,
 
 
 void
-thunar_shortcut_row_disconnect_mount (ThunarShortcutRow *row)
+thunar_shortcut_row_mount (ThunarShortcutRow *row)
+{
+  _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
+
+  thunar_shortcut_row_resolve_and_activate (row, FALSE);
+}
+
+
+
+void
+thunar_shortcut_row_unmount (ThunarShortcutRow *row)
 {
   GMountOperation *mount_operation;
   GtkWidget       *toplevel;
+  GMount          *mount;
 
   _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
-  _thunar_return_if_fail (row->shortcut_type == THUNAR_SHORTCUT_STANDALONE_MOUNT);
 
-  if (row->shortcut_type != THUNAR_SHORTCUT_STANDALONE_MOUNT)
-    return;
+  /* check if we are currently mounting/ejecting something */
+  if (row->state != THUNAR_SHORTCUT_ROW_NORMAL)
+    {
+      /* abort the current mount/eject process */
+      g_cancellable_cancel (row->cancellable);
+      g_cancellable_reset (row->cancellable);
+    }
 
-  if (row->mount == NULL)
+  /* create a mount operation */
+  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)));
+
+  if (row->mount != NULL)
     {
-      /* something is out of sync */
-      return;
+      /* only handle mounts that can be unmounted here */
+      if (g_mount_can_unmount (row->mount))
+        {
+          /* start spinning */
+          thunar_shortcut_row_set_spinning (row, TRUE, THUNAR_SHORTCUT_ROW_EJECTING);
+
+          /* try unmounting the mount */
+          g_mount_unmount_with_operation (row->mount,
+                                          G_MOUNT_UNMOUNT_NONE,
+                                          mount_operation,
+                                          row->cancellable,
+                                          thunar_shortcut_row_mount_unmount_finish,
+                                          row);
+        }
+    }
+  else if (row->volume != NULL)
+    {
+      mount = g_volume_get_mount (row->volume);
+      if (mount != NULL)
+        {
+          g_debug ("have mount");
+          /* only handle mounts that can be unmounted here */
+          if (g_mount_can_unmount(mount))
+            {
+              g_debug ("can unmount");
+              /* start spinning */
+              thunar_shortcut_row_set_spinning (row, TRUE, 
+                                                THUNAR_SHORTCUT_ROW_EJECTING);
+
+              /* 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);
+            }
+
+          /* release the mount */
+          g_object_unref (mount);
+        }
+      
+    }
+  else
+    {
+      /* this method was called despite no mount or volume being available
+       * for this shortcut... that should not happen */
+    }
+
+  /* release the mount operation */
+  g_object_unref (mount_operation);
+}
+
+
+
+void
+thunar_shortcut_row_disconnect (ThunarShortcutRow *row)
+{
+  GMountOperation *mount_operation;
+  GtkWidget       *toplevel;
+  GMount          *mount;
+
+  _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
+
+  /* check if we are currently mounting/ejecting something */
+  if (row->state != THUNAR_SHORTCUT_ROW_NORMAL)
+    {
+      /* abort the current mount/eject process */
+      g_cancellable_cancel (row->cancellable);
+      g_cancellable_reset (row->cancellable);
     }
 
   /* create a mount operation */
@@ -1689,36 +1681,91 @@ thunar_shortcut_row_disconnect_mount (ThunarShortcutRow *row)
   gtk_mount_operation_set_screen (GTK_MOUNT_OPERATION (mount_operation),
                                   gtk_widget_get_screen (GTK_WIDGET (row)));
 
-  /* distinguish between mountable and ejectable mounts */
-  if (g_mount_can_unmount (row->mount))
+  if (row->mount != NULL)
     {
-      /* start spinning */
-      thunar_shortcut_row_set_spinning (row, TRUE, THUNAR_SHORTCUT_ROW_EJECTING);
-
-      /* try unmounting the mount */
-      g_mount_unmount_with_operation (row->mount,
-                                      G_MOUNT_UNMOUNT_NONE,
-                                      mount_operation,
-                                      row->cancellable,
-                                      thunar_shortcut_row_mount_unmount_finish,
-                                      row);
+      /* distinguish between ejectable and unmountable mounts */
+      if (g_mount_can_eject (row->mount))
+        {
+          /* start spinning */
+          thunar_shortcut_row_set_spinning (row, TRUE, THUNAR_SHORTCUT_ROW_EJECTING);
+
+          /* try ejecting the mount */
+          g_mount_eject_with_operation (row->mount,
+                                        G_MOUNT_UNMOUNT_NONE,
+                                        mount_operation,
+                                        row->cancellable,
+                                        thunar_shortcut_row_mount_eject_finish,
+                                        row);
+        }
+      else if (g_mount_can_unmount (row->mount))
+        {
+          /* start spinning */
+          thunar_shortcut_row_set_spinning (row, TRUE, THUNAR_SHORTCUT_ROW_EJECTING);
+
+          /* try unmounting the mount */
+          g_mount_unmount_with_operation (row->mount,
+                                          G_MOUNT_UNMOUNT_NONE,
+                                          mount_operation,
+                                          row->cancellable,
+                                          thunar_shortcut_row_mount_unmount_finish,
+                                          row);
+        }
+      else
+        {
+          /* something is out of sync... */
+        }
     }
-  else if (g_mount_can_eject (row->mount))
+  else if (row->volume != NULL)
     {
-      /* start spinning */
-      thunar_shortcut_row_set_spinning (row, TRUE, THUNAR_SHORTCUT_ROW_EJECTING);
-
-      /* try ejecting the mount */
-      g_mount_eject_with_operation (row->mount,
-                                    G_MOUNT_UNMOUNT_NONE,
-                                    mount_operation,
-                                    row->cancellable,
-                                    thunar_shortcut_row_mount_eject_finish,
-                                    row);
+      if (g_volume_can_eject (row->volume))
+        {
+          /* try to eject the volume */
+          g_debug ("trying to eject the volume");
+        }
+      else
+        {
+          mount = g_volume_get_mount (row->volume);
+          if (mount != NULL)
+            {
+              /* distinguish between ejectable and unmountable mounts */
+              if (g_mount_can_eject (mount))
+                {
+                  /* start spinning */
+                  thunar_shortcut_row_set_spinning (row, TRUE, 
+                                                    THUNAR_SHORTCUT_ROW_EJECTING);
+
+                  /* 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_unmount (mount))
+                {
+                  /* start spinning */
+                  thunar_shortcut_row_set_spinning (row, TRUE, 
+                                                    THUNAR_SHORTCUT_ROW_EJECTING);
+
+                  /* 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);
+                }
+
+              /* release the mount */
+              g_object_unref (mount);
+            }
+        }
     }
   else
     {
-      /* something is out of sync... */
+      /* this method was called despite no mount or volume being available
+       * for this shortcut... that should not happen */
     }
 
   /* release the mount operation */
diff --git a/thunar/thunar-shortcut-row.h b/thunar/thunar-shortcut-row.h
index e114fec..effddfa 100644
--- a/thunar/thunar-shortcut-row.h
+++ b/thunar/thunar-shortcut-row.h
@@ -64,7 +64,9 @@ void               thunar_shortcut_row_set_icon_size        (ThunarShortcutRow *
                                                              ThunarIconSize     icon_size);
 void               thunar_shortcut_row_resolve_and_activate (ThunarShortcutRow *row,
                                                              gboolean           open_in_new_window);
-void               thunar_shortcut_row_disconnect_mount     (ThunarShortcutRow *row);
+void               thunar_shortcut_row_mount                (ThunarShortcutRow *row);
+void               thunar_shortcut_row_unmount              (ThunarShortcutRow *row);
+void               thunar_shortcut_row_disconnect           (ThunarShortcutRow *row);
 
 G_END_DECLS
 
diff --git a/thunar/thunar-shortcuts-view.c b/thunar/thunar-shortcuts-view.c
index bf2b7a9..e34859b 100644
--- a/thunar/thunar-shortcuts-view.c
+++ b/thunar/thunar-shortcuts-view.c
@@ -108,7 +108,9 @@ static gboolean           thunar_shortcuts_view_row_context_menu         (Thunar
                                                                           GtkWidget                        *widget);
 static void               thunar_shortcuts_view_row_open                 (ThunarShortcutsView              *view);
 static void               thunar_shortcuts_view_row_open_new_window      (ThunarShortcutsView              *view);
-static void               thunar_shortcuts_view_row_disconnect_mount     (ThunarShortcutsView              *view);
+static void               thunar_shortcuts_view_row_disconnect           (ThunarShortcutsView              *view);
+static void               thunar_shortcuts_view_row_mount                (ThunarShortcutsView              *view);
+static void               thunar_shortcuts_view_row_unmount              (ThunarShortcutsView              *view);
 static void               thunar_shortcuts_view_open                     (ThunarShortcutsView              *view,
                                                                           ThunarFile                       *file,
                                                                           gboolean                          new_window);
@@ -731,7 +733,7 @@ thunar_shortcuts_view_row_context_menu (ThunarShortcutsView *view,
       /* append the "Disconnect" item */
       item = gtk_image_menu_item_new_with_mnemonic (_("Disconn_ect"));
       g_signal_connect_swapped (item, "activate",
-                                G_CALLBACK (thunar_shortcuts_view_row_disconnect_mount),
+                                G_CALLBACK (thunar_shortcuts_view_row_disconnect),
                                 view);
       gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
       gtk_widget_show (item);
@@ -753,6 +755,9 @@ thunar_shortcuts_view_row_context_menu (ThunarShortcutsView *view,
       /* append the "Mount" item */
       item = gtk_image_menu_item_new_with_mnemonic (_("_Mount"));
       gtk_widget_set_sensitive (item, !thunar_g_volume_is_mounted (volume));
+      g_signal_connect_swapped (item, "activate",
+                                G_CALLBACK (thunar_shortcuts_view_row_mount),
+                                view);
       gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
       gtk_widget_show (item);
 
@@ -761,6 +766,9 @@ thunar_shortcuts_view_row_context_menu (ThunarShortcutsView *view,
           /* append the "Unmount" item */
           item = gtk_image_menu_item_new_with_mnemonic (_("_Unmount"));
           gtk_widget_set_sensitive (item, thunar_g_volume_is_mounted (volume));
+          g_signal_connect_swapped (item, "activate",
+                                    G_CALLBACK (thunar_shortcuts_view_row_unmount),
+                                    view);
           gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
           gtk_widget_show (item);
         }
@@ -768,6 +776,9 @@ thunar_shortcuts_view_row_context_menu (ThunarShortcutsView *view,
       /* append the "Disconnect" (eject + safely remove drive) item */
       item = gtk_image_menu_item_new_with_mnemonic (_("Disconn_ect"));
       gtk_widget_set_sensitive (item, thunar_g_volume_is_mounted (volume));
+      g_signal_connect_swapped (item, "activate",
+                                G_CALLBACK (thunar_shortcuts_view_row_disconnect),
+                                view);
       gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
       gtk_widget_show (item);
     }
@@ -902,7 +913,37 @@ thunar_shortcuts_view_row_open_new_window (ThunarShortcutsView *view)
 
 
 static void
-thunar_shortcuts_view_row_disconnect_mount (ThunarShortcutsView *view)
+thunar_shortcuts_view_row_disconnect (ThunarShortcutsView *view)
+{
+  ThunarShortcutRow *row;
+
+  _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view));
+
+  row = thunar_shortcuts_view_get_selected_row (view);
+
+  if (row != NULL)
+    thunar_shortcut_row_disconnect (row);
+}
+
+
+
+static void
+thunar_shortcuts_view_row_mount (ThunarShortcutsView *view)
+{
+  ThunarShortcutRow *row;
+
+  _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view));
+
+  row = thunar_shortcuts_view_get_selected_row (view);
+
+  if (row != NULL)
+    thunar_shortcut_row_mount (row);
+}
+
+
+
+static void
+thunar_shortcuts_view_row_unmount (ThunarShortcutsView *view)
 {
   ThunarShortcutRow *row;
 
@@ -911,7 +952,7 @@ thunar_shortcuts_view_row_disconnect_mount (ThunarShortcutsView *view)
   row = thunar_shortcuts_view_get_selected_row (view);
 
   if (row != NULL)
-    thunar_shortcut_row_disconnect_mount (row);
+    thunar_shortcut_row_unmount (row);
 }
 
 



More information about the Xfce4-commits mailing list