diff --git a/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/Bridge.kt b/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/Bridge.kt index efb7fb140..0e4337cfa 100644 --- a/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/Bridge.kt +++ b/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/Bridge.kt @@ -1,6 +1,7 @@ package org.jetbrains.jewel.bridge import com.intellij.ide.ui.LafManagerListener +import com.intellij.ide.ui.UISettingsListener import com.intellij.openapi.application.Application import com.intellij.openapi.application.ApplicationManager import com.intellij.util.messages.MessageBus @@ -12,6 +13,7 @@ import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.shareIn @@ -21,11 +23,16 @@ internal val IntelliJApplication: Application private fun Application.lookAndFeelFlow(scope: CoroutineScope): Flow = messageBus.flow(LafManagerListener.TOPIC, scope) { LafManagerListener { trySend(Unit) } } +private fun Application.uiSettingsFlow(scope: CoroutineScope): Flow = + messageBus.flow(UISettingsListener.TOPIC, scope) { + UISettingsListener { trySend(Unit) } + } + internal fun Application.lookAndFeelChangedFlow( scope: CoroutineScope, sharingStarted: SharingStarted = SharingStarted.Eagerly, ): Flow = - lookAndFeelFlow(scope).onStart { emit(Unit) } + merge(lookAndFeelFlow(scope), uiSettingsFlow(scope)).onStart { emit(Unit) } .shareIn(scope, sharingStarted, replay = 1) internal fun MessageBus.flow( diff --git a/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/BridgeUtils.kt b/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/BridgeUtils.kt index 643c2dfdb..c5af6080d 100644 --- a/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/BridgeUtils.kt +++ b/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/BridgeUtils.kt @@ -7,6 +7,10 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.graphics.TileMode import androidx.compose.ui.text.ExperimentalTextApi +import androidx.compose.ui.text.FontRasterizationSettings +import androidx.compose.ui.text.FontSmoothing +import androidx.compose.ui.text.PlatformParagraphStyle +import androidx.compose.ui.text.PlatformTextStyle import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight @@ -19,7 +23,9 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.isUnspecified import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.takeOrElse +import com.intellij.ide.ui.AntialiasingType import com.intellij.ide.ui.LafManager +import com.intellij.ide.ui.UISettings import com.intellij.ide.ui.UISettingsUtils import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.colors.EditorColorsManager @@ -175,6 +181,9 @@ public fun retrieveTextStyle( ): TextStyle { val lafFont = UIManager.getFont(key) ?: keyNotFound(key, "Font") val jbFont = JBFont.create(lafFont, false) + val uiSettings = UISettings.instanceOrNull + val aa = uiSettings?.ideAAType ?: AntialiasingType.GREYSCALE + val platformDefaultFontRasterization = FontRasterizationSettings.PlatformDefault val derivedFont = jbFont.let { if (bold) it.asBold() else it.asPlain() } .let { if (fontStyle == FontStyle.Italic) it.asItalic() else it } @@ -187,9 +196,27 @@ public fun retrieveTextStyle( fontFamily = derivedFont.asComposeFontFamily(), // TODO textDecoration might be defined in the AWT theme lineHeight = lineHeight, + platformStyle = PlatformTextStyle( + null, + paragraphStyle = PlatformParagraphStyle( + fontRasterizationSettings = FontRasterizationSettings( + smoothing = aa.asComposeFontSmoothing(), + hinting = platformDefaultFontRasterization.hinting, + subpixelPositioning = platformDefaultFontRasterization.subpixelPositioning, + platformDefaultFontRasterization.autoHintingForced + ) + ), + ) ) } +@OptIn(ExperimentalTextApi::class) +private fun AntialiasingType.asComposeFontSmoothing(): FontSmoothing = when(this) { + AntialiasingType.GREYSCALE -> FontSmoothing.AntiAlias + AntialiasingType.SUBPIXEL -> FontSmoothing.SubpixelAntiAlias + AntialiasingType.OFF -> FontSmoothing.None +} + public val JBValue.dp: Dp get() = unscaled.dp