[aseprite] 177/250: Use key modifiers from NSEvents in Skia/OSX

Tobias Hansen thansen at moszumanska.debian.org
Sun Dec 20 15:27:28 UTC 2015


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository aseprite.

commit ae1861236efffe0fcf32d1f70d17a5f271cb081b
Author: David Capello <davidcapello at gmail.com>
Date:   Wed Oct 14 17:06:23 2015 -0300

    Use key modifiers from NSEvents in Skia/OSX
---
 src/she/osx/event_queue.mm | 25 -------------------
 src/she/osx/view.mm        | 61 +++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 55 insertions(+), 31 deletions(-)

diff --git a/src/she/osx/event_queue.mm b/src/she/osx/event_queue.mm
index 2805d2c..ad21efd 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 7839175..896f114 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<sizeof(flags)/sizeof(flags[0]); ++i) {
@@ -166,7 +204,11 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
       ev.setType(
         ((newFlags & flags[i]) != 0 ? Event::KeyDown:
                                       Event::KeyUp));
+
+      pressed_keys[scancodes[i]] = ((newFlags & flags[i]) != 0);
+
       ev.setScancode(scancodes[i]);
+      ev.setModifiers(modifiers);
       ev.setRepeat(0);
       queue_event(ev);
     }
@@ -182,6 +224,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
   Event ev;
   ev.setType(Event::MouseEnter);
   ev.setPosition(get_local_mouse_pos(self, event));
+  ev.setModifiers(get_modifiers_from_nsevent(event));
   queue_event(ev);
 }
 
@@ -190,6 +233,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
   Event ev;
   ev.setType(Event::MouseMove);
   ev.setPosition(get_local_mouse_pos(self, event));
+  ev.setModifiers(get_modifiers_from_nsevent(event));
   queue_event(ev);
 }
 
@@ -205,6 +249,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
   Event ev;
   ev.setType(Event::MouseLeave);
   ev.setPosition(get_local_mouse_pos(self, event));
+  ev.setModifiers(get_modifiers_from_nsevent(event));
   queue_event(ev);
 }
 
@@ -259,6 +304,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
   ev.setType(Event::MouseDown);
   ev.setPosition(get_local_mouse_pos(self, event));
   ev.setButton(get_mouse_buttons(event));
+  ev.setModifiers(get_modifiers_from_nsevent(event));
   queue_event(ev);
 }
 
@@ -268,6 +314,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
   ev.setType(Event::MouseUp);
   ev.setPosition(get_local_mouse_pos(self, event));
   ev.setButton(get_mouse_buttons(event));
+  ev.setModifiers(get_modifiers_from_nsevent(event));
   queue_event(ev);
 }
 
@@ -277,6 +324,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
   ev.setType(Event::MouseMove);
   ev.setPosition(get_local_mouse_pos(self, event));
   ev.setButton(get_mouse_buttons(event));
+  ev.setModifiers(get_modifiers_from_nsevent(event));
   queue_event(ev);
 }
 
@@ -303,6 +351,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
   ev.setType(Event::MouseWheel);
   ev.setPosition(get_local_mouse_pos(self, event));
   ev.setButton(get_mouse_buttons(event));
+  ev.setModifiers(get_modifiers_from_nsevent(event));
 
   int scale = 1;
   if (self.window)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git



More information about the Pkg-games-commits mailing list