44

I want to create desktop entry for Inkscape AppImage. I'm having some issues because I don't have all MIME types or a clear idea about running that kind of app on desktop entry.

Does anyone know how I can achieve such a thing?

Flimm
  • 43,943
AtomX
  • 701

6 Answers6

64

You can do it manually, or you can do it like it's described here: Registering an AppImage file as a desktop app in KDE.

Since you want to do it manually, you can do it like this.

  1. Download the official Inkscape AppImage.

  2. Make it executable, run: chmod +x inkscape.AppImage.

  3. Move it to an appropriate path, like ~/.local/bin.

  4. Extract the AppImage, run inkscape.AppImage --appimage-extract; a directory will be created called squashfs-root in the current working directory.

  5. Enter the directory squashfs-root and copy the desktop launcher org.inkscape.Inkscape.desktop to ~/.local/share/applications

  6. Edit the desktop launcher to point to the path of the AppImage followed by %F or %U or %u, i.e., Exec=/home/username/.local/bin/inkscape.AppImage %F

  7. Give the .desktop file executable permissions:

    chmod +x ~/.local/share/applications/org.inkscape.Inkscape.desktop
    
  8. Remove the directory squashfs-root.

Note: The AppImage file name doesn't have to have .AppImage; the system will know what it is. If the icon isn't displayed, the icon theme you're using is missing the file org.inkscape.Inkscape. You can also edit the desktop launcher to use whatever icon is provided by the icon theme.

Flimm
  • 43,943
Uri Herrera
  • 15,328
  • 1

    then edit the desktop launcher to point to the path of the AppImage. This is the Exec line you need to edit

    – GMaster Dec 26 '21 at 07:33
  • 1
    Should the ~/.local/share/applications directory be created if it doesn't exist? Does the Icon= path also need updated? Should the icon be copied out of the squashfs-root directory before deleting it? Is there anything I can do to make an arbitrary application expose a right-click "pin to launcher" ? – user643722 Dec 03 '22 at 19:18
  • 1
    @user643722 1) Yes, the directory will exist if you have modified any desktop launcher or have installed software that adds a desktop launcher locally, .i.e, a Chrome web app. 2) Unless the path in Icon= is pointing to a path inside the AppImage, then no. 3) No, unless you want to use whatever PNG image is inside the AppImage and not the image provided by the icon theme you're using. 4) I guess that depends on what desktop you're using. I'm using Plasma and can right-click to pin a desktop launcher. – Uri Herrera Dec 06 '22 at 06:54
  • 5
    I think in the end, you need to run update-desktop-database ~/.local/share/applications/ to update the desktop database. – e3oroush Oct 21 '23 at 11:31
  • I totally don't get it. When you say edit the desktop launcher to point to the path of the appimage, that means the path, not the appimage itself? Right? in my example that would be Exec=/home/apps/ not Exec=/home/apps/ungoogled-chromium.desktop. Following those instructions to the letter, I get an error Failed to add plugin to the panel. GDBus.error:org.Freedesktop.DBus.Error.ServiceUnknown: The name xfce.Panel was not provided by any .service files – Joe Molnar Dec 03 '23 at 23:40
  • correction, the question is should the Exec line be the app image vs the app image path? Would the exec command be like this: Exec=/home/apps/ungoogled-chromium_116.0.5845.140-1.1.AppImage – Joe Molnar Dec 03 '23 at 23:49
  • I had to remove .Appimage from the filename of the executable, otherwise the Xfce app menu would fail with a "not found" error on launch. Xfce 4.18 on Debian. – Douglas Silva Dec 08 '23 at 19:42
  • This worked for me, but after I pinned/favorited the desktop entry, launching it would create a new task bar entry instead of reusing the pin. If you encounter this, it can be solved by checking the name of the new window and making sure the StartupWMClass of the desktop file matches the name of the window it launches. – Seth Falco Mar 21 '24 at 22:09
  • Don't forget to run sudo update-desktop-database to register the new .desktop entry! – Shinebayar G Mar 31 '24 at 07:41
  • How do you set Icon= to that provided by the .appimage, without extracting it elsewhere first? – Joe Coder Aug 05 '24 at 19:44
