Skip to content
Merged
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
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
- Copilot: open the complete device-login verification URL when available so the browser flow carries the user code (#739). Thanks @skhe!
- Alibaba: update the China mainland Coding Plan endpoint and browser-cookie domain while keeping older domains as fallbacks (#712). Thanks @hezhongtang!

### Menu & Settings
- Settings: fix provider-sidebar clipping on macOS Tahoe and resize the Preferences window when switching tabs (#580). Thanks @chadneal!

### Fixes
- Keychain cache: preserve cached credentials when macOS temporarily denies keychain UI after wake, avoiding repeated prompts (#594). Thanks @josepe98!

Expand Down
28 changes: 28 additions & 0 deletions Scripts/compile_and_run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,33 @@ delete_keychain_service_items() {
done
}

# Ensure Swift >= 5.5 (required for --arch flag in swift build)
ensure_swift_version() {
local swift_output
local swift_ver
swift_output=$(swift --version 2>&1 || true)
if [[ "$swift_output" =~ (Apple[[:space:]]+)?Swift[[:space:]]+version[[:space:]]+([0-9]+)\.([0-9]+)(\.[0-9]+)? ]]; then
swift_ver="${BASH_REMATCH[2]}.${BASH_REMATCH[3]}${BASH_REMATCH[4]}"
else
fail "Swift >= 5.5 required (found ${swift_output:-none}). Install Xcode or update swiftly."
fi
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 @@ -173,6 +200,7 @@ for arg in "$@"; do
esac
done

ensure_swift_version
resolve_signing_mode
if [[ "${CLEAR_ADHOC_KEYCHAIN}" == "1" && "${SIGNING_MODE}" != "adhoc" ]]; then
fail "--clear-adhoc-keychain is only supported when using adhoc signing."
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(Color(nsColor: .controlBackgroundColor).opacity(0.8)))
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 @@ -110,6 +121,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