Allow controllers to switch the iOS frontend to full screen mode

This commit is contained in:
Lior Halphon 2024-08-24 20:02:16 +03:00
parent 645ef429bc
commit f0bab07f26
8 changed files with 90 additions and 9 deletions

View File

@ -8,6 +8,7 @@
@property (readonly) GBView *gbView;
@property (nonatomic) GBLayout *layout;
@property (nonatomic) bool usesSwipePad;
@property (nonatomic) bool fullScreenMode;
- (void)enterPreviewMode:(bool)showLabel;
- (void)reloadThemeImages;

View File

@ -91,6 +91,7 @@ static GB_key_mask_t angleToKeyMask(double angle)
bool _inDynamicSpeedMode;
bool _previewMode;
UIView *_fadeView;
UIImageView *_dpadView;
UIImageView *_dpadShadowView;
UIImageView *_aButtonView;
@ -104,6 +105,7 @@ static GB_key_mask_t angleToKeyMask(double angle)
NSTimer *_fadeTimer;
GB_key_mask_t _lastMask;
bool _fullScreenMode;
}
- (void)reloadThemeImages
@ -142,11 +144,16 @@ static GB_key_mask_t angleToKeyMask(double angle)
_dpadShadowView.hidden = true;
_gbView = [[GBViewMetal alloc] initWithFrame:CGRectZero];
_fadeView = [[UIView alloc] initWithFrame:self.frame];
_fadeView.backgroundColor = [UIColor colorWithWhite:0 alpha:0];
_fadeView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self addSubview:_dpadView];
[self addSubview:_aButtonView];
[self addSubview:_bButtonView];
[self addSubview:_startButtonView];
[self addSubview:_selectButtonView];
[self addSubview:_fadeView];
[self addSubview:_gbView];
[_dpadView addSubview:_dpadShadowView];
@ -183,6 +190,10 @@ static GB_key_mask_t angleToKeyMask(double angle)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
if (_previewMode) return;
if (_fullScreenMode) {
self.fullScreenMode = false;
return;
}
static const double dpadRadius = 75;
CGPoint dpadLocation = _layout.dpadLocation;
double factor = [UIScreen mainScreen].scale;
@ -460,7 +471,17 @@ static GB_key_mask_t angleToKeyMask(double angle)
screenFrame.size.width /= [UIScreen mainScreen].scale;
screenFrame.size.height /= [UIScreen mainScreen].scale;
_gbView.frame = screenFrame;
if (_fullScreenMode) {
CGRect fullScreenFrame = layout.fullScreenRect;
fullScreenFrame.origin.x /= [UIScreen mainScreen].scale;
fullScreenFrame.origin.y /= [UIScreen mainScreen].scale;
fullScreenFrame.size.width /= [UIScreen mainScreen].scale;
fullScreenFrame.size.height /= [UIScreen mainScreen].scale;
_gbView.frame = fullScreenFrame;
}
else {
_gbView.frame = screenFrame;
}
screenFrame.origin.x += 8;
screenFrame.origin.y += 8;
@ -579,4 +600,21 @@ static GB_key_mask_t angleToKeyMask(double angle)
_previewMode = true;
}
- (bool)fullScreenMode
{
return _fullScreenMode;
}
- (void)setFullScreenMode:(bool)fullScreenMode
{
if (fullScreenMode == _fullScreenMode) return;
_fullScreenMode = fullScreenMode;
[UIView animateWithDuration:1.0/3 animations:^{
// Animating alpha has some weird quirks for some reason
_fadeView.backgroundColor = [UIColor colorWithWhite:0 alpha:fullScreenMode];
[self setLayout:_layout];
}];
[self.window.rootViewController setNeedsStatusBarAppearanceUpdate];
}
@end

View File

