Skip to content

Commit

Permalink
Added SDL_HINT_IOS_HIDE_HOME_INDICATOR to determine how the home indi…
Browse files Browse the repository at this point in the history
…cator on the iPhone X is handled.

This variable can be set to the following values:
   "0"       - The indicator bar is not hidden (default for windowed applications)
   "1"       - The indicator bar is hidden and is shown when the screen is touched (useful for movie playback applications)
   "2"       - The indicator bar is dim and the first swipe makes it visible and the second swipe performs the "home" action (default for fullscreen applications)
  • Loading branch information
slouken committed Feb 1, 2018
1 parent 330b19c commit 85c34e9
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 2 deletions.
13 changes: 12 additions & 1 deletion include/SDL_hints.h
Expand Up @@ -365,6 +365,17 @@ extern "C" {
*/
#define SDL_HINT_APPLE_TV_REMOTE_SWIPES_AS_ARROW_KEYS "SDL_APPLE_TV_REMOTE_SWIPES_AS_ARROW_KEYS"

/**
* \brief A variable controlling whether the home indicator bar on iPhone X
* should be hidden.
*
* This variable can be set to the following values:
* "0" - The indicator bar is not hidden (default for windowed applications)
* "1" - The indicator bar is hidden and is shown when the screen is touched (useful for movie playback applications)
* "2" - The indicator bar is dim and the first swipe makes it visible and the second swipe performs the "home" action (default for fullscreen applications)
*/
#define SDL_HINT_IOS_HIDE_HOME_INDICATOR "SDL_IOS_HIDE_HOME_INDICATOR"

/**
* \brief A variable controlling whether the Android / iOS built-in
* accelerometer should be listed as a joystick device, rather than listing
Expand Down Expand Up @@ -775,7 +786,7 @@ extern "C" {
* "0" - SDL will generate a window-close event when it sees Alt+F4.
* "1" - SDL will only do normal key handling for Alt+F4.
*/
#define SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 "SDL_WINDOWS_NO_CLOSE_ON_ALT_F4"
#define SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 "SDL_WINDOWS_NO_CLOSE_ON_ALT_F4"

/**
* \brief Prevent SDL from using version 4 of the bitmap header when saving BMPs.
Expand Down
12 changes: 12 additions & 0 deletions src/video/uikit/SDL_uikitmessagebox.m
Expand Up @@ -109,6 +109,18 @@
alertwindow.hidden = YES;
}

/* Force the main SDL window to re-evaluate home indicator state */
SDL_Window *focus = SDL_GetFocusWindow();
if (focus) {
SDL_WindowData *data = (__bridge SDL_WindowData *) focus->driverdata;
if (data != nil) {
if (@available(iOS 11.0, *)) {
[data.viewcontroller performSelectorOnMainThread:@selector(setNeedsUpdateOfHomeIndicatorAutoHidden) withObject:nil waitUntilDone:NO];
[data.viewcontroller performSelectorOnMainThread:@selector(setNeedsUpdateOfScreenEdgesDeferringSystemGestures) withObject:nil waitUntilDone:NO];
}
}
}

*buttonid = messageboxdata->buttons[clickedindex].buttonid;
return YES;
#else
Expand Down
4 changes: 4 additions & 0 deletions src/video/uikit/SDL_uikitviewcontroller.h
Expand Up @@ -58,6 +58,10 @@
#if !TARGET_OS_TV
- (NSUInteger)supportedInterfaceOrientations;
- (BOOL)prefersStatusBarHidden;
- (BOOL)prefersHomeIndicatorAutoHidden;
- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures;

@property (nonatomic, assign) int homeIndicatorHidden;
#endif

#if SDL_IPHONE_KEYBOARD
Expand Down
57 changes: 56 additions & 1 deletion src/video/uikit/SDL_uikitviewcontroller.m
Expand Up @@ -50,6 +50,21 @@
}
#endif

#if !TARGET_OS_TV
static void SDLCALL
SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
{
@autoreleasepool {
SDL_uikitviewcontroller *viewcontroller = (__bridge SDL_uikitviewcontroller *) userdata;
viewcontroller.homeIndicatorHidden = (hint && *hint) ? SDL_atoi(hint) : -1;
if (@available(iOS 11.0, *)) {
[viewcontroller setNeedsUpdateOfHomeIndicatorAutoHidden];
[viewcontroller setNeedsUpdateOfScreenEdgesDeferringSystemGestures];
}
}
}
#endif

@implementation SDL_uikitviewcontroller {
CADisplayLink *displayLink;
int animationInterval;
Expand Down Expand Up @@ -79,7 +94,13 @@ - (instancetype)initWithSDLWindow:(SDL_Window *)_window
SDL_AppleTVControllerUIHintChanged,
(__bridge void *) self);
#endif

#if !TARGET_OS_TV
SDL_AddHintCallback(SDL_HINT_IOS_HIDE_HOME_INDICATOR,
SDL_HideHomeIndicatorHintChanged,
(__bridge void *) self);
}
#endif
return self;
}

Expand All @@ -94,6 +115,12 @@ - (void)dealloc
SDL_AppleTVControllerUIHintChanged,
(__bridge void *) self);
#endif

#if !TARGET_OS_TV
SDL_DelHintCallback(SDL_HINT_IOS_HIDE_HOME_INDICATOR,
SDL_HideHomeIndicatorHintChanged,
(__bridge void *) self);
#endif
}

- (void)setAnimationCallback:(int)interval
Expand Down Expand Up @@ -179,7 +206,35 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orient

- (BOOL)prefersStatusBarHidden
{
return (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) != 0;
BOOL hidden = (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) != 0;
return hidden;
}

- (BOOL)prefersHomeIndicatorAutoHidden
{
BOOL hidden = NO;
if (self.homeIndicatorHidden == 1) {
hidden = YES;
}
return hidden;
}

- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
if (self.homeIndicatorHidden >= 0) {
if (self.homeIndicatorHidden == 2) {
return UIRectEdgeAll;
} else {
return UIRectEdgeNone;
}
}

/* By default, fullscreen and borderless windows get all screen gestures */
if ((window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) != 0) {
return UIRectEdgeAll;
} else {
return UIRectEdgeNone;
}
}
#endif

Expand Down

0 comments on commit 85c34e9

Please sign in to comment.