SDL 2.0
SDL_uikitvideo.m
Go to the documentation of this file.
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "../../SDL_internal.h"
22
23#if SDL_VIDEO_DRIVER_UIKIT
24
25#import <UIKit/UIKit.h>
26
27#include "SDL_video.h"
28#include "SDL_mouse.h"
29#include "SDL_hints.h"
30#include "../SDL_sysvideo.h"
31#include "../SDL_pixels_c.h"
32#include "../../events/SDL_events_c.h"
33
34#include "SDL_uikitvideo.h"
35#include "SDL_uikitevents.h"
36#include "SDL_uikitmodes.h"
37#include "SDL_uikitwindow.h"
38#include "SDL_uikitopengles.h"
39#include "SDL_uikitclipboard.h"
40#include "SDL_uikitvulkan.h"
41
42#define UIKITVID_DRIVER_NAME "uikit"
43
44@implementation SDL_VideoData
45
46@end
47
48/* Initialization/Query functions */
49static int UIKit_VideoInit(_THIS);
50static void UIKit_VideoQuit(_THIS);
51
52/* DUMMY driver bootstrap functions */
53
54static int
55UIKit_Available(void)
56{
57 return 1;
58}
59
60static void UIKit_DeleteDevice(SDL_VideoDevice * device)
61{
62 @autoreleasepool {
63 CFRelease(device->driverdata);
65 }
66}
67
68static SDL_VideoDevice *
69UIKit_CreateDevice(int devindex)
70{
71 @autoreleasepool {
74
75 /* Initialize all variables that we clean on shutdown */
77 if (device) {
78 data = [SDL_VideoData new];
79 } else {
82 return (0);
83 }
84
85 device->driverdata = (void *) CFBridgingRetain(data);
86
87 /* Set the function pointers */
88 device->VideoInit = UIKit_VideoInit;
89 device->VideoQuit = UIKit_VideoQuit;
90 device->GetDisplayModes = UIKit_GetDisplayModes;
91 device->SetDisplayMode = UIKit_SetDisplayMode;
92 device->PumpEvents = UIKit_PumpEvents;
93 device->SuspendScreenSaver = UIKit_SuspendScreenSaver;
94 device->CreateSDLWindow = UIKit_CreateWindow;
95 device->SetWindowTitle = UIKit_SetWindowTitle;
96 device->ShowWindow = UIKit_ShowWindow;
97 device->HideWindow = UIKit_HideWindow;
98 device->RaiseWindow = UIKit_RaiseWindow;
99 device->SetWindowBordered = UIKit_SetWindowBordered;
100 device->SetWindowFullscreen = UIKit_SetWindowFullscreen;
101 device->DestroyWindow = UIKit_DestroyWindow;
102 device->GetWindowWMInfo = UIKit_GetWindowWMInfo;
103 device->GetDisplayUsableBounds = UIKit_GetDisplayUsableBounds;
104
105#if SDL_IPHONE_KEYBOARD
106 device->HasScreenKeyboardSupport = UIKit_HasScreenKeyboardSupport;
107 device->ShowScreenKeyboard = UIKit_ShowScreenKeyboard;
108 device->HideScreenKeyboard = UIKit_HideScreenKeyboard;
109 device->IsScreenKeyboardShown = UIKit_IsScreenKeyboardShown;
110 device->SetTextInputRect = UIKit_SetTextInputRect;
111#endif
112
113 device->SetClipboardText = UIKit_SetClipboardText;
114 device->GetClipboardText = UIKit_GetClipboardText;
115 device->HasClipboardText = UIKit_HasClipboardText;
116
117 /* OpenGL (ES) functions */
118 device->GL_MakeCurrent = UIKit_GL_MakeCurrent;
119 device->GL_GetDrawableSize = UIKit_GL_GetDrawableSize;
120 device->GL_SwapWindow = UIKit_GL_SwapWindow;
121 device->GL_CreateContext = UIKit_GL_CreateContext;
122 device->GL_DeleteContext = UIKit_GL_DeleteContext;
123 device->GL_GetProcAddress = UIKit_GL_GetProcAddress;
124 device->GL_LoadLibrary = UIKit_GL_LoadLibrary;
125 device->free = UIKit_DeleteDevice;
126
127#if SDL_VIDEO_VULKAN
128 device->Vulkan_LoadLibrary = UIKit_Vulkan_LoadLibrary;
129 device->Vulkan_UnloadLibrary = UIKit_Vulkan_UnloadLibrary;
130 device->Vulkan_GetInstanceExtensions
131 = UIKit_Vulkan_GetInstanceExtensions;
132 device->Vulkan_CreateSurface = UIKit_Vulkan_CreateSurface;
133 device->Vulkan_GetDrawableSize = UIKit_Vulkan_GetDrawableSize;
134#endif
135
136 device->gl_config.accelerated = 1;
137
138 return device;
139 }
140}
141
143 UIKITVID_DRIVER_NAME, "SDL UIKit video driver",
144 UIKit_Available, UIKit_CreateDevice
145};
146
147
148int
149UIKit_VideoInit(_THIS)
150{
152
153 if (UIKit_InitModes(_this) < 0) {
154 return -1;
155 }
156 return 0;
157}
158
159void
160UIKit_VideoQuit(_THIS)
161{
163}
164
165void
167{
168 @autoreleasepool {
169 /* Ignore ScreenSaver API calls if the idle timer hint has been set. */
170 /* FIXME: The idle timer hint should be deprecated for SDL 2.1. */
172 UIApplication *app = [UIApplication sharedApplication];
173
174 /* Prevent the display from dimming and going to sleep. */
175 app.idleTimerDisabled = (_this->suspend_screensaver != SDL_FALSE);
176 }
177 }
178}
179
181UIKit_IsSystemVersionAtLeast(double version)
182{
183 return [[UIDevice currentDevice].systemVersion doubleValue] >= version;
184}
185
186CGRect
187UIKit_ComputeViewFrame(SDL_Window *window, UIScreen *screen)
188{
189 CGRect frame = screen.bounds;
190
191#if !TARGET_OS_TV && (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0)
192 BOOL hasiOS7 = UIKit_IsSystemVersionAtLeast(7.0);
193
194 /* The view should always show behind the status bar in iOS 7+. */
195 if (!hasiOS7 && !(window->flags & (SDL_WINDOW_BORDERLESS|SDL_WINDOW_FULLSCREEN))) {
196 frame = screen.applicationFrame;
197 }
198#endif
199
200#if !TARGET_OS_TV
201 /* iOS 10 seems to have a bug where, in certain conditions, putting the
202 * device to sleep with the a landscape-only app open, re-orienting the
203 * device to portrait, and turning it back on will result in the screen
204 * bounds returning portrait orientation despite the app being in landscape.
205 * This is a workaround until a better solution can be found.
206 * https://bugzilla.libsdl.org/show_bug.cgi?id=3505
207 * https://bugzilla.libsdl.org/show_bug.cgi?id=3465
208 * https://forums.developer.apple.com/thread/65337 */
210 UIInterfaceOrientation orient = [UIApplication sharedApplication].statusBarOrientation;
211 BOOL isLandscape = UIInterfaceOrientationIsLandscape(orient);
212
213 if (isLandscape != (frame.size.width > frame.size.height)) {
214 float height = frame.size.width;
215 frame.size.width = frame.size.height;
216 frame.size.height = height;
217 }
218 }
219#endif
220
221 return frame;
222}
223
224void
226{
227#if !TARGET_OS_TV
228 /* Force the main SDL window to re-evaluate home indicator state */
230 if (focus) {
231 SDL_WindowData *data = (__bridge SDL_WindowData *) focus->driverdata;
232 if (data != nil) {
233#pragma clang diagnostic push
234#pragma clang diagnostic ignored "-Wunguarded-availability-new"
235 if ([data.viewcontroller respondsToSelector:@selector(setNeedsUpdateOfHomeIndicatorAutoHidden)]) {
236 [data.viewcontroller performSelectorOnMainThread:@selector(setNeedsUpdateOfHomeIndicatorAutoHidden) withObject:nil waitUntilDone:NO];
237 [data.viewcontroller performSelectorOnMainThread:@selector(setNeedsUpdateOfScreenEdgesDeferringSystemGestures) withObject:nil waitUntilDone:NO];
238 }
239#pragma clang diagnostic pop
240 }
241 }
242#endif /* !TARGET_OS_TV */
243}
244
245/*
246 * iOS log support.
247 *
248 * This doesn't really have aything to do with the interfaces of the SDL video
249 * subsystem, but we need to stuff this into an Objective-C source code file.
250 *
251 * NOTE: This is copypasted from src/video/cocoa/SDL_cocoavideo.m! Thus, if
252 * Cocoa is supported, we use that one instead. Be sure both versions remain
253 * identical!
254 */
255
256#if !defined(SDL_VIDEO_DRIVER_COCOA)
257void SDL_NSLog(const char *text)
258{
259 NSLog(@"%s", text);
260}
261#endif /* SDL_VIDEO_DRIVER_COCOA */
262
263/*
264 * iOS Tablet detection
265 *
266 * This doesn't really have aything to do with the interfaces of the SDL video
267 * subsystem, but we need to stuff this into an Objective-C source code file.
268 */
269SDL_bool SDL_IsIPad(void)
270{
271 return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
272}
273
274#endif /* SDL_VIDEO_DRIVER_UIKIT */
275
276/* vi: set ts=4 sw=4 expandtab: */
#define _THIS
#define SDL_free
#define SDL_GetHintBoolean
#define SDL_calloc
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
#define SDL_HINT_IDLE_TIMER_DISABLED
A variable controlling whether the idle timer is disabled on iOS.
Definition: SDL_hints.h:349
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1572
SDL_bool
Definition: SDL_stdinc.h:162
@ SDL_FALSE
Definition: SDL_stdinc.h:163
VideoBootStrap UIKIT_bootstrap
SDL_Window * SDL_GetFocusWindow(void)
Definition: SDL_video.c:2696
char * UIKit_GetClipboardText(_THIS)
SDL_bool UIKit_HasClipboardText(_THIS)
int UIKit_SetClipboardText(_THIS, const char *text)
void UIKit_PumpEvents(_THIS)
void UIKit_GetDisplayModes(_THIS, SDL_VideoDisplay *display)
void UIKit_QuitModes(_THIS)
int UIKit_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
int UIKit_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)
int UIKit_InitModes(_THIS)
int UIKit_GL_MakeCurrent(_THIS, SDL_Window *window, SDL_GLContext context)
SDL_GLContext UIKit_GL_CreateContext(_THIS, SDL_Window *window)
int UIKit_GL_LoadLibrary(_THIS, const char *path)
void UIKit_GL_GetDrawableSize(_THIS, SDL_Window *window, int *w, int *h)
void * UIKit_GL_GetProcAddress(_THIS, const char *proc)
void UIKit_GL_DeleteContext(_THIS, SDL_GLContext context)
int UIKit_GL_SwapWindow(_THIS, SDL_Window *window)
void UIKit_ForceUpdateHomeIndicator(void)
void UIKit_SuspendScreenSaver(_THIS)
SDL_bool UIKit_IsSystemVersionAtLeast(double version)
void UIKit_ShowWindow(_THIS, SDL_Window *window)
void UIKit_RaiseWindow(_THIS, SDL_Window *window)
SDL_bool UIKit_GetWindowWMInfo(_THIS, SDL_Window *window, struct SDL_SysWMinfo *info)
void UIKit_SetWindowBordered(_THIS, SDL_Window *window, SDL_bool bordered)
void UIKit_SetWindowTitle(_THIS, SDL_Window *window)
void UIKit_DestroyWindow(_THIS, SDL_Window *window)
void UIKit_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *display, SDL_bool fullscreen)
int UIKit_CreateWindow(_THIS, SDL_Window *window)
void UIKit_HideWindow(_THIS, SDL_Window *window)
static SDL_VideoDevice * _this
Definition: SDL_video.c:118
@ SDL_WINDOW_FULLSCREEN
Definition: SDL_video.h:100
@ SDL_WINDOW_BORDERLESS
Definition: SDL_video.h:104
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
static SDL_AudioDeviceID device
Definition: loopwave.c:37
BOOL(WINAPI *CloseTouchInputHandle)(HTOUCHINPUT)
SDL_bool suspend_screensaver
Definition: SDL_sysvideo.h:314
struct SDL_VideoDevice::@262 gl_config
The type used to identify a window.
Definition: SDL_sysvideo.h:74
void * driverdata
Definition: SDL_sysvideo.h:111
SDL_Renderer * screen
static char text[MAX_TEXT_LENGTH]
Definition: testime.c:47
int frame
Definition: teststreaming.c:60