src/macosx/native/sun/awt/AWTWindow.m

Print this page

        

*** 68,95 **** { return nil; } @end @implementation AWTWindow @synthesize javaPlatformWindow; @synthesize javaMenuBar; @synthesize growBoxWindow; @synthesize javaMinSize; @synthesize javaMaxSize; @synthesize styleBits; @synthesize isEnabled; - (void) updateMinMaxSize:(BOOL)resizable { if (resizable) { ! [self setMinSize:self.javaMinSize]; ! [self setMaxSize:self.javaMaxSize]; } else { ! NSRect currentFrame = [self frame]; ! [self setMinSize:currentFrame.size]; ! [self setMaxSize:currentFrame.size]; } } // creates a new NSWindow style mask based on the _STYLE_PROP_BITMASK bits + (NSUInteger) styleMaskForStyleBits:(jint)styleBits { --- 68,148 ---- { return nil; } @end + // -------------------------------------------------------------- + // NSWindow/NSPanel descendants implementation + #define AWT_NS_WINDOW_IMPLEMENTATION \ + - (id) initWithDelegate:(AWTWindow *)delegate \ + frameRect:(NSRect)contectRect \ + styleMask:(NSUInteger)styleMask \ + contentView:(NSView *)view \ + { \ + self = [super initWithContentRect:contectRect \ + styleMask:styleMask \ + backing:NSBackingStoreBuffered \ + defer:NO]; \ + \ + if (self == nil) return nil; \ + \ + [self setDelegate:delegate]; \ + [self setContentView:view]; \ + [self setInitialFirstResponder:view]; \ + [self setReleasedWhenClosed:NO]; \ + [self setPreservesContentDuringLiveResize:YES]; \ + \ + return self; \ + } \ + \ + /* NSWindow overrides */ \ + - (BOOL) canBecomeKeyWindow { \ + return [(AWTWindow*)[self delegate] canBecomeKeyWindow]; \ + } \ + \ + - (BOOL) canBecomeMainWindow { \ + return [(AWTWindow*)[self delegate] canBecomeMainWindow]; \ + } \ + \ + - (BOOL) worksWhenModal { \ + return [(AWTWindow*)[self delegate] worksWhenModal]; \ + } \ + \ + - (void)sendEvent:(NSEvent *)event { \ + [(AWTWindow*)[self delegate] sendEvent:event]; \ + [super sendEvent:event]; \ + } + + @implementation AWTWindow_Normal + AWT_NS_WINDOW_IMPLEMENTATION + @end + @implementation AWTWindow_Panel + AWT_NS_WINDOW_IMPLEMENTATION + @end + // END of NSWindow/NSPanel descendants implementation + // -------------------------------------------------------------- + + @implementation AWTWindow + @synthesize nsWindow; @synthesize javaPlatformWindow; @synthesize javaMenuBar; @synthesize growBoxWindow; @synthesize javaMinSize; @synthesize javaMaxSize; @synthesize styleBits; @synthesize isEnabled; - (void) updateMinMaxSize:(BOOL)resizable { if (resizable) { ! [self.nsWindow setMinSize:self.javaMinSize]; ! [self.nsWindow setMaxSize:self.javaMaxSize]; } else { ! NSRect currentFrame = [self.nsWindow frame]; ! [self.nsWindow setMinSize:currentFrame.size]; ! [self.nsWindow setMaxSize:currentFrame.size]; } } // creates a new NSWindow style mask based on the _STYLE_PROP_BITMASK bits + (NSUInteger) styleMaskForStyleBits:(jint)styleBits {
*** 116,157 **** // updates _METHOD_PROP_BITMASK based properties on the window - (void) setPropertiesForStyleBits:(jint)bits mask:(jint)mask { if (IS(mask, RESIZABLE)) { BOOL resizable = IS(bits, RESIZABLE); [self updateMinMaxSize:resizable]; ! [self setShowsResizeIndicator:resizable]; } if (IS(mask, HAS_SHADOW)) { ! [self setHasShadow:IS(bits, HAS_SHADOW)]; } if (IS(mask, ZOOMABLE)) { ! [[self standardWindowButton:NSWindowZoomButton] setEnabled:IS(bits, ZOOMABLE)]; } if (IS(mask, ALWAYS_ON_TOP)) { ! [self setLevel:IS(bits, ALWAYS_ON_TOP) ? NSFloatingWindowLevel : NSNormalWindowLevel]; } if (IS(mask, HIDES_ON_DEACTIVATE)) { ! [self setHidesOnDeactivate:IS(bits, HIDES_ON_DEACTIVATE)]; } if (IS(mask, DRAGGABLE_BACKGROUND)) { ! [self setMovableByWindowBackground:IS(bits, DRAGGABLE_BACKGROUND)]; } if (IS(mask, DOCUMENT_MODIFIED)) { ! [self setDocumentEdited:IS(bits, DOCUMENT_MODIFIED)]; } ! if ([self respondsToSelector:@selector(toggleFullScreen:)]) { if (IS(mask, FULLSCREENABLE)) { ! [self setCollectionBehavior:(1 << 7) /*NSWindowCollectionBehaviorFullScreenPrimary*/]; } else { ! [self setCollectionBehavior:NSWindowCollectionBehaviorDefault]; } } } --- 169,210 ---- // updates _METHOD_PROP_BITMASK based properties on the window - (void) setPropertiesForStyleBits:(jint)bits mask:(jint)mask { if (IS(mask, RESIZABLE)) { BOOL resizable = IS(bits, RESIZABLE); [self updateMinMaxSize:resizable]; ! [self.nsWindow setShowsResizeIndicator:resizable]; } if (IS(mask, HAS_SHADOW)) { ! [self.nsWindow setHasShadow:IS(bits, HAS_SHADOW)]; } if (IS(mask, ZOOMABLE)) { ! [[self.nsWindow standardWindowButton:NSWindowZoomButton] setEnabled:IS(bits, ZOOMABLE)]; } if (IS(mask, ALWAYS_ON_TOP)) { ! [self.nsWindow setLevel:IS(bits, ALWAYS_ON_TOP) ? NSFloatingWindowLevel : NSNormalWindowLevel]; } if (IS(mask, HIDES_ON_DEACTIVATE)) { ! [self.nsWindow setHidesOnDeactivate:IS(bits, HIDES_ON_DEACTIVATE)]; } if (IS(mask, DRAGGABLE_BACKGROUND)) { ! [self.nsWindow setMovableByWindowBackground:IS(bits, DRAGGABLE_BACKGROUND)]; } if (IS(mask, DOCUMENT_MODIFIED)) { ! [self.nsWindow setDocumentEdited:IS(bits, DOCUMENT_MODIFIED)]; } ! if ([self.nsWindow respondsToSelector:@selector(toggleFullScreen:)]) { if (IS(mask, FULLSCREENABLE)) { ! [self.nsWindow setCollectionBehavior:(1 << 7) /*NSWindowCollectionBehaviorFullScreenPrimary*/]; } else { ! [self.nsWindow setCollectionBehavior:NSWindowCollectionBehaviorDefault]; } } }
*** 187,214 **** } if (contentRect.size.height <= 0.0) { contentRect.size.height = 1.0; } ! self = [super initWithContentRect:contentRect ! styleMask:styleMask ! backing:NSBackingStoreBuffered ! defer:NO]; if (self == nil) return nil; // no hope self.isEnabled = YES; self.javaPlatformWindow = platformWindow; self.styleBits = bits; [self setPropertiesForStyleBits:styleBits mask:MASK(_METHOD_PROP_BITMASK)]; - [self setDelegate:self]; - [self setContentView:view]; - [self setInitialFirstResponder:view]; - [self setReleasedWhenClosed:NO]; - [self setPreservesContentDuringLiveResize:YES]; - if ([self shouldShowGrowBox]) { NSImage *growBoxImage = [self createGrowBoxImage]; growBoxWindow = [[JavaResizeGrowBoxOverlayWindow alloc] initWithContentRect:NSMakeRect(0, 0, [growBoxImage size].width, [growBoxImage size].height) styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; [self.growBoxWindow setIgnoresMouseEvents:YES]; [self.growBoxWindow setOpaque:NO]; --- 240,279 ---- } if (contentRect.size.height <= 0.0) { contentRect.size.height = 1.0; } ! self = [super init]; if (self == nil) return nil; // no hope + if (IS(bits, UTILITY) || + IS(bits, NONACTIVATING) || + IS(bits, HUD) || + IS(bits, HIDES_ON_DEACTIVATE)) + { + self.nsWindow = [[AWTWindow_Panel alloc] initWithDelegate:self + frameRect:contentRect + styleMask:styleMask + contentView:view]; + } + else + { + // These windows will appear in the window list in the dock icon menu + self.nsWindow = [[AWTWindow_Normal alloc] initWithDelegate:self + frameRect:contentRect + styleMask:styleMask + contentView:view]; + } + + if (self.nsWindow == nil) return nil; // no hope either + self.isEnabled = YES; self.javaPlatformWindow = platformWindow; self.styleBits = bits; [self setPropertiesForStyleBits:styleBits mask:MASK(_METHOD_PROP_BITMASK)]; if ([self shouldShowGrowBox]) { NSImage *growBoxImage = [self createGrowBoxImage]; growBoxWindow = [[JavaResizeGrowBoxOverlayWindow alloc] initWithContentRect:NSMakeRect(0, 0, [growBoxImage size].width, [growBoxImage size].height) styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; [self.growBoxWindow setIgnoresMouseEvents:YES]; [self.growBoxWindow setOpaque:NO];
*** 223,233 **** [self.growBoxWindow setContentView:imageView]; [imageView setImage:growBoxImage]; [growBoxImage release]; [imageView release]; ! [self addChildWindow:self.growBoxWindow ordered:NSWindowAbove]; [self adjustGrowBoxWindow]; } else growBoxWindow = nil; return self; } --- 288,298 ---- [self.growBoxWindow setContentView:imageView]; [imageView setImage:growBoxImage]; [growBoxImage release]; [imageView release]; ! [self.nsWindow addChildWindow:self.growBoxWindow ordered:NSWindowAbove]; [self adjustGrowBoxWindow]; } else growBoxWindow = nil; return self; }
*** 237,246 **** --- 302,313 ---- JNIEnv *env = [ThreadUtilities getJNIEnv]; [self.javaPlatformWindow setJObject:nil withEnv:env]; self.growBoxWindow = nil; + self.nsWindow = nil; + [super dealloc]; } // NSWindow overrides - (BOOL) canBecomeKeyWindow {
*** 270,280 **** static JNF_MEMBER_CACHE(jf_target, jc_CPlatformWindow, "target", "Ljava/awt/Window;"); jobject awtWindow = JNFGetObjectField(env, platformWindow, jf_target); if (awtWindow != NULL) { // translate the point into Java coordinates NSPoint loc = [event locationInWindow]; ! loc.y = [self frame].size.height - loc.y; // send up to the GestureHandler to recursively dispatch on the AWT event thread static JNF_CLASS_CACHE(jc_GestureHandler, "com/apple/eawt/event/GestureHandler"); static JNF_STATIC_MEMBER_CACHE(sjm_handleGestureFromNative, jc_GestureHandler, "handleGestureFromNative", "(Ljava/awt/Window;IDDDD)V"); JNFCallStaticVoidMethod(env, sjm_handleGestureFromNative, awtWindow, type, (jdouble)loc.x, (jdouble)loc.y, (jdouble)a, (jdouble)b); --- 337,347 ---- static JNF_MEMBER_CACHE(jf_target, jc_CPlatformWindow, "target", "Ljava/awt/Window;"); jobject awtWindow = JNFGetObjectField(env, platformWindow, jf_target); if (awtWindow != NULL) { // translate the point into Java coordinates NSPoint loc = [event locationInWindow]; ! loc.y = [self.nsWindow frame].size.height - loc.y; // send up to the GestureHandler to recursively dispatch on the AWT event thread static JNF_CLASS_CACHE(jc_GestureHandler, "com/apple/eawt/event/GestureHandler"); static JNF_STATIC_MEMBER_CACHE(sjm_handleGestureFromNative, jc_GestureHandler, "handleGestureFromNative", "(Ljava/awt/Window;IDDDD)V"); JNFCallStaticVoidMethod(env, sjm_handleGestureFromNative, awtWindow, type, (jdouble)loc.x, (jdouble)loc.y, (jdouble)a, (jdouble)b);
*** 322,332 **** // NSWindowDelegate methods - (void) adjustGrowBoxWindow { if (self.growBoxWindow != nil) { ! NSRect parentRect = [self frame]; parentRect.origin.x += (parentRect.size.width - [self.growBoxWindow frame].size.width); [self.growBoxWindow setFrameOrigin:parentRect.origin]; } } --- 389,399 ---- // NSWindowDelegate methods - (void) adjustGrowBoxWindow { if (self.growBoxWindow != nil) { ! NSRect parentRect = [self.nsWindow frame]; parentRect.origin.x += (parentRect.size.width - [self.growBoxWindow frame].size.width); [self.growBoxWindow setFrameOrigin:parentRect.origin]; } }
*** 343,353 **** // TODO: create generic AWT assert } [self adjustGrowBoxWindow]; ! NSRect frame = ConvertNSScreenRect(env, [self frame]); static JNF_MEMBER_CACHE(jm_deliverMoveResizeEvent, jc_CPlatformWindow, "deliverMoveResizeEvent", "(IIII)V"); JNFCallVoidMethod(env, platformWindow, jm_deliverMoveResizeEvent, (jint)frame.origin.x, (jint)frame.origin.y, --- 410,420 ---- // TODO: create generic AWT assert } [self adjustGrowBoxWindow]; ! NSRect frame = ConvertNSScreenRect(env, [self.nsWindow frame]); static JNF_MEMBER_CACHE(jm_deliverMoveResizeEvent, jc_CPlatformWindow, "deliverMoveResizeEvent", "(IIII)V"); JNFCallVoidMethod(env, platformWindow, jm_deliverMoveResizeEvent, (jint)frame.origin.x, (jint)frame.origin.y,
*** 533,563 **** - (void)sendEvent:(NSEvent *)event { if ([event type] == NSLeftMouseDown || [event type] == NSRightMouseDown || [event type] == NSOtherMouseDown) { NSPoint p = [NSEvent mouseLocation]; ! NSRect frame = [self frame]; ! NSRect contentRect = [self contentRectForFrameRect:frame]; // Check if the click happened in the non-client area (title bar) if (p.y >= (frame.origin.y + contentRect.size.height)) { JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env]; // Currently, no need to deliver the whole NSEvent. static JNF_MEMBER_CACHE(jm_deliverNCMouseDown, jc_CPlatformWindow, "deliverNCMouseDown", "()V"); JNFCallVoidMethod(env, platformWindow, jm_deliverNCMouseDown); } } - [super sendEvent:event]; } - (void)constrainSize:(NSSize*)size { float minWidth = 0.f, minHeight = 0.f; if (IS(self.styleBits, DECORATED)) { ! NSRect frame = [self frame]; ! NSRect contentRect = [NSWindow contentRectForFrameRect:frame styleMask:[self styleMask]]; float top = frame.size.height - contentRect.size.height; float left = contentRect.origin.x - frame.origin.x; float bottom = contentRect.origin.y - frame.origin.y; float right = frame.size.width - (contentRect.size.width + left); --- 600,629 ---- - (void)sendEvent:(NSEvent *)event { if ([event type] == NSLeftMouseDown || [event type] == NSRightMouseDown || [event type] == NSOtherMouseDown) { NSPoint p = [NSEvent mouseLocation]; ! NSRect frame = [self.nsWindow frame]; ! NSRect contentRect = [self.nsWindow contentRectForFrameRect:frame]; // Check if the click happened in the non-client area (title bar) if (p.y >= (frame.origin.y + contentRect.size.height)) { JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env]; // Currently, no need to deliver the whole NSEvent. static JNF_MEMBER_CACHE(jm_deliverNCMouseDown, jc_CPlatformWindow, "deliverNCMouseDown", "()V"); JNFCallVoidMethod(env, platformWindow, jm_deliverNCMouseDown); } } } - (void)constrainSize:(NSSize*)size { float minWidth = 0.f, minHeight = 0.f; if (IS(self.styleBits, DECORATED)) { ! NSRect frame = [self.nsWindow frame]; ! NSRect contentRect = [NSWindow contentRectForFrameRect:frame styleMask:[self.nsWindow styleMask]]; float top = frame.size.height - contentRect.size.height; float left = contentRect.origin.x - frame.origin.x; float bottom = contentRect.origin.y - frame.origin.y; float right = frame.size.width - (contentRect.size.width + left);
*** 581,604 **** - (void) setEnabled: (BOOL)flag { self.isEnabled = flag; if (IS(self.styleBits, CLOSEABLE)) { ! [[self standardWindowButton:NSWindowCloseButton] setEnabled: flag]; } if (IS(self.styleBits, MINIMIZABLE)) { ! [[self standardWindowButton:NSWindowMiniaturizeButton] setEnabled: flag]; } if (IS(self.styleBits, ZOOMABLE)) { ! [[self standardWindowButton:NSWindowZoomButton] setEnabled: flag]; } if (IS(self.styleBits, RESIZABLE)) { [self updateMinMaxSize:flag]; ! [self setShowsResizeIndicator:flag]; } } @end // AWTWindow --- 647,670 ---- - (void) setEnabled: (BOOL)flag { self.isEnabled = flag; if (IS(self.styleBits, CLOSEABLE)) { ! [[self.nsWindow standardWindowButton:NSWindowCloseButton] setEnabled: flag]; } if (IS(self.styleBits, MINIMIZABLE)) { ! [[self.nsWindow standardWindowButton:NSWindowMiniaturizeButton] setEnabled: flag]; } if (IS(self.styleBits, ZOOMABLE)) { ! [[self.nsWindow standardWindowButton:NSWindowZoomButton] setEnabled: flag]; } if (IS(self.styleBits, RESIZABLE)) { [self updateMinMaxSize:flag]; ! [self.nsWindow setShowsResizeIndicator:flag]; } } @end // AWTWindow
*** 632,642 **** [window release]; // GC }]; JNF_COCOA_EXIT(env); ! return ptr_to_jlong(window); } /* * Class: sun_lwawt_macosx_CPlatformWindow * Method: nativeSetNSWindowStyleBits --- 698,708 ---- [window release]; // GC }]; JNF_COCOA_EXIT(env); ! return ptr_to_jlong(window ? window.nsWindow : nil); } /* * Class: sun_lwawt_macosx_CPlatformWindow * Method: nativeSetNSWindowStyleBits
*** 646,666 **** (JNIEnv *env, jclass clazz, jlong windowPtr, jint mask, jint bits) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; // 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) jint newBits = window.styleBits & ~mask | bits & mask; // resets the NSWindow's style mask if the mask intersects any of those bits if (mask & MASK(_STYLE_PROP_BITMASK)) { ! [window setStyleMask:[AWTWindow styleMaskForStyleBits:newBits]]; } // calls methods on NSWindow to change other properties, based on the mask if (mask & MASK(_METHOD_PROP_BITMASK)) { [window setPropertiesForStyleBits:bits mask:mask]; --- 712,734 ---- (JNIEnv *env, jclass clazz, jlong windowPtr, jint mask, jint bits) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; + 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) jint newBits = window.styleBits & ~mask | bits & mask; // 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]]; } // calls methods on NSWindow to change other properties, based on the mask if (mask & MASK(_METHOD_PROP_BITMASK)) { [window setPropertiesForStyleBits:bits mask:mask];
*** 681,696 **** (JNIEnv *env, jclass clazz, jlong windowPtr, jlong menuBarPtr) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); CMenuBar *menuBar = OBJC(menuBarPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! if ([window isKeyWindow]) [window.javaMenuBar deactivate]; window.javaMenuBar = menuBar; // if ([self isKeyWindow]) { [CMenuBar activate:window.javaMenuBar modallyDisabled:NO]; // } --- 749,766 ---- (JNIEnv *env, jclass clazz, jlong windowPtr, jlong menuBarPtr) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); CMenuBar *menuBar = OBJC(menuBarPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! AWTWindow *window = (AWTWindow*)[nsWindow delegate]; ! ! if ([nsWindow isKeyWindow]) [window.javaMenuBar deactivate]; window.javaMenuBar = menuBar; // if ([self isKeyWindow]) { [CMenuBar activate:window.javaMenuBar modallyDisabled:NO]; // }
*** 710,728 **** jobject ret = NULL; JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); __block NSRect contentRect = NSZeroRect; __block NSRect frame = NSZeroRect; [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! frame = [window frame]; ! contentRect = [NSWindow contentRectForFrameRect:frame styleMask:[window styleMask]]; }]; jint top = (jint)(frame.size.height - contentRect.size.height); jint left = (jint)(contentRect.origin.x - frame.origin.x); jint bottom = (jint)(contentRect.origin.y - frame.origin.y); --- 780,798 ---- jobject ret = NULL; JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); __block NSRect contentRect = NSZeroRect; __block NSRect frame = NSZeroRect; [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! frame = [nsWindow frame]; ! contentRect = [NSWindow contentRectForFrameRect:frame styleMask:[nsWindow styleMask]]; }]; jint top = (jint)(frame.size.height - contentRect.size.height); jint left = (jint)(contentRect.origin.x - frame.origin.x); jint bottom = (jint)(contentRect.origin.y - frame.origin.y);
*** 748,770 **** AWT_ASSERT_NOT_APPKIT_THREAD; NSRect jrect = NSMakeRect(originX, originY, width, height); // TODO: not sure we need displayIfNeeded message in our view ! AWTWindow *window = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; NSRect rect = ConvertNSScreenRect(NULL, jrect); [window constrainSize:&rect.size]; ! [window setFrame:rect display:YES]; // only start tracking events if pointer is above the toplevel // TODO: should post an Entered event if YES. NSPoint mLocation = [NSEvent mouseLocation]; ! [window setAcceptsMouseMovedEvents:NSPointInRect(mLocation, rect)]; // ensure we repaint the whole window after the resize operation // (this will also re-enable screen updates, which were disabled above) // TODO: send PaintEvent }]; --- 818,842 ---- AWT_ASSERT_NOT_APPKIT_THREAD; NSRect jrect = NSMakeRect(originX, originY, width, height); // TODO: not sure we need displayIfNeeded message in our view ! NSWindow *nsWindow = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; + AWTWindow *window = (AWTWindow*)[nsWindow delegate]; + NSRect rect = ConvertNSScreenRect(NULL, jrect); [window constrainSize:&rect.size]; ! [nsWindow setFrame:rect display:YES]; // only start tracking events if pointer is above the toplevel // TODO: should post an Entered event if YES. NSPoint mLocation = [NSEvent mouseLocation]; ! [nsWindow setAcceptsMouseMovedEvents:NSPointInRect(mLocation, rect)]; // ensure we repaint the whole window after the resize operation // (this will also re-enable screen updates, which were disabled above) // TODO: send PaintEvent }];
*** 786,799 **** if (minW < 1) minW = 1; if (minH < 1) minH = 1; if (maxW < 1) maxW = 1; if (maxH < 1) maxH = 1; ! AWTWindow *window = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; NSSize min = { minW, minH }; NSSize max = { maxW, maxH }; [window constrainSize:&min]; [window constrainSize:&max]; --- 858,873 ---- if (minW < 1) minW = 1; if (minH < 1) minH = 1; if (maxW < 1) maxW = 1; if (maxH < 1) maxH = 1; ! NSWindow *nsWindow = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; + AWTWindow *window = (AWTWindow*)[nsWindow delegate]; + NSSize min = { minW, minH }; NSSize max = { maxW, maxH }; [window constrainSize:&min]; [window constrainSize:&max];
*** 815,829 **** (JNIEnv *env, jclass clazz, jlong windowPtr) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! [window orderBack:nil]; }]; JNF_COCOA_EXIT(env); } --- 889,903 ---- (JNIEnv *env, jclass clazz, jlong windowPtr) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! [nsWindow orderBack:nil]; }]; JNF_COCOA_EXIT(env); }
*** 836,853 **** (JNIEnv *env, jclass clazz, jlong windowPtr) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! if (![window isKeyWindow]) { ! [window makeKeyAndOrderFront:window]; } else { ! [window orderFront:window]; } }]; JNF_COCOA_EXIT(env); } --- 910,927 ---- (JNIEnv *env, jclass clazz, jlong windowPtr) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! if (![nsWindow isKeyWindow]) { ! [nsWindow makeKeyAndOrderFront:nsWindow]; } else { ! [nsWindow orderFront:nsWindow]; } }]; JNF_COCOA_EXIT(env); }
*** 861,872 **** (JNIEnv *env, jclass clazz, jlong windowPtr, jstring jtitle) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); ! [window performSelectorOnMainThread:@selector(setTitle:) withObject:JNFJavaToNSString(env, jtitle) waitUntilDone:NO]; JNF_COCOA_EXIT(env); } --- 935,946 ---- (JNIEnv *env, jclass clazz, jlong windowPtr, jstring jtitle) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); ! [nsWindow performSelectorOnMainThread:@selector(setTitle:) withObject:JNFJavaToNSString(env, jtitle) waitUntilDone:NO]; JNF_COCOA_EXIT(env); }
*** 880,894 **** (JNIEnv *env, jclass clazz, jlong windowPtr, jfloat alpha) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! [window setAlphaValue:alpha]; [window.growBoxWindow setAlphaValue:alpha]; }]; JNF_COCOA_EXIT(env); } --- 954,969 ---- (JNIEnv *env, jclass clazz, jlong windowPtr, jfloat alpha) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! AWTWindow *window = (AWTWindow*)[nsWindow delegate]; ! [nsWindow setAlphaValue:alpha]; [window.growBoxWindow setAlphaValue:alpha]; }]; JNF_COCOA_EXIT(env); }
*** 902,916 **** (JNIEnv *env, jclass clazz, jlong windowPtr) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! [window invalidateShadow]; }]; JNF_COCOA_EXIT(env); } --- 977,991 ---- (JNIEnv *env, jclass clazz, jlong windowPtr) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! [nsWindow invalidateShadow]; }]; JNF_COCOA_EXIT(env); }
*** 925,936 **** jint ret = 0; JNF_COCOA_ENTER(env); AWT_ASSERT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); ! NSDictionary *props = [[window screen] deviceDescription]; ret = [[props objectForKey:@"NSScreenNumber"] intValue]; JNF_COCOA_EXIT(env); return ret; --- 1000,1011 ---- jint ret = 0; JNF_COCOA_ENTER(env); AWT_ASSERT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); ! NSDictionary *props = [[nsWindow screen] deviceDescription]; ret = [[props objectForKey:@"NSScreenNumber"] intValue]; JNF_COCOA_EXIT(env); return ret;
*** 945,960 **** (JNIEnv *env, jclass clazz, jlong windowPtr, jlong nsImagePtr) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); NSImage *image = OBJC(nsImagePtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! [window setMiniwindowImage:image]; }]; JNF_COCOA_EXIT(env); } --- 1020,1035 ---- (JNIEnv *env, jclass clazz, jlong windowPtr, jlong nsImagePtr) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); NSImage *image = OBJC(nsImagePtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! [nsWindow setMiniwindowImage:image]; }]; JNF_COCOA_EXIT(env); }
*** 967,982 **** (JNIEnv *env, jclass clazz, jlong windowPtr, jstring filename) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); NSURL *url = (filename == NULL) ? nil : [NSURL fileURLWithPath:JNFNormalizedNSStringForPath(env, filename)]; [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! [window setRepresentedURL:url]; }]; JNF_COCOA_EXIT(env); } --- 1042,1057 ---- (JNIEnv *env, jclass clazz, jlong windowPtr, jstring filename) { JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); NSURL *url = (filename == NULL) ? nil : [NSURL fileURLWithPath:JNFNormalizedNSStringForPath(env, filename)]; [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; ! [nsWindow setRepresentedURL:url]; }]; JNF_COCOA_EXIT(env); }
*** 1007,1018 **** jint index = -1; JNF_COCOA_ENTER(env); AWT_ASSERT_APPKIT_THREAD; ! AWTWindow *window = OBJC(windowPtr); ! NSScreen* screen = [window screen]; //+++gdb NOTE: This is using a linear search of the screens. If it should // prove to be a bottleneck, this can definitely be improved. However, // many screens should prove to be the exception, rather than the rule. NSArray* screens = [NSScreen screens]; --- 1082,1093 ---- jint index = -1; JNF_COCOA_ENTER(env); AWT_ASSERT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); ! NSScreen* screen = [nsWindow screen]; //+++gdb NOTE: This is using a linear search of the screens. If it should // prove to be a bottleneck, this can definitely be improved. However, // many screens should prove to be the exception, rather than the rule. NSArray* screens = [NSScreen screens];
*** 1039,1054 **** JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow__1toggleFullScreenMode (JNIEnv *env, jobject peer, jlong windowPtr) { JNF_COCOA_ENTER(env); ! AWTWindow *window = OBJC(windowPtr); SEL toggleFullScreenSelector = @selector(toggleFullScreen:); ! if (![window respondsToSelector:toggleFullScreenSelector]) return; [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ ! [window performSelector:toggleFullScreenSelector withObject:nil]; }]; JNF_COCOA_EXIT(env); } --- 1114,1129 ---- JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow__1toggleFullScreenMode (JNIEnv *env, jobject peer, jlong windowPtr) { JNF_COCOA_ENTER(env); ! NSWindow *nsWindow = OBJC(windowPtr); SEL toggleFullScreenSelector = @selector(toggleFullScreen:); ! if (![nsWindow respondsToSelector:toggleFullScreenSelector]) return; [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ ! [nsWindow performSelector:toggleFullScreenSelector withObject:nil]; }]; JNF_COCOA_EXIT(env); }
*** 1058,1073 **** __block jboolean underMouse = JNI_FALSE; JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! AWTWindow *aWindow = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^() { AWT_ASSERT_APPKIT_THREAD; ! NSPoint pt = [aWindow mouseLocationOutsideOfEventStream]; ! underMouse = [[aWindow contentView] hitTest:pt] != nil; }]; JNF_COCOA_EXIT(env); return underMouse; --- 1133,1148 ---- __block jboolean underMouse = JNI_FALSE; JNF_COCOA_ENTER(env); AWT_ASSERT_NOT_APPKIT_THREAD; ! NSWindow *nsWindow = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^() { AWT_ASSERT_APPKIT_THREAD; ! NSPoint pt = [nsWindow mouseLocationOutsideOfEventStream]; ! underMouse = [[nsWindow contentView] hitTest:pt] != nil; }]; JNF_COCOA_EXIT(env); return underMouse;
*** 1076,1087 **** JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSetEnabled (JNIEnv *env, jclass clazz, jlong windowPtr, jboolean isEnabled) { JNF_COCOA_ENTER(env); ! AWTWindow *window = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ [window setEnabled: isEnabled]; }]; JNF_COCOA_EXIT(env); } --- 1151,1164 ---- JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSetEnabled (JNIEnv *env, jclass clazz, jlong windowPtr, jboolean isEnabled) { JNF_COCOA_ENTER(env); ! NSWindow *nsWindow = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ + AWTWindow *window = (AWTWindow*)[nsWindow delegate]; + [window setEnabled: isEnabled]; }]; JNF_COCOA_EXIT(env); }