21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_UIKIT
25 #include "../../events/SDL_events_c.h"
31 #import <Foundation/Foundation.h>
33 #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 140000) || (__APPLETV_OS_VERSION_MAX_ALLOWED >= 140000) || (__MAC_OS_VERSION_MAX_ALLOWED > 1500000)
34 #import <GameController/GameController.h>
36 #define ENABLE_GCKEYBOARD
37 #define ENABLE_GCMOUSE
40 static BOOL UIKit_EventPumpEnabled = YES;
45 UIKit_EventPumpEnabled =
enabled;
51 if (!UIKit_EventPumpEnabled) {
61 const CFTimeInterval seconds = 0.000002;
66 result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, seconds,
TRUE);
67 }
while (
result == kCFRunLoopRunHandledSource);
71 result = CFRunLoopRunInMode((CFStringRef)UITrackingRunLoopMode, seconds,
TRUE);
72 }
while(
result == kCFRunLoopRunHandledSource);
75 #if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
76 UIKit_GL_RestoreCurrentContext();
80 #ifdef ENABLE_GCKEYBOARD
83 static id keyboard_connect_observer = nil;
84 static id keyboard_disconnect_observer = nil;
86 static void OnGCKeyboardConnected(GCKeyboard *keyboard) API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0))
89 keyboard.keyboardInput.keyChangedHandler = ^(GCKeyboardInput *keyboard, GCControllerButtonInput *
key, GCKeyCode keyCode, BOOL pressed)
94 dispatch_queue_t queue = dispatch_queue_create(
"org.libsdl.input.keyboard", DISPATCH_QUEUE_SERIAL );
95 dispatch_set_target_queue( queue, dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0 ) );
96 keyboard.handlerQueue = queue;
99 static void OnGCKeyboardDisconnected(GCKeyboard *keyboard) API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0))
101 keyboard.keyboardInput.keyChangedHandler = nil;
108 if (@available(iOS 14.0, tvOS 14.0, *)) {
109 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
111 keyboard_connect_observer = [center addObserverForName:GCKeyboardDidConnectNotification
114 usingBlock:^(NSNotification *note) {
115 GCKeyboard *keyboard = note.object;
116 OnGCKeyboardConnected(keyboard);
119 keyboard_disconnect_observer = [center addObserverForName:GCKeyboardDidDisconnectNotification
122 usingBlock:^(NSNotification *note) {
123 GCKeyboard *keyboard = note.object;
124 OnGCKeyboardDisconnected(keyboard);
127 if (GCKeyboard.coalescedKeyboard != nil) {
128 OnGCKeyboardConnected(GCKeyboard.coalescedKeyboard);
136 return keyboard_connected;
142 if (@available(iOS 14.0, tvOS 14.0, *)) {
143 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
145 if (keyboard_connect_observer) {
146 [center removeObserver:keyboard_connect_observer name:GCKeyboardDidConnectNotification object:nil];
147 keyboard_connect_observer = nil;
150 if (keyboard_disconnect_observer) {
151 [center removeObserver:keyboard_disconnect_observer name:GCKeyboardDidDisconnectNotification object:nil];
152 keyboard_disconnect_observer = nil;
155 if (GCKeyboard.coalescedKeyboard != nil) {
156 OnGCKeyboardDisconnected(GCKeyboard.coalescedKeyboard);
180 #ifdef ENABLE_GCMOUSE
182 static int mice_connected = 0;
183 static id mouse_connect_observer = nil;
184 static id mouse_disconnect_observer = nil;
197 static void OnGCMouseConnected(GCMouse *mouse) API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0))
201 mouse.mouseInput.leftButton.pressedChangedHandler = ^(GCControllerButtonInput *
button,
float value, BOOL pressed)
205 mouse.mouseInput.middleButton.pressedChangedHandler = ^(GCControllerButtonInput *
button,
float value, BOOL pressed)
209 mouse.mouseInput.rightButton.pressedChangedHandler = ^(GCControllerButtonInput *
button,
float value, BOOL pressed)
215 for (GCControllerButtonInput *
button in mouse.mouseInput.auxiliaryButtons) {
216 button.pressedChangedHandler = ^(GCControllerButtonInput *
button,
float value, BOOL pressed)
218 OnGCMouseButtonChanged(mouseID, auxiliary_button, pressed);
223 mouse.mouseInput.mouseMovedHandler = ^(GCMouseInput *mouse,
float deltaX,
float deltaY)
228 dispatch_queue_t queue = dispatch_queue_create(
"org.libsdl.input.mouse", DISPATCH_QUEUE_SERIAL );
229 dispatch_set_target_queue( queue, dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0 ) );
230 mouse.handlerQueue = queue;
235 static void OnGCMouseDisconnected(GCMouse *mouse) API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0))
239 mouse.mouseInput.mouseMovedHandler = nil;
241 mouse.mouseInput.leftButton.pressedChangedHandler = nil;
242 mouse.mouseInput.middleButton.pressedChangedHandler = nil;
243 mouse.mouseInput.rightButton.pressedChangedHandler = nil;
245 for (GCControllerButtonInput *
button in mouse.mouseInput.auxiliaryButtons) {
246 button.pressedChangedHandler = nil;
254 if (@available(iOS 14.1, tvOS 14.1, *)) {
255 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
257 mouse_connect_observer = [center addObserverForName:GCMouseDidConnectNotification
260 usingBlock:^(NSNotification *note) {
261 GCMouse *mouse = note.object;
262 OnGCMouseConnected(mouse);
265 mouse_disconnect_observer = [center addObserverForName:GCMouseDidDisconnectNotification
268 usingBlock:^(NSNotification *note) {
269 GCMouse *mouse = note.object;
270 OnGCMouseDisconnected(mouse);
273 for (GCMouse *mouse
in [GCMouse mice]) {
274 OnGCMouseConnected(mouse);
284 return (mice_connected > 0);
290 if (@available(iOS 14.1, tvOS 14.1, *)) {
291 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
293 if (mouse_connect_observer) {
294 [center removeObserver:mouse_connect_observer name:GCMouseDidConnectNotification object:nil];
295 mouse_connect_observer = nil;
298 if (mouse_disconnect_observer) {
299 [center removeObserver:mouse_disconnect_observer name:GCMouseDidDisconnectNotification object:nil];
300 mouse_disconnect_observer = nil;
303 for (GCMouse *mouse
in [GCMouse mice]) {
304 OnGCMouseDisconnected(mouse);
#define SDL_iPhoneSetEventPump
#define SDL_GetMouseFocus
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
int SDL_SendMouseButton(SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button)
SDL_Mouse * SDL_GetMouse(void)
int SDL_SendMouseMotion(SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
#define SDL_BUTTON_MIDDLE
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLsizei const GLfloat * value
SDL_Scancode
The SDL keyboard scancode representation.
SDL_bool SDL_HasGCKeyboard(void)
void SDL_InitGCMouse(void)
SDL_bool SDL_HasGCMouse(void)
void SDL_InitGCKeyboard(void)
void UIKit_PumpEvents(_THIS)
void SDL_QuitGCKeyboard(void)
void SDL_QuitGCMouse(void)
int(* SetRelativeMouseMode)(SDL_bool enabled)