71

How can I register an .appimage file (specifically, the tiled map editor found here) as a desktop app? (Like Firefox -- I can launch it by typing 'Firefox' into search rather than opening up a console and typing /path/to/directory/firefox.ext)

Flimm
  • 44,031

5 Answers5

59

Create a .desktop file that points to the application -- here is an example of a .desktop for minecraft:

[Desktop Entry]
Type=Application
Name=Minecraft
Comment=Minecraft
Icon=/home/bram/Applications/Minecraft/icon.png
Exec=/home/bram/Applications/Minecraft/minecraft
Terminal=false
Categories=Minecraft;game

Put that file in ~/.local/share/applications

Serge Stroobandt
  • 5,719
  • 1
  • 54
  • 59
48

You can also use AppImageLauncher which provides desktop integration along with some additional features. Unlike appimaged, it:

  • asks for confirmation before creating desktop entry for an AppImage.
  • works with AppImages in any location
  • doesn't use a daemon for monitoring, so more efficient.

Specifics of how it works are explained in the wiki. It can be installed directly from the packages provided in the releases using the command:

sudo dpkg -i <downloaded-package-name>.deb
aksh1618
  • 616
27

According to appimagekit, the proper method is to use appimaged for .AppImage file registration.

For 64-bit systems:

wget "https://github.com/AppImage/appimaged/releases/download/continuous/appimaged-x86_64.AppImage"
chmod +x appimaged-x86_64.AppImage
./appimaged-x86_64.AppImage --install

The binary will copy itself to /home/ubuntu/.local/bin/appimaged and then delete the downloaded copy upon install. Then you must logout and back in.

At time of reading, it will monitor and register the following locations:

~/Downloads
~/.local/bin
~/bin
/Applications
/isodevice/Applications
/isofrom/Applications
/run/archiso/img_dev/Applications
/opt
/usr/local/bin

To show in the menu, this assumes you've placed a desktop file in the correct location inside your .AppImage file, usually /usr/share/applications/<myproject>.desktop.

If you search in the application tray, you should find your application shortly. The daemon should also register any application-specific file associations assuming the mime xml is also bundled, usually /usr/share/mime/packages/<myproject>.xml. If the icon does not appear correctly, you may have to logout and back in a second time. This can happen if the icon was incorrectly cached while testing out images.

David Foerster
  • 36,890
  • 56
  • 97
  • 151
tresf
  • 1,072
0

I've found the app Pin It! by Ryo Nakano ( https://ryonakano.github.io/ ) a perfect solution

jmora
  • 1
0
#!/bin/bash

# Script to create a .desktop file for an application using Zenity GUI

# Check if Zenity is installed
if ! command -v zenity &> /dev/null; then
    echo "Zenity is not installed. Please install it to run this GUI script."
    echo "On Debian/Ubuntu: sudo apt install zenity"
    echo "On Fedora: sudo dnf install zenity"
    echo "On Arch: sudo pacman -S zenity"
    exit 1
fi
# Get Application Details via Zenity

APP_NAME=$(zenity --entry \
    --title="Application Name" \
    --text="Enter the Application Name (e.g., MyCustomApp):" \
    --width=400 \
    --height=100)

if [ -z "$APP_NAME" ]; then
    zenity --error --title="Error" --text="Application Name cannot be empty. Exiting."
    exit 1
fi

EXEC_PATH=$(zenity --file-selection \
    --title="Select Application Executable" \
    --file-filter="Executables | *.sh *.py *.pl *.AppImage *.*" \
    --confirm-overwrite) # Allow selecting any file type

if [ -z "$EXEC_PATH" ]; then
    zenity --error --title="Error" --text="Executable path cannot be empty. Exiting."
    exit 1
fi

APP_COMMENT=$(zenity --entry \
    --title="Application Description" \
    --text="Enter a short description for the application:")

ICON_PATH=$(zenity --file-selection \
    --title="Select Application Icon" \
    --file-filter="Images | *.png *.svg *.xpm *.jpg *.jpeg *.gif" \
    --file-filter="All Files | *.*")

# Optional: Suggest common icon directories
if [ -z "$ICON_PATH" ]; then
    zenity --question \
        --title="Icon Path" \
        --text="No icon selected. Do you want to try a standard icon name (e.g., 'firefox') instead of a file path?"
    if [ $? -eq 0 ]; then
        ICON_PATH=$(zenity --entry \
            --title="Icon Name" \
            --text="Enter a standard icon name (e.g., firefox, gimp):")
        if [ -z "$ICON_PATH" ]; then
            zenity --warning --title="Warning" --text="No icon specified. The application may appear without an icon."
            ICON_PATH="" # Ensure it's empty if user backs out
        fi
    else
        zenity --warning --title="Warning" --text="No icon specified. The application may appear without an icon."
        ICON_PATH="" # Ensure it's empty if user backs out
    fi
fi