@ -14,6 +14,10 @@
screenRect.size.height = self.hasFractionalPixels? (resolution.height - self.homeBar) : floor((resolution.height - self.homeBar) / 144) * 144;
screenRect.size.width = screenRect.size.height / 144 * 160;
screenRect.origin.x = (resolution.width - screenRect.size.width) / 2;
screenRect.origin.y = (resolution.height - self.homeBar - screenRect.size.height) / 2;
self.fullScreenRect = screenRect;
double horizontalMargin, verticalMargin;
while (true) {
horizontalMargin = (resolution.width - screenRect.size.width) / 2;

View File

@ -7,6 +7,7 @@
@property (readonly) UIImage *background;
@property (readonly) CGRect screenRect;
@property (readonly) CGRect fullScreenRect;
@property (readonly) CGRect logoRect;
@property (readonly) CGPoint dpadLocation;
@property (readonly) CGPoint aLocation;
@ -23,6 +24,7 @@
@interface GBLayout()
@property UIImage *background;
@property CGRect screenRect;
@property CGRect fullScreenRect;
@property CGPoint dpadLocation;
@property CGPoint aLocation;
@property CGPoint bLocation;

View File

@ -399,11 +399,17 @@ static NSString const *typeLightTemp = @"typeLightTemp";
],
@"footer": ^NSString *(){
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"GBSwipeState"]) {
return @"Swipe down on the Game Boy to save the state into state slot 1. Swipe up to load the state from state slot 1";
return @"Swipe down on the Game Boy to save the state into state slot 1. Swipe up to load the state from state slot 1.";
}
return @" "; // This space is needed, otherwise UITableView spacing breaks
},
},
@{
@"items": @[
@{@"type": typeCheck, @"pref": @"GBControllersHideInterface", @"title": @"Hide UI While Using a Controller"},
],
@"footer": @"When enabled, the on-screen user interface will be hidden while a game controller is being used."
},
@{
@"header": @"Enable Rumble",
@"items": @[

View File

@ -14,6 +14,10 @@
screenRect.size.width = self.hasFractionalPixels? resolution.width : floor(resolution.width / 160) * 160;
screenRect.size.height = screenRect.size.width / 160 * 144;
screenRect.origin.x = (resolution.width - screenRect.size.width) / 2;
screenRect.origin.y = (resolution.height - screenRect.size.height) / 2;
self.fullScreenRect = screenRect;
double screenBorderWidth = screenRect.size.width / 40;
screenRect.origin.x = (resolution.width - screenRect.size.width) / 2;
screenRect.origin.y = self.minY + screenBorderWidth * 2;

View File

@ -336,6 +336,11 @@ static void rumbleCallback(GB_gameboy_t *gb, double amp)
name:GCControllerDidConnectNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(controllerDisconnected:)
name:GCControllerDidDisconnectNotification
object:nil];
for (NSString *name in @[UIScreenDidConnectNotification,
UIScreenDidDisconnectNotification,
UIScreenModeDidChangeNotification]) {
@ -381,6 +386,12 @@ static void rumbleCallback(GB_gameboy_t *gb, double amp)
}
}
- (void)controllerDisconnected:(NSNotification *)notification
{
if (notification.object == _lastController) {
_backgroundView.fullScreenMode = false;
}
}
- (void)setControllerHandlers
{
@ -419,6 +430,10 @@ static void rumbleCallback(GB_gameboy_t *gb, double amp)
- (void)controller:(GCController *)controller buttonChanged:(GCControllerButtonInput *)button usage:(GBControllerUsage)usage
{
[self updateLastController:controller];
if (_running && button.value > 0.25 &&
[[NSUserDefaults standardUserDefaults] boolForKey:@"GBControllersHideInterface"]) {
_backgroundView.fullScreenMode = true;
}
GBButton gbButton = [GBSettingsViewController controller:controller convertUsageToButton:usage];
static const double analogThreshold = 0.0625;
@ -488,11 +503,20 @@ static void rumbleCallback(GB_gameboy_t *gb, double amp)
- (void)controller:(GCController *)controller axisChanged:(GCControllerDirectionPad *)axis usage:(GBControllerUsage)usage
{
[self updateLastController:controller];
bool left = axis.left.value > 0.5;
bool right = axis.right.value > 0.5;
bool up = axis.up.value > 0.5;
bool down = axis.down.value > 0.5;
GB_set_key_state(&_gb, GB_KEY_LEFT, axis.left.value > 0.5);
GB_set_key_state(&_gb, GB_KEY_RIGHT, axis.right.value > 0.5);
GB_set_key_state(&_gb, GB_KEY_UP, axis.up.value > 0.5);
GB_set_key_state(&_gb, GB_KEY_DOWN, axis.down.value > 0.5);
if (_running && (left || right || up || down ) &&
[[NSUserDefaults standardUserDefaults] boolForKey:@"GBControllersHideInterface"]) {
_backgroundView.fullScreenMode = true;
}
GB_set_key_state(&_gb, GB_KEY_LEFT, left);
GB_set_key_state(&_gb, GB_KEY_RIGHT, right);
GB_set_key_state(&_gb, GB_KEY_UP, up);
GB_set_key_state(&_gb, GB_KEY_DOWN, down);
}
- (void)controller:(GCController *)controller motionChanged:(GCMotion *)motion
@ -793,7 +817,8 @@ static void rumbleCallback(GB_gameboy_t *gb, double amp)
_backgroundView.frame = [layout viewRectForOrientation:orientation];
_backgroundView.layout = layout;
if (!self.presentedViewController) {
_window.backgroundColor = layout.theme.backgroundGradientBottom;
_window.backgroundColor = _backgroundView.fullScreenMode? [UIColor blackColor] :
layout.theme.backgroundGradientBottom;
}
}
@ -850,9 +875,9 @@ static void rumbleCallback(GB_gameboy_t *gb, double amp)
- (UIStatusBarStyle)preferredStatusBarStyle
{
if (@available(iOS 13.0, *)) {
return _verticalLayout.theme.isDark? UIStatusBarStyleLightContent : UIStatusBarStyleDarkContent;
return (_verticalLayout.theme.isDark || _backgroundView.fullScreenMode)? UIStatusBarStyleLightContent : UIStatusBarStyleDarkContent;
}
return _verticalLayout.theme.isDark? UIStatusBarStyleLightContent : UIStatusBarStyleDefault;
return (_verticalLayout.theme.isDark || _backgroundView.fullScreenMode)? UIStatusBarStyleLightContent : UIStatusBarStyleDefault;
}

View File

@ -26,6 +26,7 @@ int main(int argc, char * argv[])
@"GBDynamicSpeed": @NO,
@"GBInterfaceTheme": @"SameBoy",
@"GBControllersHideInterface": @YES,
@"GBCurrentTheme": @"Lime (Game Boy)",
// Default themes