diff options
Diffstat (limited to 'platform/osx/os_osx.mm')
| -rw-r--r-- | platform/osx/os_osx.mm | 376 |
1 files changed, 140 insertions, 236 deletions
diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index 065506c612..d13486b490 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -53,35 +53,6 @@ #include <sys/types.h> #include <unistd.h> -//uses portions of glfw - -//======================================================================== -// GLFW 3.0 - www.glfw.org -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Marcus Geelnard -// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would -// be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, and must not -// be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source -// distribution. -// -//======================================================================== - static NSRect convertRectToBacking(NSRect contentRect) { #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 @@ -92,15 +63,12 @@ static NSRect convertRectToBacking(NSRect contentRect) { return contentRect; } -static InputModifierState translateFlags(NSUInteger flags) { - InputModifierState mod; - - mod.shift = (flags & NSShiftKeyMask); - mod.control = (flags & NSControlKeyMask); - mod.alt = (flags & NSAlternateKeyMask); - mod.meta = (flags & NSCommandKeyMask); +static void get_key_modifier_state(unsigned int p_osx_state, Ref<InputEventWithModifiers> state) { - return mod; + state->set_shift((p_osx_state & NSShiftKeyMask)); + state->set_control((p_osx_state & NSControlKeyMask)); + state->set_alt((p_osx_state & NSAlternateKeyMask)); + state->set_metakey((p_osx_state & NSCommandKeyMask)); } static int mouse_x = 0; @@ -249,14 +217,7 @@ static int button_mask = 0; + (void)initialize { if (self == [GodotContentView class]) { - /* - if (_glfw.ns.cursor == nil) { - NSImage* data = [[NSImage alloc] initWithSize:NSMakeSize(1, 1)]; - _glfw.ns.cursor = [[NSCursor alloc] initWithImage:data - hotSpot:NSZeroPoint]; - [data release]; - } -*/ + // nothing left to do here at the moment.. } } @@ -322,27 +283,19 @@ static int button_mask = 0; - (void)mouseDown:(NSEvent *)event { - //print_line("mouse down:"); button_mask |= BUTTON_MASK_LEFT; - InputEvent ev; - ev.type = InputEvent::MOUSE_BUTTON; - ev.mouse_button.button_index = BUTTON_LEFT; - ev.mouse_button.pressed = true; - ev.mouse_button.x = mouse_x; - ev.mouse_button.y = mouse_y; - ev.mouse_button.global_x = mouse_x; - ev.mouse_button.global_y = mouse_y; - ev.mouse_button.button_mask = button_mask; - ev.mouse_button.doubleclick = [event clickCount] == 2; - ev.mouse_button.mod = translateFlags([event modifierFlags]); - OS_OSX::singleton->push_input(ev); - /* - _glfwInputMouseClick(window, - GLFW_MOUSE_BUTTON_LEFT, - GLFW_PRESS, - translateFlags([event modifierFlags])); -*/ + Ref<InputEventMouseButton> mb; + mb.instance(); + + get_key_modifier_state([event modifierFlags], mb); + mb->set_button_index(BUTTON_LEFT); + mb->set_pressed(true); + mb->set_pos(Vector2(mouse_x, mouse_y)); + mb->set_global_pos(Vector2(mouse_x, mouse_y)); + mb->set_button_mask(button_mask); + mb->set_doubleclick([event clickCount] == 2); + OS_OSX::singleton->push_input(mb); } - (void)mouseDragged:(NSEvent *)event { @@ -352,81 +305,58 @@ static int button_mask = 0; - (void)mouseUp:(NSEvent *)event { button_mask &= ~BUTTON_MASK_LEFT; - InputEvent ev; - ev.type = InputEvent::MOUSE_BUTTON; - ev.mouse_button.button_index = BUTTON_LEFT; - ev.mouse_button.pressed = false; - ev.mouse_button.x = mouse_x; - ev.mouse_button.y = mouse_y; - ev.mouse_button.global_x = mouse_x; - ev.mouse_button.global_y = mouse_y; - ev.mouse_button.button_mask = button_mask; - ev.mouse_button.mod = translateFlags([event modifierFlags]); - OS_OSX::singleton->push_input(ev); + Ref<InputEventMouseButton> mb; + mb.instance(); - /* - _glfwInputMouseClick(window, - GLFW_MOUSE_BUTTON_LEFT, - GLFW_RELEASE, - translateFlags([event modifierFlags])); -*/ + get_key_modifier_state([event modifierFlags], mb); + mb->set_button_index(BUTTON_LEFT); + mb->set_pressed(false); + mb->set_pos(Vector2(mouse_x, mouse_y)); + mb->set_global_pos(Vector2(mouse_x, mouse_y)); + mb->set_button_mask(button_mask); + mb->set_doubleclick([event clickCount] == 2); + OS_OSX::singleton->push_input(mb); } - (void)mouseMoved:(NSEvent *)event { - InputEvent ev; - ev.type = InputEvent::MOUSE_MOTION; - ev.mouse_motion.button_mask = button_mask; + Ref<InputEventMouseMotion> mm; + mm.instance(); + + mm->set_button_mask(button_mask); prev_mouse_x = mouse_x; prev_mouse_y = mouse_y; const NSRect contentRect = [OS_OSX::singleton->window_view frame]; const NSPoint p = [event locationInWindow]; mouse_x = p.x * OS_OSX::singleton->_mouse_scale([[event window] backingScaleFactor]); mouse_y = (contentRect.size.height - p.y) * OS_OSX::singleton->_mouse_scale([[event window] backingScaleFactor]); - ev.mouse_motion.x = mouse_x; - ev.mouse_motion.y = mouse_y; - ev.mouse_motion.global_x = mouse_x; - ev.mouse_motion.global_y = mouse_y; - ev.mouse_motion.relative_x = [event deltaX] * OS_OSX::singleton->_mouse_scale([[event window] backingScaleFactor]); - ev.mouse_motion.relative_y = [event deltaY] * OS_OSX::singleton->_mouse_scale([[event window] backingScaleFactor]); - ev.mouse_motion.mod = translateFlags([event modifierFlags]); + mm->set_pos(Vector2(mouse_x, mouse_y)); + mm->set_global_pos(Vector2(mouse_x, mouse_y)); + Vector2 relativeMotion = Vector2(); + relativeMotion.x = [event deltaX] * OS_OSX::singleton->_mouse_scale([[event window] backingScaleFactor]); + relativeMotion.y = [event deltaY] * OS_OSX::singleton->_mouse_scale([[event window] backingScaleFactor]); + mm->set_relative(relativeMotion); + get_key_modifier_state([event modifierFlags], mm); OS_OSX::singleton->input->set_mouse_position(Point2(mouse_x, mouse_y)); - OS_OSX::singleton->push_input(ev); - - /* - if (window->cursorMode == GLFW_CURSOR_DISABLED) - _glfwInputCursorMotion(window, [event deltaX], [event deltaY]); - else { - const NSRect contentRect = [window->ns.view frame]; - const NSPoint p = [event locationInWindow]; - - _glfwInputCursorMotion(window, p.x, contentRect.size.height - p.y); - } -*/ + OS_OSX::singleton->push_input(mm); } - (void)rightMouseDown:(NSEvent *)event { button_mask |= BUTTON_MASK_RIGHT; - InputEvent ev; - ev.type = InputEvent::MOUSE_BUTTON; - ev.mouse_button.button_index = BUTTON_RIGHT; - ev.mouse_button.pressed = true; - ev.mouse_button.x = mouse_x; - ev.mouse_button.y = mouse_y; - ev.mouse_button.global_x = mouse_x; - ev.mouse_button.global_y = mouse_y; - ev.mouse_button.button_mask = button_mask; - ev.mouse_button.mod = translateFlags([event modifierFlags]); - OS_OSX::singleton->push_input(ev); - /* - _glfwInputMouseClick(window, - GLFW_MOUSE_BUTTON_RIGHT, - GLFW_PRESS, - translateFlags([event modifierFlags])); -*/ + Ref<InputEventMouseButton> mb; + mb.instance(); + + get_key_modifier_state([event modifierFlags], mb); + mb->set_button_index(BUTTON_RIGHT); + mb->set_pressed(true); + mb->set_pos(Vector2(mouse_x, mouse_y)); + mb->set_global_pos(Vector2(mouse_x, mouse_y)); + mb->set_button_mask(button_mask); + mb->set_doubleclick([event clickCount] == 2); + OS_OSX::singleton->push_input(mb); } - (void)rightMouseDragged:(NSEvent *)event { @@ -435,25 +365,19 @@ static int button_mask = 0; - (void)rightMouseUp:(NSEvent *)event { - button_mask &= ~BUTTON_MASK_RIGHT; - InputEvent ev; - ev.type = InputEvent::MOUSE_BUTTON; - ev.mouse_button.button_index = BUTTON_RIGHT; - ev.mouse_button.pressed = false; - ev.mouse_button.x = mouse_x; - ev.mouse_button.y = mouse_y; - ev.mouse_button.global_x = mouse_x; - ev.mouse_button.global_y = mouse_y; - ev.mouse_button.button_mask = button_mask; - ev.mouse_button.mod = translateFlags([event modifierFlags]); - OS_OSX::singleton->push_input(ev); + button_mask |= BUTTON_MASK_RIGHT; - /* - _glfwInputMouseClick(window, - GLFW_MOUSE_BUTTON_RIGHT, - GLFW_RELEASE, - translateFlags([event modifierFlags])); -*/ + Ref<InputEventMouseButton> mb; + mb.instance(); + + get_key_modifier_state([event modifierFlags], mb); + mb->set_button_index(BUTTON_RIGHT); + mb->set_pressed(false); + mb->set_pos(Vector2(mouse_x, mouse_y)); + mb->set_global_pos(Vector2(mouse_x, mouse_y)); + mb->set_button_mask(button_mask); + mb->set_doubleclick([event clickCount] == 2); + OS_OSX::singleton->push_input(mb); } - (void)otherMouseDown:(NSEvent *)event { @@ -462,24 +386,18 @@ static int button_mask = 0; return; button_mask |= BUTTON_MASK_MIDDLE; - InputEvent ev; - ev.type = InputEvent::MOUSE_BUTTON; - ev.mouse_button.button_index = BUTTON_MIDDLE; - ev.mouse_button.pressed = true; - ev.mouse_button.x = mouse_x; - ev.mouse_button.y = mouse_y; - ev.mouse_button.global_x = mouse_x; - ev.mouse_button.global_y = mouse_y; - ev.mouse_button.button_mask = button_mask; - ev.mouse_button.mod = translateFlags([event modifierFlags]); - OS_OSX::singleton->push_input(ev); - /* - _glfwInputMouseClick(window, - (int) [event buttonNumber], - GLFW_PRESS, - translateFlags([event modifierFlags])); -*/ + Ref<InputEventMouseButton> mb; + mb.instance(); + + get_key_modifier_state([event modifierFlags], mb); + mb->set_button_index(BUTTON_MIDDLE); + mb->set_pressed(true); + mb->set_pos(Vector2(mouse_x, mouse_y)); + mb->set_global_pos(Vector2(mouse_x, mouse_y)); + mb->set_button_mask(button_mask); + mb->set_doubleclick([event clickCount] == 2); + OS_OSX::singleton->push_input(mb); } - (void)otherMouseDragged:(NSEvent *)event { @@ -491,25 +409,19 @@ static int button_mask = 0; if ((int)[event buttonNumber] != 2) return; - button_mask &= ~BUTTON_MASK_MIDDLE; - InputEvent ev; - ev.type = InputEvent::MOUSE_BUTTON; - ev.mouse_button.button_index = BUTTON_MIDDLE; - ev.mouse_button.pressed = false; - ev.mouse_button.x = mouse_x; - ev.mouse_button.y = mouse_y; - ev.mouse_button.global_x = mouse_x; - ev.mouse_button.global_y = mouse_y; - ev.mouse_button.button_mask = button_mask; - ev.mouse_button.mod = translateFlags([event modifierFlags]); - OS_OSX::singleton->push_input(ev); + button_mask |= BUTTON_MASK_MIDDLE; - /* - _glfwInputMouseClick(window, - (int) [event buttonNumber], - GLFW_RELEASE, - translateFlags([event modifierFlags])); -*/ + Ref<InputEventMouseButton> mb; + mb.instance(); + + get_key_modifier_state([event modifierFlags], mb); + mb->set_button_index(BUTTON_MIDDLE); + mb->set_pressed(true); + mb->set_pos(Vector2(mouse_x, mouse_y)); + mb->set_global_pos(Vector2(mouse_x, mouse_y)); + mb->set_button_mask(button_mask); + mb->set_doubleclick([event clickCount] == 2); + OS_OSX::singleton->push_input(mb); } - (void)mouseExited:(NSEvent *)event { @@ -520,11 +432,9 @@ static int button_mask = 0; OS_OSX::singleton->main_loop->notification(MainLoop::NOTIFICATION_WM_MOUSE_EXIT); if (OS_OSX::singleton->input) OS_OSX::singleton->input->set_mouse_in_window(false); - //_glfwInputCursorEnter(window, GL_FALSE); } - (void)mouseEntered:(NSEvent *)event { - //_glfwInputCursorEnter(window, GL_TRUE); if (!OS_OSX::singleton) return; if (OS_OSX::singleton->main_loop && OS_OSX::singleton->mouse_mode != OS::MOUSE_MODE_CAPTURED) @@ -534,12 +444,7 @@ static int button_mask = 0; } - (void)viewDidChangeBackingProperties { - /* - const NSRect contentRect = [window->ns.view frame]; - const NSRect fbRect = convertRectToBacking(window, contentRect); - - _glfwInputFramebufferSize(window, fbRect.size.width, fbRect.size.height); -*/ + // nothing left to do here } - (void)updateTrackingAreas { @@ -706,102 +611,102 @@ static int translateKey(unsigned int key) { } - (void)keyDown:(NSEvent *)event { - InputEvent ev; - ev.type = InputEvent::KEY; - ev.key.pressed = true; - ev.key.mod = translateFlags([event modifierFlags]); - ev.key.scancode = latin_keyboard_keycode_convert(translateKey([event keyCode])); - ev.key.echo = [event isARepeat]; + + Ref<InputEventKey> k; + k.instance(); + + get_key_modifier_state([event modifierFlags], k); + k->set_pressed(true); + k->set_scancode(latin_keyboard_keycode_convert(translateKey([event keyCode]))); + k->set_echo([event isARepeat]); NSString *characters = [event characters]; NSUInteger i, length = [characters length]; - if (length > 0 && keycode_has_unicode(ev.key.scancode)) { + if (length > 0 && keycode_has_unicode(k->get_scancode())) { for (i = 0; i < length; i++) { - ev.key.unicode = [characters characterAtIndex:i]; - OS_OSX::singleton->push_input(ev); - ev.key.scancode = 0; + k->set_unicode([characters characterAtIndex:i]); + OS_OSX::singleton->push_input(k); + k->set_scancode(0); } } else { - OS_OSX::singleton->push_input(ev); + OS_OSX::singleton->push_input(k); } } - (void)flagsChanged:(NSEvent *)event { - InputEvent ev; + Ref<InputEventKey> k; + k.instance(); + int key = [event keyCode]; int mod = [event modifierFlags]; - ev.type = InputEvent::KEY; - if (key == 0x36 || key == 0x37) { if (mod & NSCommandKeyMask) { mod &= ~NSCommandKeyMask; - ev.key.pressed = true; + k->set_pressed(true); } else { - ev.key.pressed = false; + k->set_pressed(false); } } else if (key == 0x38 || key == 0x3c) { if (mod & NSShiftKeyMask) { mod &= ~NSShiftKeyMask; - ev.key.pressed = true; + k->set_pressed(true); } else { - ev.key.pressed = false; + k->set_pressed(false); } } else if (key == 0x3a || key == 0x3d) { if (mod & NSAlternateKeyMask) { mod &= ~NSAlternateKeyMask; - ev.key.pressed = true; + k->set_pressed(true); } else { - ev.key.pressed = false; + k->set_pressed(false); } } else if (key == 0x3b || key == 0x3e) { if (mod & NSControlKeyMask) { mod &= ~NSControlKeyMask; - ev.key.pressed = true; + k->set_pressed(true); } else { - ev.key.pressed = false; + k->set_pressed(false); } } else { return; } - ev.key.mod = translateFlags(mod); - ev.key.scancode = latin_keyboard_keycode_convert(translateKey(key)); + get_key_modifier_state(mod, k); + k->set_scancode(latin_keyboard_keycode_convert(translateKey(key))); - OS_OSX::singleton->push_input(ev); + OS_OSX::singleton->push_input(k); } - (void)keyUp:(NSEvent *)event { - InputEvent ev; - ev.type = InputEvent::KEY; - ev.key.pressed = false; - ev.key.mod = translateFlags([event modifierFlags]); - ev.key.scancode = latin_keyboard_keycode_convert(translateKey([event keyCode])); - OS_OSX::singleton->push_input(ev); + Ref<InputEventKey> k; + k.instance(); - /* - const int key = translateKey([event keyCode]); - const int mods = translateFlags([event modifierFlags]); - _glfwInputKey(window, key, [event keyCode], GLFW_RELEASE, mods); -*/ + get_key_modifier_state([event modifierFlags], k); + k->set_pressed(false); + k->set_scancode(latin_keyboard_keycode_convert(translateKey([event keyCode]))); + + OS_OSX::singleton->push_input(k); } -inline void sendScrollEvent(int button, double factor) { - InputEvent ev; - ev.type = InputEvent::MOUSE_BUTTON; - ev.mouse_button.button_index = button; - ev.mouse_button.factor = factor; - ev.mouse_button.pressed = true; - ev.mouse_button.x = mouse_x; - ev.mouse_button.y = mouse_y; - ev.mouse_button.global_x = mouse_x; - ev.mouse_button.global_y = mouse_y; - ev.mouse_button.button_mask = button_mask; - OS_OSX::singleton->push_input(ev); - ev.mouse_button.pressed = false; - OS_OSX::singleton->push_input(ev); +inline void sendScrollEvent(int button, double factor, int modifierFlags) { + + Ref<InputEventMouseButton> sc; + sc.instance(); + + get_key_modifier_state(modifierFlags, sc); + sc->set_button_index(button); + sc->set_factor(factor); + sc->set_pressed(true); + Vector2 mouse_pos = Vector2(mouse_x, mouse_y); + sc->set_pos(mouse_pos); + sc->set_global_pos(mouse_pos); + sc->set_button_mask(button_mask); + OS_OSX::singleton->push_input(sc); + sc->set_pressed(false); + OS_OSX::singleton->push_input(sc); } - (void)scrollWheel:(NSEvent *)event { @@ -822,12 +727,11 @@ inline void sendScrollEvent(int button, double factor) { deltaX = [event deltaX]; deltaY = [event deltaY]; } - if (fabs(deltaX)) { - sendScrollEvent(0 > deltaX ? BUTTON_WHEEL_RIGHT : BUTTON_WHEEL_LEFT, fabs(deltaX * 0.3)); + sendScrollEvent(0 > deltaX ? BUTTON_WHEEL_RIGHT : BUTTON_WHEEL_LEFT, fabs(deltaX * 0.3), [event modifierFlags]); } if (fabs(deltaY)) { - sendScrollEvent(0 < deltaY ? BUTTON_WHEEL_UP : BUTTON_WHEEL_DOWN, fabs(deltaY * 0.3)); + sendScrollEvent(0 < deltaY ? BUTTON_WHEEL_UP : BUTTON_WHEEL_DOWN, fabs(deltaY * 0.3), [event modifierFlags]); } } @@ -1617,9 +1521,9 @@ void OS_OSX::process_events() { autoreleasePool = [[NSAutoreleasePool alloc] init]; } -void OS_OSX::push_input(const InputEvent &p_event) { +void OS_OSX::push_input(const Ref<InputEvent> &p_event) { - InputEvent ev = p_event; + Ref<InputEvent> ev = p_event; input->parse_input_event(ev); } |