Skip to content
Snippets Groups Projects
Commit c2c0c537 authored by Cinder's avatar Cinder
Browse files

STORM-2127 - Fix NSException when assigning values that don't exist in cocoa modifier key event.

parent 18928ea6
No related branches found
No related tags found
No related merge requests found
...@@ -25,13 +25,69 @@ ...@@ -25,13 +25,69 @@
*/ */
#import "llopenglview-objc.h" #import "llopenglview-objc.h"
#include "llwindowmacosx-objc.h" #import "llwindowmacosx-objc.h"
#import "llappdelegate-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) @implementation NSScreen (PointConversion)
...@@ -63,53 +119,6 @@ ...@@ -63,53 +119,6 @@
@end @end
void extractKeyDataFromEvent (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];
}
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 @implementation LLOpenGLView
// Force a high quality update after live resizing // Force a high quality update after live resizing
...@@ -423,18 +432,14 @@ attributedStringInfo getSegments(NSAttributedString *str) ...@@ -423,18 +432,14 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void) keyUp:(NSEvent *)theEvent - (void) keyUp:(NSEvent *)theEvent
{ {
NativeKeyEventData eventData; NativeKeyEventData eventData = extractKeyDataFromKeyEvent(theEvent);
extractKeyDataFromEvent( theEvent, &eventData );
eventData.mKeyEvent = NativeKeyEventData::KEYUP; eventData.mKeyEvent = NativeKeyEventData::KEYUP;
callKeyUp(&eventData, [theEvent keyCode], [theEvent modifierFlags]); callKeyUp(&eventData, [theEvent keyCode], [theEvent modifierFlags]);
} }
- (void) keyDown:(NSEvent *)theEvent - (void) keyDown:(NSEvent *)theEvent
{ {
NativeKeyEventData eventData; NativeKeyEventData eventData = extractKeyDataFromKeyEvent(theEvent);
extractKeyDataFromEvent( theEvent, &eventData );
eventData.mKeyEvent = NativeKeyEventData::KEYDOWN; eventData.mKeyEvent = NativeKeyEventData::KEYDOWN;
uint keycode = [theEvent keyCode]; uint keycode = [theEvent keyCode];
...@@ -472,9 +477,7 @@ attributedStringInfo getSegments(NSAttributedString *str) ...@@ -472,9 +477,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void)flagsChanged:(NSEvent *)theEvent - (void)flagsChanged:(NSEvent *)theEvent
{ {
NativeKeyEventData eventData; NativeKeyEventData eventData = extractKeyDataFromModifierEvent(theEvent);
extractKeyDataFromEvent( theEvent, &eventData );
mModifiers = [theEvent modifierFlags]; mModifiers = [theEvent modifierFlags];
callModifier([theEvent modifierFlags]); callModifier([theEvent modifierFlags]);
......
...@@ -55,13 +55,13 @@ struct NativeKeyEventData { ...@@ -55,13 +55,13 @@ struct NativeKeyEventData {
KEYCHAR KEYCHAR
}; };
EventType mKeyEvent; EventType mKeyEvent = KEYUNKNOWN;
uint32_t mEventType; uint32_t mEventType = 0;
uint32_t mEventModifiers; uint32_t mEventModifiers = 0;
uint32_t mEventKeyCode; uint32_t mEventKeyCode = 0;
uint32_t mEventChars; uint32_t mEventChars = 0;
uint32_t mEventUnmodChars; uint32_t mEventUnmodChars = 0;
bool mEventRepeat; bool mEventRepeat = false;
}; };
typedef const NativeKeyEventData * NSKeyEventRef; typedef const NativeKeyEventData * NSKeyEventRef;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment