From 144d65c7763f6cce8d0f437475fcb45ed055bab8 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 5 Mar 2021 10:22:52 +0100 Subject: [PATCH] Native window decorations: initial implementation in C++ using JNI --- .gitattributes | 3 + .github/workflows/natives.yml | 56 +++ flatlaf-core/build.gradle.kts | 10 + .../java/com/formdev/flatlaf/FlatLaf.java | 2 +- .../formdev/flatlaf/FlatSystemProperties.java | 3 +- .../flatlaf/ui/FlatNativeWindowBorder.java | 4 +- .../ui/FlatWindowsNativeWindowBorder.java | 380 +++++++++++++++++ .../formdev/flatlaf/util/NativeLibrary.java | 127 ++++++ flatlaf-demo/build.gradle.kts | 4 +- .../FlatWindowsNativeWindowBorder.java | 12 +- .../flatlaf-natives-windows/build.gradle.kts | 90 ++++ .../src/main/cpp/FlatWndProc.cpp | 399 ++++++++++++++++++ .../src/main/cpp/FlatWndProc.h | 63 +++ .../src/main/cpp/Registry.cpp | 44 ++ ...flatlaf_ui_FlatWindowsNativeWindowBorder.h | 21 + ...ui_FlatWindowsNativeWindowBorder_WndProc.h | 37 ++ flatlaf-testing/build.gradle.kts | 2 +- settings.gradle.kts | 1 + 18 files changed, 1245 insertions(+), 13 deletions(-) create mode 100644 .github/workflows/natives.yml create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatWindowsNativeWindowBorder.java create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/util/NativeLibrary.java create mode 100644 flatlaf-natives/flatlaf-natives-windows/build.gradle.kts create mode 100644 flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp create mode 100644 flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.h create mode 100644 flatlaf-natives/flatlaf-natives-windows/src/main/cpp/Registry.cpp create mode 100644 flatlaf-natives/flatlaf-natives-windows/src/main/headers/com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder.h create mode 100644 flatlaf-natives/flatlaf-natives-windows/src/main/headers/com_formdev_flatlaf_ui_FlatWindowsNativeWindowBorder_WndProc.h diff --git a/.gitattributes b/.gitattributes index 3ab79411..c3a3cc0a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15,8 +15,11 @@ # BINARY FILES: # Disable line ending normalize on checkin. +*.dll binary +*.dylib binary *.gif binary *.jar binary *.png binary *.sketch binary +*.so binary *.zip binary diff --git a/.github/workflows/natives.yml b/.github/workflows/natives.yml new file mode 100644 index 00000000..8291ac36 --- /dev/null +++ b/.github/workflows/natives.yml @@ -0,0 +1,56 @@ +# https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle + +name: Native Libraries + +on: + push: + branches: + - '*' + tags: + - '[0-9]*' + paths: + - '**.cpp' + - '**.h' + pull_request: + branches: + - '*' + paths: + - '**.cpp' + - '**.h' + +jobs: + Windows: + runs-on: windows-latest + + steps: + - uses: actions/checkout@v2 + + - uses: gradle/wrapper-validation-action@v1 + + - name: Setup Java 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Cache Gradle wrapper + uses: actions/cache@v1 + with: + path: ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-wrapper-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties') }} + + - name: Cache Gradle cache + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts') }} + restore-keys: ${{ runner.os }}-gradle + + - name: Build with Gradle + run: ./gradlew :flatlaf-natives-windows:build + + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: FlatLaf-natives-windows-build-artifacts + path: | + flatlaf-natives/flatlaf-natives-windows/build diff --git a/flatlaf-core/build.gradle.kts b/flatlaf-core/build.gradle.kts index 7d6c5038..3854d8ea 100644 --- a/flatlaf-core/build.gradle.kts +++ b/flatlaf-core/build.gradle.kts @@ -27,6 +27,16 @@ java { } tasks { + compileJava { + // generate JNI headers + options.headerOutputDirectory.set( buildDir.resolve( "generated/jni-headers" ) ) + } + + processResources { + // build native libraries + dependsOn( ":flatlaf-natives-windows:assemble" ) + } + jar { archiveBaseName.set( "flatlaf" ) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java index a8914ea9..fa6f0402 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -165,7 +165,7 @@ public abstract class FlatLaf *

* Returns also {@code false} on Windows 10 if: *