307 + (void) synthesizeMouseEnteredExitedEventsForAllWindows { 308 309 NSInteger topmostWindowUnderMouseID = [AWTWindow getTopmostWindowUnderMouseID]; 310 NSArray *windows = [NSApp windows]; 311 NSWindow *window; 312 313 NSEnumerator *windowEnumerator = [windows objectEnumerator]; 314 while ((window = [windowEnumerator nextObject]) != nil) { 315 if ([AWTWindow isAWTWindow: window]) { 316 BOOL isUnderMouse = ([window windowNumber] == topmostWindowUnderMouseID); 317 BOOL mouseIsOver = [[window contentView] mouseIsOver]; 318 if (isUnderMouse && !mouseIsOver) { 319 [AWTWindow synthesizeMouseEnteredExitedEvents:window withType:NSMouseEntered]; 320 } else if (!isUnderMouse && mouseIsOver) { 321 [AWTWindow synthesizeMouseEnteredExitedEvents:window withType:NSMouseExited]; 322 } 323 } 324 } 325 } 326 327 - (void) dealloc { 328 AWT_ASSERT_APPKIT_THREAD; 329 330 JNIEnv *env = [ThreadUtilities getJNIEnv]; 331 [self.javaPlatformWindow setJObject:nil withEnv:env]; 332 333 self.nsWindow = nil; 334 335 [super dealloc]; 336 } 337 338 // NSWindow overrides 339 - (BOOL) canBecomeKeyWindow { 340 AWT_ASSERT_APPKIT_THREAD; 341 return self.isEnabled && IS(self.styleBits, SHOULD_BECOME_KEY); 342 } 343 344 - (BOOL) canBecomeMainWindow { 345 AWT_ASSERT_APPKIT_THREAD; 346 return self.isEnabled && IS(self.styleBits, SHOULD_BECOME_MAIN); 1096 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSynthesizeMouseEnteredExitedEvents 1097 (JNIEnv *env, jclass clazz) 1098 { 1099 JNF_COCOA_ENTER(env); 1100 AWT_ASSERT_NOT_APPKIT_THREAD; 1101 1102 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 1103 AWT_ASSERT_APPKIT_THREAD; 1104 [AWTWindow synthesizeMouseEnteredExitedEventsForAllWindows]; 1105 }]; 1106 1107 JNF_COCOA_EXIT(env); 1108 } 1109 1110 /* 1111 * Class: sun_lwawt_macosx_CPlatformWindow 1112 * Method: nativeGetDisplayID_AppKitThread 1113 * Signature: (J)I 1114 */ 1115 JNIEXPORT jint JNICALL 1116 Java_sun_lwawt_macosx_CPlatformWindow_nativeGetNSWindowDisplayID_1AppKitThread 1117 (JNIEnv *env, jclass clazz, jlong windowPtr) 1118 { 1119 jint ret; // CGDirectDisplayID 1120 1121 JNF_COCOA_ENTER(env); 1122 AWT_ASSERT_APPKIT_THREAD; 1123 1124 NSWindow *window = OBJC(windowPtr); 1125 NSScreen *screen = [window screen]; 1126 NSDictionary *deviceDescription = [screen deviceDescription]; 1127 NSNumber *displayID = [deviceDescription objectForKey:@"NSScreenNumber"]; 1128 ret = (jint)[displayID intValue]; 1129 1130 JNF_COCOA_EXIT(env); 1131 1132 return ret; 1133 } 1134 1135 /* 1136 * Class: sun_lwawt_macosx_CPlatformWindow 1137 * Method: _toggleFullScreenMode 1138 * Signature: (J)V 1139 */ 1140 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow__1toggleFullScreenMode 1141 (JNIEnv *env, jobject peer, jlong windowPtr) 1142 { 1143 JNF_COCOA_ENTER(env); 1144 1145 NSWindow *nsWindow = OBJC(windowPtr); 1146 SEL toggleFullScreenSelector = @selector(toggleFullScreen:); 1147 if (![nsWindow respondsToSelector:toggleFullScreenSelector]) return; 1148 | 307 + (void) synthesizeMouseEnteredExitedEventsForAllWindows { 308 309 NSInteger topmostWindowUnderMouseID = [AWTWindow getTopmostWindowUnderMouseID]; 310 NSArray *windows = [NSApp windows]; 311 NSWindow *window; 312 313 NSEnumerator *windowEnumerator = [windows objectEnumerator]; 314 while ((window = [windowEnumerator nextObject]) != nil) { 315 if ([AWTWindow isAWTWindow: window]) { 316 BOOL isUnderMouse = ([window windowNumber] == topmostWindowUnderMouseID); 317 BOOL mouseIsOver = [[window contentView] mouseIsOver]; 318 if (isUnderMouse && !mouseIsOver) { 319 [AWTWindow synthesizeMouseEnteredExitedEvents:window withType:NSMouseEntered]; 320 } else if (!isUnderMouse && mouseIsOver) { 321 [AWTWindow synthesizeMouseEnteredExitedEvents:window withType:NSMouseExited]; 322 } 323 } 324 } 325 } 326 327 + (NSNumber *) getNSWindowDisplayID_AppKitThread:(NSWindow *)window { 328 AWT_ASSERT_APPKIT_THREAD; 329 NSScreen *screen = [window screen]; 330 NSDictionary *deviceDescription = [screen deviceDescription]; 331 return [deviceDescription objectForKey:@"NSScreenNumber"]; 332 } 333 334 - (void) dealloc { 335 AWT_ASSERT_APPKIT_THREAD; 336 337 JNIEnv *env = [ThreadUtilities getJNIEnv]; 338 [self.javaPlatformWindow setJObject:nil withEnv:env]; 339 340 self.nsWindow = nil; 341 342 [super dealloc]; 343 } 344 345 // NSWindow overrides 346 - (BOOL) canBecomeKeyWindow { 347 AWT_ASSERT_APPKIT_THREAD; 348 return self.isEnabled && IS(self.styleBits, SHOULD_BECOME_KEY); 349 } 350 351 - (BOOL) canBecomeMainWindow { 352 AWT_ASSERT_APPKIT_THREAD; 353 return self.isEnabled && IS(self.styleBits, SHOULD_BECOME_MAIN); 1103 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSynthesizeMouseEnteredExitedEvents 1104 (JNIEnv *env, jclass clazz) 1105 { 1106 JNF_COCOA_ENTER(env); 1107 AWT_ASSERT_NOT_APPKIT_THREAD; 1108 1109 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 1110 AWT_ASSERT_APPKIT_THREAD; 1111 [AWTWindow synthesizeMouseEnteredExitedEventsForAllWindows]; 1112 }]; 1113 1114 JNF_COCOA_EXIT(env); 1115 } 1116 1117 /* 1118 * Class: sun_lwawt_macosx_CPlatformWindow 1119 * Method: nativeGetDisplayID_AppKitThread 1120 * Signature: (J)I 1121 */ 1122 JNIEXPORT jint JNICALL 1123 Java_sun_lwawt_macosx_CPlatformWindow_nativeGetNSWindowDisplayID 1124 (JNIEnv *env, jclass clazz, jlong windowPtr) 1125 { 1126 __block jint ret; // CGDirectDisplayID 1127 1128 JNF_COCOA_ENTER(env); 1129 1130 NSWindow *window = OBJC(windowPtr); 1131 1132 if ([NSThread isMainThread]) { 1133 ret = (jint)[[AWTWindow getNSWindowDisplayID_AppKitThread: window] intValue]; 1134 } else { 1135 [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ 1136 ret = (jint)[[AWTWindow getNSWindowDisplayID_AppKitThread: window] intValue]; 1137 }]; 1138 } 1139 1140 JNF_COCOA_EXIT(env); 1141 1142 return ret; 1143 } 1144 1145 /* 1146 * Class: sun_lwawt_macosx_CPlatformWindow 1147 * Method: _toggleFullScreenMode 1148 * Signature: (J)V 1149 */ 1150 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow__1toggleFullScreenMode 1151 (JNIEnv *env, jobject peer, jlong windowPtr) 1152 { 1153 JNF_COCOA_ENTER(env); 1154 1155 NSWindow *nsWindow = OBJC(windowPtr); 1156 SEL toggleFullScreenSelector = @selector(toggleFullScreen:); 1157 if (![nsWindow respondsToSelector:toggleFullScreenSelector]) return; 1158 |