mirror of
https://github.com/sudosylabs/vnidrop.git
synced 2026-08-05 02:29:55 +02:00
Polish native shell navigation
This commit is contained in:
@@ -11,6 +11,7 @@ dependencies {
|
||||
|
||||
implementation(compose.desktop.currentOs)
|
||||
implementation(libs.kotlinx.coroutinesSwing)
|
||||
implementation(libs.jna)
|
||||
|
||||
implementation(libs.compose.uiToolingPreview)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.vnidrop.app
|
||||
|
||||
import com.sun.jna.Library
|
||||
import com.sun.jna.Native
|
||||
import com.sun.jna.NativeLibrary
|
||||
import com.sun.jna.Pointer
|
||||
|
||||
internal object MacOsAppKitAppearance {
|
||||
private val objc: ObjCRuntime? by lazy {
|
||||
runCatching {
|
||||
NativeLibrary.getInstance("AppKit")
|
||||
Native.load("objc", ObjCRuntime::class.java)
|
||||
}.getOrNull()
|
||||
}
|
||||
|
||||
fun apply(isDarkTheme: Boolean) {
|
||||
if (!isMacOs()) return
|
||||
runCatching {
|
||||
val runtime = objc ?: return
|
||||
val applicationClass = runtime.objc_getClass("NSApplication") ?: return
|
||||
val appearanceClass = runtime.objc_getClass("NSAppearance") ?: return
|
||||
val application = runtime.objc_msgSend(applicationClass, runtime.sel_registerName("sharedApplication")) ?: return
|
||||
val appearanceName = nsString(runtime, macOsAppearanceName(isDarkTheme)) ?: return
|
||||
val appearance = runtime.objc_msgSend(
|
||||
appearanceClass,
|
||||
runtime.sel_registerName("appearanceNamed:"),
|
||||
appearanceName,
|
||||
) ?: return
|
||||
runtime.objc_msgSend(application, runtime.sel_registerName("setAppearance:"), appearance)
|
||||
}
|
||||
}
|
||||
|
||||
private fun macOsAppearanceName(isDarkTheme: Boolean): String =
|
||||
if (isDarkTheme) "NSAppearanceNameDarkAqua" else "NSAppearanceNameAqua"
|
||||
|
||||
private fun nsString(runtime: ObjCRuntime, value: String): Pointer? {
|
||||
val stringClass = runtime.objc_getClass("NSString") ?: return null
|
||||
return runtime.objc_msgSend(stringClass, runtime.sel_registerName("stringWithUTF8String:"), value)
|
||||
}
|
||||
|
||||
private fun isMacOs(): Boolean =
|
||||
System.getProperty("os.name").startsWith("Mac", ignoreCase = true)
|
||||
}
|
||||
|
||||
private interface ObjCRuntime : Library {
|
||||
fun objc_getClass(name: String): Pointer?
|
||||
fun sel_registerName(name: String): Pointer
|
||||
fun objc_msgSend(receiver: Pointer?, selector: Pointer?): Pointer?
|
||||
fun objc_msgSend(receiver: Pointer?, selector: Pointer?, argument: Pointer?): Pointer?
|
||||
fun objc_msgSend(receiver: Pointer?, selector: Pointer?, argument: String): Pointer?
|
||||
}
|
||||
@@ -2,9 +2,11 @@ package com.vnidrop.app
|
||||
|
||||
import androidx.compose.ui.window.Window
|
||||
import androidx.compose.ui.window.application
|
||||
import com.vnidrop.app.platform.DesktopAppearanceBridge
|
||||
|
||||
fun main() {
|
||||
configureMacOsNativeAppearance()
|
||||
DesktopAppearanceBridge.applyNativeAppearance = MacOsAppKitAppearance::apply
|
||||
application {
|
||||
Window(
|
||||
onCloseRequest = ::exitApplication,
|
||||
|
||||
Reference in New Issue
Block a user