From b75f22b7bda11eeece74aeab74020af4b599b97a Mon Sep 17 00:00:00 2001 From: Sung Ho Yoon <55358516+syoon2@users.noreply.github.com> Date: Fri, 4 Aug 2023 19:19:06 +0900 Subject: [PATCH 1/4] Add windows-aarch64 build configuration --- flatlaf-natives/flatlaf-natives-windows/build.gradle.kts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/flatlaf-natives/flatlaf-natives-windows/build.gradle.kts b/flatlaf-natives/flatlaf-natives-windows/build.gradle.kts index 41942b9d..262ee477 100644 --- a/flatlaf-natives/flatlaf-natives-windows/build.gradle.kts +++ b/flatlaf-natives/flatlaf-natives-windows/build.gradle.kts @@ -29,7 +29,7 @@ flatlafJniHeaders { } library { - targetMachines.set( listOf( machines.windows.x86, machines.windows.x86_64 ) ) + targetMachines.set( listOf( machines.windows.x86, machines.windows.x86_64, machines.windows.architecture("aarch64") ) ) } var javaHome = System.getProperty( "java.home" ) @@ -42,7 +42,7 @@ tasks { description = "Builds natives" if( org.gradle.internal.os.OperatingSystem.current().isWindows() ) - dependsOn( "linkReleaseX86", "linkReleaseX86-64" ) + dependsOn( "linkReleaseX86", "linkReleaseX86-64", "linkReleaseAarch64" ) } withType().configureEach { @@ -69,8 +69,9 @@ tasks { onlyIf { name.contains( "Release" ) } val nativesDir = project( ":flatlaf-core" ).projectDir.resolve( "src/main/resources/com/formdev/flatlaf/natives" ) + val isX86 = name.contains("X86") val is64Bit = name.contains( "64" ) - val libraryName = if( is64Bit ) "flatlaf-windows-x86_64.dll" else "flatlaf-windows-x86.dll" + val libraryName = if( is64Bit && isX86 ) "flatlaf-windows-x86_64.dll" else if( isX86 ) "flatlaf-windows-x86.dll" else "flatlaf-windows-aarch64.dll" linkerArgs.addAll( toolChain.map { when( it ) { From e0a5450264a0782499359452b7c1c6ccd8232968 Mon Sep 17 00:00:00 2001 From: Sung Ho Yoon <55358516+syoon2@users.noreply.github.com> Date: Fri, 4 Aug 2023 22:10:13 +0900 Subject: [PATCH 2/4] Load Windows on ARM (aarch64) native library --- .../com/formdev/flatlaf/ui/FlatNativeLibrary.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeLibrary.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeLibrary.java index 263fbdb5..84e99309 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeLibrary.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeLibrary.java @@ -55,10 +55,16 @@ class FlatNativeLibrary String classifier; String ext; - if( SystemInfo.isWindows_10_orLater && (SystemInfo.isX86 || SystemInfo.isX86_64) ) { - // Windows: requires Windows 10/11 (x86 or x86_64) + if( SystemInfo.isWindows_10_orLater ) { + // Windows: requires Windows 10/11 + + if ( SystemInfo.isAARCH64 ) + classifier = "windows-aarch64"; + else if ( SystemInfo.isX86_64 ) + classifier = "windows-x86_64"; + else + classifier = "windows-x86"; - classifier = SystemInfo.isX86_64 ? "windows-x86_64" : "windows-x86"; ext = "dll"; // Do not load jawt.dll (part of JRE) here explicitly because From 502b18fa86dc43a51d17d22503452b5584e71d3d Mon Sep 17 00:00:00 2001 From: Sung Ho Yoon <55358516+syoon2@users.noreply.github.com> Date: Fri, 4 Aug 2023 22:10:48 +0900 Subject: [PATCH 3/4] Remove check for x86 Now that the aarch64 library is added, this check is unnecessary. --- .../com/formdev/flatlaf/ui/FlatWindowsNativeWindowBorder.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatWindowsNativeWindowBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatWindowsNativeWindowBorder.java index 727328f1..2fed2618 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatWindowsNativeWindowBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatWindowsNativeWindowBorder.java @@ -88,10 +88,6 @@ class FlatWindowsNativeWindowBorder if( !SystemInfo.isWindows_10_orLater ) return null; - // requires x86 architecture - if( !SystemInfo.isX86 && !SystemInfo.isX86_64 ) - return null; - // check whether native library was successfully loaded if( !FlatNativeLibrary.isLoaded() ) return null; From 52bae9dfb0eff3793a5091cdbe011160e665021f Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sat, 5 Aug 2023 16:11:46 +0200 Subject: [PATCH 4/4] Windows on ARM: - changed DLL filename from aarch64 to arm64 - publish ARM DLL to Maven Central --- CHANGELOG.md | 2 ++ flatlaf-core/build.gradle.kts | 1 + .../java/com/formdev/flatlaf/ui/FlatNativeLibrary.java | 10 +++++----- .../flatlaf-natives-windows/build.gradle.kts | 4 ++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index faf1024e..248860f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ FlatLaf Change Log #### New features and improvements +- FlatLaf window decorations: Support for Windows on ARM 64-bit. (issue #443, PR + #707) - Extras: Class `FlatSVGIcon` now uses [JSVG](https://github.com/weisJ/jsvg) library (instead of svgSalamander) for rendering. JSVG provides improved SVG rendering and uses less memory compared to svgSalamander. (PR #684) diff --git a/flatlaf-core/build.gradle.kts b/flatlaf-core/build.gradle.kts index b8651b3c..112d66e3 100644 --- a/flatlaf-core/build.gradle.kts +++ b/flatlaf-core/build.gradle.kts @@ -129,6 +129,7 @@ flatlafPublish { nativeArtifacts = listOf( NativeArtifact( "${natives}/flatlaf-windows-x86.dll", "windows-x86", "dll" ), NativeArtifact( "${natives}/flatlaf-windows-x86_64.dll", "windows-x86_64", "dll" ), + NativeArtifact( "${natives}/flatlaf-windows-arm64.dll", "windows-arm64", "dll" ), NativeArtifact( "${natives}/libflatlaf-linux-x86_64.so", "linux-x86_64", "so" ), ) } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeLibrary.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeLibrary.java index 84e99309..e977cae8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeLibrary.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeLibrary.java @@ -55,12 +55,12 @@ class FlatNativeLibrary String classifier; String ext; - if( SystemInfo.isWindows_10_orLater ) { - // Windows: requires Windows 10/11 + if( SystemInfo.isWindows_10_orLater && (SystemInfo.isX86 || SystemInfo.isX86_64 || SystemInfo.isAARCH64) ) { + // Windows: requires Windows 10/11 (x86, x86_64 or aarch64) - if ( SystemInfo.isAARCH64 ) - classifier = "windows-aarch64"; - else if ( SystemInfo.isX86_64 ) + if( SystemInfo.isAARCH64 ) + classifier = "windows-arm64"; + else if( SystemInfo.isX86_64 ) classifier = "windows-x86_64"; else classifier = "windows-x86"; diff --git a/flatlaf-natives/flatlaf-natives-windows/build.gradle.kts b/flatlaf-natives/flatlaf-natives-windows/build.gradle.kts index 262ee477..1c1776b9 100644 --- a/flatlaf-natives/flatlaf-natives-windows/build.gradle.kts +++ b/flatlaf-natives/flatlaf-natives-windows/build.gradle.kts @@ -29,7 +29,7 @@ flatlafJniHeaders { } library { - targetMachines.set( listOf( machines.windows.x86, machines.windows.x86_64, machines.windows.architecture("aarch64") ) ) + targetMachines.set( listOf( machines.windows.x86, machines.windows.x86_64, machines.windows.architecture( "aarch64" ) ) ) } var javaHome = System.getProperty( "java.home" ) @@ -71,7 +71,7 @@ tasks { val nativesDir = project( ":flatlaf-core" ).projectDir.resolve( "src/main/resources/com/formdev/flatlaf/natives" ) val isX86 = name.contains("X86") val is64Bit = name.contains( "64" ) - val libraryName = if( is64Bit && isX86 ) "flatlaf-windows-x86_64.dll" else if( isX86 ) "flatlaf-windows-x86.dll" else "flatlaf-windows-aarch64.dll" + val libraryName = if( is64Bit && isX86 ) "flatlaf-windows-x86_64.dll" else if( isX86 ) "flatlaf-windows-x86.dll" else "flatlaf-windows-arm64.dll" linkerArgs.addAll( toolChain.map { when( it ) {