diff options
Diffstat (limited to 'indra/llwindow/llopenglview-objc.mm')
-rw-r--r-- | indra/llwindow/llopenglview-objc.mm | 127 |
1 files changed, 87 insertions, 40 deletions
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 1c9160a42d..22f3339cf1 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -25,9 +25,70 @@ */ #import "llopenglview-objc.h" -#include "llwindowmacosx-objc.h" +#import "llwindowmacosx-objc.h" #import "llappdelegate-objc.h" +#pragma mark local functions + +NativeKeyEventData extractKeyDataFromKeyEvent(NSEvent* theEvent) +{ + NativeKeyEventData eventData; + eventData.mKeyEvent = NativeKeyEventData::KEYUNKNOWN; + eventData.mEventType = [theEvent type]; + eventData.mEventModifiers = [theEvent modifierFlags]; + eventData.mEventKeyCode = [theEvent keyCode]; + NSString *strEventChars = [theEvent characters]; + eventData.mEventChars = (strEventChars.length) ? [strEventChars characterAtIndex:0] : 0; + NSString *strEventUChars = [theEvent charactersIgnoringModifiers]; + eventData.mEventUnmodChars = (strEventUChars.length) ? [strEventUChars characterAtIndex:0] : 0; + eventData.mEventRepeat = [theEvent isARepeat]; + return eventData; +} + +NativeKeyEventData extractKeyDataFromModifierEvent(NSEvent* theEvent) +{ + NativeKeyEventData eventData; + eventData.mKeyEvent = NativeKeyEventData::KEYUNKNOWN; + eventData.mEventType = [theEvent type]; + eventData.mEventModifiers = [theEvent modifierFlags]; + eventData.mEventKeyCode = [theEvent keyCode]; + return eventData; +} + +attributedStringInfo getSegments(NSAttributedString *str) +{ + attributedStringInfo segments; + segment_lengths seg_lengths; + segment_standouts seg_standouts; + NSRange effectiveRange; + NSRange limitRange = NSMakeRange(0, [str length]); + + while (limitRange.length > 0) { + NSNumber *attr = [str attribute:NSUnderlineStyleAttributeName atIndex:limitRange.location longestEffectiveRange:&effectiveRange inRange:limitRange]; + limitRange = NSMakeRange(NSMaxRange(effectiveRange), NSMaxRange(limitRange) - NSMaxRange(effectiveRange)); + + if (effectiveRange.length <= 0) + { + effectiveRange.length = 1; + } + + if ([attr integerValue] == 2) + { + seg_lengths.push_back(effectiveRange.length); + seg_standouts.push_back(true); + } else + { + seg_lengths.push_back(effectiveRange.length); + seg_standouts.push_back(false); + } + } + segments.seg_lengths = seg_lengths; + segments.seg_standouts = seg_standouts; + return segments; +} + +#pragma mark class implementations + @implementation NSScreen (PointConversion) + (NSScreen *)currentScreenForMouseLocation @@ -42,6 +103,7 @@ return screen; } + - (NSPoint)convertPointToScreenCoordinates:(NSPoint)aPoint { float normalizedX = fabs(fabs(self.frame.origin.x) - fabs(aPoint.x)); @@ -57,38 +119,6 @@ @end -attributedStringInfo getSegments(NSAttributedString *str) -{ - attributedStringInfo segments; - segment_lengths seg_lengths; - segment_standouts seg_standouts; - NSRange effectiveRange; - NSRange limitRange = NSMakeRange(0, [str length]); - - while (limitRange.length > 0) { - NSNumber *attr = [str attribute:NSUnderlineStyleAttributeName atIndex:limitRange.location longestEffectiveRange:&effectiveRange inRange:limitRange]; - limitRange = NSMakeRange(NSMaxRange(effectiveRange), NSMaxRange(limitRange) - NSMaxRange(effectiveRange)); - - if (effectiveRange.length <= 0) - { - effectiveRange.length = 1; - } - - if ([attr integerValue] == 2) - { - seg_lengths.push_back(effectiveRange.length); - seg_standouts.push_back(true); - } else - { - seg_lengths.push_back(effectiveRange.length); - seg_standouts.push_back(false); - } - } - segments.seg_lengths = seg_lengths; - segments.seg_standouts = seg_standouts; - return segments; -} - @implementation LLOpenGLView // Force a high quality update after live resizing @@ -239,7 +269,11 @@ attributedStringInfo getSegments(NSAttributedString *str) { [glContext setValues:(const GLint*)1 forParameter:NSOpenGLCPSwapInterval]; } else { - [glContext setValues:(const GLint*)0 forParameter:NSOpenGLCPSwapInterval]; + // supress this error after move to Xcode 7: + // error: null passed to a callee that requires a non-null argument [-Werror,-Wnonnull] + // Tried using ObjC 'nonnull' keyword as per SO article but didn't build + GLint swapInterval=0; + [glContext setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval]; } mOldResize = false; @@ -316,6 +350,9 @@ attributedStringInfo getSegments(NSAttributedString *str) callRightMouseUp(mMousePos, [theEvent modifierFlags]); mSimulatedRightClick = false; } else { + NSPoint mPoint = [theEvent locationInWindow]; + mMousePos[0] = mPoint.x; + mMousePos[1] = mPoint.y; callLeftMouseUp(mMousePos, [theEvent modifierFlags]); } } @@ -363,7 +400,7 @@ attributedStringInfo getSegments(NSAttributedString *str) NSPoint mPoint = [theEvent locationInWindow]; mMousePos[0] = mPoint.x; mMousePos[1] = mPoint.y; - callMouseMoved(mMousePos, 0); + callMouseDragged(mMousePos, 0); } - (void) otherMouseDown:(NSEvent *)theEvent @@ -398,11 +435,16 @@ attributedStringInfo getSegments(NSAttributedString *str) - (void) keyUp:(NSEvent *)theEvent { - callKeyUp([theEvent keyCode], [theEvent modifierFlags]); + NativeKeyEventData eventData = extractKeyDataFromKeyEvent(theEvent); + eventData.mKeyEvent = NativeKeyEventData::KEYUP; + callKeyUp(&eventData, [theEvent keyCode], [theEvent modifierFlags]); } - (void) keyDown:(NSEvent *)theEvent { + NativeKeyEventData eventData = extractKeyDataFromKeyEvent(theEvent); + eventData.mKeyEvent = NativeKeyEventData::KEYDOWN; + uint keycode = [theEvent keyCode]; // We must not depend on flagsChange event to detect modifier flags changed, // must depend on the modifire flags in the event parameter. @@ -410,7 +452,7 @@ attributedStringInfo getSegments(NSAttributedString *str) // e.g. OS Window for upload something or Input Window... // mModifiers instance variable is for insertText: or insertText:replacementRange: (by Pell Smit) mModifiers = [theEvent modifierFlags]; - bool acceptsText = mHasMarkedText ? false : callKeyDown(keycode, mModifiers); + bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers); unichar ch; if (acceptsText && !mMarkedTextAllowed && @@ -431,12 +473,15 @@ attributedStringInfo getSegments(NSAttributedString *str) // Since SL assumes we receive those, we fake it here. if (mModifiers & NSCommandKeyMask && !mHasMarkedText) { - callKeyUp([theEvent keyCode], mModifiers); + eventData.mKeyEvent = NativeKeyEventData::KEYUP; + callKeyUp(&eventData, [theEvent keyCode], mModifiers); } } - (void)flagsChanged:(NSEvent *)theEvent { + NativeKeyEventData eventData = extractKeyDataFromModifierEvent(theEvent); + mModifiers = [theEvent modifierFlags]; callModifier([theEvent modifierFlags]); @@ -458,11 +503,13 @@ attributedStringInfo getSegments(NSAttributedString *str) if (mModifiers & mask) { - callKeyDown([theEvent keyCode], 0); + eventData.mKeyEvent = NativeKeyEventData::KEYDOWN; + callKeyDown(&eventData, [theEvent keyCode], 0); } else { - callKeyUp([theEvent keyCode], 0); + eventData.mKeyEvent = NativeKeyEventData::KEYUP; + callKeyUp(&eventData, [theEvent keyCode], 0); } } |