summaryrefslogtreecommitdiff
path: root/src/ios.m
diff options
context:
space:
mode:
Diffstat (limited to 'src/ios.m')
-rw-r--r--src/ios.m69
1 files changed, 53 insertions, 16 deletions
diff --git a/src/ios.m b/src/ios.m
index 5abf87df..4d1aac37 100644
--- a/src/ios.m
+++ b/src/ios.m
@@ -31,28 +31,63 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
31static iBool isSystemDarkMode_ = iFalse; 31static iBool isSystemDarkMode_ = iFalse;
32static iBool isPhone_ = iFalse; 32static iBool isPhone_ = iFalse;
33 33
34static UIViewController *viewController_(iWindow *window) {
35 SDL_SysWMinfo wm;
36 SDL_VERSION(&wm.version);
37 if (SDL_GetWindowWMInfo(window->win, &wm)) {
38 return wm.info.uikit.window.rootViewController;
39 }
40 iAssert(false);
41 return NULL;
42}
43
44@interface KeyboardObserver : NSObject
45-(void)keyboardOnScreen:(NSNotification *)notification;
46@end
47
48@implementation KeyboardObserver
49-(void)keyboardOnScreen:(NSNotification *)notification {
50 NSDictionary *info = notification.userInfo;
51 NSValue *value = info[UIKeyboardFrameEndUserInfoKey];
52 CGRect rawFrame = [value CGRectValue];
53 UIView *view = [viewController_(get_Window()) view];
54 CGRect keyboardFrame = [view convertRect:rawFrame fromView:nil];
55// NSLog(@"keyboardFrame: %@", NSStringFromCGRect(keyboardFrame));
56 iWindow *window = get_Window();
57 const iInt2 rootSize = rootSize_Window(window);
58 const int keyTop = keyboardFrame.origin.y * window->pixelRatio;
59 setKeyboardHeight_Window(window, rootSize.y - keyTop);
60}
61
62-(void)keyboardOffScreen:(NSNotification *)notification {
63 setKeyboardHeight_Window(get_Window(), 0);
64}
65@end
66
34static void enableMouse_(iBool yes) { 67static void enableMouse_(iBool yes) {
35 SDL_EventState(SDL_MOUSEBUTTONDOWN, yes); 68 SDL_EventState(SDL_MOUSEBUTTONDOWN, yes);
36 SDL_EventState(SDL_MOUSEMOTION, yes); 69 SDL_EventState(SDL_MOUSEMOTION, yes);
37 SDL_EventState(SDL_MOUSEBUTTONUP, yes); 70 SDL_EventState(SDL_MOUSEBUTTONUP, yes);
38} 71}
39 72
73KeyboardObserver *keyObs_;
74
40void setupApplication_iOS(void) { 75void setupApplication_iOS(void) {
41 enableMouse_(iFalse); 76 enableMouse_(iFalse);
42 NSString *deviceModel = [[UIDevice currentDevice] model]; 77 NSString *deviceModel = [[UIDevice currentDevice] model];
43 if ([deviceModel isEqualToString:@"iPhone"]) { 78 if ([deviceModel isEqualToString:@"iPhone"]) {
44 isPhone_ = iTrue; 79 isPhone_ = iTrue;
45 } 80 }
46} 81 keyObs_ = [[KeyboardObserver alloc] init];
47 82 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
48static UIViewController *viewController_(iWindow *window) { 83 [center addObserver:keyObs_
49 SDL_SysWMinfo wm; 84 selector:@selector(keyboardOnScreen:)
50 SDL_VERSION(&wm.version); 85 name:UIKeyboardWillShowNotification
51 if (SDL_GetWindowWMInfo(window->win, &wm)) { 86 object:nil];
52 return wm.info.uikit.window.rootViewController; 87 [center addObserver:keyObs_
53 } 88 selector:@selector(keyboardOffScreen:)
54 iAssert(false); 89 name:UIKeyboardWillHideNotification
55 return NULL; 90 object:nil];
56} 91}
57 92
58static iBool isDarkMode_(iWindow *window) { 93static iBool isDarkMode_(iWindow *window) {
@@ -71,13 +106,15 @@ void safeAreaInsets_iOS(float *left, float *top, float *right, float *bottom) {
71 UIViewController *ctl = viewController_(window); 106 UIViewController *ctl = viewController_(window);
72 if (@available(iOS 11.0, *)) { 107 if (@available(iOS 11.0, *)) {
73 const UIEdgeInsets safe = ctl.view.safeAreaInsets; 108 const UIEdgeInsets safe = ctl.view.safeAreaInsets;
74 *left = safe.left * window->pixelRatio; 109 if (left) *left = safe.left * window->pixelRatio;
75 *top = safe.top * window->pixelRatio; 110 if (top) *top = safe.top * window->pixelRatio;
76 *right = safe.right * window->pixelRatio; 111 if (right) *right = safe.right * window->pixelRatio;
77 *bottom = safe.bottom * window->pixelRatio; 112 if (bottom) *bottom = safe.bottom * window->pixelRatio;
78 } else { 113 } else {
79 // Fallback on earlier versions 114 if (left) *left = 0.0f;
80 *left = *top = *right = *bottom = 0.0f; 115 if (top) *top = 0.0f;
116 if (right) *right = 0.0f;
117 if (bottom) *bottom = 0.0f;
81 } 118 }
82} 119}
83 120