Skip to content

Commit 181f515

Browse files
authored
Merge pull request #237 from kdroidFilter/fix-Duplicate-Class-Implementation-Warning-on-macOS-Tray()-Initialization
Fix Duplicate Class Implementation Warning on macOS Tray() Initialization
2 parents 8c4d2e9 + 60debdb commit 181f515

4 files changed

Lines changed: 26 additions & 6 deletions

File tree

src/commonMain/kotlin/com/kdroid/composetray/lib/mac/MacOSMenuBarThemeDetector.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import com.kdroid.composetray.lib.mac.MacTrayManager.MacTrayLibrary
1111

1212
object MacOSMenuBarThemeDetector {
1313

14-
private val trayLib: MacTrayLibrary = Native.load("MacTray", MacTrayLibrary::class.java)
14+
private val trayLib: MacTrayLibrary = MacTrayLoader.lib
1515

1616
private val listeners: MutableSet<Consumer<Boolean>> = ConcurrentHashMap.newKeySet()
1717

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.kdroid.composetray.lib.mac
2+
3+
import com.kdroid.composetray.lib.mac.MacTrayManager.MacTrayLibrary
4+
import com.sun.jna.Native
5+
6+
/**
7+
* Centralized, process-wide loader for the macOS native tray library.
8+
*
9+
* JNA will otherwise extract the bundled dylib to a temporary, uniquely-named file
10+
* for each independent load request. Loading the same library multiple times can
11+
* lead to duplicate Objective‑C/Swift class definitions (e.g., MenuDelegate),
12+
* causing warnings and potential crashes on macOS.
13+
*
14+
* By exposing a single lazy-loaded instance, we ensure the library is loaded
15+
* exactly once per process and all callers reuse the same handle.
16+
*/
17+
internal object MacTrayLoader {
18+
val lib: MacTrayLibrary by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
19+
Native.load("MacTray", MacTrayLibrary::class.java)
20+
}
21+
}

src/commonMain/kotlin/com/kdroid/composetray/lib/mac/MacTrayManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ internal class MacTrayManager(
2121
private var tooltip: String = "",
2222
onLeftClick: (() -> Unit)? = null
2323
) {
24-
private val trayLib: MacTrayLibrary = Native.load("MacTray", MacTrayLibrary::class.java)
24+
private val trayLib: MacTrayLibrary = MacTrayLoader.lib
2525
private var tray: MacTray? = null
2626
private val menuItems: MutableList<MenuItem> = mutableListOf()
2727
private val running = AtomicBoolean(false)

src/commonMain/kotlin/com/kdroid/composetray/utils/TrayPosition.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.kdroid.composetray.utils
33
import com.kdroid.composetray.lib.windows.WindowsNativeTrayLibrary
44
import androidx.compose.ui.unit.dp
55
import androidx.compose.ui.window.WindowPosition
6+
import com.kdroid.composetray.lib.mac.MacTrayLoader
67
import com.kdroid.composetray.lib.mac.MacTrayManager
78
import com.sun.jna.Native
89
import com.sun.jna.ptr.IntByReference
@@ -134,8 +135,7 @@ fun getTrayPosition(): TrayPosition {
134135
return getWindowsTrayPosition(trayLib.tray_get_notification_icons_region())
135136
}
136137
OperatingSystem.MACOS -> {
137-
val lib: MacTrayManager.MacTrayLibrary =
138-
Native.load("MacTray", MacTrayManager.MacTrayLibrary::class.java)
138+
val lib = MacTrayLoader.lib
139139
return getMacTrayPosition(lib.tray_get_status_item_region())
140140
}
141141
OperatingSystem.LINUX -> {
@@ -355,8 +355,7 @@ internal fun getMacTrayPosition(nativeResult: String?): TrayPosition = when (nat
355355
internal fun getStatusItemXYForMac(): Pair<Int, Int> {
356356
val xRef = IntByReference()
357357
val yRef = IntByReference()
358-
val lib: MacTrayManager.MacTrayLibrary =
359-
Native.load("MacTray", MacTrayManager.MacTrayLibrary::class.java)
358+
val lib = MacTrayLoader.lib
360359

361360
val precise = lib.tray_get_status_item_position(xRef, yRef) != 0
362361
return xRef.value to yRef.value // si !precise, valeurs = (0,0)

0 commit comments

Comments
 (0)