Add icon extraction and desktop entry support

- Extract icons from AppImage and install to standard locations
- Create proper desktop entry with icon reference
- Fix version handling in wrapper script
- Update update script to verify icon extraction
- Now provides complete desktop integration with proper icon display

Resolves icon display issues in desktop environments.
This commit is contained in:
thinktankmachine
2025-08-28 16:56:51 +10:00
parent f77f5b1131
commit 16a551355b
2 changed files with 89 additions and 14 deletions
+76 -14
View File
@@ -12,10 +12,17 @@
buildCursor = { version, url, sha256 }:
let
src = pkgs.fetchurl { inherit url sha256; };
# Extract the AppImage to get access to the icon and desktop file
appimageContents = pkgs.appimageTools.extract {
inherit version src;
pname = "cursor";
};
unwrapped = pkgs.appimageTools.wrapType2 {
pname = "cursor";
inherit version;
src = pkgs.fetchurl { inherit url sha256; };
inherit version src;
extraPkgs = p: with p; [
glib gtk3 cairo pango atk gdk-pixbuf
@@ -27,18 +34,73 @@
];
};
in
pkgs.writeShellScriptBin "cursor" ''
#!${pkgs.bash}/bin/bash
if [[ "$1" == "--version" || "$1" == "-v" ]]; then
echo "${version}"
exit 0
fi
export CURSOR_DISABLE_UPDATE="1"
export CURSOR_SKIP_UPDATE_CHECK="1"
export XDG_CACHE_HOME="$(mktemp -d -t cursor-xdg-cache-XXXXXX)"
export CURSOR_CACHE_DIR="$(mktemp -d -t cursor-cache-XXXXXX)"
exec "${unwrapped}/bin/cursor" "$@"
'';
pkgs.stdenv.mkDerivation {
pname = "cursor";
inherit version;
nativeBuildInputs = [ pkgs.makeWrapper ];
unpackPhase = "true";
installPhase = ''
mkdir -p $out/bin $out/share/applications $out/share/icons/hicolor/scalable/apps $out/share/icons/hicolor/256x256/apps $out/share/pixmaps
# Create version-aware wrapper script
cat > $out/bin/cursor << EOF
#!/usr/bin/env bash
if [[ "\$1" == "--version" || "\$1" == "-v" ]]; then
echo "${version}"
exit 0
fi
export CURSOR_DISABLE_UPDATE="1"
export CURSOR_SKIP_UPDATE_CHECK="1"
export XDG_CACHE_HOME="\$(mktemp -d -t cursor-xdg-cache-XXXXXX)"
export CURSOR_CACHE_DIR="\$(mktemp -d -t cursor-cache-XXXXXX)"
exec "${unwrapped}/bin/cursor" "\$@"
EOF
chmod +x $out/bin/cursor
# Extract and install icon (try multiple possible locations and formats)
if [ -f "${appimageContents}/cursor.png" ]; then
cp "${appimageContents}/cursor.png" $out/share/pixmaps/cursor.png
cp "${appimageContents}/cursor.png" $out/share/icons/hicolor/256x256/apps/cursor.png
elif [ -f "${appimageContents}/Cursor.png" ]; then
cp "${appimageContents}/Cursor.png" $out/share/pixmaps/cursor.png
cp "${appimageContents}/Cursor.png" $out/share/icons/hicolor/256x256/apps/cursor.png
elif [ -f "${appimageContents}/usr/share/pixmaps/cursor.png" ]; then
cp "${appimageContents}/usr/share/pixmaps/cursor.png" $out/share/pixmaps/cursor.png
cp "${appimageContents}/usr/share/pixmaps/cursor.png" $out/share/icons/hicolor/256x256/apps/cursor.png
elif [ -f "${appimageContents}/usr/share/icons/hicolor/256x256/apps/cursor.png" ]; then
cp "${appimageContents}/usr/share/icons/hicolor/256x256/apps/cursor.png" $out/share/pixmaps/cursor.png
cp "${appimageContents}/usr/share/icons/hicolor/256x256/apps/cursor.png" $out/share/icons/hicolor/256x256/apps/cursor.png
fi
# Try SVG icon as well
if [ -f "${appimageContents}/cursor.svg" ]; then
cp "${appimageContents}/cursor.svg" $out/share/icons/hicolor/scalable/apps/cursor.svg
elif [ -f "${appimageContents}/Cursor.svg" ]; then
cp "${appimageContents}/Cursor.svg" $out/share/icons/hicolor/scalable/apps/cursor.svg
elif [ -f "${appimageContents}/usr/share/icons/hicolor/scalable/apps/cursor.svg" ]; then
cp "${appimageContents}/usr/share/icons/hicolor/scalable/apps/cursor.svg" $out/share/icons/hicolor/scalable/apps/cursor.svg
fi
# Create desktop entry
cat > $out/share/applications/cursor.desktop << EOF
[Desktop Entry]
Name=Cursor
Comment=AI-powered code editor
GenericName=Text Editor
Exec=$out/bin/cursor %F
Icon=cursor
Type=Application
StartupNotify=true
MimeType=text/plain;text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/javascript;application/json;text/x-markdown;text/x-web-markdown;text/html;text/css;text/x-sql;text/x-diff;
Categories=Development;IDE;
Keywords=editor;development;programming;ide;
StartupWMClass=Cursor
EOF
'';
};
in
{
packages.${system} = {
+13
View File
@@ -104,6 +104,19 @@ if nix build .#cursor; then
else
print_warning "Version mismatch: expected $NEW_VERSION, got $BUILT_VERSION"
fi
# Check that icon and desktop entry were installed
if [[ -f "./result/share/pixmaps/cursor.png" ]]; then
print_success "Icon successfully extracted and installed!"
else
print_warning "Icon not found - might not display properly in desktop"
fi
if [[ -f "./result/share/applications/cursor.desktop" ]]; then
print_success "Desktop entry created!"
else
print_warning "Desktop entry not found"
fi
fi
else
print_error "Build failed!"