summaryrefslogtreecommitdiff
path: root/platform/macos/godot_application.mm
diff options
context:
space:
mode:
authorbruvzg <7645683+bruvzg@users.noreply.github.com>2022-12-11 01:21:22 +0200
committerbruvzg <7645683+bruvzg@users.noreply.github.com>2023-01-23 15:08:12 +0200
commitdaad4aed62bfa471421f960179f0ac0fd78e8040 (patch)
tree86b7f69d180f253c51c4b567139d68850f9e365d /platform/macos/godot_application.mm
parent9937915ad77059b63582ffd4e324afb26f467b76 (diff)
Cleanup and unify keyboard input.
- Unify keycode values (secondary label printed on a key), remove unused hardcoded Latin-1 codes. - Unify IME behaviour, add inline composition string display on Windows and X11. - Add key_label (localized label printed on a key) value to the key events, and allow mapping actions to the unshifted Unicode events. - Add support for physical keyboard (Bluetooth or Sidecar) handling on iOS. - Add support for media key handling on macOS. Co-authored-by: Raul Santos <raulsntos@gmail.com>
Diffstat (limited to 'platform/macos/godot_application.mm')
-rw-r--r--platform/macos/godot_application.mm74
1 files changed, 74 insertions, 0 deletions
diff --git a/platform/macos/godot_application.mm b/platform/macos/godot_application.mm
index 0c282930f4..e3a744caa2 100644
--- a/platform/macos/godot_application.mm
+++ b/platform/macos/godot_application.mm
@@ -34,7 +34,81 @@
@implementation GodotApplication
+- (void)mediaKeyEvent:(int)key state:(BOOL)state repeat:(BOOL)repeat {
+ Key keycode = Key::NONE;
+ switch (key) {
+ case NX_KEYTYPE_SOUND_UP: {
+ keycode = Key::VOLUMEUP;
+ } break;
+ case NX_KEYTYPE_SOUND_DOWN: {
+ keycode = Key::VOLUMEUP;
+ } break;
+ //NX_KEYTYPE_BRIGHTNESS_UP
+ //NX_KEYTYPE_BRIGHTNESS_DOWN
+ case NX_KEYTYPE_CAPS_LOCK: {
+ keycode = Key::CAPSLOCK;
+ } break;
+ case NX_KEYTYPE_HELP: {
+ keycode = Key::HELP;
+ } break;
+ case NX_POWER_KEY: {
+ keycode = Key::STANDBY;
+ } break;
+ case NX_KEYTYPE_MUTE: {
+ keycode = Key::VOLUMEMUTE;
+ } break;
+ //NX_KEYTYPE_CONTRAST_UP
+ //NX_KEYTYPE_CONTRAST_DOWN
+ //NX_KEYTYPE_LAUNCH_PANEL
+ //NX_KEYTYPE_EJECT
+ //NX_KEYTYPE_VIDMIRROR
+ //NX_KEYTYPE_FAST
+ //NX_KEYTYPE_REWIND
+ //NX_KEYTYPE_ILLUMINATION_UP
+ //NX_KEYTYPE_ILLUMINATION_DOWN
+ //NX_KEYTYPE_ILLUMINATION_TOGGLE
+ case NX_KEYTYPE_PLAY: {
+ keycode = Key::MEDIAPLAY;
+ } break;
+ case NX_KEYTYPE_NEXT: {
+ keycode = Key::MEDIANEXT;
+ } break;
+ case NX_KEYTYPE_PREVIOUS: {
+ keycode = Key::MEDIAPREVIOUS;
+ } break;
+ default: {
+ keycode = Key::NONE;
+ } break;
+ }
+
+ DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
+ if (ds && keycode != Key::NONE) {
+ DisplayServerMacOS::KeyEvent ke;
+
+ ke.window_id = ds->_get_focused_window_or_popup();
+ ke.macos_state = 0;
+ ke.pressed = state;
+ ke.echo = repeat;
+ ke.keycode = keycode;
+ ke.physical_keycode = keycode;
+ ke.key_label = keycode;
+ ke.unicode = 0;
+ ke.raw = true;
+
+ ds->push_to_key_event_buffer(ke);
+ }
+}
+
- (void)sendEvent:(NSEvent *)event {
+ if ([event type] == NSSystemDefined && [event subtype] == 8) {
+ int keyCode = (([event data1] & 0xFFFF0000) >> 16);
+ int keyFlags = ([event data1] & 0x0000FFFF);
+ int keyState = (((keyFlags & 0xFF00) >> 8)) == 0xA;
+ int keyRepeat = (keyFlags & 0x1);
+
+ [self mediaKeyEvent:keyCode state:keyState repeat:keyRepeat];
+ }
+
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
if (ds) {
if ([event type] == NSEventTypeLeftMouseDown || [event type] == NSEventTypeRightMouseDown || [event type] == NSEventTypeOtherMouseDown) {