diff --git a/core/src/main/java/com/github/weisj/darklaf/ui/tabframe/DarkPanelPopupUI.java b/core/src/main/java/com/github/weisj/darklaf/ui/tabframe/DarkPanelPopupUI.java index 30814fbf0..f2917c4a6 100644 --- a/core/src/main/java/com/github/weisj/darklaf/ui/tabframe/DarkPanelPopupUI.java +++ b/core/src/main/java/com/github/weisj/darklaf/ui/tabframe/DarkPanelPopupUI.java @@ -400,9 +400,6 @@ public HeaderButton(final Icon icon, final DarkPanelPopupUI popupUI) { setFocus(false); setFocusable(false); setOpaque(false); - - System.out.println(icon.getIconWidth() + " " + icon.getIconHeight()); - System.out.println(getPreferredSize()); } public void setFocus(final boolean focus) { diff --git a/gradle.properties b/gradle.properties index 4144a1111..308c19bae 100644 --- a/gradle.properties +++ b/gradle.properties @@ -37,7 +37,6 @@ javaxAnnotations.version = 1.3.2 # MacOS Frameworks macOSFramework.version = latest.release -javaNativeFoundation.version = 1.1.1 # Test libraries junit.version = 5.6.2 diff --git a/macos/build.gradle.kts b/macos/build.gradle.kts index 740cc8f31..96ceaae02 100644 --- a/macos/build.gradle.kts +++ b/macos/build.gradle.kts @@ -13,28 +13,8 @@ moduleInfo { stubModule("darklaf.platform.preferences") } -val jnfConfig: Configuration by configurations.creating { - attributes { - attribute(Attribute.of("dev.nokee.architecture", String::class.java), "arm64") - } -} - -dependencies { - jnfConfig(macOsFrameworks.javaNativeFoundation) -} - val nativeResourcePath = "com/github/weisj/darklaf/platform/${project.name}" -tasks.jar { - jnfConfig.asFileTree.forEach { - from(zipTree(it)) { - into("$nativeResourcePath/JavaNativeFoundation.framework") - include("JavaNativeFoundation*") - exclude("**/*.tbd") - } - } -} - library { dependencies { jvmImplementation(projects.darklafThemeSpec) @@ -44,7 +24,6 @@ library { jvmImplementation(projects.darklafPlatformDecorations) nativeLibImplementation(macOsFrameworks.appKit) nativeLibImplementation(macOsFrameworks.cocoa) - nativeLibImplementation(macOsFrameworks.javaNativeFoundation) } targetMachines.addAll(machines.macOS.x86_64, machines.macOS.architecture("arm64")) @@ -59,28 +38,10 @@ library { optimizedBinary() } linkTask.configure { - val systemFrameworks = "/System/Library/Frameworks" - val versionCurrent = "Versions/Current" - val versionA = "Versions/A" - val jnfName = "JavaNativeFoundation.framework" linkerArgs.addAll( "-lobjc", "-mmacosx-version-min=$minOs", // "-framework", "AppKit", // "-framework", "Cocoa", - // The custom JNF framework specified @rpath for searching. As we aren't actually linking - // with the dynamic library of the framework we specifically have to add the system framework - // search paths accordingly. - // First try any system provided framework (this will fail on arm64): - "-rpath", "$systemFrameworks/$jnfName/$versionCurrent", - "-rpath", "$systemFrameworks/$jnfName/$versionA", - "-rpath", "$systemFrameworks/JavaVM.framework/$versionCurrent/Frameworks/$jnfName/$versionCurrent", - "-rpath", "$systemFrameworks/JavaVM.framework/$versionA/Frameworks/$jnfName/$versionA", - // Then try the jdk provided framework (folder layout may vary. We check multiple possibilities): - "-rpath", "@executable_path/../lib/$jnfName", - "-rpath", "@executable_path/../lib/$jnfName/$versionCurrent", - "-rpath", "@executable_path/../lib/$jnfName/$versionA", - // Lastly use our bundled drop-in replacement: - "-rpath", "@loader_path/$jnfName" ) } } diff --git a/macos/src/main/java/com/github/weisj/darklaf/platform/macos/MacOSLibrary.java b/macos/src/main/java/com/github/weisj/darklaf/platform/macos/MacOSLibrary.java index d2fcf2efb..8d613a97c 100644 --- a/macos/src/main/java/com/github/weisj/darklaf/platform/macos/MacOSLibrary.java +++ b/macos/src/main/java/com/github/weisj/darklaf/platform/macos/MacOSLibrary.java @@ -20,11 +20,7 @@ */ package com.github.weisj.darklaf.platform.macos; -import java.util.Collections; -import java.util.List; - import com.github.weisj.darklaf.nativeutil.AbstractLibrary; -import com.github.weisj.darklaf.nativeutil.NativeUtil; import com.github.weisj.darklaf.platform.SystemInfo; import com.github.weisj.darklaf.util.LogUtil; @@ -34,8 +30,6 @@ public class MacOSLibrary extends AbstractLibrary { private static final String x86_64_PATH = PATH + "/libdarklaf-macos-x86-64.dylib"; private static final String arm64_PATH = PATH + "/libdarklaf-macos-arm64.dylib"; - private static final String FRAMEWORK_TARGET_PATH = "JavaNativeFoundation.framework/"; - private static final String FRAMEWORK_PATH = PATH + "/" + FRAMEWORK_TARGET_PATH + "JavaNativeFoundation"; private static final MacOSLibrary instance = new MacOSLibrary(); public static MacOSLibrary get() { @@ -70,12 +64,6 @@ public String getLibraryPath() { } } - @Override - protected List getResourcePaths() { - return Collections.singletonList( - new NativeUtil.Resource(FRAMEWORK_PATH, FRAMEWORK_TARGET_PATH)); - } - @Override protected boolean canLoad() { return ((SystemInfo.isX86Compatible && SystemInfo.isX64) || SystemInfo.isM1) && SystemInfo.isMacOSYosemite; diff --git a/macos/src/main/objcpp/Decorations.mm b/macos/src/main/objcpp/Decorations.mm index cfd4708af..e9a49ac8e 100644 --- a/macos/src/main/objcpp/Decorations.mm +++ b/macos/src/main/objcpp/Decorations.mm @@ -19,11 +19,9 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #import "com_github_weisj_darklaf_platform_macos_JNIDecorationsMacOS.h" -#import +#import "JNFUtils.h" #import -#define OBJC(jl) ((id)jlong_to_ptr(jl)) - JNIEXPORT jlong JNICALL Java_com_github_weisj_darklaf_platform_macos_JNIDecorationsMacOS_getComponentPointer(JNIEnv *env, jclass cls, jobject window) { JNF_COCOA_ENTER(env); @@ -100,7 +98,7 @@ jboolean enabled) { JNF_COCOA_ENTER(env); NSWindow *nsWindow = OBJC(hwnd); - [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^{ + [JNF_RunLoop performOnMainThreadWaiting:YES withBlock:^{ if (enabled) { nsWindow.titleVisibility = NSWindowTitleVisible; } else { @@ -117,7 +115,7 @@ JNF_COCOA_ENTER(env); NSWindow *nsWindow = OBJC(hwnd); if(@available(macOS 10.14, *)) { - [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^{ + [JNF_RunLoop performOnMainThreadWaiting:YES withBlock:^{ if (darkEnabled) { nsWindow.appearance = [NSAppearance appearanceNamed:@"NSAppearanceNameDarkAqua"]; } else { @@ -133,7 +131,7 @@ Java_com_github_weisj_darklaf_platform_macos_JNIDecorationsMacOS_installDecorations(JNIEnv *env, jclass obj, jlong hwnd) { JNF_COCOA_ENTER(env); NSWindow *nsWindow = OBJC(hwnd); - [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^{ + [JNF_RunLoop performOnMainThreadWaiting:YES withBlock:^{ nsWindow.styleMask |= NSWindowStyleMaskFullSizeContentView; nsWindow.titlebarAppearsTransparent = YES; [nsWindow contentView].needsDisplay = YES; @@ -146,7 +144,7 @@ jboolean fullSizeContent, jboolean transparentTitleBar) { JNF_COCOA_ENTER(env); NSWindow *nsWindow = OBJC(hwnd); - [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^{ + [JNF_RunLoop performOnMainThreadWaiting:YES withBlock:^{ if (fullSizeContent) { nsWindow.styleMask |= NSWindowStyleMaskFullSizeContentView; } else { diff --git a/macos/src/main/objcpp/JNFUtils.h b/macos/src/main/objcpp/JNFUtils.h new file mode 100644 index 000000000..de04ae0da --- /dev/null +++ b/macos/src/main/objcpp/JNFUtils.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2008-2020 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#import +#import + +__BEGIN_DECLS + +#ifndef jlong_to_ptr +#define jlong_to_ptr(a) ((void *)(uintptr_t)(a)) +#endif + +#define OBJC(jl) ((id)jlong_to_ptr(jl)) + +#define JNF_COCOA_DURING(env) \ +@try { + +#define JNF_COCOA_HANDLE(env) \ +} @catch(NSException *localException) { \ + [JNF_Exception throwToJava:env exception:localException]; \ +} + +#define JNF_COCOA_ENTER(env) \ +@autoreleasepool { \ + @try { \ + @autoreleasepool { + +#define JNF_COCOA_EXIT(env) \ + } /*@autoreleasepool*/ \ + JNF_COCOA_HANDLE(env) \ +} /*@autoreleasepool*/ + + +@interface JNF_RunLoop : NSObject { } ++ (void)performOnMainThread:(SEL)aSelector on:(id)target withObject:(id)arg waitUntilDone:(BOOL)waitUntilDone; ++ (void)performOnMainThreadWaiting:(BOOL)waitUntilDone withBlock:(void (^)(void))block; +@end + +@interface JNF_Exception : NSException ++ (void)throwToJava:(JNIEnv *)env exception:(NSException *)exception; +@end + + +__END_DECLS diff --git a/macos/src/main/objcpp/JNFUtils.mm b/macos/src/main/objcpp/JNFUtils.mm new file mode 100644 index 000000000..83e9a0979 --- /dev/null +++ b/macos/src/main/objcpp/JNFUtils.mm @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2008-2020 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#import "JNFUtils.h" + +#import + +static NSString *AWTRunLoopMode = @"AWTRunLoopMode"; +static NSArray *sPerformModes = nil; + +@implementation JNF_RunLoop + ++ (void)initialize { + if (sPerformModes) return; + sPerformModes = [[NSArray alloc] initWithObjects:NSDefaultRunLoopMode, NSModalPanelRunLoopMode, NSEventTrackingRunLoopMode, AWTRunLoopMode, nil]; +} + ++ (void)_performDirectBlock:(void (^)(void))block { + block(); +} + ++ (void)_performCopiedBlock:(void (^)(void))newBlock { + newBlock(); + Block_release(newBlock); +} + ++ (void)performOnMainThread:(SEL)aSelector on:(id)target withObject:(id)arg waitUntilDone:(BOOL)waitUntilDone { + [target performSelectorOnMainThread:aSelector withObject:arg waitUntilDone:waitUntilDone modes:sPerformModes]; +} + ++ (void)performOnMainThreadWaiting:(BOOL)waitUntilDone withBlock:(void (^)(void))block { + if (waitUntilDone) { + [self performOnMainThread:@selector(_performDirectBlock:) on:self withObject:block waitUntilDone:YES]; + } else { + void (^newBlock)(void) = Block_copy(block); + [self performOnMainThread:@selector(_performCopiedBlock:) on:self withObject:newBlock waitUntilDone:NO]; + } +} +@end + +@implementation JNF_Exception + ++ (void)throwToJava:(JNIEnv *)env exception:(NSException *)exception { + jclass exceptionClass = env-> FindClass("java/lang/RuntimeException"); + if (!exceptionClass) return; + + const char *reason = [[NSString stringWithFormat:@"Non-Java exception raised, not handled! (Original problem: %@)", [exception reason]] UTF8String]; + if (reason == NULL) reason = "unknown"; + + env->ThrowNew(exceptionClass, reason); +} +@end diff --git a/macos/src/main/objcpp/ThemeInfo.mm b/macos/src/main/objcpp/ThemeInfo.mm index 429ece5ce..59542abca 100644 --- a/macos/src/main/objcpp/ThemeInfo.mm +++ b/macos/src/main/objcpp/ThemeInfo.mm @@ -19,11 +19,9 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #import "com_github_weisj_darklaf_platform_macos_JNIThemeInfoMacOS.h" -#import +#import "JNFUtils.h" #import -#define OBJC(jl) ((id)jlong_to_ptr(jl)) - #define NSRequiresAquaSystemAppearance CFSTR("NSRequiresAquaSystemAppearance") #define KEY_APPLE_INTERFACE_STYLE @"AppleInterfaceStyle" @@ -114,7 +112,7 @@ - (void)runCallback { } - (void)dispatchCallback { - [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^{ + [JNF_RunLoop performOnMainThreadWaiting:NO withBlock:^{ [self runCallback]; }]; } diff --git a/settings.gradle.kts b/settings.gradle.kts index b39ad5d7a..179f7f9e5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -41,7 +41,6 @@ dependencyResolutionManagement { idv("nullabilityAnnotations", "org.jetbrains:annotations") } create("macOsFrameworks") { - idv("javaNativeFoundation", "com.github.weisj:java-native-foundation") idv("appKit", "dev.nokee.framework:AppKit", "macOSFramework") idv("cocoa", "dev.nokee.framework:Cocoa", "macOSFramework") }