< prev index next >
src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m
Print this page
rev 51957 : add support for full window content view and transparent title bar
rev 51960 : update full window content change to avoid unnecessary blocking
rev 51961 : Update
@@ -204,10 +204,11 @@
if (IS(styleBits, DECORATED)) {
type |= NSTitledWindowMask;
if (IS(styleBits, CLOSEABLE)) type |= NSClosableWindowMask;
if (IS(styleBits, MINIMIZABLE)) type |= NSMiniaturizableWindowMask;
if (IS(styleBits, RESIZABLE)) type |= NSResizableWindowMask;
+ if (IS(styleBits, FULL_WINDOW_CONTENT)) type |= NSFullSizeContentViewWindowMask;
} else {
type |= NSBorderlessWindowMask;
}
if (IS(styleBits, TEXTURED)) type |= NSTexturedBackgroundWindowMask;
@@ -261,10 +262,14 @@
[self.nsWindow setCollectionBehavior:(1 << 7) /*NSWindowCollectionBehaviorFullScreenPrimary*/];
} else {
[self.nsWindow setCollectionBehavior:NSWindowCollectionBehaviorDefault];
}
}
+
+ if (IS(mask, TRANSPARENT_TITLE_BAR) && [self.nsWindow respondsToSelector:@selector(setTitlebarAppearsTransparent:)]) {
+ [self.nsWindow setTitlebarAppearsTransparent:IS(bits, TRANSPARENT_TITLE_BAR)];
+ }
}
- (id) initWithPlatformWindow:(JNFWeakJObjectWrapper *)platformWindow
ownerWindow:owner
styleBits:(jint)bits
@@ -588,34 +593,37 @@
}
// NSWindowDelegate methods
-- (void) _deliverMoveResizeEvent {
-AWT_ASSERT_APPKIT_THREAD;
-
- // deliver the event if this is a user-initiated live resize or as a side-effect
- // of a Java initiated resize, because AppKit can override the bounds and force
- // the bounds of the window to avoid the Dock or remain on screen.
- [AWTToolkit eventCountPlusPlus];
- JNIEnv *env = [ThreadUtilities getJNIEnv];
- jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env];
+static void deliverMoveResizeEvent(JNIEnv *env, NSRect frame, JNFWeakJObjectWrapper *javaPlatformWindow,
+ BOOL inLiveResize) {
+ jobject platformWindow = [javaPlatformWindow jObjectWithEnv:env];
if (platformWindow == NULL) {
// TODO: create generic AWT assert
}
- NSRect frame = ConvertNSScreenRect(env, [self.nsWindow frame]);
-
static JNF_MEMBER_CACHE(jm_deliverMoveResizeEvent, jc_CPlatformWindow, "deliverMoveResizeEvent", "(IIIIZ)V");
JNFCallVoidMethod(env, platformWindow, jm_deliverMoveResizeEvent,
(jint)frame.origin.x,
(jint)frame.origin.y,
(jint)frame.size.width,
(jint)frame.size.height,
- (jboolean)[self.nsWindow inLiveResize]);
+ (jboolean)inLiveResize);
(*env)->DeleteLocalRef(env, platformWindow);
+}
+
+- (void) _deliverMoveResizeEvent {
+AWT_ASSERT_APPKIT_THREAD;
+ // deliver the event if this is a user-initiated live resize or as a side-effect
+ // of a Java initiated resize, because AppKit can override the bounds and force
+ // the bounds of the window to avoid the Dock or remain on screen.
+ [AWTToolkit eventCountPlusPlus];
+ JNIEnv *env = [ThreadUtilities getJNIEnv];
+ NSRect frame = ConvertNSScreenRect(env, [self.nsWindow frame]);
+ deliverMoveResizeEvent(env, frame, self.javaPlatformWindow, [self.nsWindow inLiveResize]);
[AWTWindow synthesizeMouseEnteredExitedEventsForAllWindows];
}
- (void)windowDidMove:(NSNotification *)notification {
AWT_ASSERT_APPKIT_THREAD;
@@ -1056,18 +1064,43 @@
(JNIEnv *env, jclass clazz, jlong windowPtr, jint mask, jint bits)
{
JNF_COCOA_ENTER(env);
NSWindow *nsWindow = OBJC(windowPtr);
- [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
+ __block BOOL resized = NO;
+ __block NSRect resizeFrame;
+ __block JNFWeakJObjectWrapper *javaPlatformWindow;
+
+ BOOL shouldWait = IS(mask, FULL_WINDOW_CONTENT); // delay upcall until window changes are made
+
+ [ThreadUtilities performOnMainThreadWaiting:shouldWait block:^(){
AWTWindow *window = (AWTWindow*)[nsWindow delegate];
// scans the bit field, and only updates the values requested by the mask
- // (this implicity handles the _CALLBACK_PROP_BITMASK case, since those are passive reads)
+ // (this implicitly handles the _CALLBACK_PROP_BITMASK case, since those are passive reads)
jint newBits = window.styleBits & ~mask | bits & mask;
+ // Check for a change to the full window content view option.
+ // The content view must be resized first, otherwise the window will be resized to fit the existing
+ // content view.
+ if (IS(mask, FULL_WINDOW_CONTENT)) {
+ if (IS(newBits, FULL_WINDOW_CONTENT) != IS(window.styleBits, FULL_WINDOW_CONTENT)) {
+ NSRect frame = [nsWindow frame];
+ NSUInteger styleMask = [AWTWindow styleMaskForStyleBits:newBits];
+ NSRect screenContentRect = [NSWindow contentRectForFrameRect:frame styleMask:styleMask];
+ NSRect contentFrame = NSMakeRect(screenContentRect.origin.x - frame.origin.x,
+ screenContentRect.origin.y - frame.origin.y,
+ screenContentRect.size.width,
+ screenContentRect.size.height);
+ nsWindow.contentView.frame = contentFrame;
+ resized = YES;
+ resizeFrame = [nsWindow frame];
+ javaPlatformWindow = window.javaPlatformWindow;
+ }
+ }
+
// resets the NSWindow's style mask if the mask intersects any of those bits
if (mask & MASK(_STYLE_PROP_BITMASK)) {
[nsWindow setStyleMask:[AWTWindow styleMaskForStyleBits:newBits]];
}
@@ -1077,10 +1110,17 @@
}
window.styleBits = newBits;
}];
+ if (resized) {
+ [AWTToolkit eventCountPlusPlus];
+ NSRect frame = ConvertNSScreenRect(env, resizeFrame);
+ deliverMoveResizeEvent(env, frame, javaPlatformWindow, NO);
+ [AWTWindow synthesizeMouseEnteredExitedEventsForAllWindows];
+ }
+
JNF_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_CPlatformWindow
< prev index next >