diff --git a/shell/apple/emulator-osx/emulator-osx/EmuGLView.swift b/shell/apple/emulator-osx/emulator-osx/EmuGLView.swift index 3fe555907..cb21470c9 100644 --- a/shell/apple/emulator-osx/emulator-osx/EmuGLView.swift +++ b/shell/apple/emulator-osx/emulator-osx/EmuGLView.swift @@ -76,10 +76,48 @@ class EmuGLView: NSOpenGLView, NSWindowDelegate { override func keyUp(with e: NSEvent) { emu_key_input(e.keyCode, 0); } - + + private func setMousePos(_ event: NSEvent) + { + let point = convert(event.locationInWindow, from: self) + let size = frame.size + let scale = 480.0 / size.height + mo_x_abs = Int32((point.x - (size.width - 640.0 / scale) / 2.0) * scale) + mo_y_abs = Int32((size.height - point.y) * scale) + } + override func mouseDown(with event: NSEvent) { + mo_buttons &= ~(1 << 2) + setMousePos(event) + } + override func mouseUp(with event: NSEvent) { + mo_buttons |= 1 << 2; + setMousePos(event) + } + override func rightMouseDown(with event: NSEvent) { + mo_buttons &= ~(1 << 1) + setMousePos(event) + } + override func rightMouseUp(with event: NSEvent) { + mo_buttons |= 1 << 1 + setMousePos(event) + } + // Not dispatched by default. Need to set Window.acceptsMouseMovedEvents to true + override func mouseMoved(with event: NSEvent) { + setMousePos(event) + } + override func mouseDragged(with event: NSEvent) { + mo_buttons &= ~(1 << 2) + setMousePos(event) + } + override func rightMouseDragged(with event: NSEvent) { + mo_buttons &= ~(1 << 1) + setMousePos(event) + } + override func viewDidMoveToWindow() { super.viewDidMoveToWindow() self.window!.delegate = self + self.window!.acceptsMouseMovedEvents = true } func windowWillClose(_ notification: Notification) { diff --git a/shell/apple/emulator-osx/emulator-osx/emulator-osx-Bridging-Header.h b/shell/apple/emulator-osx/emulator-osx/emulator-osx-Bridging-Header.h index 8a0d31675..11db2ebe3 100644 --- a/shell/apple/emulator-osx/emulator-osx/emulator-osx-Bridging-Header.h +++ b/shell/apple/emulator-osx/emulator-osx/emulator-osx-Bridging-Header.h @@ -16,4 +16,7 @@ int emu_single_frame(int w, int h); void emu_gles_init(); void emu_key_input(UInt16 keyCode, int state); bool emu_frame_pending(); +extern unsigned int mo_buttons; +extern int mo_x_abs; +extern int mo_y_abs; #endif