summaryrefslogtreecommitdiff
path: root/indra/llwindow/llopenglview-objc.mm
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llwindow/llopenglview-objc.mm')
-rw-r--r--indra/llwindow/llopenglview-objc.mm127
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);
}
}