From 8b889f4ba5d067acacdca0add7fba00c2d813848 Mon Sep 17 00:00:00 2001 From: justin97530 Date: Fri, 23 Sep 2016 15:32:36 +0530 Subject: [PATCH 1/2] Add toggle for using mirrored display as top screen. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This might be useful for streamers or people recording gameplay, where both screens need to be visible. It has been tested on an iPad Pro 9.7 with X-Mirage. This is also my first time working on/modifying an emulator’s code, so the code quality may not be great. --- iNDS/AppDelegate.m | 4 +++- iNDS/iNDSEmulatorViewController.mm | 9 ++++++--- iNDS/settings/Defaults.plist | 2 ++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/iNDS/AppDelegate.m b/iNDS/AppDelegate.m index 0a43c5c..a6a3f5a 100644 --- a/iNDS/AppDelegate.m +++ b/iNDS/AppDelegate.m @@ -519,7 +519,9 @@ - (WCEasySettingsViewController *)getSettingsViewController interfaceSection.items = @[[[WCEasySettingsSwitch alloc] initWithIdentifier:@"fullScreenSettings" title:@"Full Screen Settings"], [[WCEasySettingsSwitch alloc] initWithIdentifier:@"showFPS" - title:@"Show FPS"]]; + title:@"Show FPS"], + [[WCEasySettingsSwitch alloc] initWithIdentifier:@"mirrorDisplay" + title:@"Mirror Display"]]; // Credits diff --git a/iNDS/iNDSEmulatorViewController.mm b/iNDS/iNDSEmulatorViewController.mm index b1c0cf2..b6c108c 100644 --- a/iNDS/iNDSEmulatorViewController.mm +++ b/iNDS/iNDSEmulatorViewController.mm @@ -354,6 +354,9 @@ - (void)defaultsChanged:(NSNotification*)notification int filterTranslate[] = {NONE, EPX, SUPEREAGLE, _2XSAI, SUPER2XSAI, BRZ2x, LQ2X, BRZ3x, HQ2X, HQ4X, BRZ4x, BRZ5x}; NSInteger filter = [[NSUserDefaults standardUserDefaults] integerForKey:@"videoFilter"]; EMU_setFilter(filterTranslate[filter]); + + // Mirror Display + [self performSelector:@selector(screenChanged:) withObject:notification]; } self.directionalControl.style = [defaults integerForKey:@"controlPadStyle"]; self.fpsLabel.hidden = ![defaults integerForKey:@"showFPS"]; @@ -403,7 +406,7 @@ - (void)viewWillLayoutSubviews self.controllerContainerView.alpha = [[NSUserDefaults standardUserDefaults] floatForKey:@"controlOpacity"]; self.startButton.alpha = [[NSUserDefaults standardUserDefaults] floatForKey:@"controlOpacity"]; self.selectButton.alpha = [[NSUserDefaults standardUserDefaults] floatForKey:@"controlOpacity"]; - if ([UIScreen screens].count > 1) { + if ([UIScreen screens].count > 1 && ![[NSUserDefaults standardUserDefaults] boolForKey:@"mirrorDisplay"]) { CGSize screenSize = [UIScreen screens][1].bounds.size; CGSize viewSize = CGSizeMake(MIN(screenSize.width, screenSize.height * 1.333), MIN(screenSize.width, screenSize.height * 1.333) * 0.75); glkView[0].frame = CGRectMake(screenSize.width/2 - viewSize.width/2, screenSize.height/2 - viewSize.height/2, viewSize.width, viewSize.height); @@ -420,7 +423,7 @@ - (void)dealloc - (void)screenChanged:(NSNotification*)notification { [self pauseEmulation]; - if ([UIScreen screens].count > 1) { + if ([UIScreen screens].count > 1 && ![[NSUserDefaults standardUserDefaults] boolForKey:@"mirrorDisplay"]) { UIScreen *extScreen = [UIScreen screens][1]; extScreen.currentMode = extScreen.availableModes[0]; extWindow = [[UIWindow alloc] initWithFrame:extScreen.bounds]; @@ -466,7 +469,7 @@ - (void)initGL //self.context.multiThreaded = YES; NSLog(@"Is multi: %d", self.context.isMultiThreaded); - if ([UIScreen screens].count > 1) { + if ([UIScreen screens].count > 1 && ![[NSUserDefaults standardUserDefaults] boolForKey:@"mirrorDisplay"]) { UIScreen *extScreen = [UIScreen screens][1]; extScreen.currentMode = extScreen.availableModes[0]; extWindow = [[UIWindow alloc] initWithFrame:extScreen.bounds]; diff --git a/iNDS/settings/Defaults.plist b/iNDS/settings/Defaults.plist index 360591a..57ca1ec 100755 --- a/iNDS/settings/Defaults.plist +++ b/iNDS/settings/Defaults.plist @@ -2,6 +2,8 @@ + mirrorDisplay + videoFilter 5 enableMic From 505ab1911962462834baff5c2c84edbb8b4f68ab Mon Sep 17 00:00:00 2001 From: justin97530 Date: Fri, 23 Sep 2016 18:47:44 +0530 Subject: [PATCH 2/2] Fixed freezing/crashing with previous commit. Fix. --- iNDS/iNDSEmulatorViewController.mm | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/iNDS/iNDSEmulatorViewController.mm b/iNDS/iNDSEmulatorViewController.mm index b6c108c..81df775 100644 --- a/iNDS/iNDSEmulatorViewController.mm +++ b/iNDS/iNDSEmulatorViewController.mm @@ -199,6 +199,7 @@ - (void)viewDidLoad [notificationCenter addObserver:self selector:@selector(screenChanged:) name:UIScreenDidDisconnectNotification object:nil]; [notificationCenter addObserver:self selector:@selector(controllerActivated:) name:GCControllerDidConnectNotification object:nil]; [notificationCenter addObserver:self selector:@selector(controllerDeactivated:) name:GCControllerDidDisconnectNotification object:nil]; + [[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"mirrorDisplay" options:NSKeyValueObservingOptionNew context:NULL]; if ([[GCController controllers] count] > 0) { [self controllerActivated:nil]; @@ -338,6 +339,13 @@ - (void)loadProfile:(iNDSEmulationProfile *)profile } +-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if([keyPath isEqual: @"mirrorDisplay"] && emuLoopLock) { + [self performSelector:@selector(screenChanged:)]; + } +} + - (void)defaultsChanged:(NSNotification*)notification { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; @@ -354,9 +362,6 @@ - (void)defaultsChanged:(NSNotification*)notification int filterTranslate[] = {NONE, EPX, SUPEREAGLE, _2XSAI, SUPER2XSAI, BRZ2x, LQ2X, BRZ3x, HQ2X, HQ4X, BRZ4x, BRZ5x}; NSInteger filter = [[NSUserDefaults standardUserDefaults] integerForKey:@"videoFilter"]; EMU_setFilter(filterTranslate[filter]); - - // Mirror Display - [self performSelector:@selector(screenChanged:) withObject:notification]; } self.directionalControl.style = [defaults integerForKey:@"controlPadStyle"]; self.fpsLabel.hidden = ![defaults integerForKey:@"showFPS"]; @@ -418,6 +423,7 @@ - (void)dealloc { EMU_closeRom(); [[NSNotificationCenter defaultCenter] removeObserver:self]; + [[NSUserDefaults standardUserDefaults] removeObserver:self forKeyPath:@"mirrorDisplay"]; } - (void)screenChanged:(NSNotification*)notification