CATEGORIES=$(zenity --entry \
    --title="Application Categories" \
    --text="Enter Categories (comma-separated, e.g., Utility;Development;Game;)\n(See https://specifications.freedesktop.org/menu-spec/latest/apa.html for a list of categories):")

# Determine Terminal Requirement 
RUN_IN_TERMINAL=$(zenity --question \
    --title="Terminal Requirement" \
    --text="Does this application need to run in a terminal?")

TERMINAL_SETTING="false"
if [ $? -eq 0 ]; then # Zenity returns 0 for OK/Yes, 1 for Cancel/No
    TERMINAL_SETTING="true"
fi

# Creates the .desktop File Content 

DESKTOP_FILE_CONTENT="[Desktop Entry]
Name=${APP_NAME}
Comment=${APP_COMMENT}
Exec=${EXEC_PATH}
Icon=${ICON_PATH}
Terminal=${TERMINAL_SETTING}
Type=Application
Categories=${CATEGORIES}
"

# Choose Installation Location

INSTALL_LOCATION_CHOICE=$(zenity --list \
    --title="Installation Location" \
    --text="Where do you want to install the .desktop file?" \
    --radiolist \
    --column="Choice" --column="Location" \
    TRUE "For current user only (~/.local/share/applications/)" \
    FALSE "For all users (requires root privileges - /usr/share/applications/)")

DESKTOP_DIR=""
if [ "$INSTALL_LOCATION_CHOICE" == "For current user only (~/.local/share/applications/)" ]; then
    DESKTOP_DIR="$HOME/.local/share/applications"
elif [ "$INSTALL_LOCATION_CHOICE" == "For all users (requires root privileges - /usr/share/applications/)" ]; then
    DESKTOP_DIR="/usr/share/applications"
else
    zenity --error --title="Error" --text="Invalid choice for installation location. Exiting."
    exit 1
fi

# Creates a directory if it doesn't exist
mkdir -p "$DESKTOP_DIR"

DESKTOP_FILE_PATH="${DESKTOP_DIR}/${APP_NAME}.desktop"

# Deprecated for pkexec can still use sudo tee if you want
#if [ "$INSTALL_LOCATION_CHOICE" == "For all users (requires root privileges - /usr/share/applications/)" ]; then
   # echo "$DESKTOP_FILE_CONTENT" | sudo tee "$DESKTOP_FILE_PATH" > /dev/null
    #if [ $? -ne 0 ]; then
        #zenity --error --title="Error" --text="Failed to write desktop file to system-wide location. You may need to enter your password for 'sudo'."
        #exit 1
    #fi
    #sudo chmod +x "$DESKTOP_FILE_PATH"
#else
    #echo "$DESKTOP_FILE_CONTENT" > "$DESKTOP_FILE_PATH"
    #chmod +x "$DESKTOP_FILE_PATH"
#fi
if [ "$INSTALL_LOCATION_CHOICE" == "For all users (requires root privileges - /usr/share/applications/)" ]; then
    # Creates a temporary file to hold content
    TEMP_DESKTOP_FILE=$(mktemp)
    echo "$DESKTOP_FILE_CONTENT" > "$TEMP_DESKTOP_FILE"

    # Uses pkexec to copy and set permissions
    pkexec cp "$TEMP_DESKTOP_FILE" "$DESKTOP_FILE_PATH"
    if [ $? -ne 0 ]; then
        zenity --error --title="Error" --text="Failed to copy desktop file with root privileges. pkexec failed."
        rm "$TEMP_DESKTOP_FILE"
        exit 1
    fi
    pkexec chmod +x "$DESKTOP_FILE_PATH"

    rm "$TEMP_DESKTOP_FILE" # Clean up temp file
else
    echo "$DESKTOP_FILE_CONTENT" > "$DESKTOP_FILE_PATH"
    chmod +x "$DESKTOP_FILE_PATH"
fi

zenity --info --title="Success" --text="Desktop file created successfully!\nPath: ${DESKTOP_FILE_PATH}"

# Optional: Update Desktop Database (for some desktop environments) 
zenity --info --title="Updating Cache" --text="Attempting to update desktop icon cache (may require root for system-wide changes)..."

if command -v update-desktop-database &> /dev/null; then
    if [ "$INSTALL_LOCATION_CHOICE" == "For all users (requires root privileges - /usr/share/applications/)" ]; then
        sudo update-desktop-database "$DESKTOP_DIR"
    else
        update-desktop-database "$DESKTOP_DIR"
    fi
else
    zenity --warning --title="Warning" --text="update-desktop-database command not found. You may need to manually update or log out/in."
fi

zenity --info \
    --title="Completion" \
    --text="Your application '${APP_NAME}' should now appear in your application menu.\n\nIf it doesn't, try logging out and logging back in, or restarting your desktop environment."

exit 0 

To make the process 'less' tedious here is a code sample just basic interface but hey it works.. Just save it as an sh file and give it executable permission.

OR just download the file and set executable permission Appimage Integrator