Files
kapture/build-app.sh
T
TZGyn e22bcb99c4 Make overlay panels activating so clicks are received
The session log showed active=false after every activation attempt on
macOS 26: cooperative activation is denied for LSUIElement apps, and an
inactive app's panels let clicks fall through to the windows below.
Remove .nonactivatingPanel so showing the overlay activates the app
(previous app focus is restored after capture as before).

💘 Generated with Crush

Assisted-by: Crush:deepseek-v4-flash-0731
2026-09-09 11:46:45 +08:00

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.6.3</string>
<key>CFBundleVersion</key>
<string>63</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