11

Using other answers I created a bash script that automatically extracts PNG icon from appimage and creates a .desktop file.

https://github.com/un1t/appimage-desktop-entry

Usage:

./appimage-desktop-entry.sh /path/to/Example.AppImage

Script:

#!/bin/bash
set -e
set -o pipefail

APPIMAGE_PATH=$1

if [ -z "$APPIMAGE_PATH" ]; then echo "Missing argument: appimage" exit 1 fi

if [ ! -f "$APPIMAGE_PATH" ]; then echo "File not found: $APPIMAGE_PATH" exit 1 fi

TEMP_SQUASHFS_PATH=$(mktemp -d) APPIMAGE_FULLPATH=$(readlink -e "$APPIMAGE_PATH") APPIMAGE_FILENAME=$(basename "$APPIMAGE_PATH") APP_NAME="${APPIMAGE_FILENAME%.*}" DESKTOP_ENTRY_PATH="${HOME}/.local/share/applications/$APP_NAME.desktop" ICON_FOLDER="${HOME}/.local/share/icons" mkdir -p "${ICON_FOLDER}"

if [ "$2" == "--remove" ]; then rm -f "$DESKTOP_ENTRY_PATH" find "${ICON_FOLDER}" -maxdepth 1 -type f -name "$APP_NAME.*" -delete echo "Removed" exit 0 fi

pushd $TEMP_SQUASHFS_PATH "$APPIMAGE_FULLPATH" --appimage-extract > /dev/null cd squashfs-root/

echo "Choose icon: " mapfile -t FILENAMES < <(find -L . -maxdepth 1 -type f ( -iname '.png' -o -iname '.svg' )) i=1 for filename in "${FILENAMES[@]}" do printf " %d) %s\n" "$i" "$filename" i=$((i + 1)) done

read -r SELECTED_INDEX

ICON_SRC=${FILENAMES[$((SELECTED_INDEX - 1))]} ICON_EXT="${ICON_SRC##*.}" ICON_DST="${ICON_FOLDER}/$APP_NAME.$ICON_EXT" cp "$ICON_SRC" "$ICON_DST"

cat <<EOT > "$DESKTOP_ENTRY_PATH" [Desktop Entry] Name=$APP_NAME StartupWMClass=$APP_NAME Exec="$APPIMAGE_FULLPATH" Icon=$ICON_DST Type=Application Terminal=false EOT

popd

rm -rf $TEMP_SQUASHFS_PATH

echo "Created"

Maarten
  • 234
un1t
  • 211
10

First, make sure it is executable: chmod u+x Inkscape.AppImage

Then, you would format your desktop file like this:

[Desktop Entry]
Name=InkScape
Exec=/path/to/appimage.AppImage
Icon=Inkscape
Type=Application
Categories=GTK;GNOME;Utility;
3

This is what worked for me.

  1. Download Inkscape-xxx.AppImage from inkscape.org.

  2. Copy it to /opt/inkscape/ folder and rename it to Inkscape.AppImage

  3. Make it executable chmod u+x Inkscape.AppImage

  4. Download inkscape-logo.svg file and copy it to /opt/inkscape/

  5. Create a a new file ~/.local/share/applications/inkscape.desktop

with the following entries.

[Desktop Entry]
Name=Inkscape
Exec=/opt/inkscape/Inkscape.AppImage %u
Icon=/opt/inkscape/inkscape-logo.svg
Comment=Draw Freely
Type=Application
Terminal=false
Encoding=UTF-8
Categories=Utility;
StartupNotify=true
StartupWMClass=org.inkscape.Inkscape

Edit: Run this command in terminal to show the app in applications list

update-desktop-database ~/.local/share/applications

Note: StartupWMClass=org.inkscape.Inkscape is very important to associate the running instance to the .desktop launcher. Also %u parameter at the end of Exec field is to list the application in the open with applications list.

To find the StartupWMClass entry of your application use

  1. for wayland use looking-glass
  2. for xorg run xprop | grep WM_CLASS in terminal and click on your application's window

