diff --git a/FchatiApp/Package.swift b/FchatiApp/Package.swift index 94f1cfe..7bdc10d 100644 --- a/FchatiApp/Package.swift +++ b/FchatiApp/Package.swift @@ -7,8 +7,7 @@ let package = Package( targets: [ .executableTarget( name: "FchatiApp", - path: "Sources/FchatiApp", - resources: [.process("Resources")] + path: "Sources/FchatiApp" ), .testTarget( name: "FchatiAppTests", diff --git a/FchatiApp/Sources/FchatiApp/Resources/MenuBarIcon.png b/FchatiApp/Resources/MenuBarIcon.png similarity index 100% rename from FchatiApp/Sources/FchatiApp/Resources/MenuBarIcon.png rename to FchatiApp/Resources/MenuBarIcon.png diff --git a/FchatiApp/Sources/FchatiApp/FchatiApp.swift b/FchatiApp/Sources/FchatiApp/FchatiApp.swift index da4890e..867a2a5 100644 --- a/FchatiApp/Sources/FchatiApp/FchatiApp.swift +++ b/FchatiApp/Sources/FchatiApp/FchatiApp.swift @@ -14,13 +14,24 @@ struct FchatiApp: App { RootView() .background(WindowConfigurator()) } label: { - Image("MenuBarIcon", bundle: .module) - .renderingMode(.original) + MenuBarIcon() } .menuBarExtraStyle(.window) } } +private struct MenuBarIcon: View { + var body: some View { + if let url = Bundle.main.url(forResource: "MenuBarIcon", withExtension: "png"), + let image = NSImage(contentsOf: url) { + Image(nsImage: image) + .renderingMode(.original) + } else { + Image(systemName: "message") + } + } +} + // Prevents the popover from closing when clicking outside. private struct WindowConfigurator: NSViewRepresentable { func makeNSView(context: Context) -> NSView { diff --git a/IMPLEMENTATION_STATUS.md b/IMPLEMENTATION_STATUS.md index a59df7c..0cfb565 100644 --- a/IMPLEMENTATION_STATUS.md +++ b/IMPLEMENTATION_STATUS.md @@ -200,7 +200,7 @@ - The macOS app now has an always-visible quit control beside the top-level tabs, in addition to the existing Settings action. - The macOS app now includes a normal main window and Dock presence while retaining the menu-bar shortcut. - `FchatiApp/Resources/AppIcon.png` and `FchatiApp/Resources/Fchati.icns` provide the bundled Dock and application icon, and the installer copies the icon into the application bundle. -- The supplied Teamwork Chat icon now replaces the app icon and provides the custom menu-bar icon through the Swift package resources; the installer copies that resource bundle into the application bundle. +- The supplied Teamwork Chat icon now replaces the app icon and provides the custom menu-bar icon from the signed application resources directory. ## Bug Fixes — Post-Review ✅ diff --git a/scripts/run-macos-app.sh b/scripts/run-macos-app.sh index 2875aa0..a2ed7cf 100755 --- a/scripts/run-macos-app.sh +++ b/scripts/run-macos-app.sh @@ -10,6 +10,7 @@ INSTALL_PATH="/Applications/Fchati.app" STAGING_DIR="$(mktemp -d "${TMPDIR:-/tmp}/fchati-install.XXXXXX")" STAGING_APP="$STAGING_DIR/Fchati.app" ICON_PATH="$PROJECT_DIR/Resources/Fchati.icns" +MENU_BAR_ICON_PATH="$PROJECT_DIR/Resources/MenuBarIcon.png" cleanup() { rm -rf "$STAGING_DIR" @@ -41,14 +42,13 @@ echo "Building the release executable..." swift build --configuration release --package-path "$PROJECT_DIR" EXECUTABLE_PATH="$PROJECT_DIR/.build/release/$PRODUCT_NAME" -RESOURCE_BUNDLE="$PROJECT_DIR/.build/release/FchatiApp_FchatiApp.bundle" if [[ ! -x "$EXECUTABLE_PATH" ]]; then echo "Release executable not found: $EXECUTABLE_PATH" >&2 exit 1 fi -if [[ ! -d "$RESOURCE_BUNDLE" ]]; then - echo "Application resource bundle not found: $RESOURCE_BUNDLE" >&2 +if [[ ! -f "$MENU_BAR_ICON_PATH" ]]; then + echo "Menu bar icon not found: $MENU_BAR_ICON_PATH" >&2 exit 1 fi @@ -57,7 +57,7 @@ mkdir -p "$STAGING_APP/Contents/MacOS" "$STAGING_APP/Contents/Resources" cp "$PROJECT_DIR/Info.plist" "$STAGING_APP/Contents/Info.plist" cp "$EXECUTABLE_PATH" "$STAGING_APP/Contents/MacOS/$PRODUCT_NAME" cp "$ICON_PATH" "$STAGING_APP/Contents/Resources/Fchati.icns" -cp -R "$RESOURCE_BUNDLE" "$STAGING_APP/Contents/Resources/" +cp "$MENU_BAR_ICON_PATH" "$STAGING_APP/Contents/Resources/MenuBarIcon.png" codesign --force --sign - --timestamp=none --entitlements "$PROJECT_DIR/FchatiApp.entitlements" "$STAGING_APP" if [[ -d "$INSTALL_PATH" ]]; then