diff options
Diffstat (limited to '3rdparty/SDL2/src/video/uikit/SDL_uikitviewcontroller.m')
-rw-r--r-- | 3rdparty/SDL2/src/video/uikit/SDL_uikitviewcontroller.m | 431 |
1 files changed, 0 insertions, 431 deletions
diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitviewcontroller.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitviewcontroller.m deleted file mode 100644 index e6e903ee4c6..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitviewcontroller.m +++ /dev/null @@ -1,431 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include "SDL_video.h" -#include "SDL_assert.h" -#include "SDL_hints.h" -#include "../SDL_sysvideo.h" -#include "../../events/SDL_events_c.h" - -#import "SDL_uikitviewcontroller.h" -#import "SDL_uikitmessagebox.h" -#include "SDL_uikitvideo.h" -#include "SDL_uikitmodes.h" -#include "SDL_uikitwindow.h" -#include "SDL_uikitopengles.h" - -#if SDL_IPHONE_KEYBOARD -#include "keyinfotable.h" -#endif - -#if TARGET_OS_TV -static void -SDL_AppleTVControllerUIHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint) -{ - @autoreleasepool { - SDL_uikitviewcontroller *viewcontroller = (__bridge SDL_uikitviewcontroller *) userdata; - viewcontroller.controllerUserInteractionEnabled = hint && (*hint != '0'); - } -} -#endif - -@implementation SDL_uikitviewcontroller { - CADisplayLink *displayLink; - int animationInterval; - void (*animationCallback)(void*); - void *animationCallbackParam; - -#if SDL_IPHONE_KEYBOARD - UITextField *textField; -#endif -} - -@synthesize window; - -- (instancetype)initWithSDLWindow:(SDL_Window *)_window -{ - if (self = [super initWithNibName:nil bundle:nil]) { - self.window = _window; - -#if SDL_IPHONE_KEYBOARD - [self initKeyboard]; -#endif - -#if TARGET_OS_TV - SDL_AddHintCallback(SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS, - SDL_AppleTVControllerUIHintChanged, - (__bridge void *) self); -#endif - } - return self; -} - -- (void)dealloc -{ -#if SDL_IPHONE_KEYBOARD - [self deinitKeyboard]; -#endif - -#if TARGET_OS_TV - SDL_DelHintCallback(SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS, - SDL_AppleTVControllerUIHintChanged, - (__bridge void *) self); -#endif -} - -- (void)setAnimationCallback:(int)interval - callback:(void (*)(void*))callback - callbackParam:(void*)callbackParam -{ - [self stopAnimation]; - - animationInterval = interval; - animationCallback = callback; - animationCallbackParam = callbackParam; - - if (animationCallback) { - [self startAnimation]; - } -} - -- (void)startAnimation -{ - displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(doLoop:)]; - [displayLink setFrameInterval:animationInterval]; - [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; -} - -- (void)stopAnimation -{ - [displayLink invalidate]; - displayLink = nil; -} - -- (void)doLoop:(CADisplayLink*)sender -{ - /* Don't run the game loop while a messagebox is up */ - if (!UIKit_ShowingMessageBox()) { - /* See the comment in the function definition. */ - UIKit_GL_RestoreCurrentContext(); - - animationCallback(animationCallbackParam); - } -} - -- (void)loadView -{ - /* Do nothing. */ -} - -- (void)viewDidLayoutSubviews -{ - const CGSize size = self.view.bounds.size; - int w = (int) size.width; - int h = (int) size.height; - - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, w, h); -} - -#if !TARGET_OS_TV -- (NSUInteger)supportedInterfaceOrientations -{ - return UIKit_GetSupportedOrientations(window); -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orient -{ - return ([self supportedInterfaceOrientations] & (1 << orient)) != 0; -} - -- (BOOL)prefersStatusBarHidden -{ - return (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) != 0; -} -#endif - -/* - ---- Keyboard related functionality below this line ---- - */ -#if SDL_IPHONE_KEYBOARD - -@synthesize textInputRect; -@synthesize keyboardHeight; -@synthesize keyboardVisible; - -/* Set ourselves up as a UITextFieldDelegate */ -- (void)initKeyboard -{ - textField = [[UITextField alloc] initWithFrame:CGRectZero]; - textField.delegate = self; - /* placeholder so there is something to delete! */ - textField.text = @" "; - - /* set UITextInputTrait properties, mostly to defaults */ - textField.autocapitalizationType = UITextAutocapitalizationTypeNone; - textField.autocorrectionType = UITextAutocorrectionTypeNo; - textField.enablesReturnKeyAutomatically = NO; - textField.keyboardAppearance = UIKeyboardAppearanceDefault; - textField.keyboardType = UIKeyboardTypeDefault; - textField.returnKeyType = UIReturnKeyDefault; - textField.secureTextEntry = NO; - - textField.hidden = YES; - keyboardVisible = NO; - -#if !TARGET_OS_TV - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - [center addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; - [center addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; -#endif -} - -- (void)setView:(UIView *)view -{ - [super setView:view]; - - [view addSubview:textField]; - - if (keyboardVisible) { - [self showKeyboard]; - } -} - -- (void)deinitKeyboard -{ -#if !TARGET_OS_TV - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - [center removeObserver:self name:UIKeyboardWillShowNotification object:nil]; - [center removeObserver:self name:UIKeyboardWillHideNotification object:nil]; -#endif -} - -/* reveal onscreen virtual keyboard */ -- (void)showKeyboard -{ - keyboardVisible = YES; - if (textField.window) { - [textField becomeFirstResponder]; - } -} - -/* hide onscreen virtual keyboard */ -- (void)hideKeyboard -{ - keyboardVisible = NO; - [textField resignFirstResponder]; -} - -- (void)keyboardWillShow:(NSNotification *)notification -{ -#if !TARGET_OS_TV - CGRect kbrect = [[notification userInfo][UIKeyboardFrameBeginUserInfoKey] CGRectValue]; - - /* The keyboard rect is in the coordinate space of the screen/window, but we - * want its height in the coordinate space of the view. */ - kbrect = [self.view convertRect:kbrect fromView:nil]; - - [self setKeyboardHeight:(int)kbrect.size.height]; -#endif -} - -- (void)keyboardWillHide:(NSNotification *)notification -{ - SDL_StopTextInput(); - [self setKeyboardHeight:0]; -} - -- (void)updateKeyboard -{ - CGAffineTransform t = self.view.transform; - CGPoint offset = CGPointMake(0.0, 0.0); - CGRect frame = UIKit_ComputeViewFrame(window, self.view.window.screen); - - if (self.keyboardHeight) { - int rectbottom = self.textInputRect.y + self.textInputRect.h; - int keybottom = self.view.bounds.size.height - self.keyboardHeight; - if (keybottom < rectbottom) { - offset.y = keybottom - rectbottom; - } - } - - /* Apply this view's transform (except any translation) to the offset, in - * order to orient it correctly relative to the frame's coordinate space. */ - t.tx = 0.0; - t.ty = 0.0; - offset = CGPointApplyAffineTransform(offset, t); - - /* Apply the updated offset to the view's frame. */ - frame.origin.x += offset.x; - frame.origin.y += offset.y; - - self.view.frame = frame; -} - -- (void)setKeyboardHeight:(int)height -{ - keyboardVisible = height > 0; - keyboardHeight = height; - [self updateKeyboard]; -} - -/* UITextFieldDelegate method. Invoked when user types something. */ -- (BOOL)textField:(UITextField *)_textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string -{ - NSUInteger len = string.length; - - if (len == 0) { - /* it wants to replace text with nothing, ie a delete */ - SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_BACKSPACE); - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_BACKSPACE); - } else { - /* go through all the characters in the string we've been sent and - * convert them to key presses */ - int i; - for (i = 0; i < len; i++) { - unichar c = [string characterAtIndex:i]; - Uint16 mod = 0; - SDL_Scancode code; - - if (c < 127) { - /* figure out the SDL_Scancode and SDL_keymod for this unichar */ - code = unicharToUIKeyInfoTable[c].code; - mod = unicharToUIKeyInfoTable[c].mod; - } else { - /* we only deal with ASCII right now */ - code = SDL_SCANCODE_UNKNOWN; - mod = 0; - } - - if (mod & KMOD_SHIFT) { - /* If character uses shift, press shift down */ - SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LSHIFT); - } - - /* send a keydown and keyup even for the character */ - SDL_SendKeyboardKey(SDL_PRESSED, code); - SDL_SendKeyboardKey(SDL_RELEASED, code); - - if (mod & KMOD_SHIFT) { - /* If character uses shift, press shift back up */ - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT); - } - } - - SDL_SendKeyboardText([string UTF8String]); - } - - return NO; /* don't allow the edit! (keep placeholder text there) */ -} - -/* Terminates the editing session */ -- (BOOL)textFieldShouldReturn:(UITextField*)_textField -{ - SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_RETURN); - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_RETURN); - SDL_StopTextInput(); - return YES; -} - -#endif - -@end - -/* iPhone keyboard addition functions */ -#if SDL_IPHONE_KEYBOARD - -static SDL_uikitviewcontroller * -GetWindowViewController(SDL_Window * window) -{ - if (!window || !window->driverdata) { - SDL_SetError("Invalid window"); - return nil; - } - - SDL_WindowData *data = (__bridge SDL_WindowData *)window->driverdata; - - return data.viewcontroller; -} - -SDL_bool -UIKit_HasScreenKeyboardSupport(_THIS) -{ - return SDL_TRUE; -} - -void -UIKit_ShowScreenKeyboard(_THIS, SDL_Window *window) -{ - @autoreleasepool { - SDL_uikitviewcontroller *vc = GetWindowViewController(window); - [vc showKeyboard]; - } -} - -void -UIKit_HideScreenKeyboard(_THIS, SDL_Window *window) -{ - @autoreleasepool { - SDL_uikitviewcontroller *vc = GetWindowViewController(window); - [vc hideKeyboard]; - } -} - -SDL_bool -UIKit_IsScreenKeyboardShown(_THIS, SDL_Window *window) -{ - @autoreleasepool { - SDL_uikitviewcontroller *vc = GetWindowViewController(window); - if (vc != nil) { - return vc.isKeyboardVisible; - } - return SDL_FALSE; - } -} - -void -UIKit_SetTextInputRect(_THIS, SDL_Rect *rect) -{ - if (!rect) { - SDL_InvalidParamError("rect"); - return; - } - - @autoreleasepool { - SDL_uikitviewcontroller *vc = GetWindowViewController(SDL_GetFocusWindow()); - if (vc != nil) { - vc.textInputRect = *rect; - - if (vc.keyboardVisible) { - [vc updateKeyboard]; - } - } - } -} - - -#endif /* SDL_IPHONE_KEYBOARD */ - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ |