From bbff68c85b09a2ff68502068d7df589f8dce881a Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Sat, 30 May 2026 13:09:15 -0700 Subject: [PATCH] fix: trim small macOS app icon slots (#3896) --- resources/build/icon.icns | Bin 644978 -> 647652 bytes resources/icon-source/generate.sh | 47 +++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/resources/build/icon.icns b/resources/build/icon.icns index 097c8cef8c122b05d53d2af4bdae54ecc490041c..dc390835b5b26da1c8f2bfb2f13c529259ffd263 100644 GIT binary patch delta 9899 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 Z_i-Kb>t+#e5YeIdmk-|`_OE8=-vC~t4oCn1 delta 7192 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 diff --git a/resources/icon-source/generate.sh b/resources/icon-source/generate.sh index 5255ca1a301..d8377345a51 100755 --- a/resources/icon-source/generate.sh +++ b/resources/icon-source/generate.sh @@ -12,6 +12,13 @@ TMP_DIR=$(mktemp -d) trap 'rm -rf "$TMP_DIR"' EXIT +MAGICK_BIN=$(command -v magick || true) +if [ -z "$MAGICK_BIN" ]; then + echo "Error: ImageMagick is required to trim the small macOS icon slots." >&2 + echo "Install with: brew install imagemagick" >&2 + exit 1 +fi + echo "Compiling icon from $ICON_SOURCE..." # Generate .icns using actool (requires Xcode) @@ -29,22 +36,42 @@ if [ ! -f "$TMP_DIR/icon.icns" ]; then fi cp "$TMP_DIR/icon.icns" "$BUILD_DIR/icon.icns" + +# macOS list views use the small .icns slots directly. Icon Composer keeps the +# safe-area inset there, so trim only those slots while preserving larger icons. +ICONSET_DIR="$TMP_DIR/icon.iconset" +iconutil -c iconset "$BUILD_DIR/icon.icns" -o "$ICONSET_DIR" +for icon_file in \ + icon_16x16.png \ + icon_16x16@2x.png \ + icon_32x32.png \ + icon_32x32@2x.png; do + case "$icon_file" in + icon_16x16.png) icon_size=16 ;; + icon_16x16@2x.png | icon_32x32.png) icon_size=32 ;; + icon_32x32@2x.png) icon_size=64 ;; + esac + "$MAGICK_BIN" "$ICONSET_DIR/$icon_file" \ + -trim +repage \ + -resize "${icon_size}x${icon_size}" \ + -background none \ + -gravity center \ + -extent "${icon_size}x${icon_size}" \ + "$ICONSET_DIR/$icon_file" +done +iconutil -c icns "$ICONSET_DIR" -o "$BUILD_DIR/icon.icns" echo " -> resources/build/icon.icns" -# Extract 1024x1024 PNG from icns for electron-builder fallback & resources -sips -s format png --resampleWidth 1024 "$BUILD_DIR/icon.icns" --out "$BUILD_DIR/icon.png" >/dev/null 2>&1 +# Extract PNG fallbacks from the unmodified compiled icon; small-slot trimming is +# only for the macOS .icns list representations. +sips -s format png --resampleWidth 1024 "$TMP_DIR/icon.icns" --out "$BUILD_DIR/icon.png" >/dev/null 2>&1 echo " -> resources/build/icon.png (1024x1024)" -sips -s format png --resampleWidth 256 "$BUILD_DIR/icon.icns" --out "$RESOURCES_DIR/icon.png" >/dev/null 2>&1 +sips -s format png --resampleWidth 256 "$TMP_DIR/icon.icns" --out "$RESOURCES_DIR/icon.png" >/dev/null 2>&1 echo " -> resources/icon.png (256x256)" # Generate .ico for Windows (proper ICO format with multiple sizes) -if command -v magick &>/dev/null; then - magick "$BUILD_DIR/icon.png" -define icon:auto-resize=256,128,64,48,32,16 "$BUILD_DIR/icon.ico" - echo " -> resources/build/icon.ico (multi-size ICO via ImageMagick)" -else - echo "Warning: ImageMagick not found, skipping icon.ico generation" >&2 - echo "Install with: brew install imagemagick" >&2 -fi +"$MAGICK_BIN" "$BUILD_DIR/icon.png" -define icon:auto-resize=256,128,64,48,32,16 "$BUILD_DIR/icon.ico" +echo " -> resources/build/icon.ico (multi-size ICO via ImageMagick)" echo "Done! Icons generated in resources/build/ and resources/"