From 13528b49cbbda760763c75d5d5f5462f95c9cc5a Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 14 Dec 2023 18:51:03 +0100 Subject: [PATCH] macOS large title bar: fixed wrong "main" JToolBar height and left inset after leaving full screen --- .../flatlaf/ui/FlatNativeMacLibrary.java | 2 +- .../formdev/flatlaf/ui/FlatToolBarBorder.java | 6 +- .../natives/libflatlaf-macos-arm64.dylib | Bin 72640 -> 77024 bytes .../natives/libflatlaf-macos-x86_64.dylib | Bin 55408 -> 58784 bytes ..._formdev_flatlaf_ui_FlatNativeMacLibrary.h | 4 +- .../src/main/objcpp/MacWindow.mm | 126 ++++++++++++++---- 6 files changed, 101 insertions(+), 37 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeMacLibrary.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeMacLibrary.java index 65df59cd..059dedb0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeMacLibrary.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeMacLibrary.java @@ -54,7 +54,7 @@ public class FlatNativeMacLibrary public native static boolean setWindowRoundedBorder( Window window, float radius, float borderWidth, int borderColor ); - public native static void setWindowToolbar( Window window, boolean hasToolbar ); + public native static boolean setWindowToolbar( Window window, boolean hasToolbar ); public native static int getWindowButtonAreaWidth( Window window ); public native static int getWindowTitleBarHeight( Window window ); public native static boolean isWindowFullScreen( Window window ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarBorder.java index 4d66a4a1..f6c17873 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarBorder.java @@ -116,11 +116,7 @@ public class FlatToolBarBorder } // on macOS, add some extra space to left side for close/minimize/zoom buttons (if necessary) - if( c instanceof JToolBar && - FlatToolBarUI.isMacOSMainToolbar( (JToolBar) c ) && - (!FlatNativeMacLibrary.isLoaded() || - !FlatNativeMacLibrary.isWindowFullScreen( SwingUtilities.windowForComponent( c ) )) ) - { + if( c instanceof JToolBar && FlatToolBarUI.isMacOSMainToolbar( (JToolBar) c ) ) { // get button area width from macOS int buttonBarWidth = FlatNativeMacLibrary.isLoaded() ? FlatNativeMacLibrary.getWindowButtonAreaWidth( SwingUtilities.windowForComponent( c ) ) diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/libflatlaf-macos-arm64.dylib b/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/libflatlaf-macos-arm64.dylib index e29df3b1766ed568b08d1bd2d7a94d97effcf663..61b6e9cdacf1e11192ca70b5681c3db7d51207f9 100755 GIT binary patch delta 15554 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 PYT8-vorce%pGE%#y!sFV diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/libflatlaf-macos-x86_64.dylib b/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/libflatlaf-macos-x86_64.dylib index bb1c221c9e60306dfa601e29fd6fb0f7f8c286c6..084b58cafbdf27e95ff6d6bb2e9cfb8bf7ac591d 100755 GIT binary patch delta 15274 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 PrmT|v`)XRcf9m=_6qORK delta 6925 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 diff --git a/flatlaf-natives/flatlaf-natives-macos/src/main/headers/com_formdev_flatlaf_ui_FlatNativeMacLibrary.h b/flatlaf-natives/flatlaf-natives-macos/src/main/headers/com_formdev_flatlaf_ui_FlatNativeMacLibrary.h index 7964d7f2..f7669308 100644 --- a/flatlaf-natives/flatlaf-natives-macos/src/main/headers/com_formdev_flatlaf_ui_FlatNativeMacLibrary.h +++ b/flatlaf-natives/flatlaf-natives-macos/src/main/headers/com_formdev_flatlaf_ui_FlatNativeMacLibrary.h @@ -18,9 +18,9 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW /* * Class: com_formdev_flatlaf_ui_FlatNativeMacLibrary * Method: setWindowToolbar - * Signature: (Ljava/awt/Window;Z)V + * Signature: (Ljava/awt/Window;Z)Z */ -JNIEXPORT void JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowToolbar +JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowToolbar (JNIEnv *, jclass, jobject, jboolean); /* diff --git a/flatlaf-natives/flatlaf-natives-macos/src/main/objcpp/MacWindow.mm b/flatlaf-natives/flatlaf-natives-macos/src/main/objcpp/MacWindow.mm index 62c41c7a..cc04908a 100644 --- a/flatlaf-natives/flatlaf-natives-macos/src/main/objcpp/MacWindow.mm +++ b/flatlaf-natives/flatlaf-natives-macos/src/main/objcpp/MacWindow.mm @@ -25,6 +25,27 @@ * @author Karl Tauber */ +@interface WindowData : NSObject + // used when window is full screen + @property (nonatomic) int lastWindowButtonAreaWidth; + @property (nonatomic) int lastWindowTitleBarHeight; + + // full screen observers + @property (nonatomic) id willEnterFullScreenObserver; + @property (nonatomic) id didExitFullScreenObserver; +@end + +@implementation WindowData +@end + +// declare internal methods +NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window ); +WindowData* getWindowData( NSWindow* nsWindow, bool allocate ); +int getWindowButtonAreaWidth( NSWindow* nsWindow ); +int getWindowTitleBarHeight( NSWindow* nsWindow ); +bool isWindowFullScreen( NSWindow* nsWindow ); + + NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window ) { if( window == NULL ) return NULL; @@ -50,6 +71,16 @@ NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window ) { return (NSWindow *) jlong_to_ptr( env->GetLongField( platformWindow, ptrID ) ); } +WindowData* getWindowData( NSWindow* nsWindow, bool allocate ) { + static char key; + WindowData* windowData = objc_getAssociatedObject( nsWindow, &key ); + if( windowData == NULL && allocate ) { + windowData = [WindowData new]; + objc_setAssociatedObject( nsWindow, &key, windowData, OBJC_ASSOCIATION_RETAIN_NONATOMIC ); + } + return windowData; +} + extern "C" JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowRoundedBorder ( JNIEnv* env, jclass cls, jobject window, jfloat radius, jfloat borderWidth, jint borderColor ) @@ -90,20 +121,22 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW } extern "C" -JNIEXPORT void JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowToolbar +JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowToolbar ( JNIEnv* env, jclass cls, jobject window, jboolean hasToolbar ) { JNI_COCOA_ENTER() NSWindow* nsWindow = getNSWindow( env, cls, window ); if( nsWindow == NULL ) - return; + return FALSE; if( hasToolbar == (nsWindow.toolbar != NULL) ) - return; + return TRUE; + + WindowData* windowData = getWindowData( nsWindow, true ); [FlatJNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ - NSLog( @"\n%@\n\n", [nsWindow.contentView.superview _subtreeDescription] ); +// NSLog( @"\n%@\n\n", [nsWindow.contentView.superview _subtreeDescription] ); // add/remove toolbar NSToolbar* toolbar = NULL; @@ -113,45 +146,51 @@ JNIEXPORT void JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindo } nsWindow.toolbar = toolbar; - NSLog( @"\n%@\n\n", [nsWindow.contentView.superview _subtreeDescription] ); +// NSLog( @"\n%@\n\n", [nsWindow.contentView.superview _subtreeDescription] ); // when window becomes full screen, it is necessary to hide the toolbar // because it otherwise is shown non-transparent and hides Swing components - static char enterObserverKey; - static char exitObserverKey; NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; if( hasToolbar ) { - NSLog( @"add observers %@", nsWindow ); - id enterObserver = [center addObserverForName:NSWindowWillEnterFullScreenNotification +// NSLog( @"add observers %@", nsWindow ); + windowData.willEnterFullScreenObserver = [center addObserverForName:NSWindowWillEnterFullScreenNotification object:nsWindow queue:nil usingBlock:^(NSNotification *note) { - NSLog( @"enter full screen %@", nsWindow ); - if( nsWindow.toolbar != NULL ) +// NSLog( @"enter full screen %@", nsWindow ); + if( nsWindow.toolbar != NULL ) { + // remember button area width, which is used later when window exits full screen + // remembar title bar height so that "main" JToolBar keeps its height in full screen + windowData.lastWindowButtonAreaWidth = getWindowButtonAreaWidth( nsWindow ); + windowData.lastWindowTitleBarHeight = getWindowTitleBarHeight( nsWindow ); + nsWindow.toolbar.visible = NO; + } }]; - id exitObserver = [center addObserverForName:NSWindowDidExitFullScreenNotification + windowData.didExitFullScreenObserver = [center addObserverForName:NSWindowDidExitFullScreenNotification object:nsWindow queue:nil usingBlock:^(NSNotification *note) { - NSLog( @"exit full screen %@", nsWindow ); +// NSLog( @"exit full screen %@", nsWindow ); if( nsWindow.toolbar != NULL ) nsWindow.toolbar.visible = YES; + + windowData.lastWindowButtonAreaWidth = 0; + windowData.lastWindowTitleBarHeight = 0; }]; - objc_setAssociatedObject( nsWindow, &enterObserverKey, enterObserver, OBJC_ASSOCIATION_RETAIN_NONATOMIC ); - objc_setAssociatedObject( nsWindow, &exitObserverKey, exitObserver, OBJC_ASSOCIATION_RETAIN_NONATOMIC ); } else { - NSLog( @"remove observers %@", nsWindow ); - id enterObserver = objc_getAssociatedObject( nsWindow, &enterObserverKey ); - id exitObserver = objc_getAssociatedObject( nsWindow, &exitObserverKey ); - if( enterObserver != NULL ) { - [center removeObserver:enterObserver]; - objc_setAssociatedObject( nsWindow, &enterObserverKey, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC ); +// NSLog( @"remove observers %@", nsWindow ); + if( windowData.willEnterFullScreenObserver != NULL ) { + [center removeObserver:windowData.willEnterFullScreenObserver]; + windowData.willEnterFullScreenObserver = nil; } - if( exitObserver != NULL ) { - [center removeObserver:exitObserver]; - objc_setAssociatedObject( nsWindow, &exitObserverKey, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC ); + if( windowData.didExitFullScreenObserver != NULL ) { + [center removeObserver:windowData.didExitFullScreenObserver]; + windowData.didExitFullScreenObserver = nil; } } }]; + return TRUE; + JNI_COCOA_EXIT() + return FALSE; } extern "C" @@ -164,6 +203,23 @@ JNIEXPORT jint JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_getWindo if( nsWindow == NULL ) return -1; + // return zero if window is full screen because close/minimize/zoom buttons are hidden + if( isWindowFullScreen( nsWindow ) ) + return 0; + + // use remembered value if window is in transition from full screen to non-full screen + // because NSToolbar is not yet visible + WindowData* windowData = getWindowData( nsWindow, false ); + if( windowData != NULL && windowData.lastWindowButtonAreaWidth > 0 ) + return windowData.lastWindowButtonAreaWidth; + + return getWindowButtonAreaWidth( nsWindow ); + + JNI_COCOA_EXIT() + return -1; +} + +int getWindowButtonAreaWidth( NSWindow* nsWindow ) { // get buttons NSView* buttons[3] = { [nsWindow standardWindowButton:NSWindowCloseButton], @@ -193,8 +249,6 @@ JNIEXPORT jint JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_getWindo // 'right' is the actual button area width (from left window edge) // adding 'left' to add same empty space on right side as on left side return right + left; - - JNI_COCOA_EXIT() } extern "C" @@ -207,14 +261,24 @@ JNIEXPORT jint JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_getWindo if( nsWindow == NULL ) return -1; + // use remembered value if window is full screen because NSToolbar is hidden + WindowData* windowData = getWindowData( nsWindow, false ); + if( windowData != NULL && windowData.lastWindowTitleBarHeight > 0 ) + return windowData.lastWindowTitleBarHeight; + + return getWindowTitleBarHeight( nsWindow ); + + JNI_COCOA_EXIT() + return -1; +} + +int getWindowTitleBarHeight( NSWindow* nsWindow ) { NSView* closeButton = [nsWindow standardWindowButton:NSWindowCloseButton]; if( closeButton == NULL ) return -1; NSView* titlebar = closeButton.superview; return titlebar.bounds.size.height; - - JNI_COCOA_EXIT() } extern "C" @@ -227,8 +291,12 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_isWi if( nsWindow == NULL ) return FALSE; - return (jboolean) (([nsWindow styleMask] & NSWindowStyleMaskFullScreen) != 0); + return (jboolean) isWindowFullScreen( nsWindow ); JNI_COCOA_EXIT() + return FALSE; } +bool isWindowFullScreen( NSWindow* nsWindow ) { + return ((nsWindow.styleMask & NSWindowStyleMaskFullScreen) != 0); +}