From 16a551355b3af05038c3f676a38a2a38dfa8f5a3 Mon Sep 17 00:00:00 2001 From: thinktankmachine Date: Thu, 28 Aug 2025 16:56:51 +1000 Subject: [PATCH] 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. --- flake.nix | 90 ++++++++++++++++++++++++++++++++++++++++-------- update-cursor.sh | 13 +++++++ 2 files changed, 89 insertions(+), 14 deletions(-) diff --git a/flake.nix b/flake.nix index 19972e6..daf256e 100644 --- a/flake.nix +++ b/flake.nix @@ -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} = { diff --git a/update-cursor.sh b/update-cursor.sh index 390036c..f17ebd7 100755 --- a/update-cursor.sh +++ b/update-cursor.sh @@ -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!"