123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- /**************************************************************************/
- /* godot_application.mm */
- /**************************************************************************/
- /* This file is part of: */
- /* GODOT ENGINE */
- /* https://godotengine.org */
- /**************************************************************************/
- /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
- /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
- /* */
- /* Permission is hereby granted, free of charge, to any person obtaining */
- /* a copy of this software and associated documentation files (the */
- /* "Software"), to deal in the Software without restriction, including */
- /* without limitation the rights to use, copy, modify, merge, publish, */
- /* distribute, sublicense, and/or sell copies of the Software, and to */
- /* permit persons to whom the Software is furnished to do so, subject to */
- /* the following conditions: */
- /* */
- /* The above copyright notice and this permission notice shall be */
- /* included in all copies or substantial portions of the Software. */
- /* */
- /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
- /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
- /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
- /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
- /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
- /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
- /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
- /**************************************************************************/
- #include "godot_application.h"
- #include "display_server_macos.h"
- @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] == NSEventTypeSystemDefined && [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) {
- if (ds->mouse_process_popups()) {
- return;
- }
- }
- ds->send_event(event);
- }
- // From http://cocoadev.com/index.pl?GameKeyboardHandlingAlmost
- // This works around an AppKit bug, where key up events while holding
- // down the command key don't get sent to the key window.
- if ([event type] == NSEventTypeKeyUp && ([event modifierFlags] & NSEventModifierFlagCommand)) {
- [[self keyWindow] sendEvent:event];
- } else {
- [super sendEvent:event];
- }
- }
- @end
|