Three bugs made the toggle appear dead: the result window never activated the LSUIElement app, so the first click was consumed; the hosting controller's Auto Layout fitting size shrank the window when the layout branch changed; and SwiftUI's displayScale environment does not reliably track the window's display on macOS. The window now activates before ordering front, the hosting view is attached directly as the contentView (no fitting-size constraints), and the actual-size scale comes from the window's backingScaleFactor (updated when it moves between displays). Generated with OpenCode Assisted-by: Kimi:k3
138 lines
4.6 KiB
Bash
Executable File
138 lines
4.6 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")"
|
|
|
|
swift build -c release
|
|
|
|
BIN=".build/release/Kapture"
|
|
APP="Kapture.app"
|
|
CERT="kapture-dev"
|
|
SIGN_DIR="$HOME/.config/kapture"
|
|
KEYCHAIN="$SIGN_DIR/signing.keychain-db"
|
|
KCHAIN_PASS="kapture-dev"
|
|
mkdir -p "$SIGN_DIR"
|
|
|
|
# Prefer a Developer ID Application identity (login keychain) so the app gets
|
|
# clean Gatekeeper behavior; fall back to the self-signed "kapture-dev" identity.
|
|
# Resolve by keychain path to avoid ambiguous matches.
|
|
DEV_IDENT=""
|
|
if command -v security >/dev/null 2>&1; then
|
|
DEV_IDENT=$(security find-identity -v -p codesigning 2>/dev/null | awk '/Developer ID Application:/ { print $2; exit }')
|
|
fi
|
|
SIGN_KEYCHAIN=""
|
|
if [ -n "$DEV_IDENT" ]; then
|
|
CERT="$DEV_IDENT"
|
|
echo "Using Developer ID identity: $CERT"
|
|
# Ensure the login keychain holding the Dev ID is unlocked & accessible.
|
|
security unlock-keychain "$HOME/Library/Keychains/login.keychain-db" 2>/dev/null || true
|
|
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "" "$HOME/Library/Keychains/login.keychain-db" >/dev/null 2>&1 || true
|
|
SIGN_KEYCHAIN="$HOME/Library/Keychains/login.keychain-db"
|
|
else
|
|
CERT="kapture-dev"
|
|
echo "Using self-signed identity 'kapture-dev'"
|
|
SIGN_KEYCHAIN="$KEYCHAIN"
|
|
fi
|
|
DEV_IDENT="${DEV_IDENT:-}" # ensure set for later use
|
|
|
|
if [ ! -f "$KEYCHAIN" ]; then
|
|
security create-keychain -p "$KCHAIN_PASS" "$KEYCHAIN" 2>/dev/null
|
|
security set-keychain-settings -lut 86400 "$KEYCHAIN"
|
|
fi
|
|
security unlock-keychain -p "$KCHAIN_PASS" "$KEYCHAIN" 2>/dev/null || true
|
|
|
|
if ! security find-identity -p codesigning "$KEYCHAIN" 2>/dev/null | grep -q "kapture-dev"; then
|
|
echo "Creating self-signed code signing identity '$CERT' (one-time)..."
|
|
TMP=$(mktemp -d)
|
|
trap 'rm -rf "$TMP"' EXIT
|
|
cat > "$TMP/cert.cnf" <<'CNF'
|
|
[ req ]
|
|
distinguished_name = dn
|
|
x509_extensions = v3
|
|
prompt = no
|
|
|
|
[ dn ]
|
|
CN = kapture-dev
|
|
|
|
[ v3 ]
|
|
basicConstraints = critical, CA:true
|
|
keyUsage = critical, digitalSignature
|
|
extendedKeyUsage = codeSigning
|
|
CNF
|
|
|
|
BREW_OPENSSL=""
|
|
if [ -x /opt/homebrew/bin/openssl ]; then
|
|
BREW_OPENSSL=/opt/homebrew/bin/openssl
|
|
elif [ -x /usr/local/bin/openssl ]; then
|
|
BREW_OPENSSL=/usr/local/bin/openssl
|
|
fi
|
|
|
|
if [ -n "$BREW_OPENSSL" ]; then
|
|
"$BREW_OPENSSL" req -x509 -newkey rsa:2048 -nodes -days 3650 \
|
|
-keyout "$TMP/key.pem" -out "$TMP/cert.pem" \
|
|
-config "$TMP/cert.cnf" 2>/dev/null
|
|
"$BREW_OPENSSL" pkcs12 -export -legacy \
|
|
-inkey "$TMP/key.pem" -in "$TMP/cert.pem" \
|
|
-out "$TMP/cert.p12" -passout pass:kapture 2>/dev/null
|
|
security import "$TMP/cert.p12" -k "$KEYCHAIN" \
|
|
-P kapture -T /usr/bin/codesign 2>/dev/null
|
|
else
|
|
openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \
|
|
-keyout "$TMP/key.pem" -out "$TMP/cert.pem" \
|
|
-config "$TMP/cert.cnf" 2>/dev/null
|
|
openssl x509 -in "$TMP/cert.pem" -outform der -out "$TMP/cert.der" 2>/dev/null
|
|
openssl pkcs8 -topk8 -nocrypt -in "$TMP/key.pem" -outform der -out "$TMP/key.der" 2>/dev/null
|
|
security add-certificates -k "$KEYCHAIN" "$TMP/cert.der" 2>/dev/null
|
|
security import "$TMP/key.der" -k "$KEYCHAIN" -T /usr/bin/codesign 2>/dev/null
|
|
fi
|
|
fi
|
|
|
|
rm -rf "$APP"
|
|
mkdir -p "$APP/Contents/MacOS"
|
|
cp "$BIN" "$APP/Contents/MacOS/Kapture"
|
|
|
|
cat > "$APP/Contents/Info.plist" <<'PLIST'
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>CFBundleExecutable</key>
|
|
<string>Kapture</string>
|
|
<key>CFBundleIdentifier</key>
|
|
<string>dev.tzgyn.kapture</string>
|
|
<key>CFBundleInfoDictionaryVersion</key>
|
|
<string>6.0</string>
|
|
<key>CFBundleName</key>
|
|
<string>Kapture</string>
|
|
<key>CFBundlePackageType</key>
|
|
<string>APPL</string>
|
|
<key>CFBundleIconFile</key>
|
|
<string>Icon</string>
|
|
<key>CFBundleShortVersionString</key>
|
|
<string>1.11.2</string>
|
|
<key>CFBundleVersion</key>
|
|
<string>112</string>
|
|
<key>LSUIElement</key>
|
|
<true/>
|
|
<key>NSHighResolutionCapable</key>
|
|
<true/>
|
|
<key>NSPrincipalClass</key>
|
|
<string>NSApplication</string>
|
|
</dict>
|
|
</plist>
|
|
PLIST
|
|
|
|
chmod +x scripts/make-icon.sh
|
|
./scripts/make-icon.sh
|
|
|
|
if [ -n "$SIGN_KEYCHAIN" ]; then
|
|
codesign --force --options runtime --sign "$CERT" --keychain "$SIGN_KEYCHAIN" "$APP"
|
|
else
|
|
codesign --force --sign "$CERT" "$APP"
|
|
fi
|
|
|
|
if [ -n "$DEV_IDENT" ]; then
|
|
echo "Built $APP (signed with Developer ID '$CERT') — drag to /Applications or run: open $APP"
|
|
else
|
|
echo "Built $APP (signed with stable identity '$CERT') — drag to /Applications or run: open $APP"
|
|
fi
|