Update: for Blender

  1. Download blender-x.x.x-linux-x64.tar.xz from blender.org.

  2. Extract it to directory /opt/blender/blender-x.x.x-linux-x64(or any other directory on your convenince)

  3. copy the file /opt/blender/blender-x.x.x-linux-x64/blender.desktop to

    ~/.local/share/applications/blender.desktop

  4. open the file ~/.local/share/applications/blender.desktop

find the following lines

Exec=blender %f
Icon=blender

and change to

Exec=/opt/blender/blender-x.x.x-linux-x64/blender %f
Icon=/opt/blender/blender-x.x.x-linux-x64/blender.svg
  1. Run this command in terminal

    update-desktop-database ~/.local/share/applications

resuser
  • 91
  • This worked for me, with the addition from the comment above https://askubuntu.com/questions/1328196/how-can-i-create-a-desktop-entry-for-an-appimage#comment2609764_1328529 – Chuck Claunch Mar 04 '24 at 14:22
  • Why does this have to be so bizarrely complicated? – ParkerM Oct 03 '24 at 05:24
1

This is the answer that the AppImage documentation gives:

Integrating AppImages into the desktop

AppImages are standalone bundles, and do not need to be installed. However, some users may want their AppImages to be available like distribution provided applications. This primarily involves being able to launch desktop applications from their desktop environments’ launchers. This concept is called desktop integration.

appimaged

appimaged is a daemon that monitors the system and integrates AppImages. It monitors a predefined set of directories on the user’s system searching for AppImages, and integrates them into the system using libappimage.

See also: More information on appimaged can be found in appimaged.

AppImageLauncher

AppImageLauncher is a helper application for Linux distributions serving as a kind of “entry point” for running and integrating AppImages. It makes a user’s system AppImage-ready™.

AppImageLauncher must be installed into the system to be able to integrate into the system properly. It uses technologies that are independent from any desktop environment features, and therefore should be able to run on most distributions.

After install AppImageLauncher, you can simply double-click AppImages in file managers, browsers etc. You will be prompted whether to integrate the AppImage, or run it just once. When you choose to integrate your AppImage, the file will be moved into the directory ~/Applications. This helps reducing the mess of AppImages on your file system and prevents you from having to search for the actual AppImage file if you want to e.g., remove it.

To provide a complete solution for managing AppImages on the system, AppImageLauncher furthermore provides solutions for updating and removing AppImages from the system. These functions can be found in the context menus of the entries in the desktop’s launcher.

See also: More information about AppImageLauncher can be found in AppImageLauncher.

Flimm
  • 43,943
1

In addition to the previous amazing answers, I have found the following command useful to skip the extract and remove steps:

timeout 1 ./<whatever>.AppImage --appimage-mount \
   | xargs -I {} bash -c 'cp {}/*.desktop . -v'

which mounts the appimage (--appimage-mount) instead of extracting it; pipes the output of that command (the mount path) to xargs, invoking a new bash so we can use shell expansion after mounting; then within this new shell, copy over all desktop files to the current directory; finally closing the mount after 1 second

In a similar way, you can even automate the entire procedure (at your own risk :))

APPIMAGE=<whatever>.AppImage
chmod +x "$APPIMAGE"
timeout 1 ./"$APPIMAGE" --appimage-mount \
   | xargs -I {} find {} -name '*.desktop' \
   | head -n 1 \
   | xargs cat \
   | sed 's:^Exec=.*:Exec='"$(readlink -f "$APPIMAGE")"':' \
   > ~/.local/share/applications/"$APPIMAGE".desktop \
   && chmod +x ~/.local/share/applications/"$APPIMAGE".desktop

under the assumption that there is no : sign in the full appimage path

To fetch the icon as well, I use

APPIMAGE=<whatever>.AppImage
timeout 1 ./"$APPIMAGE" --appimage-mount \
   | xargs -I {} find {} -name '*.desktop' \
   | head -n 1 \
   | sed 's/\.desktop$/.png/' \
   | xargs -I {} cp {} ~/.local/share/icons -v

which assumes the desktop and icon file just have a different extension, which seemed to be the case for the few appimages I checked but I have no idea if it's part of the specification

Lennart
  • 111