Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions Scripts/compile_and_run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,27 @@ SIGNING_MODE="${CODEXBAR_SIGNING:-}"
log() { printf '%s\n' "$*"; }
fail() { printf 'ERROR: %s\n' "$*" >&2; exit 1; }

# Ensure Swift >= 5.5 (required for --arch flag in swift build)
ensure_swift_version() {
local swift_ver
swift_ver=$(swift --version 2>&1 | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?' | head -1)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve xcrun fallback when PATH lacks swift

With set -euo pipefail enabled, swift_ver=$(swift --version ... | grep ... | head -1) aborts the script immediately if swift is not on PATH, so the intended Xcode fallback (xcrun --find swift) never runs. This makes compile_and_run.sh fail in environments where only xcrun swift is available (for example, sanitized CI/login shells), even though the script now claims to support that fallback path.

Useful? React with 👍 / 👎.

local major minor
major=$(echo "$swift_ver" | cut -d. -f1)
minor=$(echo "$swift_ver" | cut -d. -f2)
if [[ "${major:-0}" -ge 6 ]] || { [[ "${major:-0}" -eq 5 ]] && [[ "${minor:-0}" -ge 5 ]]; }; then
return 0
fi
# Try Xcode toolchain
local xcrun_swift
xcrun_swift=$(xcrun --find swift 2>/dev/null || true)
if [[ -n "$xcrun_swift" && -x "$xcrun_swift" ]]; then
log "WARN: PATH swift is v${swift_ver}; switching to Xcode toolchain at $(dirname "$xcrun_swift")"
export PATH="$(dirname "$xcrun_swift"):$PATH"
return 0
fi
fail "Swift >= 5.5 required (found ${swift_ver:-none}). Install Xcode or update swiftly."
}

has_signing_identity() {
local identity="${1:-}"
if [[ -z "${identity}" ]]; then
Expand Down Expand Up @@ -163,6 +184,7 @@ for arg in "$@"; do
esac
done

ensure_swift_version
resolve_signing_mode
if [[ "${SIGNING_MODE}" == "adhoc" ]]; then
log "==> Signing: adhoc (set APP_IDENTITY or install a dev cert to avoid keychain prompts)"
Expand Down
46 changes: 28 additions & 18 deletions Sources/CodexBar/PreferencesProviderSidebarView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,26 +13,36 @@ struct ProviderSidebarListView: View {
@State private var draggingProvider: UsageProvider?

var body: some View {
List(selection: self.$selection) {
ForEach(self.providers, id: \.self) { provider in
ProviderSidebarRowView(
provider: provider,
store: self.store,
isEnabled: self.isEnabled(provider),
subtitle: self.subtitle(provider),
draggingProvider: self.$draggingProvider)
.tag(provider)
.onDrop(
of: [UTType.plainText],
delegate: ProviderSidebarDropDelegate(
item: provider,
providers: self.providers,
dragging: self.$draggingProvider,
moveProviders: self.moveProviders))
ScrollView {
VStack(spacing: 0) {
ForEach(self.providers, id: \.self) { provider in
ProviderSidebarRowView(
provider: provider,
store: self.store,
isEnabled: self.isEnabled(provider),
subtitle: self.subtitle(provider),
draggingProvider: self.$draggingProvider)
.padding(.horizontal, 8)
.background(
RoundedRectangle(cornerRadius: 6, style: .continuous)
.fill(
self.selection == provider
? Color(nsColor: .selectedContentBackgroundColor)
: Color.clear)
.padding(.horizontal, 4))
.contentShape(Rectangle())
.onTapGesture { self.selection = provider }
.onDrop(
of: [UTType.plainText],
delegate: ProviderSidebarDropDelegate(
item: provider,
providers: self.providers,
dragging: self.$draggingProvider,
moveProviders: self.moveProviders))
}
}
.padding(.vertical, 4)
}
.listStyle(.sidebar)
.scrollContentBackground(.hidden)
.background(
RoundedRectangle(cornerRadius: ProviderSettingsMetrics.sidebarCornerRadius, style: .continuous)
.fill(.regularMaterial))
Expand Down
31 changes: 30 additions & 1 deletion Sources/CodexBar/PreferencesView.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import AppKit
import SwiftUI

enum PreferencesTab: String, Hashable {
enum PreferencesTab: String, CaseIterable, Hashable {
case general
case providers
case display
Expand All @@ -13,6 +13,17 @@ enum PreferencesTab: String, Hashable {
static let providersWidth: CGFloat = 720
static let windowHeight: CGFloat = 580

var title: String {
switch self {
case .general: "General"
case .providers: "Providers"
case .display: "Display"
case .advanced: "Advanced"
case .about: "About"
case .debug: "Debug"
}
}

var preferredWidth: CGFloat {
self == .providers ? PreferencesTab.providersWidth : PreferencesTab.defaultWidth
}
Expand Down Expand Up @@ -84,6 +95,24 @@ struct PreferencesView: View {
} else {
change()
}
Self.resizeSettingsWindow(width: tab.preferredWidth, height: tab.preferredHeight, animate: animate)
}

private static let settingsWindowIdentifier = "com_apple_SwiftUI_Settings_window"
private static let knownTabTitles = Set(PreferencesTab.allCases.map(\.title))

private static func resizeSettingsWindow(width: CGFloat, height: CGFloat, animate: Bool) {
guard let window = NSApp.windows.first(where: {
$0.identifier?.rawValue == settingsWindowIdentifier
|| knownTabTitles.contains($0.title)
}) else { return }
let toolbarHeight = window.frame.height - window.contentLayoutRect.height
guard toolbarHeight > 0 else { return }
let newSize = NSSize(width: width, height: height + toolbarHeight)
var frame = window.frame
frame.origin.y += frame.size.height - newSize.height
frame.size = newSize
window.setFrame(frame, display: true, animate: animate)
}

private func ensureValidTabSelection() {
Expand Down
Loading