Blame SOURCES/0001-fileItem-Support-.desktop-files-of-type-Link.patch

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