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
7 changes: 6 additions & 1 deletion NotchIA/managers/FocusModeManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -931,7 +931,12 @@ final class ScreenRecordingManager: ObservableObject {

// Process spawning is blocked by app-sandbox, so we skip the replayd/lsof path entirely
// when sandboxed. Filesystem monitoring of the scratch dir is the sandbox-compatible signal.
private static let isSandboxed: Bool = {
//
// `nonisolated` requis : la classe est `@MainActor` donc ce static le serait
// implicitement, mais `runProcessDetached` (juste en-dessous) est `nonisolated`
// et doit pouvoir le lire. `ProcessInfo.environment` est thread-safe donc
// l'initialisation au premier accès est sûre depuis n'importe quel thread.
nonisolated private static let isSandboxed: Bool = {
ProcessInfo.processInfo.environment["APP_SANDBOX_CONTAINER_ID"] != nil
}()

Expand Down
19 changes: 15 additions & 4 deletions NotchIA/managers/MusicManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -586,11 +586,16 @@ class MusicManager: ObservableObject {

private func updateArtwork(_ artworkData: Data) {
// Decode artwork off the main actor, hop back on to mutate state.
// Re-capture [weak self] dans le bloc MainActor.run pour éviter le
// warning Swift 6 "reference to captured var 'self' in concurrently-
// executing code" — le `self?` traversait deux frontières de closure
// (Task.detached nonisolated → MainActor.run main).
Task.detached(priority: .userInitiated) { [weak self] in
guard let artworkImage = NSImage(data: artworkData) else { return }
await MainActor.run {
self?.usingAppIconForArtwork = false
self?.updateAlbumArt(newAlbumArt: artworkImage)
await MainActor.run { [weak self] in
guard let self else { return }
self.usingAppIconForArtwork = false
self.updateAlbumArt(newAlbumArt: artworkImage)
}
}
}
Expand Down Expand Up @@ -763,7 +768,13 @@ class MusicManager: ObservableObject {
private func startShuffleRepeatPoll() {
shuffleRepeatPollTimer?.invalidate()
shuffleRepeatPollTimer = Timer.scheduledTimer(withTimeInterval: 2.5, repeats: true) { [weak self] _ in
self?.forceUpdate()
// `forceUpdate()` est @MainActor — wrap dans Task { @MainActor in }
// pour respecter l'isolation (le callback Timer est nonisolated même
// si la RunLoop est main). Évite le warning Swift 6 "call to main
// actor-isolated instance method in a synchronous nonisolated context".
Task { @MainActor in
self?.forceUpdate()
}
}
}

Expand Down
20 changes: 10 additions & 10 deletions updater/appcast.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,16 @@
-->
<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0">
<channel>
<item>
<title>2.8.1</title>
<pubDate>Sun, 17 May 2026 17:45:44 +0000</pubDate>
<link>https://github.com/coaxel2/NotchIA/releases</link>
<sparkle:version>20801</sparkle:version>
<sparkle:shortVersionString>2.8.1</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
<description><![CDATA[Same as #15 but PR didn't make it before auto-merge. Includes bell.fill + 4 Swift 6 cleanups.]]></description>
<enclosure url="https://github.com/coaxel2/NotchIA/releases/download/v2.8.1/NotchIA.dmg" length="13236266" type="application/octet-stream" sparkle:edSignature="arSSr8PAhFZ0aeJzOjFkwVsjwW3mUCBMp+uqxlAhQiWDAPnKZk4H/8Db9wGOKeB00TvjdH5jZwXulpbk237PCA=="/>
</item>
<item>
<title>2.8.0</title>
<pubDate>Sat, 16 May 2026 16:56:37 +0000</pubDate>
Expand Down Expand Up @@ -348,16 +358,6 @@
<description><![CDATA[Removes SWIFT_REFLECTION_METADATA_LEVEL=none which was killing @EnvironmentObject lookup at runtime. Release build verified locally: 6+ seconds alive.]]></description>
<enclosure url="https://github.com/coaxel2/NotchIA/releases/download/v2.7.8/NotchIA.dmg" length="12484884" type="application/octet-stream" sparkle:edSignature="ceWHbwuLeeudFbFNfEiYqsd6v6OHJY2BjM6LZc9MpZRPZcycsiWTnZAj6X9qwkTTwX1g1DZQB3sWYzWKgSwJDA=="/>
</item>
<item>
<title>2.7.7</title>
<pubDate>Thu, 07 May 2026 12:40:54 +0000</pubDate>
<link>https://github.com/coaxel2/NotchIA/releases</link>
<sparkle:version>27</sparkle:version>
<sparkle:shortVersionString>2.7.7</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
<description><![CDATA[Defers SwiftUI hosting view creation in SettingsWindowController until NotchIAViewModel is injected. Tested locally: Debug build runs 6+ seconds without crashing.]]></description>
<enclosure url="https://github.com/coaxel2/NotchIA/releases/download/v2.7.7/NotchIA.dmg" length="12416665" type="application/octet-stream" sparkle:edSignature="z1LFdPn8I1ZTFxasebDEsc8oZUgAg+uQjr7RLepW/ozN2n4T0cvTIwHdusKWyrxcQ93cl5L8ntdFOQiUYS+ODA=="/>
</item>
<item>
<title>2.7.4-beta5</title>
<pubDate>Wed, 06 May 2026 18:55:17 +0000</pubDate>
Expand Down
Loading