148 lines
5.9 KiB
Diff
148 lines
5.9 KiB
Diff
|
From be4ab59a3f2bb9829dde390db3dd8868a08840eb Mon Sep 17 00:00:00 2001
|
|||
|
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
|||
|
Date: Fri, 2 Dec 2022 19:28:54 +0100
|
|||
|
Subject: [PATCH] fileItem: Support .desktop files of type Link
|
|||
|
|
|||
|
Gio only has direct support for .desktop files of type Application.
|
|||
|
|
|||
|
However in the context of desktop icons (and file managers), shortcuts
|
|||
|
of URLs are useful as well, so add explicit support for .desktop files
|
|||
|
of type Link.
|
|||
|
---
|
|||
|
extensions/desktop-icons/fileItem.js | 71 +++++++++++++++++++++++-----
|
|||
|
1 file changed, 60 insertions(+), 11 deletions(-)
|
|||
|
|
|||
|
diff --git a/extensions/desktop-icons/fileItem.js b/extensions/desktop-icons/fileItem.js
|
|||
|
index f2f03440..1c9a1e55 100644
|
|||
|
--- a/extensions/desktop-icons/fileItem.js
|
|||
|
+++ b/extensions/desktop-icons/fileItem.js
|
|||
|
@@ -239,12 +239,32 @@ var FileItem = class {
|
|||
|
log(`desktop-icons: File ${this._displayName} is writable by others - will not allow launching`);
|
|||
|
|
|||
|
if (this._isDesktopFile) {
|
|||
|
- this._desktopFile = Gio.DesktopAppInfo.new_from_filename(this._file.get_path());
|
|||
|
- if (!this._desktopFile) {
|
|||
|
- log(`Couldn’t parse ${this._displayName} as a desktop file, will treat it as a regular file.`);
|
|||
|
+ try {
|
|||
|
+ const keyFile = new GLib.KeyFile();
|
|||
|
+ keyFile.load_from_file(this._file.get_path(), GLib.KeyFileFlags.NONE);
|
|||
|
+
|
|||
|
+ const type = keyFile.get_string(
|
|||
|
+ GLib.KEY_FILE_DESKTOP_GROUP, GLib.KEY_FILE_DESKTOP_KEY_TYPE);
|
|||
|
+ switch (type) {
|
|||
|
+ case GLib.KEY_FILE_DESKTOP_TYPE_APPLICATION:
|
|||
|
+ this._desktopFile = Gio.DesktopAppInfo.new_from_keyfile(keyFile);
|
|||
|
+ if (!this._desktopFile) {
|
|||
|
+ log(`Couldn’t parse ${this._displayName} as a desktop file, will treat it as a regular file.`);
|
|||
|
+ this._isValidDesktopFile = false;
|
|||
|
+ } else {
|
|||
|
+ this._isValidDesktopFile = true;
|
|||
|
+ }
|
|||
|
+ break;
|
|||
|
+ case GLib.KEY_FILE_DESKTOP_TYPE_LINK:
|
|||
|
+ const url = keyFile.get_string(
|
|||
|
+ GLib.KEY_FILE_DESKTOP_GROUP, GLib.KEY_FILE_DESKTOP_KEY_URL);
|
|||
|
+ if (url)
|
|||
|
+ this._linkFile = keyFile;
|
|||
|
+ default: // fall-through
|
|||
|
+ this._isValidDesktopFile = false;
|
|||
|
+ }
|
|||
|
+ } catch (e) {
|
|||
|
this._isValidDesktopFile = false;
|
|||
|
- } else {
|
|||
|
- this._isValidDesktopFile = true;
|
|||
|
}
|
|||
|
} else {
|
|||
|
this._isValidDesktopFile = false;
|
|||
|
@@ -356,8 +376,17 @@ var FileItem = class {
|
|||
|
if (this._isBrokenSymlink) {
|
|||
|
this._icon.child = this._createEmblemedStIcon(null, 'text-x-generic');
|
|||
|
} else {
|
|||
|
- if (this.trustedDesktopFile && this._desktopFile.has_key('Icon'))
|
|||
|
- this._icon.child = this._createEmblemedStIcon(null, this._desktopFile.get_string('Icon'));
|
|||
|
+ let iconName = null;
|
|||
|
+
|
|||
|
+ try {
|
|||
|
+ if (this.trustedDesktopFile)
|
|||
|
+ iconName = this._desktopFile.get_string('Icon');
|
|||
|
+ else if (this._linkFile)
|
|||
|
+ iconName = this._linkFile.get_string(GLib.KEY_FILE_DESKTOP_GROUP, GLib.KEY_FILE_DESKTOP_KEY_ICON);
|
|||
|
+ } catch (e) {}
|
|||
|
+
|
|||
|
+ if (iconName)
|
|||
|
+ this._icon.child = this._createEmblemedStIcon(null, iconName);
|
|||
|
else
|
|||
|
this._icon.child = this._createEmblemedStIcon(this._fileInfo.get_icon(), null);
|
|||
|
}
|
|||
|
@@ -411,7 +440,7 @@ var FileItem = class {
|
|||
|
itemIcon.add_emblem(Gio.Emblem.new(Gio.ThemedIcon.new('emblem-unreadable')));
|
|||
|
else
|
|||
|
itemIcon.add_emblem(Gio.Emblem.new(Gio.ThemedIcon.new('emblem-symbolic-link')));
|
|||
|
- } else if (this.trustedDesktopFile) {
|
|||
|
+ } else if (this.trustedDesktopFile || this._linkFile) {
|
|||
|
itemIcon.add_emblem(Gio.Emblem.new(Gio.ThemedIcon.new('emblem-symbolic-link')));
|
|||
|
}
|
|||
|
|
|||
|
@@ -440,6 +469,12 @@ var FileItem = class {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
+ if (this._linkFile) {
|
|||
|
+ this._openUri(this._linkFile.get_string(
|
|||
|
+ GLib.KEY_FILE_DESKTOP_GROUP, GLib.KEY_FILE_DESKTOP_KEY_URL));
|
|||
|
+ return;
|
|||
|
+ }
|
|||
|
+
|
|||
|
if (this._attributeCanExecute &&
|
|||
|
!this._isDirectory &&
|
|||
|
!this._isValidDesktopFile &&
|
|||
|
@@ -449,13 +484,17 @@ var FileItem = class {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
- Gio.AppInfo.launch_default_for_uri_async(this.file.get_uri(),
|
|||
|
+ this._openUri(this.file.get_uri());
|
|||
|
+ }
|
|||
|
+
|
|||
|
+ _openUri(uri) {
|
|||
|
+ Gio.AppInfo.launch_default_for_uri_async(uri,
|
|||
|
null, null,
|
|||
|
(source, result) => {
|
|||
|
try {
|
|||
|
Gio.AppInfo.launch_default_for_uri_finish(result);
|
|||
|
} catch (e) {
|
|||
|
- log('Error opening file ' + this.file.get_uri() + ': ' + e.message);
|
|||
|
+ log('Error opening file ' + uri + ': ' + e.message);
|
|||
|
}
|
|||
|
}
|
|||
|
);
|
|||
|
@@ -555,7 +594,9 @@ var FileItem = class {
|
|||
|
}
|
|||
|
|
|||
|
canRename() {
|
|||
|
- return !this.trustedDesktopFile && this._fileExtra == Prefs.FileType.NONE;
|
|||
|
+ return !this.trustedDesktopFile &&
|
|||
|
+ !this._linkFile &&
|
|||
|
+ this._fileExtra == Prefs.FileType.NONE;
|
|||
|
}
|
|||
|
|
|||
|
_doOpenWith() {
|
|||
|
@@ -819,6 +860,14 @@ var FileItem = class {
|
|||
|
if (this.trustedDesktopFile)
|
|||
|
return this._desktopFile.get_name();
|
|||
|
|
|||
|
+ if (this._linkFile) {
|
|||
|
+ try {
|
|||
|
+ const name = this._linkFile.get_string(
|
|||
|
+ GLib.KEY_FILE_DESKTOP_GROUP, GLib.KEY_FILE_DESKTOP_KEY_NAME);
|
|||
|
+ return name;
|
|||
|
+ } catch (e) {}
|
|||
|
+ }
|
|||
|
+
|
|||
|
return this._displayName || null;
|
|||
|
}
|
|||
|
|
|||
|
--
|
|||
|
2.38.1
|
|||
|
|