aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-10-27 20:09:53 +0800
committercrupest <crupest@outlook.com>2021-10-27 20:09:53 +0800
commit4b1008ef111caf2008d3b4530993d17fd0e365ae (patch)
tree80626d3b2b40b136347f2c5d78d24c8deb0172c1 /src
parent25454e67a12acfb0f7f85680fe8242f562002f70 (diff)
downloadcru-4b1008ef111caf2008d3b4530993d17fd0e365ae.tar.gz
cru-4b1008ef111caf2008d3b4530993d17fd0e365ae.tar.bz2
cru-4b1008ef111caf2008d3b4530993d17fd0e365ae.zip
...
Diffstat (limited to 'src')
-rw-r--r--src/osx/gui/Keyboard.mm18
-rw-r--r--src/osx/gui/Window.mm94
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);