diff options
author | crupest <crupest@outlook.com> | 2021-10-27 20:09:53 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-10-27 20:09:53 +0800 |
commit | 4b1008ef111caf2008d3b4530993d17fd0e365ae (patch) | |
tree | 80626d3b2b40b136347f2c5d78d24c8deb0172c1 /src | |
parent | 25454e67a12acfb0f7f85680fe8242f562002f70 (diff) | |
download | cru-4b1008ef111caf2008d3b4530993d17fd0e365ae.tar.gz cru-4b1008ef111caf2008d3b4530993d17fd0e365ae.tar.bz2 cru-4b1008ef111caf2008d3b4530993d17fd0e365ae.zip |
...
Diffstat (limited to 'src')
-rw-r--r-- | src/osx/gui/Keyboard.mm | 18 | ||||
-rw-r--r-- | src/osx/gui/Window.mm | 94 |
2 files changed, 53 insertions, 59 deletions
diff --git a/src/osx/gui/Keyboard.mm b/src/osx/gui/Keyboard.mm index f9b0c92d..8e14ec83 100644 --- a/src/osx/gui/Keyboard.mm +++ b/src/osx/gui/Keyboard.mm @@ -66,13 +66,17 @@ KeyCode KeyCodeFromOsxToCru(unsigned short n) { CRU_DEFINE_KEYCODE_MAP(kVK_RightOption, KeyCode::RightAlt) CRU_DEFINE_KEYCODE_MAP(kVK_Command, KeyCode::LeftCommand) CRU_DEFINE_KEYCODE_MAP(kVK_RightCommand, KeyCode::RightCommand) - CRU_DEFINE_KEYCODE_MAP(kVK_ForwardDelete, KeyCode::Backspace) + CRU_DEFINE_KEYCODE_MAP(kVK_Delete, KeyCode::Backspace) CRU_DEFINE_KEYCODE_MAP(kVK_Return, KeyCode::Return) - CRU_DEFINE_KEYCODE_MAP(kVK_Delete, KeyCode::Delete) + CRU_DEFINE_KEYCODE_MAP(kVK_ForwardDelete, KeyCode::Delete) CRU_DEFINE_KEYCODE_MAP(kVK_Home, KeyCode::Home) CRU_DEFINE_KEYCODE_MAP(kVK_End, KeyCode::End) CRU_DEFINE_KEYCODE_MAP(kVK_PageUp, KeyCode::PageUp) CRU_DEFINE_KEYCODE_MAP(kVK_PageDown, KeyCode::PageDown) + CRU_DEFINE_KEYCODE_MAP(kVK_LeftArrow, KeyCode::Left) + CRU_DEFINE_KEYCODE_MAP(kVK_RightArrow, KeyCode::Right) + CRU_DEFINE_KEYCODE_MAP(kVK_UpArrow, KeyCode::Up) + CRU_DEFINE_KEYCODE_MAP(kVK_DownArrow, KeyCode::Down) CRU_DEFINE_KEYCODE_MAP(kVK_ANSI_Keypad0, KeyCode::NumPad0) CRU_DEFINE_KEYCODE_MAP(kVK_ANSI_Keypad1, KeyCode::NumPad1) CRU_DEFINE_KEYCODE_MAP(kVK_ANSI_Keypad2, KeyCode::NumPad2) @@ -89,7 +93,7 @@ KeyCode KeyCodeFromOsxToCru(unsigned short n) { #undef CRU_DEFINE_KEYCODE_MAP } -unsigned short KeyCodeFromOsxToCru(KeyCode k) { +unsigned short KeyCodeFromCruToOsx(KeyCode k) { switch (k) { #define CRU_DEFINE_KEYCODE_MAP(cru, osx) \ case cru: \ @@ -152,13 +156,17 @@ unsigned short KeyCodeFromOsxToCru(KeyCode k) { CRU_DEFINE_KEYCODE_MAP(KeyCode::RightAlt, kVK_RightOption) CRU_DEFINE_KEYCODE_MAP(KeyCode::LeftCommand, kVK_Command) CRU_DEFINE_KEYCODE_MAP(KeyCode::RightCommand, kVK_RightCommand) - CRU_DEFINE_KEYCODE_MAP(KeyCode::Backspace, kVK_ForwardDelete) + CRU_DEFINE_KEYCODE_MAP(KeyCode::Backspace, kVK_Delete) CRU_DEFINE_KEYCODE_MAP(KeyCode::Return, kVK_Return) - CRU_DEFINE_KEYCODE_MAP(KeyCode::Delete, kVK_Delete) + CRU_DEFINE_KEYCODE_MAP(KeyCode::Delete, kVK_ForwardDelete) CRU_DEFINE_KEYCODE_MAP(KeyCode::Home, kVK_Home) CRU_DEFINE_KEYCODE_MAP(KeyCode::End, kVK_End) CRU_DEFINE_KEYCODE_MAP(KeyCode::PageUp, kVK_PageUp) CRU_DEFINE_KEYCODE_MAP(KeyCode::PageDown, kVK_PageDown) + CRU_DEFINE_KEYCODE_MAP(KeyCode::Left, kVK_LeftArrow) + CRU_DEFINE_KEYCODE_MAP(KeyCode::Right, kVK_RightArrow) + CRU_DEFINE_KEYCODE_MAP(KeyCode::Up, kVK_UpArrow) + CRU_DEFINE_KEYCODE_MAP(KeyCode::Down, kVK_DownArrow) CRU_DEFINE_KEYCODE_MAP(KeyCode::NumPad0, kVK_ANSI_Keypad0) CRU_DEFINE_KEYCODE_MAP(KeyCode::NumPad1, kVK_ANSI_Keypad1) CRU_DEFINE_KEYCODE_MAP(KeyCode::NumPad2, kVK_ANSI_Keypad2) diff --git a/src/osx/gui/Window.mm b/src/osx/gui/Window.mm index bbf05f4d..9a71d271 100644 --- a/src/osx/gui/Window.mm +++ b/src/osx/gui/Window.mm @@ -30,6 +30,7 @@ #include <gsl/gsl_assert> #include <limits> #include <memory> +#include <unordered_set> using cru::platform::osx::Convert; using cru::platform::graphics::osx::quartz::Convert; @@ -283,6 +284,19 @@ IEvent<NativeKeyEventArgs>* OsxWindow::KeyUpEvent() { return &p_->key_up_event_; IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_method_context_.get(); } } +namespace { +cru::platform::gui::KeyModifier GetKeyModifier(NSEvent* event) { + cru::platform::gui::KeyModifier key_modifier; + if (event.modifierFlags & NSEventModifierFlagControl) + key_modifier |= cru::platform::gui::KeyModifiers::ctrl; + if (event.modifierFlags & NSEventModifierFlagOption) + key_modifier |= cru::platform::gui::KeyModifiers::alt; + if (event.modifierFlags & NSEventModifierFlagShift) + key_modifier |= cru::platform::gui::KeyModifiers::shift; + return key_modifier; +} +} + @implementation CruWindow { cru::platform::gui::osx::details::OsxWindowPrivate* _p; } @@ -375,13 +389,7 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho // cru::log::TagDebug(u"CruView", u"Recieved mouse down."); [[self window] makeKeyWindow]; - cru::platform::gui::KeyModifier key_modifier; - if (event.modifierFlags & NSEventModifierFlagControl) - key_modifier |= cru::platform::gui::KeyModifiers::ctrl; - if (event.modifierFlags & NSEventModifierFlagOption) - key_modifier |= cru::platform::gui::KeyModifiers::alt; - if (event.modifierFlags & NSEventModifierFlagShift) - key_modifier |= cru::platform::gui::KeyModifiers::shift; + auto key_modifier = GetKeyModifier(event); cru::platform::Point p(event.locationInWindow.x, event.locationInWindow.y); _p->OnMouseDown(cru::platform::gui::mouse_buttons::left, p, key_modifier); @@ -390,13 +398,7 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho - (void)mouseUp:(NSEvent*)event { // cru::log::TagDebug(u"CruView", u"Recieved mouse up."); - cru::platform::gui::KeyModifier key_modifier; - if (event.modifierFlags & NSEventModifierFlagControl) - key_modifier |= cru::platform::gui::KeyModifiers::ctrl; - if (event.modifierFlags & NSEventModifierFlagOption) - key_modifier |= cru::platform::gui::KeyModifiers::alt; - if (event.modifierFlags & NSEventModifierFlagShift) - key_modifier |= cru::platform::gui::KeyModifiers::shift; + auto key_modifier = GetKeyModifier(event); cru::platform::Point p(event.locationInWindow.x, event.locationInWindow.y); _p->OnMouseUp(cru::platform::gui::mouse_buttons::left, p, key_modifier); @@ -405,13 +407,7 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho - (void)rightMouseDown:(NSEvent*)event { // cru::log::TagDebug(u"CruView", u"Recieved right mouse down."); - cru::platform::gui::KeyModifier key_modifier; - if (event.modifierFlags & NSEventModifierFlagControl) - key_modifier |= cru::platform::gui::KeyModifiers::ctrl; - if (event.modifierFlags & NSEventModifierFlagOption) - key_modifier |= cru::platform::gui::KeyModifiers::alt; - if (event.modifierFlags & NSEventModifierFlagShift) - key_modifier |= cru::platform::gui::KeyModifiers::shift; + auto key_modifier = GetKeyModifier(event); cru::platform::Point p(event.locationInWindow.x, event.locationInWindow.y); _p->OnMouseDown(cru::platform::gui::mouse_buttons::right, p, key_modifier); @@ -420,13 +416,7 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho - (void)rightMouseUp:(NSEvent*)event { // cru::log::TagDebug(u"CruView", u"Recieved right mouse up."); - cru::platform::gui::KeyModifier key_modifier; - if (event.modifierFlags & NSEventModifierFlagControl) - key_modifier |= cru::platform::gui::KeyModifiers::ctrl; - if (event.modifierFlags & NSEventModifierFlagOption) - key_modifier |= cru::platform::gui::KeyModifiers::alt; - if (event.modifierFlags & NSEventModifierFlagShift) - key_modifier |= cru::platform::gui::KeyModifiers::shift; + auto key_modifier = GetKeyModifier(event); cru::platform::Point p(event.locationInWindow.x, event.locationInWindow.y); _p->OnMouseUp(cru::platform::gui::mouse_buttons::right, p, key_modifier); @@ -435,49 +425,45 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho - (void)scrollWheel:(NSEvent*)event { // cru::log::TagDebug(u"CruView", u"Recieved mouse wheel."); - cru::platform::gui::KeyModifier key_modifier; - if (event.modifierFlags & NSEventModifierFlagControl) - key_modifier |= cru::platform::gui::KeyModifiers::ctrl; - if (event.modifierFlags & NSEventModifierFlagOption) - key_modifier |= cru::platform::gui::KeyModifiers::alt; - if (event.modifierFlags & NSEventModifierFlagShift) - key_modifier |= cru::platform::gui::KeyModifiers::shift; + auto key_modifier = GetKeyModifier(event); cru::platform::Point p(event.locationInWindow.x, event.locationInWindow.y); _p->OnMouseWheel(static_cast<float>(event.scrollingDeltaY), p, key_modifier); } +namespace { +using cru::platform::gui::KeyCode; +const std::unordered_set<KeyCode> bypass_codes{ + KeyCode::Backspace, KeyCode::Delete, KeyCode::Left, KeyCode::Right, KeyCode::Up, + KeyCode::Down, KeyCode::Home, KeyCode::End, KeyCode::PageUp, KeyCode::PageDown}; +} + - (void)keyDown:(NSEvent*)event { // cru::log::TagDebug(u"CruView", u"Recieved key down."); - cru::platform::gui::KeyModifier key_modifier; - if (event.modifierFlags & NSEventModifierFlagControl) - key_modifier |= cru::platform::gui::KeyModifiers::ctrl; - if (event.modifierFlags & NSEventModifierFlagOption) - key_modifier |= cru::platform::gui::KeyModifiers::alt; - if (event.modifierFlags & NSEventModifierFlagShift) - key_modifier |= cru::platform::gui::KeyModifiers::shift; + bool handled = false; + + auto input_context = dynamic_cast<cru::platform::gui::osx::OsxInputMethodContext*>( + _p->GetWindow()->GetInputMethodContext()); + Ensures(input_context); + auto c = cru::platform::gui::osx::KeyCodeFromOsxToCru(event.keyCode); - _p->OnKeyDown(c, key_modifier); + if (!(input_context->GetCompositionText().text.empty() && bypass_codes.count(c)) && + input_context->IsEnabled()) { + handled = [[self inputContext] handleEvent:event]; + } - if (dynamic_cast<cru::platform::gui::osx::OsxInputMethodContext*>( - _p->GetWindow()->GetInputMethodContext()) - ->IsEnabled()) { - [[self inputContext] handleEvent:event]; + if (!handled) { + auto key_modifier = GetKeyModifier(event); + _p->OnKeyDown(c, key_modifier); } } - (void)keyUp:(NSEvent*)event { // cru::log::TagDebug(u"CruView", u"Recieved key up."); - cru::platform::gui::KeyModifier key_modifier; - if (event.modifierFlags & NSEventModifierFlagControl) - key_modifier |= cru::platform::gui::KeyModifiers::ctrl; - if (event.modifierFlags & NSEventModifierFlagOption) - key_modifier |= cru::platform::gui::KeyModifiers::alt; - if (event.modifierFlags & NSEventModifierFlagShift) - key_modifier |= cru::platform::gui::KeyModifiers::shift; + auto key_modifier = GetKeyModifier(event); auto c = cru::platform::gui::osx::KeyCodeFromOsxToCru(event.keyCode); _p->OnKeyUp(c, key_modifier); |