From 2114e392378301d832a2018fea6da423f755da65 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 1 Nov 2020 11:50:00 -0600 Subject: [PATCH] Plumb touch mode and stats overlay preferences --- Limelight/Database/DataManager.h | 5 +- Limelight/Database/DataManager.m | 8 +- Limelight/Database/TemporarySettings.h | 3 +- Limelight/Database/TemporarySettings.m | 4 +- Limelight/Input/StreamView.m | 24 ++++-- .../Limelight.xcdatamodeld/.xccurrentversion | 2 +- .../Moonlight v1.6.xcdatamodel/contents | 43 ++++++++++ Limelight/Stream/StreamConfiguration.h | 1 - Limelight/Stream/StreamConfiguration.m | 2 +- .../ViewControllers/MainFrameViewController.m | 1 - .../ViewControllers/SettingsViewController.h | 2 + .../ViewControllers/SettingsViewController.m | 16 +++- Moonlight TV/Settings.bundle/Root.plist | 10 +++ Moonlight.xcodeproj/project.pbxproj | 4 +- iPad.storyboard | 71 ++++++++++++---- iPhone.storyboard | 82 +++++++++++++------ 16 files changed, 221 insertions(+), 57 deletions(-) create mode 100644 Limelight/Limelight.xcdatamodeld/Moonlight v1.6.xcdatamodel/contents diff --git a/Limelight/Database/DataManager.h b/Limelight/Database/DataManager.h index f77b6c70..d155885c 100644 --- a/Limelight/Database/DataManager.h +++ b/Limelight/Database/DataManager.h @@ -18,13 +18,14 @@ height:(NSInteger)height width:(NSInteger)width onscreenControls:(NSInteger)onscreenControls - remote:(BOOL)streamingRemotely optimizeGames:(BOOL)optimizeGames multiController:(BOOL)multiController audioOnPC:(BOOL)audioOnPC useHevc:(BOOL)useHevc enableHdr:(BOOL)enableHdr - btMouseSupport:(BOOL)btMouseSupport; + btMouseSupport:(BOOL)btMouseSupport + absoluteTouchMode:(BOOL)absoluteTouchMode + statsOverlay:(BOOL)statsOverlay; - (NSArray*) getHosts; - (void) updateHost:(TemporaryHost*)host; diff --git a/Limelight/Database/DataManager.m b/Limelight/Database/DataManager.m index fb7ae54c..ac616648 100644 --- a/Limelight/Database/DataManager.m +++ b/Limelight/Database/DataManager.m @@ -58,13 +58,14 @@ height:(NSInteger)height width:(NSInteger)width onscreenControls:(NSInteger)onscreenControls - remote:(BOOL)streamingRemotely optimizeGames:(BOOL)optimizeGames multiController:(BOOL)multiController audioOnPC:(BOOL)audioOnPC useHevc:(BOOL)useHevc enableHdr:(BOOL)enableHdr - btMouseSupport:(BOOL)btMouseSupport { + btMouseSupport:(BOOL)btMouseSupport + absoluteTouchMode:(BOOL)absoluteTouchMode + statsOverlay:(BOOL)statsOverlay { [_managedObjectContext performBlockAndWait:^{ Settings* settingsToSave = [self retrieveSettings]; @@ -73,13 +74,14 @@ settingsToSave.height = [NSNumber numberWithInteger:height]; settingsToSave.width = [NSNumber numberWithInteger:width]; settingsToSave.onscreenControls = [NSNumber numberWithInteger:onscreenControls]; - settingsToSave.streamingRemotely = streamingRemotely; settingsToSave.optimizeGames = optimizeGames; settingsToSave.multiController = multiController; settingsToSave.playAudioOnPC = audioOnPC; settingsToSave.useHevc = useHevc; settingsToSave.enableHdr = enableHdr; settingsToSave.btMouseSupport = btMouseSupport; + settingsToSave.absoluteTouchMode = absoluteTouchMode; + settingsToSave.statsOverlay = statsOverlay; [self saveData]; }]; diff --git a/Limelight/Database/TemporarySettings.h b/Limelight/Database/TemporarySettings.h index c249976b..cb9f2cbc 100644 --- a/Limelight/Database/TemporarySettings.h +++ b/Limelight/Database/TemporarySettings.h @@ -18,13 +18,14 @@ @property (nonatomic, retain) NSNumber * width; @property (nonatomic, retain) NSNumber * onscreenControls; @property (nonatomic, retain) NSString * uniqueId; -@property (nonatomic) BOOL streamingRemotely; @property (nonatomic) BOOL useHevc; @property (nonatomic) BOOL multiController; @property (nonatomic) BOOL playAudioOnPC; @property (nonatomic) BOOL optimizeGames; @property (nonatomic) BOOL enableHdr; @property (nonatomic) BOOL btMouseSupport; +@property (nonatomic) BOOL absoluteTouchMode; +@property (nonatomic) BOOL statsOverlay; - (id) initFromSettings:(Settings*)settings; diff --git a/Limelight/Database/TemporarySettings.m b/Limelight/Database/TemporarySettings.m index aec111a6..07119719 100644 --- a/Limelight/Database/TemporarySettings.m +++ b/Limelight/Database/TemporarySettings.m @@ -40,6 +40,7 @@ self.optimizeGames = [[NSUserDefaults standardUserDefaults] boolForKey:@"optimizeGames"]; self.multiController = [[NSUserDefaults standardUserDefaults] boolForKey:@"multipleControllers"]; self.btMouseSupport = [[NSUserDefaults standardUserDefaults] boolForKey:@"btMouseSupport"]; + self.statsOverlay = [[NSUserDefaults standardUserDefaults] boolForKey:@"statsOverlay"]; NSInteger _screenSize = [[NSUserDefaults standardUserDefaults] integerForKey:@"streamResolution"]; switch (_screenSize) { @@ -71,9 +72,10 @@ self.multiController = settings.multiController; self.onscreenControls = settings.onscreenControls; self.btMouseSupport = settings.btMouseSupport; + self.absoluteTouchMode = settings.absoluteTouchMode; + self.statsOverlay = settings.statsOverlay; #endif self.uniqueId = settings.uniqueId; - self.streamingRemotely = settings.streamingRemotely; return self; } diff --git a/Limelight/Input/StreamView.m b/Limelight/Input/StreamView.m index f989bee0..025c5a34 100644 --- a/Limelight/Input/StreamView.m +++ b/Limelight/Input/StreamView.m @@ -12,6 +12,7 @@ #import "ControllerSupport.h" #import "KeyboardSupport.h" #import "RelativeTouchHandler.h" +#import "AbsoluteTouchHandler.h" static const double X1_MOUSE_SPEED_DIVISOR = 2.5; @@ -32,7 +33,7 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; double accumulatedMouseDeltaX; double accumulatedMouseDeltaY; - RelativeTouchHandler* touchHandler; + UIResponder* touchHandler; id interactionDelegate; NSTimer* interactionTimer; @@ -48,14 +49,27 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; self->interactionDelegate = interactionDelegate; self->streamAspectRatio = (float)streamConfig.width / (float)streamConfig.height; - self->touchHandler = [[RelativeTouchHandler alloc] initWithView:self]; - TemporarySettings* settings = [[[DataManager alloc] init] getSettings]; -#if !TARGET_OS_TV +#if TARGET_OS_TV + // tvOS requires RelativeTouchHandler to manage Apple Remote input + self->touchHandler = [[RelativeTouchHandler alloc] initWithView:self]; +#else + // iOS uses RelativeTouchHandler or AbsoluteTouchHandler depending on user preference + if (settings.absoluteTouchMode) { + self->touchHandler = [[AbsoluteTouchHandler alloc] initWithView:self]; + } + else { + self->touchHandler = [[RelativeTouchHandler alloc] initWithView:self]; + } + onScreenControls = [[OnScreenControls alloc] initWithView:self controllerSup:controllerSupport swipeDelegate:swipeDelegate]; OnScreenControlsLevel level = (OnScreenControlsLevel)[settings.onscreenControls integerValue]; - if (level == OnScreenControlsLevelAuto) { + if (settings.absoluteTouchMode) { + Log(LOG_I, @"On-screen controls disabled in absolute touch mode"); + [onScreenControls setLevel:OnScreenControlsLevelOff]; + } + else if (level == OnScreenControlsLevelAuto) { [controllerSupport initAutoOnScreenControlMode:onScreenControls]; } else { diff --git a/Limelight/Limelight.xcdatamodeld/.xccurrentversion b/Limelight/Limelight.xcdatamodeld/.xccurrentversion index 3ebeef5d..c2a8b517 100644 --- a/Limelight/Limelight.xcdatamodeld/.xccurrentversion +++ b/Limelight/Limelight.xcdatamodeld/.xccurrentversion @@ -3,6 +3,6 @@ _XCCurrentVersionName - Moonlight v1.5.xcdatamodel + Moonlight v1.6.xcdatamodel diff --git a/Limelight/Limelight.xcdatamodeld/Moonlight v1.6.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Moonlight v1.6.xcdatamodel/contents new file mode 100644 index 00000000..15090450 --- /dev/null +++ b/Limelight/Limelight.xcdatamodeld/Moonlight v1.6.xcdatamodel/contents @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Limelight/Stream/StreamConfiguration.h b/Limelight/Stream/StreamConfiguration.h index 145db82f..cff66488 100644 --- a/Limelight/Stream/StreamConfiguration.h +++ b/Limelight/Stream/StreamConfiguration.h @@ -18,7 +18,6 @@ @property int frameRate; @property int bitRate; @property int riKeyId; -@property BOOL streamingRemotely; @property NSData* riKey; @property int gamepadMask; @property BOOL optimizeGameSettings; diff --git a/Limelight/Stream/StreamConfiguration.m b/Limelight/Stream/StreamConfiguration.m index 371eafb6..3eefdd49 100644 --- a/Limelight/Stream/StreamConfiguration.m +++ b/Limelight/Stream/StreamConfiguration.m @@ -9,5 +9,5 @@ #import "StreamConfiguration.h" @implementation StreamConfiguration -@synthesize host, appID, width, height, frameRate, bitRate, riKeyId, riKey, gamepadMask, streamingRemotely, appName, optimizeGameSettings, playAudioOnPC, audioConfiguration, enableHdr, multiController, allowHevc, serverCert; +@synthesize host, appID, width, height, frameRate, bitRate, riKeyId, riKey, gamepadMask, appName, optimizeGameSettings, playAudioOnPC, audioConfiguration, enableHdr, multiController, allowHevc, serverCert; @end diff --git a/Limelight/ViewControllers/MainFrameViewController.m b/Limelight/ViewControllers/MainFrameViewController.m index f58cd90b..88164da8 100644 --- a/Limelight/ViewControllers/MainFrameViewController.m +++ b/Limelight/ViewControllers/MainFrameViewController.m @@ -605,7 +605,6 @@ static NSMutableSet* hostList; #endif _streamConfig.bitRate = [streamSettings.bitrate intValue]; - _streamConfig.streamingRemotely = streamSettings.streamingRemotely; _streamConfig.optimizeGameSettings = streamSettings.optimizeGames; _streamConfig.playAudioOnPC = streamSettings.playAudioOnPC; _streamConfig.allowHevc = streamSettings.useHevc; diff --git a/Limelight/ViewControllers/SettingsViewController.h b/Limelight/ViewControllers/SettingsViewController.h index 825e65f5..5e6b7a4e 100644 --- a/Limelight/ViewControllers/SettingsViewController.h +++ b/Limelight/ViewControllers/SettingsViewController.h @@ -14,12 +14,14 @@ @property (strong, nonatomic) IBOutlet UISlider *bitrateSlider; @property (strong, nonatomic) IBOutlet UISegmentedControl *framerateSelector; @property (strong, nonatomic) IBOutlet UISegmentedControl *resolutionSelector; +@property (strong, nonatomic) IBOutlet UISegmentedControl *touchModeSelector; @property (strong, nonatomic) IBOutlet UISegmentedControl *onscreenControlSelector; @property (strong, nonatomic) IBOutlet UISegmentedControl *optimizeSettingsSelector; @property (strong, nonatomic) IBOutlet UISegmentedControl *multiControllerSelector; @property (strong, nonatomic) IBOutlet UISegmentedControl *audioOnPCSelector; @property (strong, nonatomic) IBOutlet UISegmentedControl *hevcSelector; @property (strong, nonatomic) IBOutlet UISegmentedControl *btMouseSelector; +@property (strong, nonatomic) IBOutlet UISegmentedControl *statsOverlaySelector; @property (strong, nonatomic) IBOutlet UIScrollView *scrollView; #pragma clang diagnostic push diff --git a/Limelight/ViewControllers/SettingsViewController.m b/Limelight/ViewControllers/SettingsViewController.m index aec4a317..c31fbc5c 100644 --- a/Limelight/ViewControllers/SettingsViewController.m +++ b/Limelight/ViewControllers/SettingsViewController.m @@ -193,6 +193,9 @@ static const int bitrateTable[] = { [self.hevcSelector setEnabled:NO]; } + [self.touchModeSelector setSelectedSegmentIndex:currentSettings.absoluteTouchMode ? 1 : 0]; + [self.touchModeSelector addTarget:self action:@selector(touchModeChanged) forControlEvents:UIControlEventValueChanged]; + [self.statsOverlaySelector setSelectedSegmentIndex:currentSettings.statsOverlay ? 1 : 0]; [self.btMouseSelector setSelectedSegmentIndex:currentSettings.btMouseSupport ? 1 : 0]; [self.optimizeSettingsSelector setSelectedSegmentIndex:currentSettings.optimizeGames ? 1 : 0]; [self.multiControllerSelector setSelectedSegmentIndex:currentSettings.multiController ? 1 : 0]; @@ -203,6 +206,7 @@ static const int bitrateTable[] = { [self.framerateSelector setSelectedSegmentIndex:framerate]; [self.framerateSelector addTarget:self action:@selector(newResolutionFpsChosen) forControlEvents:UIControlEventValueChanged]; [self.onscreenControlSelector setSelectedSegmentIndex:onscreenControls]; + [self.onscreenControlSelector setEnabled:!currentSettings.absoluteTouchMode]; [self.bitrateSlider setMinimumValue:0]; [self.bitrateSlider setMaximumValue:(sizeof(bitrateTable) / sizeof(*bitrateTable)) - 1]; [self.bitrateSlider setValue:[self getSliderValueForBitrate:_bitrate] animated:YES]; @@ -210,6 +214,11 @@ static const int bitrateTable[] = { [self updateBitrateText]; } +- (void) touchModeChanged { + // Disable on-screen controls in absolute touch mode + [self.onscreenControlSelector setEnabled:[self.touchModeSelector selectedSegmentIndex] == 0]; +} + - (void) newResolutionFpsChosen { NSInteger fps = [self getChosenFrameRate]; NSInteger width = [self getChosenStreamWidth]; @@ -294,18 +303,21 @@ static const int bitrateTable[] = { BOOL audioOnPC = [self.audioOnPCSelector selectedSegmentIndex] == 1; BOOL useHevc = [self.hevcSelector selectedSegmentIndex] == 1; BOOL btMouseSupport = [self.btMouseSelector selectedSegmentIndex] == 1; + BOOL absoluteTouchMode = [self.touchModeSelector selectedSegmentIndex] == 1; + BOOL statsOverlay = [self.statsOverlaySelector selectedSegmentIndex] == 1; [dataMan saveSettingsWithBitrate:_bitrate framerate:framerate height:height width:width onscreenControls:onscreenControls - remote:NO optimizeGames:optimizeGames multiController:multiController audioOnPC:audioOnPC useHevc:useHevc enableHdr:NO - btMouseSupport:btMouseSupport]; + btMouseSupport:btMouseSupport + absoluteTouchMode:absoluteTouchMode + statsOverlay:statsOverlay]; } - (void)didReceiveMemoryWarning { diff --git a/Moonlight TV/Settings.bundle/Root.plist b/Moonlight TV/Settings.bundle/Root.plist index b3bfdf08..84ce0eda 100644 --- a/Moonlight TV/Settings.bundle/Root.plist +++ b/Moonlight TV/Settings.bundle/Root.plist @@ -156,6 +156,16 @@ DefaultValue + + Type + PSToggleSwitchSpecifier + Title + Statistics Overlay + Key + statsOverlay + DefaultValue + + diff --git a/Moonlight.xcodeproj/project.pbxproj b/Moonlight.xcodeproj/project.pbxproj index 5b960c68..6f4ab26b 100644 --- a/Moonlight.xcodeproj/project.pbxproj +++ b/Moonlight.xcodeproj/project.pbxproj @@ -166,6 +166,7 @@ 9819CC13254F107A008A7C8E /* RelativeTouchHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RelativeTouchHandler.m; sourceTree = ""; }; 9819CC20254F180F008A7C8E /* AbsoluteTouchHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AbsoluteTouchHandler.h; sourceTree = ""; }; 9819CC21254F180F008A7C8E /* AbsoluteTouchHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AbsoluteTouchHandler.m; sourceTree = ""; }; + 9819CC25254F2734008A7C8E /* Moonlight v1.6.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.6.xcdatamodel"; sourceTree = ""; }; 9827E7A22514366900F25707 /* HapticContext.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HapticContext.m; sourceTree = ""; }; 9827E7A7251436EA00F25707 /* HapticContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HapticContext.h; sourceTree = ""; }; 9832D1341BBCD5C50036EF48 /* TemporaryApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TemporaryApp.h; path = Database/TemporaryApp.h; sourceTree = ""; }; @@ -1411,6 +1412,7 @@ FB290D0519B2C406004C83CF /* Limelight.xcdatamodeld */ = { isa = XCVersionGroup; children = ( + 9819CC25254F2734008A7C8E /* Moonlight v1.6.xcdatamodel */, 98783FEA242EAC5D00F00EF4 /* Moonlight v1.5.xcdatamodel */, 98608BDD22DC0C2C000E5672 /* Moonlight v1.4.xcdatamodel */, 98517B1B21CE0A9000481377 /* Moonlight v1.3.xcdatamodel */, @@ -1422,7 +1424,7 @@ FB4678F21A51BDCB00377732 /* Limelight 0.3.0.xcdatamodel */, FB290D0619B2C406004C83CF /* Limelight.xcdatamodel */, ); - currentVersion = 98783FEA242EAC5D00F00EF4 /* Moonlight v1.5.xcdatamodel */; + currentVersion = 9819CC25254F2734008A7C8E /* Moonlight v1.6.xcdatamodel */; path = Limelight.xcdatamodeld; sourceTree = ""; versionGroupType = wrapper.xcdatamodel; diff --git a/iPad.storyboard b/iPad.storyboard index 34013869..c57de78a 100644 --- a/iPad.storyboard +++ b/iPad.storyboard @@ -1,9 +1,9 @@ - + - + @@ -114,8 +114,25 @@ + + + + + + + + + + + - + @@ -135,14 +152,14 @@ - + @@ -152,14 +169,14 @@ - + @@ -169,14 +186,14 @@ - + @@ -186,14 +203,14 @@ - + @@ -203,14 +220,31 @@ - + + + + + + + + + + + + @@ -220,7 +254,7 @@ - + @@ -233,6 +267,8 @@ + + @@ -365,4 +401,9 @@ + + + + + diff --git a/iPhone.storyboard b/iPhone.storyboard index 467faba0..62fc8c79 100644 --- a/iPhone.storyboard +++ b/iPhone.storyboard @@ -1,9 +1,9 @@ - - + + - + @@ -12,7 +12,7 @@ - + @@ -60,7 +60,7 @@ - + @@ -82,7 +82,7 @@ - + @@ -264,7 +300,7 @@ - + @@ -288,7 +324,7 @@ - + - +