diff --git a/core/input/gamepad_device.h b/core/input/gamepad_device.h index 2799b7abf..4cf560f68 100644 --- a/core/input/gamepad_device.h +++ b/core/input/gamepad_device.h @@ -93,14 +93,22 @@ public: } static void Register(const std::shared_ptr& gamepad); - static void Unregister(const std::shared_ptr& gamepad); - static int GetGamepadCount(); static std::shared_ptr GetGamepad(int index); static void SaveMaplePorts(); static void RampAnalog(); + template + static std::shared_ptr GetGamepad() + { + Lock _(_gamepads_mutex); + for (const auto& gamepad : _gamepads) + if (dynamic_cast(gamepad.get()) != nullptr) + return std::dynamic_pointer_cast(gamepad); + return {}; + } + static void load_system_mappings(); bool find_mapping(int system = settings.platform.system); virtual void resetMappingToDefault(bool arcade, bool gamepad) { diff --git a/core/input/mouse.h b/core/input/mouse.h index d17f8dcf1..f5f238815 100644 --- a/core/input/mouse.h +++ b/core/input/mouse.h @@ -104,3 +104,15 @@ public: void setButton(Button button, bool pressed); void setWheel(int delta); }; + +class TouchMouse : public SystemMouse +{ +public: + TouchMouse() : SystemMouse("Flycast", -1) + { + _name = "Touch Mouse"; + _unique_id = "touch_mouse"; + loadMapping(); + } +}; + diff --git a/core/ui/vgamepad.cpp b/core/ui/vgamepad.cpp index 2e239e45b..adf0f5ea4 100644 --- a/core/ui/vgamepad.cpp +++ b/core/ui/vgamepad.cpp @@ -30,6 +30,7 @@ #include "oslib/resources.h" #include "cfg/cfg.h" #include "input/gamepad.h" +#include "input/mouse.h" #include "hw/naomi/naomi_cart.h" #include "hw/naomi/card_reader.h" #include "hw/maple/maple_devs.h" @@ -710,6 +711,7 @@ void startGame() enableAllControls(); serviceMode = false; setButtonMap(); + bool enableTouchMouse = false; if (settings.platform.isConsole()) { disableControl(Btn4); @@ -719,7 +721,7 @@ void startGame() switch (config::MapleMainDevices[0]) { case MDT_LightGun: - // TODO enable mouse? + enableTouchMouse = true; disableControl(AnalogArea); disableControl(LeftTrigger); disableControl(RightTrigger); @@ -878,12 +880,14 @@ void startGame() if ((usedButtons & NAOMI_START_KEY) == 0) disableControl(Start); } + if (settings.input.lightgunGame) + enableTouchMouse = true; } else { if (settings.input.lightgunGame) { - // TODO enable mouse? + enableTouchMouse = true; disableControl(A); disableControl(X); disableControl(Y); @@ -906,6 +910,18 @@ void startGame() } } } + std::shared_ptr touchMouse = GamepadDevice::GetGamepad(); + if (touchMouse != nullptr) + { + if (enableTouchMouse) { + if (touchMouse->maple_port() == -1) + touchMouse->set_maple_port(0); + } + else { + if (touchMouse->maple_port() == 0) + touchMouse->set_maple_port(-1); + } + } } void resetEditing() { diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java index 6af259689..873a4334b 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java @@ -269,7 +269,7 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. private boolean processJoystickInput(MotionEvent event, int axis) { float v = event.getAxisValue(axis); - return InputDeviceManager.getInstance().joystickAxisEvent(event.getDeviceId(), axis, (int)Math.round(v * 32767.f)); + return InputDeviceManager.getInstance().axisEvent(event.getDeviceId(), axis, (int)Math.round(v * 32767.f)); } @Override public boolean onGenericMotionEvent(MotionEvent event) { @@ -283,29 +283,29 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. if (range.getAxis() == MotionEvent.AXIS_HAT_X) { float v = event.getAxisValue(MotionEvent.AXIS_HAT_X); if (v == -1.0) { - rc |= InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, true); - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, false); + rc |= InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, true); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, false); } else if (v == 1.0) { - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, false); - rc |= InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, true); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, false); + rc |= InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, true); } else { - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, false); - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, false); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, false); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, false); } } else if (range.getAxis() == MotionEvent.AXIS_HAT_Y) { float v = event.getAxisValue(MotionEvent.AXIS_HAT_Y); if (v == -1.0) { - rc |= InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, true); - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, false); + rc |= InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, true); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, false); } else if (v == 1.0) { - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, false); - rc |= InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, true); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, false); + rc |= InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, true); } else { - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, false); - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, false); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, false); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, false); } } else @@ -329,7 +329,7 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. @Override public boolean onKeyUp(int keyCode, KeyEvent event) { - if (InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), keyCode, false)) + if (InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), keyCode, false)) return true; if (hasKeyboard && InputDeviceManager.getInstance().keyboardEvent(keyCode, false)) return true; @@ -348,7 +348,7 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. } return true; } - if (InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), keyCode, true)) + if (InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), keyCode, true)) return true; if (hasKeyboard) { diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VirtualJoystickDelegate.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VirtualJoystickDelegate.java index a0276225f..3ecae4bee 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VirtualJoystickDelegate.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VirtualJoystickDelegate.java @@ -74,7 +74,7 @@ public class VirtualJoystickDelegate implements TouchEventHandler case MotionEvent.ACTION_CANCEL: mousePid = -1; mouseButtons = 0; - InputDeviceManager.getInstance().mouseEvent(mousePos[0], mousePos[1], mouseButtons); + InputDeviceManager.getInstance().touchMouseEvent(mousePos[0], mousePos[1], mouseButtons); return true; case MotionEvent.ACTION_POINTER_DOWN: @@ -85,7 +85,7 @@ public class VirtualJoystickDelegate implements TouchEventHandler mousePos[0] = Math.round(event.getX(actionIndex)); mousePos[1] = Math.round(event.getY(actionIndex)); mouseButtons = MotionEvent.BUTTON_PRIMARY; // Mouse left button down - InputDeviceManager.getInstance().mouseEvent(mousePos[0], mousePos[1], mouseButtons); + InputDeviceManager.getInstance().touchMouseEvent(mousePos[0], mousePos[1], mouseButtons); return true; } return false; @@ -96,7 +96,7 @@ public class VirtualJoystickDelegate implements TouchEventHandler if (event.getPointerId(i) == mousePid) { mousePos[0] = Math.round(event.getX(i)); mousePos[1] = Math.round(event.getY(i)); - InputDeviceManager.getInstance().mouseEvent(mousePos[0], mousePos[1], mouseButtons); + InputDeviceManager.getInstance().touchMouseEvent(mousePos[0], mousePos[1], mouseButtons); break; } } @@ -108,7 +108,7 @@ public class VirtualJoystickDelegate implements TouchEventHandler mousePos[0] = Math.round(event.getX(actionIndex)); mousePos[1] = Math.round(event.getY(actionIndex)); mouseButtons = 0; - InputDeviceManager.getInstance().mouseEvent(mousePos[0], mousePos[1], mouseButtons); + InputDeviceManager.getInstance().touchMouseEvent(mousePos[0], mousePos[1], mouseButtons); return true; } break; @@ -168,7 +168,7 @@ public class VirtualJoystickDelegate implements TouchEventHandler // Release the mouse too mousePid = -1; mouseButtons = 0; - InputDeviceManager.getInstance().mouseEvent(mousePos[0], mousePos[1], mouseButtons); + InputDeviceManager.getInstance().touchMouseEvent(mousePos[0], mousePos[1], mouseButtons); // Then fall through case MotionEvent.ACTION_POINTER_DOWN: { diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java index 09947d944..25850fc2a 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java @@ -11,8 +11,10 @@ import com.flycast.emulator.Emulator; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.commons.lang3.ArrayUtils; @@ -32,6 +34,7 @@ public final class InputDeviceManager implements InputManager.InputDeviceListene long stopTime; } private Map vibParams = new HashMap<>(); + private Set knownDevices = new HashSet<>(); public InputDeviceManager() { @@ -45,9 +48,6 @@ public final class InputDeviceManager implements InputManager.InputDeviceListene if (hasTouchscreen) joystickAdded(VIRTUAL_GAMEPAD_ID, null, 0, null, null, null, getVibrator(VIRTUAL_GAMEPAD_ID) != null); - int[] ids = InputDevice.getDeviceIds(); - for (int id : ids) - onInputDeviceAdded(id); inputManager = (InputManager)applicationContext.getSystemService(Context.INPUT_SERVICE); inputManager.registerInputDeviceListener(this, null); } @@ -63,25 +63,6 @@ public final class InputDeviceManager implements InputManager.InputDeviceListene @Override public void onInputDeviceAdded(int i) { - InputDevice device = InputDevice.getDevice(i); - if (device != null && (device.getSources() & InputDevice.SOURCE_CLASS_BUTTON) == InputDevice.SOURCE_CLASS_BUTTON) { - int port = 0; - if ((device.getSources() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK) { - port = this.maple_port == 3 ? 3 : this.maple_port++; - } - List axes = device.getMotionRanges(); - List fullAxes = new ArrayList<>(); - List halfAxes = new ArrayList<>(); - for (InputDevice.MotionRange range : axes) { - if (range.getMin() == 0) - halfAxes.add(range.getAxis()); - else - fullAxes.add(range.getAxis()); - } - joystickAdded(i, device.getName(), port, device.getDescriptor(), - ArrayUtils.toPrimitive(fullAxes.toArray(new Integer[0])), ArrayUtils.toPrimitive(halfAxes.toArray(new Integer[0])), - getVibrator(i) != null); - } } @Override @@ -89,6 +70,7 @@ public final class InputDeviceManager implements InputManager.InputDeviceListene if (maple_port > 0) maple_port--; joystickRemoved(i); + knownDevices.remove(i); } @Override @@ -209,6 +191,47 @@ public final class InputDeviceManager implements InputManager.InputDeviceListene return hasTouchscreen; } + private boolean createDevice(int id) + { + if (id == 0) + return false; + if (knownDevices.contains(id)) + return true; + InputDevice device = InputDevice.getDevice(id); + if (device == null || (device.getSources() & InputDevice.SOURCE_CLASS_BUTTON) != InputDevice.SOURCE_CLASS_BUTTON) + return false; + int port = 0; + if ((device.getSources() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK) { + port = this.maple_port == 3 ? 3 : this.maple_port++; + } + List axes = device.getMotionRanges(); + List fullAxes = new ArrayList<>(); + List halfAxes = new ArrayList<>(); + for (InputDevice.MotionRange range : axes) { + if (range.getMin() == 0) + halfAxes.add(range.getAxis()); + else + fullAxes.add(range.getAxis()); + } + joystickAdded(id, device.getName(), port, device.getDescriptor(), + ArrayUtils.toPrimitive(fullAxes.toArray(new Integer[0])), ArrayUtils.toPrimitive(halfAxes.toArray(new Integer[0])), + getVibrator(id) != null); + knownDevices.add(id); + return true; + } + public boolean buttonEvent(int id, int button, boolean pressed) + { + if (!createDevice(id)) + return false; + return joystickButtonEvent(id, button, pressed); + } + public boolean axisEvent(int id, int button, int value) + { + if (!createDevice(id)) + return false; + return joystickAxisEvent(id, button, value); + } + public static InputDeviceManager getInstance() { return INSTANCE; } @@ -217,10 +240,11 @@ public final class InputDeviceManager implements InputManager.InputDeviceListene public native void virtualReleaseAll(); public native void virtualJoystick(float x, float y); public native void virtualButtonInput(int key, boolean pressed); - public native boolean joystickButtonEvent(int id, int button, boolean pressed); - public native boolean joystickAxisEvent(int id, int button, int value); + private native boolean joystickButtonEvent(int id, int button, boolean pressed); + private native boolean joystickAxisEvent(int id, int button, int value); public native void mouseEvent(int xpos, int ypos, int buttons); public native void mouseScrollEvent(int scrollValue); + public native void touchMouseEvent(int xpos, int ypos, int buttons); private native void joystickAdded(int id, String name, int maple_port, String uniqueId, int[] fullAxes, int[] halfAxes, boolean rumbleEnabled); private native void joystickRemoved(int id); public native boolean keyboardEvent(int key, boolean pressed); diff --git a/shell/android-studio/flycast/src/main/jni/src/Android.cpp b/shell/android-studio/flycast/src/main/jni/src/Android.cpp index 955803ded..e4a250907 100644 --- a/shell/android-studio/flycast/src/main/jni/src/Android.cpp +++ b/shell/android-studio/flycast/src/main/jni/src/Android.cpp @@ -17,6 +17,7 @@ #endif #include "jni_util.h" #include "android_storage.h" +#include "http_client.h" #include #include @@ -35,8 +36,6 @@ namespace jni thread_local JVMAttacher jvm_attacher; } -#include "http_client.h" - extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_screenCharacteristics(JNIEnv *env, jobject obj, jfloat screenDpi, jfloat refreshRate) { settings.display.dpi = screenDpi; diff --git a/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h b/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h index 79d1cf985..9b9fd4801 100644 --- a/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h +++ b/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h @@ -411,7 +411,7 @@ public: class AndroidVirtualGamepad : public VirtualGamepad { public: - AndroidVirtualGamepad(bool rumbleEnabled) : VirtualGamepad("Android") { + AndroidVirtualGamepad(bool rumbleEnabled) : VirtualGamepad("Flycast") { this->rumbleEnabled = rumbleEnabled; } diff --git a/shell/android-studio/flycast/src/main/jni/src/android_input.cpp b/shell/android-studio/flycast/src/main/jni/src/android_input.cpp index 074663ca2..9814a84f0 100644 --- a/shell/android-studio/flycast/src/main/jni/src/android_input.cpp +++ b/shell/android-studio/flycast/src/main/jni/src/android_input.cpp @@ -23,6 +23,7 @@ #include "hw/maple/maple_if.h" std::shared_ptr mouse; +std::shared_ptr touchMouse; std::shared_ptr keyboard; std::shared_ptr virtualGamepad; @@ -96,11 +97,6 @@ extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceMa { input_device_manager = env->NewGlobalRef(obj); input_device_manager_rumble = env->GetMethodID(env->GetObjectClass(obj), "rumble", "(IFFI)Z"); - // FIXME Don't connect it by default or any screen touch will register as button A press - mouse = std::make_shared(-1); - GamepadDevice::Register(mouse); - keyboard = std::make_shared(); - GamepadDevice::Register(keyboard); gui_setOnScreenKeyboardCallback([](bool show) { if (g_activity != nullptr) jni::env()->CallVoidMethod(g_activity, showScreenKeyboardMid, show); @@ -110,9 +106,14 @@ extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceMa extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickAdded(JNIEnv *env, jobject obj, jint id, jstring name, jint maple_port, jstring junique_id, jintArray fullAxes, jintArray halfAxes, jboolean hasRumble) { - if (id == AndroidVirtualGamepad::GAMEPAD_ID) { + if (id == 0) + return; + if (id == AndroidVirtualGamepad::GAMEPAD_ID) + { virtualGamepad = std::make_shared(hasRumble); GamepadDevice::Register(virtualGamepad); + touchMouse = std::make_shared(); + GamepadDevice::Register(touchMouse); } else { @@ -130,9 +131,12 @@ extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceMa extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickRemoved(JNIEnv *env, jobject obj, jint id) { - if (id == AndroidVirtualGamepad::GAMEPAD_ID) { + if (id == AndroidVirtualGamepad::GAMEPAD_ID) + { GamepadDevice::Unregister(virtualGamepad); virtualGamepad.reset(); + GamepadDevice::Unregister(touchMouse); + touchMouse.reset(); } else { std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); @@ -169,7 +173,12 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDevi } extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_keyboardEvent(JNIEnv *env, jobject obj, - jint key, jboolean pressed) { + jint key, jboolean pressed) +{ + if (keyboard == nullptr) { + keyboard = std::make_shared(); + GamepadDevice::Register(keyboard); + } keyboard->input(key, pressed); return true; } @@ -191,9 +200,18 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDevi return false; } +static void createMouse() +{ + if (mouse == nullptr) { + mouse = std::make_shared(touchMouse == nullptr ? 0 : 1); + GamepadDevice::Register(mouse); + } +} + extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_mouseEvent(JNIEnv *env, jobject obj, jint xpos, jint ypos, jint buttons) { + createMouse(); mouse->setAbsPos(xpos, ypos, settings.display.width, settings.display.height); mouse->setButton(Mouse::LEFT_BUTTON, (buttons & 1) != 0); mouse->setButton(Mouse::RIGHT_BUTTON, (buttons & 2) != 0); @@ -201,6 +219,17 @@ extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceMa } extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_mouseScrollEvent(JNIEnv *env, jobject obj, - jint scrollValue) { + jint scrollValue) +{ + createMouse(); mouse->setWheel(scrollValue); } + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_touchMouseEvent(JNIEnv *env, jobject obj, + jint xpos, jint ypos, jint buttons) +{ + touchMouse->setAbsPos(xpos, ypos, settings.display.width, settings.display.height); + touchMouse->setButton(Mouse::LEFT_BUTTON, (buttons & 1) != 0); + touchMouse->setButton(Mouse::RIGHT_BUTTON, (buttons & 2) != 0); + touchMouse->setButton(Mouse::MIDDLE_BUTTON, (buttons & 4) != 0); +} diff --git a/shell/apple/emulator-ios/emulator/EmulatorView.mm b/shell/apple/emulator-ios/emulator/EmulatorView.mm index d77e2eba0..42a34aff0 100644 --- a/shell/apple/emulator-ios/emulator/EmulatorView.mm +++ b/shell/apple/emulator-ios/emulator/EmulatorView.mm @@ -24,13 +24,13 @@ #include "ios_gamepad.h" @implementation EmulatorView { - std::shared_ptr mouse; + std::shared_ptr mouse; } - (void)didMoveToSuperview { [super didMoveToSuperview]; - mouse = std::make_shared(); + mouse = std::make_shared(); GamepadDevice::Register(mouse); } @@ -45,8 +45,7 @@ { UITouch *touch = [touches anyObject]; [self touchLocation:touch]; - if (gui_is_open()) - mouse->setButton(Mouse::LEFT_BUTTON, true); + mouse->setButton(Mouse::LEFT_BUTTON, true); [super touchesBegan:touches withEvent:event]; } @@ -54,8 +53,7 @@ { UITouch *touch = [touches anyObject]; [self touchLocation:touch]; - if (gui_is_open()) - mouse->setButton(Mouse::LEFT_BUTTON, false); + mouse->setButton(Mouse::LEFT_BUTTON, false); [super touchesEnded:touches withEvent:event]; } diff --git a/shell/apple/emulator-ios/emulator/PadViewController.mm b/shell/apple/emulator-ios/emulator/PadViewController.mm index 97dedb34f..fb649db40 100644 --- a/shell/apple/emulator-ios/emulator/PadViewController.mm +++ b/shell/apple/emulator-ios/emulator/PadViewController.mm @@ -106,6 +106,7 @@ static CGPoint translateCoords(const CGPoint& pos, const CGSize& size) - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; { + bool forwardEvent = true; [self startHideTimer]; for (UITouch *touch in touches) { @@ -117,6 +118,7 @@ static CGPoint translateCoords(const CGPoint& pos, const CGSize& size) [self resetAnalog]; joyTouch = touch; joyBias = point; + forwardEvent = false; continue; } NSValue *key = [NSValue valueWithPointer:(const void *)touch]; @@ -126,17 +128,21 @@ static CGPoint translateCoords(const CGPoint& pos, const CGSize& size) touchToButton[key] = [NSNumber numberWithInt:control]; // button down virtualGamepad->buttonInput(control, true); + forwardEvent = false; } } - [super touchesBegan:touches withEvent:event]; + if (forwardEvent) + [super touchesBegan:touches withEvent:event]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; { + bool forwardEvent = true; for (UITouch *touch in touches) { if (touch == joyTouch) { [self resetAnalog]; + forwardEvent = false; continue; } NSValue *key = [NSValue valueWithPointer:(const void *)touch]; @@ -145,13 +151,16 @@ static CGPoint translateCoords(const CGPoint& pos, const CGSize& size) [touchToButton removeObjectForKey:key]; // button up virtualGamepad->buttonInput(static_cast(control.intValue), false); + forwardEvent = false; } } - [super touchesEnded:touches withEvent:event]; + if (forwardEvent) + [super touchesEnded:touches withEvent:event]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; { + bool forwardEvent = true; [self startHideTimer]; for (UITouch *touch in touches) { @@ -165,6 +174,7 @@ static CGPoint translateCoords(const CGPoint& pos, const CGSize& size) point.x = std::max(std::min(1.0, point.x / sz), -1.0); point.y = std::max(std::min(1.0, point.y / sz), -1.0); virtualGamepad->joystickInput(point.x, point.y); + forwardEvent = false; continue; } vgamepad::ControlId control = vgamepad::hitTest(point.x, point.y); @@ -179,15 +189,19 @@ static CGPoint translateCoords(const CGPoint& pos, const CGSize& size) // button down virtualGamepad->buttonInput(control, true); touchToButton[key] = [NSNumber numberWithInt:control]; + forwardEvent = false; } - [super touchesMoved:touches withEvent:event]; + if (forwardEvent) + [super touchesMoved:touches withEvent:event]; } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; { + bool forwardEvent = true; for (UITouch *touch in touches) { if (touch == joyTouch) { [self resetAnalog]; + forwardEvent = false; continue; } NSValue *key = [NSValue valueWithPointer:(const void *)touch]; @@ -196,8 +210,10 @@ static CGPoint translateCoords(const CGPoint& pos, const CGSize& size) [touchToButton removeObjectForKey:key]; // button up virtualGamepad->buttonInput(static_cast(control.intValue), false); + forwardEvent = false; } } - [super touchesCancelled:touches withEvent:event]; + if (forwardEvent) + [super touchesCancelled:touches withEvent:event]; } @end diff --git a/shell/apple/emulator-ios/emulator/ios_gamepad.h b/shell/apple/emulator-ios/emulator/ios_gamepad.h index e3aa0683a..420132e5b 100644 --- a/shell/apple/emulator-ios/emulator/ios_gamepad.h +++ b/shell/apple/emulator-ios/emulator/ios_gamepad.h @@ -506,14 +506,3 @@ public: return false; } }; - -class IOSTouchMouse : public SystemMouse -{ -public: - IOSTouchMouse() : SystemMouse("iOS") - { - _unique_id = "ios_mouse"; - _name = "Touchscreen (Mouse)"; - loadMapping(); - } -};