Atlas - SDL_uikitvideo.m
Home / ext / SDL2 / src / video / uikit Lines: 1 | Size: 7901 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1/* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2018 Sam Lantinga <[email protected]> 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); 64 SDL_free(device); 65 } 66} 67 68static SDL_VideoDevice * 69UIKit_CreateDevice(int devindex) 70{ 71 @autoreleasepool { 72 SDL_VideoDevice *device; 73 SDL_VideoData *data; 74 75 /* Initialize all variables that we clean on shutdown */ 76 device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); 77 if (device) { 78 data = [SDL_VideoData new]; 79 } else { 80 SDL_free(device); 81 SDL_OutOfMemory(); 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 142VideoBootStrap UIKIT_bootstrap = { 143 UIKITVID_DRIVER_NAME, "SDL UIKit video driver", 144 UIKit_Available, UIKit_CreateDevice 145}; 146 147 148int 149UIKit_VideoInit(_THIS) 150{ 151 _this->gl_config.driver_loaded = 1; 152 153 if (UIKit_InitModes(_this) < 0) { 154 return -1; 155 } 156 return 0; 157} 158 159void 160UIKit_VideoQuit(_THIS) 161{ 162 UIKit_QuitModes(_this); 163} 164 165void 166UIKit_SuspendScreenSaver(_THIS) 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. */ 171 if (!SDL_GetHintBoolean(SDL_HINT_IDLE_TIMER_DISABLED, SDL_FALSE)) { 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 180SDL_bool 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 */ 209 if (UIKit_IsSystemVersionAtLeast(8.0)) { 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 224/* 225 * iOS log support. 226 * 227 * This doesn't really have aything to do with the interfaces of the SDL video 228 * subsystem, but we need to stuff this into an Objective-C source code file. 229 */ 230 231void SDL_NSLog(const char *text) 232{ 233 NSLog(@"%s", text); 234} 235 236/* 237 * iOS Tablet detection 238 * 239 * This doesn't really have aything to do with the interfaces of the SDL video 240 * subsystem, but we need to stuff this into an Objective-C source code file. 241 */ 242SDL_bool SDL_IsIPad(void) 243{ 244 return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); 245} 246 247#endif /* SDL_VIDEO_DRIVER_UIKIT */ 248 249/* vi: set ts=4 sw=4 expandtab: */ 250[FILE END](C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.