SameBoy | Accurate GB/GBC emulator |
| download: https://git.y1.nz/archives/sameboy.tar.gz | |
| README | Files | Log | Refs | LICENSE |
commit 10a869edf57fead4b9dd151b6229779a5e7c276c parent d85a2614e5fda84316b49cf269d37f2231475d47 Author: Lior Halphon <LIJI32@gmail.com> Date: Sat, 3 Jan 2026 13:42:09 +0200 Allow assigning iOS controller inputs to one of 4 hotkey commands Diffstat:
| M | iOS/GBBackgroundView.h | 2 | ++ |
| M | iOS/GBBackgroundView.m | 32 | ++++++++++++++++++-------------- |
| M | iOS/GBSettingsViewController.h | 6 | ++++-- |
| M | iOS/GBSettingsViewController.m | 24 | ++++++++++++++---------- |
| M | iOS/GBViewController.m | 22 | ++++++++++++++++++++++ |
5 files changed, 60 insertions(+), 26 deletions(-)
diff --git a/iOS/GBBackgroundView.h b/iOS/GBBackgroundView.h @@ -13,4 +13,6 @@ - (void)enterPreviewMode:(bool)showLabel; - (void)reloadThemeImages; - (void)fadeOverlayOut; +- (void)saveSwipeFromController:(bool)fromController; +- (void)loadSwipeFromController:(bool)fromController; @end diff --git a/iOS/GBBackgroundView.m b/iOS/GBBackgroundView.m @@ -373,10 +373,10 @@ static GB_key_mask_t angleToKeyMask(double angle) [self rewindSwipe]; } else if (point.y - _screenSwipeOrigin.y > 32) { - [self saveSwipe]; + [self saveSwipeFromController:false]; } else if (point.y - _screenSwipeOrigin.y < -32) { - [self loadSwipe]; + [self loadSwipeFromController:false]; } continue; } @@ -576,13 +576,15 @@ static GB_key_mask_t angleToKeyMask(double angle) return [[GBROMManager sharedManager] stateFile:1]; } -- (void)saveSwipe +- (void)saveSwipeFromController:(bool)fromController { - _screenSwiped = true; - self.viewController.runMode = GBRunModeNormal; - if (![[NSUserDefaults standardUserDefaults] boolForKey:@"GBSwipeState"]) { - [self fadeOverlayOut]; - return; + if (!fromController) { + _screenSwiped = true; + self.viewController.runMode = GBRunModeNormal; + if (![[NSUserDefaults standardUserDefaults] boolForKey:@"GBSwipeState"]) { + [self fadeOverlayOut]; + return; + } } [self displayOverlayWithImage:@"square.and.arrow.down" orTitle:@"Saved state to Slot 1"]; _fadeTimer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:false block:^(NSTimer *timer) { @@ -593,13 +595,15 @@ static GB_key_mask_t angleToKeyMask(double angle) [self.viewController start]; } -- (void)loadSwipe +- (void)loadSwipeFromController:(bool)fromController { - _screenSwiped = true; - self.viewController.runMode = GBRunModeNormal; - if (![[NSUserDefaults standardUserDefaults] boolForKey:@"GBSwipeState"]) { - [self fadeOverlayOut]; - return; + if (!fromController) { + _screenSwiped = true; + self.viewController.runMode = GBRunModeNormal; + if (![[NSUserDefaults standardUserDefaults] boolForKey:@"GBSwipeState"]) { + [self fadeOverlayOut]; + return; + } } [self displayOverlayWithImage:@"square.and.arrow.up" orTitle:@"Loaded state from Slot 1"]; _fadeTimer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:false block:^(NSTimer *timer) { diff --git a/iOS/GBSettingsViewController.h b/iOS/GBSettingsViewController.h @@ -17,8 +17,10 @@ typedef enum { GBUnderclock, GBRapidA, GBRapidB, - // GBHotkey1, // Todo - // GBHotkey2, // Todo + GBSaveState1, + GBLoadState1, + GBOpenMenu, + GBReset, GBUnusedButton = 0xFF, } GBButton; diff --git a/iOS/GBSettingsViewController.m b/iOS/GBSettingsViewController.m @@ -377,6 +377,16 @@ static NSString const *typeTurboSlider = @"turboSlider"; }, @{ @"items": @[ + @{@"type": typeCheck, @"pref": @"GBButtonHaptics", @"title": @"Enable Button Haptics"}, + @{@"type": typeSlider, @"pref": @"GBHapticsStrength", @"min": @0.25, @"max": @1, @"minImage": @"waveform.weak", @"maxImage": @"waveform", + @"previewBlock": ^void(void){ + [[GBHapticManager sharedManager] doTapHaptic]; + } + } + ], + }, + @{ + @"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." @@ -388,16 +398,6 @@ static NSString const *typeTurboSlider = @"turboSlider"; @{@"type": typeRadio, @"pref": @"GBFauxAnalogInputs", @"title": @"Faux Analog", @"value": @YES}, ], }, - @{ - @"items": @[ - @{@"type": typeCheck, @"pref": @"GBButtonHaptics", @"title": @"Enable Button Haptics"}, - @{@"type": typeSlider, @"pref": @"GBHapticsStrength", @"min": @0.25, @"max": @1, @"minImage": @"waveform.weak", @"maxImage": @"waveform", - @"previewBlock": ^void(void){ - [[GBHapticManager sharedManager] doTapHaptic]; - } - } - ], - }, ]; @@ -633,6 +633,10 @@ static NSString *LocalizedNameForElement(GCControllerElement *element, GBControl @{@"type": typeRadio, @"getter": getter, @"setter": setter, @"title": @"Turbo", @"value": @(GBTurbo)}, @{@"type": typeRadio, @"getter": getter, @"setter": setter, @"title": @"Rewind", @"value": @(GBRewind)}, @{@"type": typeRadio, @"getter": getter, @"setter": setter, @"title": @"Slow-motion", @"value": @(GBUnderclock)}, + @{@"type": typeRadio, @"getter": getter, @"setter": setter, @"title": @"Save State 1", @"value": @(GBSaveState1)}, + @{@"type": typeRadio, @"getter": getter, @"setter": setter, @"title": @"Load State 1", @"value": @(GBLoadState1)}, + @{@"type": typeRadio, @"getter": getter, @"setter": setter, @"title": @"Open Menu", @"value": @(GBOpenMenu)}, + @{@"type": typeRadio, @"getter": getter, @"setter": setter, @"title": @"Reset", @"value": @(GBReset)}, ]}], }; if (@available(iOS 14.0, *)) { diff --git a/iOS/GBViewController.m b/iOS/GBViewController.m @@ -762,6 +762,28 @@ static void rumbleCallback(GB_gameboy_t *gb, double amp) } } break; + case GBSaveState1: + if (_romLoaded) { + [_backgroundView saveSwipeFromController:true]; + } + break; + case GBLoadState1: + if (_romLoaded) { + [_backgroundView loadSwipeFromController:true]; + } + break; + case GBReset: + if (_romLoaded) { + [self stop]; + _skipAutoLoad = true; + GB_reset(&_gb); + [self start]; + } + break; + case GBOpenMenu: + self.window.backgroundColor = nil; + [self presentViewController:[GBMenuViewController menu] animated:true completion:nil]; + break; default: break; } }
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.