mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-10 22:17:13 -06:00
macOS window buttons spacing:
- renamed client property `MACOS_WINDOW_BUTTON_STYLE` to `MACOS_WINDOW_BUTTONS_SPACING` - no longer allow value `true` for that client property - enable using `MACOS_WINDOW_BUTTONS_SPACING` without `apple.awt.fullWindowContent` - remove client property `FULL_WINDOW_CONTENT_BUTTONS_BOUNDS` when `apple.awt.fullWindowContent` is set to false or null - added placeholder options `zeroInFullScreen`, `leftToRight` and `rightToLeft` - hide close/min/max buttons during the transition from full-screen to non-full-screen to avoid that they "jump" when the nsToolbar is made visible - fixed: full-screen listeners where added multiple times - updated macOS native libraries - added `FlatMacOSTest`
This commit is contained in:
@@ -7,12 +7,12 @@
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTON_STYLE_DEFAULT
|
||||
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTON_STYLE_DEFAULT 0L
|
||||
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTON_STYLE_MEDIUM
|
||||
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTON_STYLE_MEDIUM 1L
|
||||
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTON_STYLE_LARGE
|
||||
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTON_STYLE_LARGE 2L
|
||||
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTONS_SPACING_DEFAULT
|
||||
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTONS_SPACING_DEFAULT 0L
|
||||
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTONS_SPACING_MEDIUM
|
||||
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTONS_SPACING_MEDIUM 1L
|
||||
#undef com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTONS_SPACING_LARGE
|
||||
#define com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTONS_SPACING_LARGE 2L
|
||||
/*
|
||||
* Class: com_formdev_flatlaf_ui_FlatNativeMacLibrary
|
||||
* Method: setWindowRoundedBorder
|
||||
@@ -23,10 +23,10 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW
|
||||
|
||||
/*
|
||||
* Class: com_formdev_flatlaf_ui_FlatNativeMacLibrary
|
||||
* Method: setWindowButtonStyle
|
||||
* Method: setWindowButtonsSpacing
|
||||
* Signature: (Ljava/awt/Window;I)Z
|
||||
*/
|
||||
JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowButtonStyle
|
||||
JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowButtonsSpacing
|
||||
(JNIEnv *, jclass, jobject, jint);
|
||||
|
||||
/*
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
|
||||
// full screen observers
|
||||
@property (nonatomic) id willEnterFullScreenObserver;
|
||||
@property (nonatomic) id willExitFullScreenObserver;
|
||||
@property (nonatomic) id didExitFullScreenObserver;
|
||||
@end
|
||||
|
||||
@@ -41,6 +42,7 @@
|
||||
// declare internal methods
|
||||
NSWindow* getNSWindow( JNIEnv* env, jclass cls, jobject window );
|
||||
WindowData* getWindowData( NSWindow* nsWindow, bool allocate );
|
||||
void setWindowButtonsHidden( NSWindow* nsWindow, bool hidden );
|
||||
int getWindowButtonAreaWidth( NSWindow* nsWindow );
|
||||
int getWindowTitleBarHeight( NSWindow* nsWindow );
|
||||
bool isWindowFullScreen( NSWindow* nsWindow );
|
||||
@@ -121,8 +123,8 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW
|
||||
}
|
||||
|
||||
extern "C"
|
||||
JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowButtonStyle
|
||||
( JNIEnv* env, jclass cls, jobject window, jint buttonStyle )
|
||||
JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowButtonsSpacing
|
||||
( JNIEnv* env, jclass cls, jobject window, jint buttonsSpacing )
|
||||
{
|
||||
JNI_COCOA_ENTER()
|
||||
|
||||
@@ -130,20 +132,20 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW
|
||||
if( nsWindow == NULL )
|
||||
return FALSE;
|
||||
|
||||
#define STYLE_DEFAULT com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTON_STYLE_DEFAULT
|
||||
#define STYLE_MEDIUM com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTON_STYLE_MEDIUM
|
||||
#define STYLE_LARGE com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTON_STYLE_LARGE
|
||||
#define SPACING_DEFAULT com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTONS_SPACING_DEFAULT
|
||||
#define SPACING_MEDIUM com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTONS_SPACING_MEDIUM
|
||||
#define SPACING_LARGE com_formdev_flatlaf_ui_FlatNativeMacLibrary_BUTTONS_SPACING_LARGE
|
||||
|
||||
bool isMacOS_11_orLater = @available( macOS 11, * );
|
||||
if( !isMacOS_11_orLater && buttonStyle == STYLE_LARGE )
|
||||
buttonStyle = STYLE_MEDIUM;
|
||||
int oldButtonStyle = (nsWindow.toolbar != NULL)
|
||||
if( !isMacOS_11_orLater && buttonsSpacing == SPACING_LARGE )
|
||||
buttonsSpacing = SPACING_MEDIUM;
|
||||
int oldButtonsSpacing = (nsWindow.toolbar != NULL)
|
||||
? ((isMacOS_11_orLater && nsWindow.toolbarStyle == NSWindowToolbarStyleUnified)
|
||||
? STYLE_LARGE
|
||||
: STYLE_MEDIUM)
|
||||
: STYLE_DEFAULT;
|
||||
? SPACING_LARGE
|
||||
: SPACING_MEDIUM)
|
||||
: SPACING_DEFAULT;
|
||||
|
||||
if( buttonStyle == oldButtonStyle )
|
||||
if( buttonsSpacing == oldButtonsSpacing )
|
||||
return TRUE;
|
||||
|
||||
WindowData* windowData = getWindowData( nsWindow, true );
|
||||
@@ -153,8 +155,8 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW
|
||||
|
||||
// add/remove toolbar
|
||||
NSToolbar* toolbar = NULL;
|
||||
bool hasToolbar = (buttonStyle != STYLE_DEFAULT);
|
||||
if( hasToolbar ) {
|
||||
bool needsToolbar = (buttonsSpacing != SPACING_DEFAULT);
|
||||
if( needsToolbar ) {
|
||||
toolbar = [NSToolbar new];
|
||||
toolbar.showsBaselineSeparator = NO; // necessary for older macOS versions
|
||||
if( isWindowFullScreen( nsWindow ) )
|
||||
@@ -163,9 +165,9 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW
|
||||
nsWindow.toolbar = toolbar;
|
||||
|
||||
if( isMacOS_11_orLater ) {
|
||||
nsWindow.toolbarStyle = (buttonStyle == STYLE_LARGE)
|
||||
nsWindow.toolbarStyle = (buttonsSpacing == SPACING_LARGE)
|
||||
? NSWindowToolbarStyleUnified
|
||||
: (buttonStyle == STYLE_MEDIUM)
|
||||
: (buttonsSpacing == SPACING_MEDIUM)
|
||||
? NSWindowToolbarStyleUnifiedCompact
|
||||
: NSWindowToolbarStyleAutomatic;
|
||||
}
|
||||
@@ -178,7 +180,7 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW
|
||||
// when window becomes full screen, it is necessary to hide the toolbar
|
||||
// because it otherwise is shown non-transparent and hides Swing components
|
||||
NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
|
||||
if( hasToolbar ) {
|
||||
if( needsToolbar && windowData.willEnterFullScreenObserver == NULL ) {
|
||||
// NSLog( @"add observers %@", nsWindow );
|
||||
windowData.willEnterFullScreenObserver = [center addObserverForName:NSWindowWillEnterFullScreenNotification
|
||||
object:nsWindow queue:nil usingBlock:^(NSNotification *note) {
|
||||
@@ -188,26 +190,40 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW
|
||||
// remembar title bar height so that "main" JToolBar keeps its height in full screen
|
||||
windowData.lastWindowButtonAreaWidth = getWindowButtonAreaWidth( nsWindow );
|
||||
windowData.lastWindowTitleBarHeight = getWindowTitleBarHeight( nsWindow );
|
||||
// NSLog(@"%d %d",windowData.lastWindowButtonAreaWidth,windowData.lastWindowTitleBarHeight);
|
||||
// NSLog( @"%d %d", windowData.lastWindowButtonAreaWidth, windowData.lastWindowTitleBarHeight );
|
||||
|
||||
nsWindow.toolbar.visible = NO;
|
||||
}
|
||||
}];
|
||||
|
||||
windowData.willExitFullScreenObserver = [center addObserverForName:NSWindowWillExitFullScreenNotification
|
||||
object:nsWindow queue:nil usingBlock:^(NSNotification *note) {
|
||||
// NSLog( @"will exit full screen %@", nsWindow );
|
||||
if( nsWindow.toolbar != NULL )
|
||||
setWindowButtonsHidden( nsWindow, true );
|
||||
}];
|
||||
|
||||
windowData.didExitFullScreenObserver = [center addObserverForName:NSWindowDidExitFullScreenNotification
|
||||
object:nsWindow queue:nil usingBlock:^(NSNotification *note) {
|
||||
// NSLog( @"exit full screen %@", nsWindow );
|
||||
if( nsWindow.toolbar != NULL )
|
||||
if( nsWindow.toolbar != NULL ) {
|
||||
setWindowButtonsHidden( nsWindow, false );
|
||||
nsWindow.toolbar.visible = YES;
|
||||
}
|
||||
|
||||
windowData.lastWindowButtonAreaWidth = 0;
|
||||
windowData.lastWindowTitleBarHeight = 0;
|
||||
}];
|
||||
} else {
|
||||
} else if( !needsToolbar ) {
|
||||
// NSLog( @"remove observers %@", nsWindow );
|
||||
if( windowData.willEnterFullScreenObserver != NULL ) {
|
||||
[center removeObserver:windowData.willEnterFullScreenObserver];
|
||||
windowData.willEnterFullScreenObserver = nil;
|
||||
}
|
||||
if( windowData.willExitFullScreenObserver != NULL ) {
|
||||
[center removeObserver:windowData.willExitFullScreenObserver];
|
||||
windowData.willExitFullScreenObserver = nil;
|
||||
}
|
||||
if( windowData.didExitFullScreenObserver != NULL ) {
|
||||
[center removeObserver:windowData.didExitFullScreenObserver];
|
||||
windowData.didExitFullScreenObserver = nil;
|
||||
@@ -221,6 +237,21 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void setWindowButtonsHidden( NSWindow* nsWindow, bool hidden ) {
|
||||
// get buttons
|
||||
NSView* buttons[3] = {
|
||||
[nsWindow standardWindowButton:NSWindowCloseButton],
|
||||
[nsWindow standardWindowButton:NSWindowMiniaturizeButton],
|
||||
[nsWindow standardWindowButton:NSWindowZoomButton]
|
||||
};
|
||||
|
||||
for( int i = 0; i < 3; i++ ) {
|
||||
NSView* button = buttons[i];
|
||||
if( button != NULL )
|
||||
button.hidden = hidden;
|
||||
}
|
||||
}
|
||||
|
||||
extern "C"
|
||||
JNIEXPORT jobject JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_getWindowButtonsBounds
|
||||
( JNIEnv* env, jclass cls, jobject window )
|
||||
|
||||
Reference in New Issue
Block a user