diff --git a/src/she/osx/event_queue.mm b/src/she/osx/event_queue.mm index 2805d2cd3..ad21efd27 100644 --- a/src/she/osx/event_queue.mm +++ b/src/she/osx/event_queue.mm @@ -14,33 +14,8 @@ namespace she { -static NSWindow* g_window = nil; - -#ifndef _WIN32 -static bool pressedkeys[kKeyScancodes]; -bool is_key_pressed(KeyScancode scancode) -{ - if (scancode >= 0 && scancode < kKeyScancodes) - return pressedkeys[scancode]; - else - return false; -} -#endif - void OSXEventQueue::getEvent(Event& ev, bool canWait) { -#ifndef _WIN32 - switch (ev.type()) { - case Event::KeyDown: - case Event::KeyUp: { - KeyScancode scancode = ev.scancode(); - if (scancode >= 0 && scancode < kKeyScancodes) - pressedkeys[scancode] = (ev.type() == Event::KeyDown); - break; - } - } -#endif - ev.setType(Event::None); retry:; diff --git a/src/she/osx/view.mm b/src/she/osx/view.mm index 783917569..896f11488 100644 --- a/src/she/osx/view.mm +++ b/src/she/osx/view.mm @@ -20,6 +20,9 @@ using namespace she; namespace { +// Internal array of pressed keys used in is_key_pressed() +bool pressed_keys[kKeyScancodes]; + inline gfx::Point get_local_mouse_pos(NSView* view, NSEvent* event) { NSPoint point = [view convertPoint:[event locationInWindow] @@ -44,8 +47,32 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event) return Event::MouseButton::NoneButton; } +inline KeyModifiers get_modifiers_from_nsevent(NSEvent* event) +{ + int modifiers = kKeyNoneModifier; + NSEventModifierFlags nsFlags = event.modifierFlags; + if (nsFlags & NSShiftKeyMask) modifiers |= kKeyShiftModifier; + if (nsFlags & NSControlKeyMask) modifiers |= kKeyCtrlModifier; + if (nsFlags & NSAlternateKeyMask) modifiers |= kKeyAltModifier; + if (nsFlags & NSCommandKeyMask) modifiers |= kKeyCmdModifier; + if (she::is_key_pressed(kKeySpace)) modifiers |= kKeySpaceModifier; + return (KeyModifiers)modifiers; +} + } // anonymous namespace +namespace she { + +bool is_key_pressed(KeyScancode scancode) +{ + if (scancode >= 0 && scancode < kKeyScancodes) + return pressed_keys[scancode]; + else + return false; +} + +} // namespace she + @implementation OSXView - (id)initWithFrame:(NSRect)frameRect @@ -108,9 +135,14 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event) [super keyDown:event]; #endif + KeyScancode scancode = cocoavk_to_scancode(event.keyCode); + if (scancode >= 0 && scancode < kKeyScancodes) + pressed_keys[scancode] = true; + Event ev; ev.setType(Event::KeyDown); - ev.setScancode(cocoavk_to_scancode(event.keyCode)); + ev.setScancode(scancode); + ev.setModifiers(get_modifiers_from_nsevent(event)); ev.setRepeat(event.ARepeat ? 1: 0); // TODO we should use event.characters @@ -127,15 +159,20 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event) [super keyUp:event]; #endif + KeyScancode scancode = cocoavk_to_scancode(event.keyCode); + if (scancode >= 0 && scancode < kKeyScancodes) + pressed_keys[scancode] = false; + Event ev; ev.setType(Event::KeyUp); - ev.setScancode(cocoavk_to_scancode(event.keyCode)); + ev.setScancode(scancode); + ev.setModifiers(get_modifiers_from_nsevent(event)); ev.setRepeat(event.ARepeat ? 1: 0); - if (event.characters && - event.characters.length >= 1) { - ev.setUnicodeChar([event.characters characterAtIndex:0]); - } + // TODO we should use event.characters + NSString* chars = event.charactersIgnoringModifiers; + if (chars && chars.length >= 1) + ev.setUnicodeChar([chars characterAtIndex:0]); queue_event(ev); } @@ -158,6 +195,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event) kKeyCommand }; + KeyModifiers modifiers = get_modifiers_from_nsevent(event); int newFlags = event.modifierFlags; for (int i=0; i