mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-18 11:42:47 +00:00
Use key modifiers from NSEvents in Skia/OSX
This commit is contained in:
parent
bd1a1ffafb
commit
ae1861236e
@ -14,33 +14,8 @@
|
|||||||
|
|
||||||
namespace she {
|
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)
|
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);
|
ev.setType(Event::None);
|
||||||
|
|
||||||
retry:;
|
retry:;
|
||||||
|
@ -20,6 +20,9 @@ using namespace she;
|
|||||||
|
|
||||||
namespace {
|
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)
|
inline gfx::Point get_local_mouse_pos(NSView* view, NSEvent* event)
|
||||||
{
|
{
|
||||||
NSPoint point = [view convertPoint:[event locationInWindow]
|
NSPoint point = [view convertPoint:[event locationInWindow]
|
||||||
@ -44,8 +47,32 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
|
|||||||
return Event::MouseButton::NoneButton;
|
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
|
} // 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
|
@implementation OSXView
|
||||||
|
|
||||||
- (id)initWithFrame:(NSRect)frameRect
|
- (id)initWithFrame:(NSRect)frameRect
|
||||||
@ -108,9 +135,14 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
|
|||||||
[super keyDown:event];
|
[super keyDown:event];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
KeyScancode scancode = cocoavk_to_scancode(event.keyCode);
|
||||||
|
if (scancode >= 0 && scancode < kKeyScancodes)
|
||||||
|
pressed_keys[scancode] = true;
|
||||||
|
|
||||||
Event ev;
|
Event ev;
|
||||||
ev.setType(Event::KeyDown);
|
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);
|
ev.setRepeat(event.ARepeat ? 1: 0);
|
||||||
|
|
||||||
// TODO we should use event.characters
|
// TODO we should use event.characters
|
||||||
@ -127,15 +159,20 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
|
|||||||
[super keyUp:event];
|
[super keyUp:event];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
KeyScancode scancode = cocoavk_to_scancode(event.keyCode);
|
||||||
|
if (scancode >= 0 && scancode < kKeyScancodes)
|
||||||
|
pressed_keys[scancode] = false;
|
||||||
|
|
||||||
Event ev;
|
Event ev;
|
||||||
ev.setType(Event::KeyUp);
|
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);
|
ev.setRepeat(event.ARepeat ? 1: 0);
|
||||||
|
|
||||||
if (event.characters &&
|
// TODO we should use event.characters
|
||||||
event.characters.length >= 1) {
|
NSString* chars = event.charactersIgnoringModifiers;
|
||||||
ev.setUnicodeChar([event.characters characterAtIndex:0]);
|
if (chars && chars.length >= 1)
|
||||||
}
|
ev.setUnicodeChar([chars characterAtIndex:0]);
|
||||||
|
|
||||||
queue_event(ev);
|
queue_event(ev);
|
||||||
}
|
}
|
||||||
@ -158,6 +195,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
|
|||||||
kKeyCommand
|
kKeyCommand
|
||||||
};
|
};
|
||||||
|
|
||||||
|
KeyModifiers modifiers = get_modifiers_from_nsevent(event);
|
||||||
int newFlags = event.modifierFlags;
|
int newFlags = event.modifierFlags;
|
||||||
|
|
||||||
for (int i=0; i<sizeof(flags)/sizeof(flags[0]); ++i) {
|
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(
|
ev.setType(
|
||||||
((newFlags & flags[i]) != 0 ? Event::KeyDown:
|
((newFlags & flags[i]) != 0 ? Event::KeyDown:
|
||||||
Event::KeyUp));
|
Event::KeyUp));
|
||||||
|
|
||||||
|
pressed_keys[scancodes[i]] = ((newFlags & flags[i]) != 0);
|
||||||
|
|
||||||
ev.setScancode(scancodes[i]);
|
ev.setScancode(scancodes[i]);
|
||||||
|
ev.setModifiers(modifiers);
|
||||||
ev.setRepeat(0);
|
ev.setRepeat(0);
|
||||||
queue_event(ev);
|
queue_event(ev);
|
||||||
}
|
}
|
||||||
@ -182,6 +224,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
|
|||||||
Event ev;
|
Event ev;
|
||||||
ev.setType(Event::MouseEnter);
|
ev.setType(Event::MouseEnter);
|
||||||
ev.setPosition(get_local_mouse_pos(self, event));
|
ev.setPosition(get_local_mouse_pos(self, event));
|
||||||
|
ev.setModifiers(get_modifiers_from_nsevent(event));
|
||||||
queue_event(ev);
|
queue_event(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,6 +233,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
|
|||||||
Event ev;
|
Event ev;
|
||||||
ev.setType(Event::MouseMove);
|
ev.setType(Event::MouseMove);
|
||||||
ev.setPosition(get_local_mouse_pos(self, event));
|
ev.setPosition(get_local_mouse_pos(self, event));
|
||||||
|
ev.setModifiers(get_modifiers_from_nsevent(event));
|
||||||
queue_event(ev);
|
queue_event(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,6 +249,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
|
|||||||
Event ev;
|
Event ev;
|
||||||
ev.setType(Event::MouseLeave);
|
ev.setType(Event::MouseLeave);
|
||||||
ev.setPosition(get_local_mouse_pos(self, event));
|
ev.setPosition(get_local_mouse_pos(self, event));
|
||||||
|
ev.setModifiers(get_modifiers_from_nsevent(event));
|
||||||
queue_event(ev);
|
queue_event(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,6 +304,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
|
|||||||
ev.setType(Event::MouseDown);
|
ev.setType(Event::MouseDown);
|
||||||
ev.setPosition(get_local_mouse_pos(self, event));
|
ev.setPosition(get_local_mouse_pos(self, event));
|
||||||
ev.setButton(get_mouse_buttons(event));
|
ev.setButton(get_mouse_buttons(event));
|
||||||
|
ev.setModifiers(get_modifiers_from_nsevent(event));
|
||||||
queue_event(ev);
|
queue_event(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,6 +314,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
|
|||||||
ev.setType(Event::MouseUp);
|
ev.setType(Event::MouseUp);
|
||||||
ev.setPosition(get_local_mouse_pos(self, event));
|
ev.setPosition(get_local_mouse_pos(self, event));
|
||||||
ev.setButton(get_mouse_buttons(event));
|
ev.setButton(get_mouse_buttons(event));
|
||||||
|
ev.setModifiers(get_modifiers_from_nsevent(event));
|
||||||
queue_event(ev);
|
queue_event(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,6 +324,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
|
|||||||
ev.setType(Event::MouseMove);
|
ev.setType(Event::MouseMove);
|
||||||
ev.setPosition(get_local_mouse_pos(self, event));
|
ev.setPosition(get_local_mouse_pos(self, event));
|
||||||
ev.setButton(get_mouse_buttons(event));
|
ev.setButton(get_mouse_buttons(event));
|
||||||
|
ev.setModifiers(get_modifiers_from_nsevent(event));
|
||||||
queue_event(ev);
|
queue_event(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,6 +351,7 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
|
|||||||
ev.setType(Event::MouseWheel);
|
ev.setType(Event::MouseWheel);
|
||||||
ev.setPosition(get_local_mouse_pos(self, event));
|
ev.setPosition(get_local_mouse_pos(self, event));
|
||||||
ev.setButton(get_mouse_buttons(event));
|
ev.setButton(get_mouse_buttons(event));
|
||||||
|
ev.setModifiers(get_modifiers_from_nsevent(event));
|
||||||
|
|
||||||
int scale = 1;
|
int scale = 1;
|
||||||
if (self.window)
|
if (self.window)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user