From 19c129faba081fcd420a21810f3fc0beaaaee8ed Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 9 Nov 2021 20:32:16 -0800
Subject: [PATCH] Added documentation that the
UIApplicationSupportsIndirectInputEvents key must be set to true in your
application's Info.plist in order to get real Bluetooth mouse events.
---
WhatsNew.txt | 4 +++
Xcode-iOS/Demos/Info.plist | 2 ++
docs/README-ios.md | 6 ++++
src/video/uikit/SDL_uikitevents.m | 48 ++++++++++++++++++-------------
4 files changed, 40 insertions(+), 20 deletions(-)
diff --git a/WhatsNew.txt b/WhatsNew.txt
index 08d82c00a8..7292712d8d 100644
--- a/WhatsNew.txt
+++ b/WhatsNew.txt
@@ -8,6 +8,10 @@ This is a list of major changes in SDL's version history.
Android:
* Added support for audio output and capture using AAudio
+iOS:
+* Added documentation that the UIApplicationSupportsIndirectInputEvents key must be set to true in your application's Info.plist in order to get real Bluetooth mouse events.
+
+
---------------------------------------------------------------------------
2.0.16:
---------------------------------------------------------------------------
diff --git a/Xcode-iOS/Demos/Info.plist b/Xcode-iOS/Demos/Info.plist
index 7714fe8af0..aa7b5f6e0f 100644
--- a/Xcode-iOS/Demos/Info.plist
+++ b/Xcode-iOS/Demos/Info.plist
@@ -30,5 +30,7 @@
<string>iOS Launch Screen</string>
<key>UISupportedInterfaceOrientations</key>
<array/>
+ <key>UIApplicationSupportsIndirectInputEvents</key>
+ <true/>
</dict>
</plist>
diff --git a/docs/README-ios.md b/docs/README-ios.md
index acb8baefe5..ee039de2f8 100644
--- a/docs/README-ios.md
+++ b/docs/README-ios.md
@@ -191,6 +191,12 @@ SDL_bool SDL_IsTextInputActive()
-- returns whether or not text events are enabled (and the onscreen keyboard is visible)
+Notes -- Mouse
+==============================================================================
+
+iOS now supports Bluetooth mice on iPad, but by default will provide the mouse input as touch. In order for SDL to see the real mouse events, you should set the key UIApplicationSupportsIndirectInputEvents to true in your Info.plist
+
+
Notes -- Reading and Writing files
==============================================================================
diff --git a/src/video/uikit/SDL_uikitevents.m b/src/video/uikit/SDL_uikitevents.m
index 6d78685d22..82fde8889e 100644
--- a/src/video/uikit/SDL_uikitevents.m
+++ b/src/video/uikit/SDL_uikitevents.m
@@ -268,29 +268,37 @@ void SDL_InitGCMouse(void)
@autoreleasepool {
/* There is a bug where mouse accumulates duplicate deltas over time in iOS 14.0 */
if (@available(iOS 14.1, tvOS 14.1, *)) {
- NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
-
- mouse_connect_observer = [center addObserverForName:GCMouseDidConnectNotification
- object:nil
- queue:nil
- usingBlock:^(NSNotification *note) {
- GCMouse *mouse = note.object;
- OnGCMouseConnected(mouse);
- }];
+ /* iOS will not send the new pointer touch events if you don't have this key,
+ * and we need them to differentiate between mouse events and real touch events.
+ */
+ BOOL indirect_input_available = [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"UIApplicationSupportsIndirectInputEvents"] boolValue];
+ if (indirect_input_available) {
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
+
+ mouse_connect_observer = [center addObserverForName:GCMouseDidConnectNotification
+ object:nil
+ queue:nil
+ usingBlock:^(NSNotification *note) {
+ GCMouse *mouse = note.object;
+ OnGCMouseConnected(mouse);
+ }];
+
+ mouse_disconnect_observer = [center addObserverForName:GCMouseDidDisconnectNotification
+ object:nil
+ queue:nil
+ usingBlock:^(NSNotification *note) {
+ GCMouse *mouse = note.object;
+ OnGCMouseDisconnected(mouse);
+ }];
- mouse_disconnect_observer = [center addObserverForName:GCMouseDidDisconnectNotification
- object:nil
- queue:nil
- usingBlock:^(NSNotification *note) {
- GCMouse *mouse = note.object;
- OnGCMouseDisconnected(mouse);
- }];
+ for (GCMouse *mouse in [GCMouse mice]) {
+ OnGCMouseConnected(mouse);
+ }
- for (GCMouse *mouse in [GCMouse mice]) {
- OnGCMouseConnected(mouse);
+ SDL_GetMouse()->SetRelativeMouseMode = SetGCMouseRelativeMode;
+ } else {
+ NSLog(@"You need UIApplicationSupportsIndirectInputEvents in your Info.plist for mouse support");
}
-
- SDL_GetMouse()->SetRelativeMouseMode = SetGCMouseRelativeMode;
}
}
}