--- old/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m 2017-09-14 15:37:15.000000000 -0700 +++ new/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m 2017-09-14 15:37:15.000000000 -0700 @@ -74,20 +74,20 @@ // Initialize ourselves self = [super initWithFrame: rect]; if (self == nil) return self; - + m_cPlatformView = cPlatformView; fInputMethodLOCKABLE = NULL; fKeyEventsNeeded = NO; fProcessingKeystroke = NO; - + fEnablePressAndHold = shouldUsePressAndHold(); fInPressAndHold = NO; fPAHNeedsToSelect = NO; - + mouseIsOver = NO; [self resetTrackingArea]; [self setAutoresizesSubviews:NO]; - + if (windowLayer != nil) { self.cglLayer = windowLayer; //Layer hosting view @@ -98,7 +98,7 @@ //[self setLayerContentsRedrawPolicy: NSViewLayerContentsRedrawDuringViewResize]; //[self setLayerContentsPlacement: NSViewLayerContentsPlacementTopLeft]; //[self setAutoresizingMask: NSViewHeightSizable | NSViewWidthSizable]; - + #ifdef REMOTELAYER CGLLayer *parentLayer = (CGLLayer*)self.cglLayer; parentLayer.parentLayer = NULL; @@ -120,36 +120,36 @@ } #endif /* REMOTELAYER */ } - + return self; } - (void) dealloc { AWT_ASSERT_APPKIT_THREAD; - + self.cglLayer = nil; - + JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; (*env)->DeleteWeakGlobalRef(env, m_cPlatformView); m_cPlatformView = NULL; - + if (fInputMethodLOCKABLE != NULL) { JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; - + JNFDeleteGlobalRef(env, fInputMethodLOCKABLE); fInputMethodLOCKABLE = NULL; } - - + + [super dealloc]; } - (void) viewDidMoveToWindow { AWT_ASSERT_APPKIT_THREAD; - + [AWTToolkit eventCountPlusPlus]; - + [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^() { [[self window] makeFirstResponder: self]; }]; @@ -230,10 +230,10 @@ - (void) mouseMoved: (NSEvent *)event { // TODO: better way to redirect move events to the "under" view - + NSPoint eventLocation = [event locationInWindow]; NSPoint localPoint = [self convertPoint: eventLocation fromView: nil]; - + if ([self mouse: localPoint inRect: [self bounds]]) { [self deliverJavaMouseEvent: event]; } else { @@ -277,10 +277,10 @@ - (void) keyDown: (NSEvent *)event { fProcessingKeystroke = YES; fKeyEventsNeeded = YES; - + // Allow TSM to look at the event and potentially send back NSTextInputClient messages. [self interpretKeyEvents:[NSArray arrayWithObject:event]]; - + if (fEnablePressAndHold && [event willBeHandledByComplexInputMethod] && fInputMethodLOCKABLE) { fProcessingKeystroke = NO; if (!fInPressAndHold) { @@ -289,14 +289,14 @@ } return; } - + NSString *eventCharacters = [event characters]; BOOL isDeadKey = (eventCharacters != nil && [eventCharacters length] == 0); - + if ((![self hasMarkedText] && fKeyEventsNeeded) || isDeadKey) { [self deliverJavaKeyEventHelper: event]; } - + fProcessingKeystroke = NO; } @@ -313,7 +313,7 @@ if (![self hasMarkedText] && !fInPressAndHold) { [self deliverJavaKeyEventHelper: event]; } - + // Workaround for 8020209: special case for "Cmd =" and "Cmd ." // because Cocoa calls performKeyEquivalent twice for these keystrokes NSUInteger modFlags = [event modifierFlags] & @@ -327,9 +327,9 @@ return YES; } } - + } - + return NO; } @@ -343,36 +343,36 @@ if ([window isKindOfClass: [AWTWindow_Panel class]] || [window isKindOfClass: [AWTWindow_Normal class]]) { isEnabled = [(AWTWindow*)[window delegate] isEnabled]; } - + if (!isEnabled) { return; } - + NSEventType type = [event type]; - + // check synthesized mouse entered/exited events if ((type == NSMouseEntered && mouseIsOver) || (type == NSMouseExited && !mouseIsOver)) { return; }else if ((type == NSMouseEntered && !mouseIsOver) || (type == NSMouseExited && mouseIsOver)) { mouseIsOver = !mouseIsOver; } - + [AWTToolkit eventCountPlusPlus]; - + JNIEnv *env = [ThreadUtilities getJNIEnv]; - + NSPoint eventLocation = [event locationInWindow]; NSPoint localPoint = [self convertPoint: eventLocation fromView: nil]; NSPoint absP = [NSEvent mouseLocation]; - + // Convert global numbers between Cocoa's coordinate system and Java. // TODO: need consitent way for doing that both with global as well as with local coordinates. // The reason to do it here is one more native method for getting screen dimension otherwise. - + NSRect screenRect = [[[NSScreen screens] objectAtIndex:0] frame]; absP.y = screenRect.size.height - absP.y; jint clickCount; - + if (type == NSMouseEntered || type == NSMouseExited || type == NSScrollWheel || @@ -388,7 +388,7 @@ deltaX = [event scrollingDeltaX] * 0.1; deltaY = [event scrollingDeltaY] * 0.1; } - + static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/NSEvent"); static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IIIIIIIIDDI)V"); jobject jEvent = JNFNewObject(env, jctor_NSEvent, @@ -402,7 +402,7 @@ deltaX, [AWTToolkit scrollStateWithEvent: event]); CHECK_NULL(jEvent); - + static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView"); static JNF_MEMBER_CACHE(jm_deliverMouseEvent, jc_PlatformView, "deliverMouseEvent", "(Lsun/lwawt/macosx/NSEvent;)V"); jobject jlocal = (*env)->NewLocalRef(env, m_cPlatformView); @@ -418,10 +418,10 @@ [self removeTrackingArea:rolloverTrackingArea]; [rolloverTrackingArea release]; } - + int options = (NSTrackingActiveAlways | NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingEnabledDuringMouseDrag); - + rolloverTrackingArea = [[NSTrackingArea alloc] initWithRect:[self visibleRect] options: options owner:self @@ -448,17 +448,17 @@ } [sLastKeyEvent release]; sLastKeyEvent = [event retain]; - + [AWTToolkit eventCountPlusPlus]; JNIEnv *env = [ThreadUtilities getJNIEnv]; - + jstring characters = NULL; jstring charactersIgnoringModifiers = NULL; if ([event type] != NSFlagsChanged) { characters = JNFNSToJavaString(env, [event characters]); charactersIgnoringModifiers = JNFNSToJavaString(env, [event charactersIgnoringModifiers]); } - + static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/NSEvent"); static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IISLjava/lang/String;Ljava/lang/String;)V"); jobject jEvent = JNFNewObject(env, jctor_NSEvent, @@ -468,7 +468,7 @@ characters, charactersIgnoringModifiers); CHECK_NULL(jEvent); - + static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView"); static JNF_MEMBER_CACHE(jm_deliverKeyEvent, jc_PlatformView, "deliverKeyEvent", "(Lsun/lwawt/macosx/NSEvent;)V"); @@ -502,7 +502,7 @@ - (void) drawRect:(NSRect)dirtyRect { AWT_ASSERT_APPKIT_THREAD; - + [super drawRect:dirtyRect]; JNIEnv *env = [ThreadUtilities getJNIEnv]; if (env != NULL) { @@ -615,17 +615,17 @@ - (id)accessibilityAttributeValue:(NSString *)attribute { AWT_ASSERT_APPKIT_THREAD; - + if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) { JNIEnv *env = [ThreadUtilities getJNIEnv]; - + (*env)->PushLocalFrame(env, 4); - + id result = NSAccessibilityUnignoredChildrenForOnlyChild([self getAxData:env]); - + (*env)->PopLocalFrame(env, NULL); - + return result; } else @@ -642,28 +642,28 @@ { AWT_ASSERT_APPKIT_THREAD; JNIEnv *env = [ThreadUtilities getJNIEnv]; - + (*env)->PushLocalFrame(env, 4); - + id result = [[self getAxData:env] accessibilityHitTest:point withEnv:env]; - + (*env)->PopLocalFrame(env, NULL); - + return result; } - (id)accessibilityFocusedUIElement { AWT_ASSERT_APPKIT_THREAD; - + JNIEnv *env = [ThreadUtilities getJNIEnv]; - + (*env)->PushLocalFrame(env, 4); - + id result = [[self getAxData:env] accessibilityFocusedUIElement]; - + (*env)->PopLocalFrame(env, NULL); - + return result; } @@ -702,12 +702,12 @@ - (id)validRequestorForSendType:(NSString *)sendType returnType:(NSString *)returnType { if ([[self window] firstResponder] != self) return nil; // let AWT components handle themselves - + if ([sendType isEqual:NSStringPboardType] || [returnType isEqual:NSStringPboardType]) { NSString *selectedText = [self accessibleSelectedText]; if (selectedText) return self; } - + return nil; } @@ -719,13 +719,13 @@ [pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; return [pboard setString:[self accessibleSelectedText] forType:NSStringPboardType]; } - + if ([types containsObject:NSRTFDPboardType]) { [pboard declareTypes:[NSArray arrayWithObject:NSRTFDPboardType] owner:nil]; return [pboard setData:[self accessibleSelectedTextAsRTFD] forType:NSRTFDPboardType]; } - + return NO; } @@ -737,17 +737,17 @@ NSString *text = [pboard stringForType:NSStringPboardType]; return [self replaceAccessibleTextSelection:text]; } - + if ([[pboard types] containsObject:NSRTFDPboardType]) { NSData *rtfdData = [pboard dataForType:NSRTFDPboardType]; NSAttributedString *styledText = [[NSAttributedString alloc] initWithRTFD:rtfdData documentAttributes:NULL]; NSString *text = [styledText string]; [styledText release]; - + return [self replaceAccessibleTextSelection:text]; } - + return NO; } @@ -769,7 +769,7 @@ // If draggingSource is nil route the message to the superclass (if responding to the selector): CDragSource *dragSource = self._dragSource; NSDragOperation dragOp = NSDragOperationNone; - + if (dragSource != nil) { dragOp = [dragSource draggingSourceOperationMaskForLocal:flag]; } @@ -781,7 +781,7 @@ // If draggingSource is nil route the message to the superclass (if responding to the selector): CDragSource *dragSource = self._dragSource; NSArray* array = nil; - + if (dragSource != nil) { array = [dragSource namesOfPromisedFilesDroppedAtDestination:dropDestination]; } @@ -792,7 +792,7 @@ { // If draggingSource is nil route the message to the superclass (if responding to the selector): CDragSource *dragSource = self._dragSource; - + if (dragSource != nil) { [dragSource draggedImage:image beganAt:screenPoint]; } @@ -802,7 +802,7 @@ { // If draggingSource is nil route the message to the superclass (if responding to the selector): CDragSource *dragSource = self._dragSource; - + if (dragSource != nil) { [dragSource draggedImage:image endedAt:screenPoint operation:operation]; } @@ -812,7 +812,7 @@ { // If draggingSource is nil route the message to the superclass (if responding to the selector): CDragSource *dragSource = self._dragSource; - + if (dragSource != nil) { [dragSource draggedImage:image movedTo:screenPoint]; } @@ -823,7 +823,7 @@ // If draggingSource is nil route the message to the superclass (if responding to the selector): CDragSource *dragSource = self._dragSource; BOOL result = FALSE; - + if (dragSource != nil) { result = [dragSource ignoreModifierKeysWhileDragging]; } @@ -839,7 +839,7 @@ // If draggingDestination is nil route the message to the superclass: CDropTarget *dropTarget = self._dropTarget; NSDragOperation dragOp = NSDragOperationNone; - + if (dropTarget != nil) { dragOp = [dropTarget draggingEntered:sender]; } @@ -851,7 +851,7 @@ // If draggingDestination is nil route the message to the superclass: CDropTarget *dropTarget = self._dropTarget; NSDragOperation dragOp = NSDragOperationNone; - + if (dropTarget != nil) { dragOp = [dropTarget draggingUpdated:sender]; } @@ -862,7 +862,7 @@ { // If draggingDestination is nil route the message to the superclass: CDropTarget *dropTarget = self._dropTarget; - + if (dropTarget != nil) { [dropTarget draggingExited:sender]; } @@ -873,7 +873,7 @@ // If draggingDestination is nil route the message to the superclass: CDropTarget *dropTarget = self._dropTarget; BOOL result = FALSE; - + if (dropTarget != nil) { result = [dropTarget prepareForDragOperation:sender]; } @@ -885,7 +885,7 @@ // If draggingDestination is nil route the message to the superclass: CDropTarget *dropTarget = self._dropTarget; BOOL result = FALSE; - + if (dropTarget != nil) { result = [dropTarget performDragOperation:sender]; } @@ -896,7 +896,7 @@ { // If draggingDestination is nil route the message to the superclass: CDropTarget *dropTarget = self._dropTarget; - + if (dropTarget != nil) { [dropTarget concludeDragOperation:sender]; } @@ -906,7 +906,7 @@ { // If draggingDestination is nil route the message to the superclass: CDropTarget *dropTarget = self._dropTarget; - + if (dropTarget != nil) { [dropTarget draggingEnded:sender]; } @@ -924,20 +924,20 @@ #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [insertText]: %s\n", [aString UTF8String]); #endif // IM_DEBUG - + if (fInputMethodLOCKABLE == NULL) { return; } - + // Insert happens at the end of PAH fInPressAndHold = NO; - + // insertText gets called when the user commits text generated from an input method. It also gets // called during ordinary input as well. We only need to send an input method event when we have marked // text, or 'text in progress'. We also need to send the event if we get an insert text out of the blue! // (i.e., when the user uses the Character palette or Inkwell), or when the string to insert is a complex // Unicode value. - + NSMutableString * useString = [self parseString:aString]; NSUInteger utf16Length = [useString lengthOfBytesUsingEncoding:NSUTF16StringEncoding]; NSUInteger utf8Length = [useString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; @@ -946,22 +946,22 @@ ((utf8Length > 1) && [self isCodePointInUnicodeBlockNeedingIMEvent:[useString characterAtIndex:0]])) { aStringIsComplex = YES; } - + if ([self hasMarkedText] || !fProcessingKeystroke || aStringIsComplex) { JNIEnv *env = [ThreadUtilities getJNIEnv]; - + static JNF_MEMBER_CACHE(jm_selectPreviousGlyph, jc_CInputMethod, "selectPreviousGlyph", "()V"); // We need to select the previous glyph so that it is overwritten. if (fPAHNeedsToSelect) { JNFCallVoidMethod(env, fInputMethodLOCKABLE, jm_selectPreviousGlyph); fPAHNeedsToSelect = NO; } - + static JNF_MEMBER_CACHE(jm_insertText, jc_CInputMethod, "insertText", "(Ljava/lang/String;)V"); jstring insertedText = JNFNSToJavaString(env, useString); JNFCallVoidMethod(env, fInputMethodLOCKABLE, jm_insertText, insertedText); // AWT_THREADING Safe (AWTRunLoopMode) (*env)->DeleteLocalRef(env, insertedText); - + // The input method event will create psuedo-key events for each character in the committed string. // We also don't want to send the character that triggered the insertText, usually a return. [3337563] fKeyEventsNeeded = NO; @@ -993,7 +993,7 @@ { if (!fInputMethodLOCKABLE) return; - + BOOL isAttributedString = [aString isKindOfClass:[NSAttributedString class]]; NSAttributedString *attrString = (isAttributedString ? (NSAttributedString *)aString : nil); NSString *incomingString = (isAttributedString ? [aString string] : aString); @@ -1004,14 +1004,14 @@ static JNF_MEMBER_CACHE(jm_addAttribute, jc_CInputMethod, "addAttribute", "(ZZII)V"); static JNF_MEMBER_CACHE(jm_dispatchText, jc_CInputMethod, "dispatchText", "(IIZ)V"); JNIEnv *env = [ThreadUtilities getJNIEnv]; - + // NSInputContext already did the analysis of the TSM event and created attributes indicating // the underlining and color that should be done to the string. We need to look at the underline // style and color to determine what kind of Java hilighting needs to be done. jstring inProcessText = JNFNSToJavaString(env, incomingString); JNFCallVoidMethod(env, fInputMethodLOCKABLE, jm_startIMUpdate, inProcessText); // AWT_THREADING Safe (AWTRunLoopMode) (*env)->DeleteLocalRef(env, inProcessText); - + if (isAttributedString) { NSUInteger length; NSRange effectiveRange; @@ -1027,25 +1027,25 @@ (NSNumber *)[attributes objectForKey:NSUnderlineStyleAttributeName]; NSInteger underlineSize = [underlineSizeObj integerValue]; isThickUnderline = (underlineSize > 1); - + NSColor *underlineColorObj = (NSColor *)[attributes objectForKey:NSUnderlineColorAttributeName]; isGray = !([underlineColorObj isEqual:[NSColor blackColor]]); - + JNFCallVoidMethod(env, fInputMethodLOCKABLE, jm_addAttribute, isThickUnderline, isGray, effectiveRange.location, effectiveRange.length); // AWT_THREADING Safe (AWTRunLoopMode) } } } - + static JNF_MEMBER_CACHE(jm_selectPreviousGlyph, jc_CInputMethod, "selectPreviousGlyph", "()V"); // We need to select the previous glyph so that it is overwritten. if (fPAHNeedsToSelect) { JNFCallVoidMethod(env, fInputMethodLOCKABLE, jm_selectPreviousGlyph); fPAHNeedsToSelect = NO; } - + JNFCallVoidMethod(env, fInputMethodLOCKABLE, jm_dispatchText, selectionRange.location, selectionRange.length, JNI_FALSE); // AWT_THREADING Safe (AWTRunLoopMode) - + // If the marked text is being cleared (zero-length string) don't handle the key event. if ([incomingString length] == 0) { fKeyEventsNeeded = NO; @@ -1057,16 +1057,16 @@ #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [unmarkText]\n"); #endif // IM_DEBUG - + if (!fInputMethodLOCKABLE) { return; } - + // unmarkText cancels any input in progress and commits it to the text field. static JNF_MEMBER_CACHE(jm_unmarkText, jc_CInputMethod, "unmarkText", "()V"); JNIEnv *env = [ThreadUtilities getJNIEnv]; JNFCallVoidMethod(env, fInputMethodLOCKABLE, jm_unmarkText); // AWT_THREADING Safe (AWTRunLoopMode) - + } - (BOOL) hasMarkedText @@ -1074,24 +1074,24 @@ #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [hasMarkedText]\n"); #endif // IM_DEBUG - + if (!fInputMethodLOCKABLE) { return NO; } - + static JNF_MEMBER_CACHE(jf_fCurrentText, jc_CInputMethod, "fCurrentText", "Ljava/text/AttributedString;"); static JNF_MEMBER_CACHE(jf_fCurrentTextLength, jc_CInputMethod, "fCurrentTextLength", "I"); JNIEnv *env = [ThreadUtilities getJNIEnv]; jobject currentText = JNFGetObjectField(env, fInputMethodLOCKABLE, jf_fCurrentText); - + jint currentTextLength = JNFGetIntField(env, fInputMethodLOCKABLE, jf_fCurrentTextLength); - + BOOL hasMarkedText = (currentText != NULL && currentTextLength > 0); - + if (currentText != NULL) { (*env)->DeleteLocalRef(env, currentText); } - + return hasMarkedText; } @@ -1100,7 +1100,7 @@ #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [conversationIdentifier]\n"); #endif // IM_DEBUG - + return (NSInteger) self; } @@ -1112,16 +1112,16 @@ #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [attributedSubstringFromRange] location=%lu, length=%lu\n", (unsigned long)theRange.location, (unsigned long)theRange.length); #endif // IM_DEBUG - + static JNF_MEMBER_CACHE(jm_substringFromRange, jc_CInputMethod, "attributedSubstringFromRange", "(II)Ljava/lang/String;"); JNIEnv *env = [ThreadUtilities getJNIEnv]; jobject theString = JNFCallObjectMethod(env, fInputMethodLOCKABLE, jm_substringFromRange, theRange.location, theRange.length); // AWT_THREADING Safe (AWTRunLoopMode) - + id result = [[[NSAttributedString alloc] initWithString:JNFJavaToNSString(env, theString)] autorelease]; #ifdef IM_DEBUG NSLog(@"attributedSubstringFromRange returning \"%@\"", result); #endif // IM_DEBUG - + (*env)->DeleteLocalRef(env, theString); return result; } @@ -1131,24 +1131,24 @@ */ - (NSRange) markedRange { - + #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [markedRange]\n"); #endif // IM_DEBUG - + if (!fInputMethodLOCKABLE) { return NSMakeRange(NSNotFound, 0); } - + static JNF_MEMBER_CACHE(jm_markedRange, jc_CInputMethod, "markedRange", "()[I"); JNIEnv *env = [ThreadUtilities getJNIEnv]; jarray array; jboolean isCopy; jint *_array; NSRange range = NSMakeRange(NSNotFound, 0); - + array = JNFCallObjectMethod(env, fInputMethodLOCKABLE, jm_markedRange); // AWT_THREADING Safe (AWTRunLoopMode) - + if (array) { _array = (*env)->GetIntArrayElements(env, array, &isCopy); if (_array != NULL) { @@ -1162,7 +1162,7 @@ } (*env)->DeleteLocalRef(env, array); } - + return range; } @@ -1174,18 +1174,18 @@ if (!fInputMethodLOCKABLE) { return NSMakeRange(NSNotFound, 0); } - + static JNF_MEMBER_CACHE(jm_selectedRange, jc_CInputMethod, "selectedRange", "()[I"); JNIEnv *env = [ThreadUtilities getJNIEnv]; jarray array; jboolean isCopy; jint *_array; NSRange range = NSMakeRange(NSNotFound, 0); - + #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [selectedRange]\n"); #endif // IM_DEBUG - + array = JNFCallObjectMethod(env, fInputMethodLOCKABLE, jm_selectedRange); // AWT_THREADING Safe (AWTRunLoopMode) if (array) { _array = (*env)->GetIntArrayElements(env, array, &isCopy); @@ -1196,7 +1196,7 @@ } (*env)->DeleteLocalRef(env, array); } - + return range; } @@ -1207,7 +1207,7 @@ if (!fInputMethodLOCKABLE) { return NSZeroRect; } - + static JNF_MEMBER_CACHE(jm_firstRectForCharacterRange, jc_CInputMethod, "firstRectForCharacterRange", "(I)[I"); JNIEnv *env = [ThreadUtilities getJNIEnv]; @@ -1215,16 +1215,16 @@ jboolean isCopy; jint *_array; NSRect rect; - + #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [firstRectForCharacterRange:] location=%lu, length=%lu\n", (unsigned long)theRange.location, (unsigned long)theRange.length); #endif // IM_DEBUG - + array = JNFCallObjectMethod(env, fInputMethodLOCKABLE, jm_firstRectForCharacterRange, theRange.location); // AWT_THREADING Safe (AWTRunLoopMode) - + _array = (*env)->GetIntArrayElements(env, array, &isCopy); if (_array) { rect = ConvertNSScreenRect(env, NSMakeRect(_array[0], _array[1], _array[2], _array[3])); @@ -1233,7 +1233,7 @@ rect = NSZeroRect; } (*env)->DeleteLocalRef(env, array); - + #ifdef IM_DEBUG fprintf(stderr, "firstRectForCharacterRange returning x=%f, y=%f, width=%f, height=%f\n", @@ -1250,23 +1250,23 @@ if (!fInputMethodLOCKABLE) { return NSNotFound; } - + static JNF_MEMBER_CACHE(jm_characterIndexForPoint, jc_CInputMethod, "characterIndexForPoint", "(II)I"); JNIEnv *env = [ThreadUtilities getJNIEnv]; - + NSPoint flippedLocation = ConvertNSScreenPoint(env, thePoint); - + #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [characterIndexForPoint:(NSPoint)thePoint] x=%f, y=%f\n", flippedLocation.x, flippedLocation.y); #endif // IM_DEBUG - + jint index = JNFCallIntMethod(env, fInputMethodLOCKABLE, jm_characterIndexForPoint, (jint)flippedLocation.x, (jint)flippedLocation.y); // AWT_THREADING Safe (AWTRunLoopMode) - + #ifdef IM_DEBUG fprintf(stderr, "characterIndexForPoint returning %ld\n", index); #endif // IM_DEBUG - + if (index == -1) { return NSNotFound; } else { @@ -1279,7 +1279,7 @@ #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [validAttributesForMarkedText]\n"); #endif // IM_DEBUG - + return [NSArray array]; } @@ -1288,14 +1288,14 @@ #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [setInputMethod]\n"); #endif // IM_DEBUG - + JNIEnv *env = [ThreadUtilities getJNIEnv]; - + // Get rid of the old one if (fInputMethodLOCKABLE) { JNFDeleteGlobalRef(env, fInputMethodLOCKABLE); } - + // Save a global ref to the new input method. if (inputMethod != NULL) fInputMethodLOCKABLE = JNFNewGlobalRef(env, inputMethod); @@ -1308,7 +1308,7 @@ #ifdef IM_DEBUG fprintf(stderr, "AWTView InputMethod Selector Called : [abandonInput]\n"); #endif // IM_DEBUG - + [ThreadUtilities performOnMainThread:@selector(markedTextAbandoned:) on:[NSInputManager currentInputManager] withObject:self waitUntilDone:YES]; [self unmarkText]; } @@ -1330,22 +1330,22 @@ (JNIEnv *env, jobject obj, jint originX, jint originY, jint width, jint height, jlong windowLayerPtr) { __block AWTView *newView = nil; - + JNF_COCOA_ENTER(env); - + NSRect rect = NSMakeRect(originX, originY, width, height); jobject cPlatformView = (*env)->NewWeakGlobalRef(env, obj); - + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ - + CALayer *windowLayer = jlong_to_ptr(windowLayerPtr); newView = [[AWTView alloc] initWithRect:rect platformView:cPlatformView windowLayer:windowLayer]; }]; - + JNF_COCOA_EXIT(env); - + return ptr_to_jlong(newView); } @@ -1360,21 +1360,21 @@ (JNIEnv *env, jclass cls, jlong viewPtr, jboolean toResize) { JNF_COCOA_ENTER(env); - + NSView *view = (NSView *)jlong_to_ptr(viewPtr); - + [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ - + if (toResize) { [view setAutoresizingMask: NSViewHeightSizable | NSViewWidthSizable]; } else { [view setAutoresizingMask: NSViewMinYMargin | NSViewMaxXMargin]; } - + if ([view superview] != nil) { [[view superview] setAutoresizesSubviews:(BOOL)toResize]; } - + }]; JNF_COCOA_EXIT(env); } @@ -1390,19 +1390,19 @@ (JNIEnv *env, jclass cls, jlong viewPtr) { __block jint ret; //CGDirectDisplayID - + JNF_COCOA_ENTER(env); - + NSView *view = (NSView *)jlong_to_ptr(viewPtr); NSWindow *window = [view window]; - + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ - + ret = (jint)[[AWTWindow getNSWindowDisplayID_AppKitThread: window] intValue]; }]; - + JNF_COCOA_EXIT(env); - + return ret; } @@ -1417,25 +1417,25 @@ (JNIEnv *env, jclass cls, jlong viewPtr) { jobject jRect = NULL; - + JNF_COCOA_ENTER(env); - + __block NSRect rect = NSZeroRect; - + NSView *view = (NSView *)jlong_to_ptr(viewPtr); [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ - + NSRect viewBounds = [view bounds]; NSRect frameInWindow = [view convertRect:viewBounds toView:nil]; rect = [[view window] convertRectToScreen:frameInWindow]; - NSRect screenRect = [[NSScreen mainScreen] frame]; //Convert coordinates to top-left corner origin - rect.origin.y = screenRect.size.height - rect.origin.y - viewBounds.size.height; + rect = ConvertNSScreenRect(NULL, rect); + }]; jRect = NSToJavaRect(env, rect); - + JNF_COCOA_EXIT(env); - + return jRect; } @@ -1449,17 +1449,17 @@ (JNIEnv *env, jclass clazz, jlong viewPtr) { __block jboolean underMouse = JNI_FALSE; - + JNF_COCOA_ENTER(env); - + NSView *nsView = OBJC(viewPtr); - [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ NSPoint ptWindowCoords = [[nsView window] mouseLocationOutsideOfEventStream]; NSPoint ptViewCoords = [nsView convertPoint:ptWindowCoords fromView:nil]; underMouse = [nsView hitTest:ptViewCoords] != nil; }]; - + JNF_COCOA_EXIT(env); - + return underMouse; }