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

Print this page

        

*** 228,237 **** --- 228,297 ---- } else growBoxWindow = nil; return self; } + -(BOOL) isTopmostWindowUnderMouse{ + + int currentWinID = [self windowNumber]; + + NSRect screenRect = [[NSScreen mainScreen] frame]; + NSPoint nsMouseLocation = [NSEvent mouseLocation]; + CGPoint cgMouseLocation = CGPointMake(nsMouseLocation.x, screenRect.size.height - nsMouseLocation.y); + + NSMutableArray *windows = (NSMutableArray *)CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID); + + + for (NSDictionary *window in windows) { + int layer = [[window objectForKey:(id)kCGWindowLayer] intValue]; + if (layer == 0) { + int winID = [[window objectForKey:(id)kCGWindowNumber] intValue]; + CGRect rect; + CGRectMakeWithDictionaryRepresentation((CFDictionaryRef)[window objectForKey:(id)kCGWindowBounds], &rect); + if(CGRectContainsPoint(rect, cgMouseLocation)){ + return currentWinID == winID; + }else if(currentWinID == winID){ + return NO; + } + } + } + return NO; + } + + - (void) synthesizeMouseEnteredExitedEvents{ + + int eventType = 0; + BOOL isUnderMouse = [self isTopmostWindowUnderMouse]; + BOOL mouseIsOver = [[self contentView] mouseIsOver]; + + if(isUnderMouse && !mouseIsOver){ + eventType = NSMouseEntered; + }else if(!isUnderMouse && mouseIsOver){ + eventType = NSMouseExited; + }else{ + return; + } + + NSPoint screenLocation = [NSEvent mouseLocation]; + NSPoint windowLocation = [self convertScreenToBase: screenLocation]; + int modifierFlags = (eventType == NSMouseEntered) ? NSMouseEnteredMask : NSMouseExitedMask; + + NSEvent * mouseEvent = [NSEvent + enterExitEventWithType: eventType + location: windowLocation + modifierFlags: modifierFlags + timestamp: 0 + windowNumber: [self windowNumber] + context: nil + eventNumber: 0 + trackingNumber: 0 + userData: nil + ]; + + [[self contentView] deliverJavaMouseEvent: mouseEvent]; + } + - (void) dealloc { AWT_ASSERT_APPKIT_THREAD; JNIEnv *env = [ThreadUtilities getJNIEnv]; [self.javaPlatformWindow setJObject:nil withEnv:env];
*** 711,720 **** --- 771,782 ---- [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 + + [window synthesizeMouseEnteredExitedEvents]; }]; JNF_COCOA_EXIT(env); }
*** 763,772 **** --- 825,835 ---- AWTWindow *window = OBJC(windowPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ AWT_ASSERT_APPKIT_THREAD; [window orderBack:nil]; + [window synthesizeMouseEnteredExitedEvents]; }]; JNF_COCOA_EXIT(env); }
*** 788,797 **** --- 851,862 ---- if (![window isKeyWindow]) { [window makeKeyAndOrderFront:window]; } else { [window orderFront:window]; } + + [window synthesizeMouseEnteredExitedEvents]; }]; JNF_COCOA_EXIT(env); }