Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.5:Update
gnome-shell-extension-desktop-icons.15842
gnome-shell-extension-desktop-icons-add-mount-d...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File gnome-shell-extension-desktop-icons-add-mount-disk-icon.patch of Package gnome-shell-extension-desktop-icons.15842
diff --git a/desktopIconsUtil.js b/desktopIconsUtil.js index 0aea654..696c945 100644 --- a/desktopIconsUtil.js +++ b/desktopIconsUtil.js @@ -22,6 +22,8 @@ const GLib = imports.gi.GLib; const ExtensionUtils = imports.misc.extensionUtils; const Me = ExtensionUtils.getCurrentExtension(); const Prefs = Me.imports.prefs; +const Main = imports.ui.main; +const ShellMountOperation = imports.ui.shellMountOperation; const TERMINAL_SCHEMA = 'org.gnome.desktop.default-applications.terminal'; const EXEC_KEY = 'exec'; @@ -121,3 +123,42 @@ function getGtkClassBackgroundColor(classname, state) { context.add_class(classname); return context.get_background_color(state); } + +// Reference the extension org.gnome.shell.extensions.drive-menu +function eject(mount) { + let unmountArgs = [ + Gio.MountUnmountFlags.NONE, + (new ShellMountOperation.ShellMountOperation(mount)).mountOp, + null, // Gio.Cancellable + ]; + + if (mount.can_eject()) { + mount.eject_with_operation(...unmountArgs, + _ejectFinish.bind(mount)); + } else { + mount.unmount_with_operation(...unmountArgs, + _unmountFinish.bind(mount)); + } +} + +function _unmountFinish(mount, result) { + try { + mount.unmount_with_operation_finish(result); + } catch (e) { + this._reportFailure(e); + } +} + +function _ejectFinish(mount, result) { + try { + mount.eject_with_operation_finish(result); + } catch (e) { + this._reportFailure(e); + } +} + +function _reportFailure(exception) { + // TRANSLATORS: %s is the filesystem name + let msg = _('Ejecting drive “%s” failed:').format(this.mount.get_name()); + Main.notifyError(msg, exception.message); +} diff --git a/desktopManager.js b/desktopManager.js index 7dd0b4c..97ea1de 100644 --- a/desktopManager.js +++ b/desktopManager.js @@ -86,6 +86,12 @@ var DesktopManager = GObject.registerClass({ Main.layoutManager._backgroundGroup.add_child(this._rubberBand); this._grabHelper = new GrabHelper.GrabHelper(global.stage); + this._mountMonitor = Gio.VolumeMonitor.get(); + this._mountAddedId = this._mountMonitor.connect('mount-added', (monitor, mount) => { + this._recreateDesktopIcons(); }); + this._mountRemovedId = this._mountMonitor.connect('mount-removed', (monitor, mount) => { + this._recreateDesktopIcons(); }); + this._addDesktopIcons(); this._monitorDesktopFolder(); @@ -232,8 +238,14 @@ var DesktopManager = GObject.registerClass({ } try { + let items = []; + for (let item of await this._enumerateDesktop()) + items.push(item); + for (let item of this._getMounts()) + items.push(item); + let tmpFileItems = new Map(); - for (let [file, info, extra] of await this._enumerateDesktop()) { + for (let [file, info, extra] of items) { let fileItem = new FileItem.FileItem(file, info, extra); tmpFileItems.set(fileItem.file.get_uri(), fileItem); let id = fileItem.connect('selected', @@ -302,6 +314,33 @@ var DesktopManager = GObject.registerClass({ this._monitorDesktopDir.connect('changed', (obj, file, otherFile, eventType) => this._updateDesktopIfChanged(file, otherFile, eventType)); } + _getMounts() { + let files = []; + if (!Prefs.settings.get_boolean('show-mount')) + return files; + + this._mountMonitor.get_mounts().forEach( mount => { + if (this._isNetworkMount(mount)) + return; + + let file = mount.get_root(); + let info = file.query_info(DesktopIconsUtil.DEFAULT_ATTRIBUTES, + Gio.FileQueryInfoFlags.NONE, + null); + files.push([file, info, Prefs.FileType.MOUNT_DISK]); + }); + + return files; + } + + _isNetworkMount(mount) { + let volume = mount.get_volume(); + if (!volume) + return true; + + return volume.get_identifier('class') == 'network'; + } + checkIfSpecialFilesAreSelected() { for (let fileItem of this._selection) { if (fileItem.isSpecial) @@ -716,6 +755,13 @@ var DesktopManager = GObject.registerClass({ this._monitorDesktopDir.cancel(); this._monitorDesktopDir = null; + if (this._mountAddedId) + this._mountMonitor.disconnect(this._mountAddedId); + this._mountAddedId = 0; + if (this._mountRemovedId) + this._mountMonitor.disconnect(this._mountRemovedId); + this._mountRemovedId = 0; + if (this.settingsId) Prefs.settings.disconnect(this.settingsId); this.settingsId = 0; diff --git a/fileItem.js b/fileItem.js index 4585413..9ab93ce 100644 --- a/fileItem.js +++ b/fileItem.js @@ -68,6 +68,9 @@ var FileItem = class { this._isSpecial = this._fileExtra != Prefs.FileType.NONE; this._file = file; + this._mount = null; + if (this._fileExtra == Prefs.FileType.MOUNT_DISK) + this._mount = this._file.find_enclosing_mount(null); this._savedCoordinates = null; let savedCoordinates = fileInfo.get_attribute_as_string('metadata::nautilus-icon-position'); @@ -284,6 +287,10 @@ var FileItem = class { this._icon.child = this._createEmblemedStIcon(this._fileInfo.get_icon(), null); return; } + if (this._fileExtra == Prefs.FileType.MOUNT_DISK) { + this._icon.child = this._createEmblemedStIcon(this._mount.get_icon(), null); + return; + } let thumbnailFactory = GnomeDesktop.DesktopThumbnailFactory.new(GnomeDesktop.DesktopThumbnailSize.LARGE); if (thumbnailFactory.can_thumbnail(this._file.get_uri(), @@ -499,6 +506,10 @@ var FileItem = class { Extension.desktopManager.doEmptyTrash(); } + _onEjectClicked() { + DesktopIconsUtil.eject(this._mount); + } + get _allowLaunchingText() { if (this.trustedDesktopFile) return _("Don’t Allow Launching"); @@ -626,6 +637,10 @@ var FileItem = class { this._menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this._menu.addAction(_('Empty Trash'), () => this._onEmptyTrashClicked()); break; + case Prefs.FileType.MOUNT_DISK: + this._menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + this._menu.addAction(_('Eject'), () => this._onEjectClicked()); + break; default: break; } diff --git a/prefs.js b/prefs.js index 66382f7..4b33e55 100644 --- a/prefs.js +++ b/prefs.js @@ -40,6 +40,7 @@ var FileType = { NONE: null, USER_DIRECTORY_HOME: 'show-home', USER_DIRECTORY_TRASH: 'show-trash', + MOUNT_DISK: 'mount-disk', } var nautilusSettings; @@ -102,6 +103,7 @@ function buildPrefsWidget() { frame.add(buildSelector('icon-size', _("Size for the desktop icons"), { 'small': _("Small"), 'standard': _("Standard"), 'large': _("Large") })); frame.add(buildSwitcher('show-home', _("Show the personal folder in the desktop"))); frame.add(buildSwitcher('show-trash', _("Show the trash icon in the desktop"))); + frame.add(buildSwitcher('show-mount', _("Show mounted drives in the desktop"))); frame.show_all(); return frame; } diff --git a/schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml b/schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml index bb4e50f..de126b5 100644 --- a/schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml +++ b/schemas/org.gnome.shell.extensions.desktop-icons.gschema.xml @@ -20,6 +20,11 @@ <default>true</default> <summary>Show trash icon</summary> <description>Show the trash icon in the desktop.</description> + </key> + <key type="b" name="show-mount"> + <default>true</default> + <summary>Show mounted drives</summary> + <description>Show mounted drives in the desktop.</description> </key> </schema> </schemalist>
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor