HiDPI par moniteur
Drag une fenêtre entre un écran 4K et un 1080p — Tao met à jour la surface, Compose reste en Dp, le rendu reste net.
Les configurations à DPI mixtes sont la norme : un moniteur 4K à côté d'un laptop 1080p, scaling fractionnaire sous Linux, Retina miroir sur du non-Retina sur macOS. Le backend Tao suit l'output courant de chaque fenêtre et reconfigure sa surface de rendu à chaque changement de scale — Compose reste en Dp, le GPU rasterise à la bonne densité.
TL;DR
- Chaque fenêtre a son propre facteur de scale ; Tao le met à jour au déplacement entre moniteurs.
- Les valeurs Compose
Dprestent logiques — Skiko rasterise à la densité pixel de chaque fenêtre. - Marche sur macOS (Retina + arrangement d'écrans), Windows (Per-Monitor V2), Linux Wayland (
wp_fractional_scale_v1). - Pour les sessions X11, voir le module
linux-hidpi.
Install
Inclus avec decorated-window-tao. Aucun opt-in.
Comment ça marche
À l'ouverture d'un DecoratedWindow sur Tao, le backend demande à l'output actif son facteur de scale et configure la surface Skiko en conséquence — CAMetalLayer.contentsScale sur macOS, l'espace colorimétrique de la swapchain sur Windows, buffer scale EGL sur Wayland. La fenêtre native reçoit WindowEvent::ScaleFactorChanged chaque fois que l'utilisateur drag entre écrans, branche un moniteur ou change le scale système. Tao remonte ça à la ComposeScene, qui propage une nouvelle LocalDensity à les composables.
Conséquence pratique : Modifier.size(48.dp) vaut 48 dp sur un moniteur 1.0 (48 pixels), 96 dp sur un 2.0 (96 pixels), 72 dp sur un output Wayland 1.5. L'UI ne change pas — seul le rendu rasterisé change.
import androidx.compose.runtime.*
import androidx.compose.ui.platform.LocalDensity
@Composable
fun ShowDensity() {
val density = LocalDensity.current
Text("Scale: ${density.density}x · font scale: ${density.fontScale}")
}Différences vs linux-hidpi
linux-hidpi est un helper X11/AWT : il lit le scale système depuis GSettings / Xft.dpi et l'applique aux propriétés JVM avant le boot d'AWT. C'est un unique scale global, posé une fois au démarrage. Utilise-le quand on livre les backends AWT (JBR / JNI) sur sessions X11.
Le backend Tao n'en a pas besoin — il observe les changements de scale par fenêtre au runtime. Quand on migre de JBR vers Tao sur Linux, on peut retirer la dépendance linux-hidpi.
Pour des setups X11 uniquement où on doit utiliser les backends AWT, garde le module linux-hidpi. Voir /docs/performance/linux-hidpi.
Reference
LocalDensity.current— densité Compose de la fenêtre courante.Platform.isWayland— distingue Wayland (scaling fractionnaire) de X11.WindowState— garde les tailles enDp, jamais en pixels.
Notes
- Sur Windows 10 1607+, Tao déclare Per-Monitor V2 DPI awareness via le manifest. Le plugin Gradle s'en charge pour les builds packagés.
- Sur macOS, les backing stores Retina sont automatiques — pas d'opt-in.
- Le scaling fractionnaire sur KDE Plasma marche sur X11 et Wayland avec Tao, mais Wayland donne la précision par moniteur.