[gnome-shell/hotplug: 10/13] autorun: prefer Safe Removal over eject/unmount if possible



commit d7eca4e2140634720db69fb7d9b480b698d7f298
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Thu Jun 23 10:08:17 2011 -0400

    autorun: prefer Safe Removal over eject/unmount if possible
    
    Basically do what NautilusPlacesSidebar does with the drive/volume/mount
    eject/unmount/stop priorities.
    
    We follow this pattern:
    - always prefer Safely Remove if available (i.e. drive.stop())
    - fallback to ejecting the mount/volume/drive if that's not possible
    - finally, fallback to unmounting the mount if even eject is not
      available
    
    This also means we don't care about the distinction between
    Stop/Eject/Unmount at this level. Disk Utility (or Nautilus) are
    available for those who want that degree of control, but the common case
    here should do the most useful action without presenting the choice.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=653520

 js/ui/autorunManager.js |   61 ++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 50 insertions(+), 11 deletions(-)
---
diff --git a/js/ui/autorunManager.js b/js/ui/autorunManager.js
index 192916e..49bbbb9 100644
--- a/js/ui/autorunManager.js
+++ b/js/ui/autorunManager.js
@@ -201,20 +201,35 @@ AutorunManager.prototype = {
     ejectMount: function(mount) {
         let mountOp = new ShellMountOperation.ShellMountOperation(mount);
 
-        if (mount.can_eject())
-            mount.eject_with_operation(0, mountOp.mountOp, null,
-                                       Lang.bind(this, this._onMountEject));
-        else
-            mount.unmount_with_operation(0, mountOp.mountOp, null,
-                                         Lang.bind(this, this._onMountEject));
+        // first, see if we have a drive
+        let drive = mount.get_drive();
+        let volume = mount.get_volume();
+
+        if (drive &&
+            drive.get_start_stop_type() == Gio.DriveStartStopType.SHUTDOWN &&
+            drive.can_stop()) {
+            drive.stop(0, mountOp.mountOp, null,
+                       Lang.bind(this, this._onStop));
+        } else {
+            if (mount.can_eject()) {
+                mount.eject_with_operation(0, mountOp.mountOp, null,
+                                           Lang.bind(this, this._onEject));
+            } else if (volume && volume.can_eject()) {
+                volume.eject_with_operation(0, mountOp.mountOp, null,
+                                            Lang.bind(this, this._onEject));
+            } else if (drive && drive.can_eject()) {
+                drive.eject_with_operation(0, mountOp.mountOp, null,
+                                           Lang.bind(this, this._onEject));
+            } else if (mount.can_unmount()) {
+                mount.unmount_with_operation(0, mountOp.mountOp, null,
+                                             Lang.bind(this, this._onUnmount));
+            }
+        }
     },
 
-    _onMountEject: function(mount, res) {
+    _onUnmount: function(mount, res) {
         try {
-            if (mount.can_eject())
-                mount.eject_with_operation_finish(res);
-            else
-                mount.unmount_with_operation_finish(res);
+            mount.unmount_with_operation_finish(res);
         } catch (e) {
             // FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here
             // but we can't access the error code from JS.
@@ -223,6 +238,30 @@ AutorunManager.prototype = {
                 + ': ' + e.toString());
         }
     },
+
+    _onEject: function(source, res) {
+        try {
+            source.eject_with_operation_finish(res);
+        } catch (e) {
+            // FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here
+            // but we can't access the error code from JS.
+            // See https://bugzilla.gnome.org/show_bug.cgi?id=591480
+            log('Unable to eject the drive ' + source.get_name() 
+                + ': ' + e.toString());
+        }
+    },
+
+    _onStop: function(drive, res) {
+        try {
+            drive.stop_finish(res);
+        } catch (e) {
+            // FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here
+            // but we can't access the error code from JS.
+            // See https://bugzilla.gnome.org/show_bug.cgi?id=591480
+            log('Unable to stop the drive ' + drive.get_name() 
+                + ': ' + e.toString());
+        }
+    },
 }
 
 function AutorunResidentSource() {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]