Unverified Commit b55efc68 authored by Roman Sedaikin's avatar Roman Sedaikin Committed by GitHub

Fix linux dpi (#128)

* Fix dpi scaling issue on Linux.
parent fb3de434
...@@ -52,6 +52,7 @@ val additionalArguments = mutableMapOf<String, String>() ...@@ -52,6 +52,7 @@ val additionalArguments = mutableMapOf<String, String>()
val casualRun = tasks.named<JavaExec>("run") { val casualRun = tasks.named<JavaExec>("run") {
systemProperty("skiko.fps.enabled", "true") systemProperty("skiko.fps.enabled", "true")
systemProperty("skiko.linux.autodpi", "true")
systemProperty("skiko.hardwareInfo.enabled", "true") systemProperty("skiko.hardwareInfo.enabled", "true")
jvmArgs?.add("-ea") jvmArgs?.add("-ea")
// Use systemProperty("skiko.library.path", "/tmp") to test loader. // Use systemProperty("skiko.library.path", "/tmp") to test loader.
......
...@@ -55,16 +55,33 @@ extern "C" ...@@ -55,16 +55,33 @@ extern "C"
return 1; return 1;
} }
double getDpiScale() {
Display *display = XOpenDisplay(nullptr);
if (display != nullptr) {
double result = getDpiScaleByDisplay(display);
XCloseDisplay(display);
return result;
} else {
return 1;
}
}
JNIEXPORT jfloat JNICALL Java_org_jetbrains_skiko_PlatformOperationsKt_linuxGetDpiScaleNative(JNIEnv *env, jobject properties, jlong platformInfoPtr) JNIEXPORT jfloat JNICALL Java_org_jetbrains_skiko_PlatformOperationsKt_linuxGetDpiScaleNative(JNIEnv *env, jobject properties, jlong platformInfoPtr)
{ {
JAWT_X11DrawingSurfaceInfo *dsi_x11 = fromJavaPointer<JAWT_X11DrawingSurfaceInfo *>(platformInfoPtr); JAWT_X11DrawingSurfaceInfo *dsi_x11 = fromJavaPointer<JAWT_X11DrawingSurfaceInfo *>(platformInfoPtr);
return (float) getDpiScaleByDisplay(dsi_x11->display); return (float) getDpiScaleByDisplay(dsi_x11->display);
} }
JNIEXPORT jint JNICALL Java_org_jetbrains_skiko_SystemThemeKt_getCurrentSystemTheme(JNIEnv *env, jobject topLevel) JNIEXPORT jint JNICALL Java_org_jetbrains_skiko_SystemThemeKt_getCurrentSystemTheme(JNIEnv *env, jobject topLevel)
{ {
// Unknown. // Unknown.
return 2; return 2;
} }
JNIEXPORT jfloat JNICALL Java_org_jetbrains_skiko_SetupKt_linuxGetSystemDpiScale(JNIEnv *env, jobject layer)
{
return (float) getDpiScale();
}
} // extern "C" } // extern "C"
\ No newline at end of file
...@@ -79,11 +79,7 @@ object Library { ...@@ -79,11 +79,7 @@ object Library {
} }
// TODO move properties to SkikoProperties // TODO move properties to SkikoProperties
Setup.init( Setup.init()
System.getProperty("skiko.rendering.noerasebackground") != "false",
System.getProperty("skiko.rendering.laf.global") == "true",
System.getProperty("skiko.rendering.useScreenMenuBar") != "false"
)
try { try {
// Init code executed after library was loaded. // Init code executed after library was loaded.
......
...@@ -110,18 +110,6 @@ internal val platformOperations: PlatformOperations by lazy { ...@@ -110,18 +110,6 @@ internal val platformOperations: PlatformOperations by lazy {
override fun getDpiScale(component: Component): Float { override fun getDpiScale(component: Component): Float {
return component.graphicsConfiguration.defaultTransform.scaleX.toFloat() return component.graphicsConfiguration.defaultTransform.scaleX.toFloat()
// TODO doesn't work well because java doesn't scale windows (content has offset with 200% scale)
//
// Two solutions:
// 1. dynamically change sun.java2d.uiScale (it is global property,
// so we have to be careful) and update all windows
//
// 2. apply contentScale manually to all windows
// (it is not good, because on different platform windows will have different size.
// Maybe we will apply contentScale manually on all platforms?)
// see also comment for HardwareLayer.checkContentScale
// return component.useDrawingSurfacePlatformInfo(::linuxGetDpiScaleNative)
} }
override fun createRedrawer( override fun createRedrawer(
......
...@@ -4,10 +4,16 @@ import javax.swing.UIManager ...@@ -4,10 +4,16 @@ import javax.swing.UIManager
object Setup { object Setup {
fun init( fun init(
noEraseBackground: Boolean = true, noEraseBackground: Boolean = System.getProperty("skiko.rendering.noerasebackground") != "false",
globalLAF: Boolean = false, globalLAF: Boolean = System.getProperty("skiko.rendering.laf.global") == "true",
useScreenMenuBar: Boolean = true useScreenMenuBar: Boolean = System.getProperty("skiko.rendering.useScreenMenuBar") != "false",
autoLinuxDpi: Boolean = System.getProperty("skiko.linux.autodpi") == "true"
) { ) {
if (hostOs == OS.Linux && autoLinuxDpi) {
val scale = linuxGetSystemDpiScale()
System.setProperty("sun.java2d.uiScale.enabled", "true")
System.setProperty("sun.java2d.uiScale", "$scale")
}
if (noEraseBackground) { if (noEraseBackground) {
// we have to set this property to avoid render flickering. // we have to set this property to avoid render flickering.
System.setProperty("sun.awt.noerasebackground", "true") System.setProperty("sun.awt.noerasebackground", "true")
...@@ -24,4 +30,6 @@ object Setup { ...@@ -24,4 +30,6 @@ object Setup {
// Not all platforms allow this. // Not all platforms allow this.
} }
} }
} }
\ No newline at end of file
private external fun linuxGetSystemDpiScale(): Float
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment