From d90bf747fc0f5e5073c19ef9c0b2a3e5f7b69ecb Mon Sep 17 00:00:00 2001 From: True Zhuanjia Date: Sat, 10 Aug 2024 21:02:35 +0800 Subject: [PATCH] add OSC visual feedback & corresponding menu option. adjust menu option layout for iPhone --- Limelight/Base.lproj/iPad.storyboard | 86 ++++++++++------- Limelight/Base.lproj/iPhone.storyboard | 94 +++++++++++-------- Limelight/Database/DataManager.h | 3 +- Limelight/Database/DataManager.m | 2 + Limelight/Database/TemporarySettings.h | 2 +- Limelight/Database/TemporarySettings.m | 1 + Limelight/Input/OnScreenControls.m | 92 +++++++++++++++++- .../Moonlight v1.10.xcdatamodel/contents | 1 + Limelight/Stream/StreamConfiguration.h | 1 + .../OSCProfilesTableViewController.m | 1 - .../ViewControllers/MainFrameViewController.m | 1 + .../ViewControllers/SettingsViewController.h | 1 + .../ViewControllers/SettingsViewController.m | 8 +- Limelight/mul.lproj/iPad.xcstrings | 90 ++++++++++++++++++ Limelight/mul.lproj/iPhone.xcstrings | 90 ++++++++++++++++++ 15 files changed, 391 insertions(+), 82 deletions(-) diff --git a/Limelight/Base.lproj/iPad.storyboard b/Limelight/Base.lproj/iPad.storyboard index f35ccf94..1316a9c3 100644 --- a/Limelight/Base.lproj/iPad.storyboard +++ b/Limelight/Base.lproj/iPad.storyboard @@ -181,7 +181,7 @@ - + @@ -219,14 +219,14 @@ - + @@ -236,14 +236,14 @@ - + @@ -253,14 +253,14 @@ - + @@ -270,14 +270,14 @@ - + @@ -287,12 +287,12 @@ - + - + - + @@ -327,21 +327,21 @@ ICAgICAgICAgICAgICA - + @@ -351,14 +351,14 @@ ICAgICAgICAgICAgICA - + @@ -370,14 +370,14 @@ ICAgICAgICAgICAgICA - + @@ -387,14 +387,14 @@ ICAgICAgICAgICAgICA - + @@ -404,14 +404,14 @@ ICAgICAgICAgICAgICA - + @@ -421,14 +421,14 @@ ICAgICAgICAgICAgICA - + @@ -438,14 +438,14 @@ ICAgICAgICAgICAgICA - + @@ -455,7 +455,7 @@ ICAgICAgICAgICAgICA - + @@ -493,13 +493,30 @@ ICAgICAgICAgICAgICA + + + + + + + + + + + @@ -525,6 +542,7 @@ ICAgICAgICAgICAgICA + @@ -545,7 +563,7 @@ ICAgICAgICAgICAgICA - + @@ -871,7 +889,7 @@ ICAgICAgICAgICAgICA - + diff --git a/Limelight/Base.lproj/iPhone.storyboard b/Limelight/Base.lproj/iPhone.storyboard index cf522879..9c24d32a 100644 --- a/Limelight/Base.lproj/iPhone.storyboard +++ b/Limelight/Base.lproj/iPhone.storyboard @@ -83,7 +83,7 @@ - + - + @@ -542,6 +559,7 @@ ICAgICAgICAgICAgIA + @@ -562,7 +580,7 @@ ICAgICAgICAgICAgIA - + @@ -867,7 +885,7 @@ ICAgICAgICAgICAgIA - + diff --git a/Limelight/Database/DataManager.h b/Limelight/Database/DataManager.h index f164c79d..6278acaf 100644 --- a/Limelight/Database/DataManager.h +++ b/Limelight/Database/DataManager.h @@ -19,12 +19,13 @@ width:(NSInteger)width audioConfig:(NSInteger)audioConfig onscreenControls:(NSInteger)onscreenControls - keyboardToggleFingers:(NSInteger)keyboardToggleFingers + keyboardToggleFingers:(NSInteger)keyboardToggleFingers slideToSettingsScreenEdge:(NSInteger)slideToSettingsScreenEdge slideToSettingsDistance:(CGFloat)slideToSettingsDistance pointerVelocityModeDivider:(CGFloat)pointerVelocityModeDivider touchPointerVelocityFactor:(CGFloat)touchPointerVelocityFactor mousePointerVelocityFactor:(CGFloat)mousePointerVelocityFactor + oscVisualFeedback:(BOOL)oscVisualFeedback liftStreamViewForKeyboard:(BOOL)liftStreamViewForKeyboard showKeyboardToolbar:(BOOL)showKeyboardToolbar optimizeGames:(BOOL)optimizeGames diff --git a/Limelight/Database/DataManager.m b/Limelight/Database/DataManager.m index 5979fcb3..8f5386ea 100644 --- a/Limelight/Database/DataManager.m +++ b/Limelight/Database/DataManager.m @@ -64,6 +64,7 @@ pointerVelocityModeDivider:(CGFloat)pointerVelocityModeDivider touchPointerVelocityFactor:(CGFloat)touchPointerVelocityFactor mousePointerVelocityFactor:(CGFloat)mousePointerVelocityFactor + oscVisualFeedback:(BOOL)oscVisualFeedback liftStreamViewForKeyboard:(BOOL)liftStreamViewForKeyboard showKeyboardToolbar:(BOOL)showKeyboardToolbar optimizeGames:(BOOL)optimizeGames @@ -93,6 +94,7 @@ settingsToSave.pointerVelocityModeDivider = [NSNumber numberWithFloat:pointerVelocityModeDivider]; settingsToSave.touchPointerVelocityFactor = [NSNumber numberWithFloat:touchPointerVelocityFactor]; settingsToSave.mousePointerVelocityFactor = [NSNumber numberWithFloat:mousePointerVelocityFactor]; + settingsToSave.oscVisualFeedback = oscVisualFeedback; settingsToSave.liftStreamViewForKeyboard = liftStreamViewForKeyboard; settingsToSave.showKeyboardToolbar = showKeyboardToolbar; settingsToSave.optimizeGames = optimizeGames; diff --git a/Limelight/Database/TemporarySettings.h b/Limelight/Database/TemporarySettings.h index a83d7e72..b82b2a8d 100644 --- a/Limelight/Database/TemporarySettings.h +++ b/Limelight/Database/TemporarySettings.h @@ -36,6 +36,7 @@ CODEC_PREF_HEVC, CODEC_PREF_AV1, } preferredCodec; +@property (nonatomic) BOOL oscVisualFeedback; @property (nonatomic) BOOL useFramePacing; @property (nonatomic) BOOL multiController; @property (nonatomic) BOOL swapABXYButtons; @@ -50,7 +51,6 @@ @property (nonatomic) BOOL showKeyboardToolbar; @property (nonatomic) BOOL allowPortrait; - - (id) initFromSettings:(Settings*)settings; @end diff --git a/Limelight/Database/TemporarySettings.m b/Limelight/Database/TemporarySettings.m index 2b509cb8..56b32443 100644 --- a/Limelight/Database/TemporarySettings.m +++ b/Limelight/Database/TemporarySettings.m @@ -82,6 +82,7 @@ self.multiController = settings.multiController; self.swapABXYButtons = settings.swapABXYButtons; self.onscreenControls = settings.onscreenControls; + self.oscVisualFeedback = settings.oscVisualFeedback; self.btMouseSupport = settings.btMouseSupport; // self.absoluteTouchMode = settings.absoluteTouchMode; self.touchMode = settings.touchMode; diff --git a/Limelight/Input/OnScreenControls.m b/Limelight/Input/OnScreenControls.m index ddfd9a22..74beeaeb 100644 --- a/Limelight/Input/OnScreenControls.m +++ b/Limelight/Input/OnScreenControls.m @@ -12,6 +12,7 @@ #include "Limelight.h" #import "OnScreenButtonState.h" #import "OSCProfilesManager.h" +#import "DataManager.h" #define UPDATE_BUTTON(x, y) (buttonFlags = \ @@ -25,6 +26,10 @@ UITouch* _xTouch; UITouch* _yTouch; UITouch* _dpadTouch; + UITouch* _upTouch; + UITouch* _leftTouch; + UITouch* _rightTouch; + UITouch* _downTouch; UITouch* _lsTouch; UITouch* _rsTouch; UITouch* _startTouch; @@ -51,6 +56,7 @@ Controller *_controller; NSMutableArray* _deadTouches; BOOL _swapABXY; + BOOL _visualFeedback; OSCProfilesManager *profilesManager; NSMutableDictionary *_activeCustomOscButtonPositionDict; } @@ -135,8 +141,9 @@ static float L3_Y; _deadTouches = [[NSMutableArray alloc] init]; if (streamConfig) { _swapABXY = streamConfig.swapABXYButtons; + _visualFeedback = streamConfig.oscVisualFeedback; // turn visual feedback of the OSC buttons on or off } - + _iPad = ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad); _controlArea = CGRectMake(0, 0, _view.frame.size.width, _view.frame.size.height); if (_iPad) @@ -786,17 +793,27 @@ static float L3_Y; // Allow the user to slide their finger to another d-pad button if ([_upButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:UP_FLAG]; + [self oscButtonTouchDownVisualEffect:_upButton]; updated = true; - } else if ([_downButton.presentationLayer hitTest:touchLocation]) { + } else _upButton.shadowOpacity = 0.0; + + if ([_downButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:DOWN_FLAG]; + [self oscButtonTouchDownVisualEffect:_downButton]; updated = true; - } else if ([_leftButton.presentationLayer hitTest:touchLocation]) { + } else _downButton.shadowOpacity = 0.0; + + if ([_leftButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:LEFT_FLAG]; + [self oscButtonTouchDownVisualEffect:_leftButton]; updated = true; - } else if ([_rightButton.presentationLayer hitTest:touchLocation]) { + } else _leftButton.shadowOpacity = 0.0; + + if ([_rightButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:RIGHT_FLAG]; + [self oscButtonTouchDownVisualEffect:_rightButton]; updated = true; - } + } else _rightButton.shadowOpacity = 0.0; buttonTouch = true; } else if (touch == _aTouch) { @@ -834,6 +851,35 @@ static float L3_Y; return updated || buttonTouch; } + +- (void)oscButtonTouchDownVisualEffect:(CALayer* )button{ + if(_visualFeedback){ + [CATransaction begin]; + [CATransaction setDisableActions:YES]; // Disable implicit animations + + button.borderColor = [UIColor clearColor].CGColor; // Color of the outline + button.borderWidth = 20; // Width of the outline + button.cornerRadius = 45; + + // 使用 shadowPath 定义阴影形状和扩展范围 + CGFloat spread = 15; // 扩散的大小 + CGRect largerRect = CGRectInset(button.bounds, -spread, -spread); + UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRoundedRect:largerRect cornerRadius:button.cornerRadius]; + button.shadowPath = shadowPath.CGPath; + + //button.shadowColor = [[UIColor colorWithRed:0/255.0 green:110/255.0 blue:255/255.0 alpha:1.0] colorWithAlphaComponent:0.7].CGColor; + button.shadowColor = [[UIColor colorWithRed:0.5 green:0.5 blue:1.0 alpha:0.85] colorWithAlphaComponent:0.80].CGColor; + + //button.shadowColor = [UIColor colorWithRed:0/255.0 green:51/255.0 blue:102/255.0 alpha:0.6].CGColor; + button.shadowOffset = CGSizeZero; + button.shadowOpacity = 1.0; + button.shadowRadius = 0.0; // Adjust the radius to simulate border thickness + [CATransaction commit]; + } +} + + +// osc Button capturing here - (BOOL)handleTouchDownEvent:touches { BOOL updated = false; BOOL stickTouch = false; @@ -843,70 +889,88 @@ static float L3_Y; if ([_aButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:A_FLAG]; _aTouch = touch; + [self oscButtonTouchDownVisualEffect:_aButton]; updated = true; // NSLog(@"Captured OSC A"); } else if ([_bButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:B_FLAG]; _bTouch = touch; + [self oscButtonTouchDownVisualEffect:_bButton]; updated = true; // NSLog(@"Captured OSC B"); } else if ([_xButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:X_FLAG]; _xTouch = touch; + [self oscButtonTouchDownVisualEffect:_xButton]; updated = true; // NSLog(@"Captured OSC X"); } else if ([_yButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:Y_FLAG]; _yTouch = touch; + [self oscButtonTouchDownVisualEffect:_yButton]; updated = true; // NSLog(@"Captured OSC Y"); } else if ([_upButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:UP_FLAG]; _dpadTouch = touch; + _upTouch = touch; + [self oscButtonTouchDownVisualEffect:_upButton]; updated = true; // NSLog(@"Captured OSC UP"); } else if ([_downButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:DOWN_FLAG]; _dpadTouch = touch; + _downTouch = touch; + [self oscButtonTouchDownVisualEffect:_downButton]; updated = true; } else if ([_leftButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:LEFT_FLAG]; _dpadTouch = touch; + _leftTouch = touch; + [self oscButtonTouchDownVisualEffect:_leftButton]; updated = true; // NSLog(@"Captured OSC LEFT"); } else if ([_rightButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:RIGHT_FLAG]; _dpadTouch = touch; + _rightTouch = touch; + [self oscButtonTouchDownVisualEffect:_rightButton]; updated = true; // NSLog(@"Captured OSC RIGHT"); } else if ([_startButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:PLAY_FLAG]; _startTouch = touch; + [self oscButtonTouchDownVisualEffect:_startButton]; updated = true; // NSLog(@"Captured OSC PLAY"); } else if ([_selectButton.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:BACK_FLAG]; _selectTouch = touch; + [self oscButtonTouchDownVisualEffect:_selectButton]; updated = true; // NSLog(@"Captured OSC BACK"); } else if ([_l1Button.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:LB_FLAG]; _l1Touch = touch; + [self oscButtonTouchDownVisualEffect:_l1Button]; updated = true; // NSLog(@"Captured OSC LB"); } else if ([_r1Button.presentationLayer hitTest:touchLocation]) { [_controllerSupport setButtonFlag:_controller flags:RB_FLAG]; _r1Touch = touch; + [self oscButtonTouchDownVisualEffect:_r1Button]; updated = true; // NSLog(@"Captured OSC RB"); } else if ([_l2Button.presentationLayer hitTest:touchLocation]) { [_controllerSupport updateLeftTrigger:_controller left:0xFF]; _l2Touch = touch; + [self oscButtonTouchDownVisualEffect:_l2Button]; updated = true; // NSLog(@"Captured OSC LeftTrigger"); } else if ([_r2Button.presentationLayer hitTest:touchLocation]) { [_controllerSupport updateRightTrigger:_controller right:0xFF]; _r2Touch = touch; + [self oscButtonTouchDownVisualEffect:_r2Button]; updated = true; // NSLog(@"Captured OSC RightTrigger"); } else if ([_l3Button.presentationLayer hitTest:touchLocation]) { @@ -942,6 +1006,7 @@ static float L3_Y; double l3TouchTime = [l3TouchStart timeIntervalSinceNow] * -1000.0; if (l3TouchTime < STICK_CLICK_RATE) { [_controllerSupport setButtonFlag:_controller flags:LS_CLK_FLAG]; + [self oscButtonTouchDownVisualEffect:_leftStick]; updated = true; // NSLog(@"Captured OSC LS_CLK3"); @@ -956,6 +1021,7 @@ static float L3_Y; double r3TouchTime = [r3TouchStart timeIntervalSinceNow] * -1000.0; if (r3TouchTime < STICK_CLICK_RATE) { [_controllerSupport setButtonFlag:_controller flags:RS_CLK_FLAG]; + [self oscButtonTouchDownVisualEffect:_rightStick]; updated = true; // NSLog(@"Captured OSC LS_CLK4"); } @@ -982,50 +1048,65 @@ static float L3_Y; if (touch == _aTouch) { [_controllerSupport clearButtonFlag:_controller flags:A_FLAG]; _aTouch = nil; + _aButton.shadowOpacity = 0.0; // reset button shadow & background color updated = true; } else if (touch == _bTouch) { [_controllerSupport clearButtonFlag:_controller flags:B_FLAG]; _bTouch = nil; + _bButton.shadowOpacity = 0.0; updated = true; } else if (touch == _xTouch) { [_controllerSupport clearButtonFlag:_controller flags:X_FLAG]; _xTouch = nil; + _xButton.shadowOpacity = 0.0; updated = true; } else if (touch == _yTouch) { [_controllerSupport clearButtonFlag:_controller flags:Y_FLAG]; _yTouch = nil; + _yButton.shadowOpacity = 0.0; updated = true; } else if (touch == _dpadTouch) { [_controllerSupport clearButtonFlag:_controller flags:UP_FLAG | DOWN_FLAG | LEFT_FLAG | RIGHT_FLAG]; _dpadTouch = nil; + _upButton.shadowOpacity = 0.0; + _leftButton.shadowOpacity = 0.0; + _rightButton.shadowOpacity = 0.0; + _downButton.shadowOpacity = 0.0; updated = true; } else if (touch == _startTouch) { [_controllerSupport clearButtonFlag:_controller flags:PLAY_FLAG]; _startTouch = nil; + _startButton.shadowOpacity = 0.0; updated = true; } else if (touch == _selectTouch) { [_controllerSupport clearButtonFlag:_controller flags:BACK_FLAG]; _selectTouch = nil; + _selectButton.shadowOpacity = 0.0; updated = true; } else if (touch == _l1Touch) { [_controllerSupport clearButtonFlag:_controller flags:LB_FLAG]; _l1Touch = nil; + _l1Button.shadowOpacity = 0.0; updated = true; } else if (touch == _r1Touch) { [_controllerSupport clearButtonFlag:_controller flags:RB_FLAG]; _r1Touch = nil; + _r1Button.shadowOpacity = 0.0; updated = true; } else if (touch == _l2Touch) { [_controllerSupport updateLeftTrigger:_controller left:0]; _l2Touch = nil; + _l2Button.shadowOpacity = 0.0; updated = true; } else if (touch == _r2Touch) { [_controllerSupport updateRightTrigger:_controller right:0]; _r2Touch = nil; + _r2Button.shadowOpacity = 0.0; updated = true; } else if (touch == _lsTouch) { _leftStick.frame = CGRectMake(LS_CENTER_X - STICK_INNER_SIZE / 2, LS_CENTER_Y - STICK_INNER_SIZE / 2, STICK_INNER_SIZE, STICK_INNER_SIZE); + _leftStick.shadowOpacity = 0.0; [_controllerSupport updateLeftStick:_controller x:0 y:0]; [_controllerSupport clearButtonFlag:_controller flags:LS_CLK_FLAG]; l3TouchStart = [NSDate date]; @@ -1033,6 +1114,7 @@ static float L3_Y; updated = true; } else if (touch == _rsTouch) { _rightStick.frame = CGRectMake(RS_CENTER_X - STICK_INNER_SIZE / 2, RS_CENTER_Y - STICK_INNER_SIZE / 2, STICK_INNER_SIZE, STICK_INNER_SIZE); + _rightStick.shadowOpacity = 0.0; [_controllerSupport updateRightStick:_controller x:0 y:0]; [_controllerSupport clearButtonFlag:_controller flags:RS_CLK_FLAG]; r3TouchStart = [NSDate date]; diff --git a/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents index d9f5f0f4..b7a4ba16 100644 --- a/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents @@ -35,6 +35,7 @@ + diff --git a/Limelight/Stream/StreamConfiguration.h b/Limelight/Stream/StreamConfiguration.h index e912b578..501d83df 100644 --- a/Limelight/Stream/StreamConfiguration.h +++ b/Limelight/Stream/StreamConfiguration.h @@ -26,6 +26,7 @@ @property BOOL optimizeGameSettings; @property BOOL playAudioOnPC; @property BOOL swapABXYButtons; +@property BOOL oscVisualFeedback; @property int audioConfiguration; @property int supportedVideoFormats; @property BOOL multiController; diff --git a/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.m b/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.m index 705ddfc4..779c4345 100644 --- a/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.m +++ b/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.m @@ -47,7 +47,6 @@ const double NAV_BAR_HEIGHT = 50; [self.tableView registerNib:[UINib nibWithNibName:@"ProfileTableViewCell" bundle:nil] forCellReuseIdentifier:@"Cell"]; // Register the custom cell nib file with the table view self.tableView.alpha = 0.5; - self.tableView.backgroundColor = [[UIColor colorWithRed:0.5 green:0.7 blue:1.0 alpha:1.0] colorWithAlphaComponent:0.5]; // set background color & transparency } diff --git a/Limelight/ViewControllers/MainFrameViewController.m b/Limelight/ViewControllers/MainFrameViewController.m index 589a1a8b..9b5ae776 100644 --- a/Limelight/ViewControllers/MainFrameViewController.m +++ b/Limelight/ViewControllers/MainFrameViewController.m @@ -668,6 +668,7 @@ static NSMutableSet* hostList; _streamConfig.playAudioOnPC = streamSettings.playAudioOnPC; _streamConfig.useFramePacing = streamSettings.useFramePacing; _streamConfig.swapABXYButtons = streamSettings.swapABXYButtons; + _streamConfig.oscVisualFeedback = streamSettings.oscVisualFeedback; // new streamConfig segment // multiController must be set before calling getConnectedGamepadMask _streamConfig.multiController = streamSettings.multiController; diff --git a/Limelight/ViewControllers/SettingsViewController.h b/Limelight/ViewControllers/SettingsViewController.h index 8b30b80d..ba97b173 100644 --- a/Limelight/ViewControllers/SettingsViewController.h +++ b/Limelight/ViewControllers/SettingsViewController.h @@ -22,6 +22,7 @@ @property (strong, nonatomic) IBOutlet UISegmentedControl *touchModeSelector; @property (strong, nonatomic) IBOutlet UILabel *onscreenControllerLabel; @property (strong, nonatomic) IBOutlet UISegmentedControl *onscreenControlSelector; +@property (strong, nonatomic) IBOutlet UISegmentedControl *oscVisualFeedbackSelector; @property (strong, nonatomic) IBOutlet UISegmentedControl *optimizeSettingsSelector; @property (strong, nonatomic) IBOutlet UISegmentedControl *multiControllerSelector; @property (strong, nonatomic) IBOutlet UISegmentedControl *swapABXYButtonsSelector; diff --git a/Limelight/ViewControllers/SettingsViewController.m b/Limelight/ViewControllers/SettingsViewController.m index de831a7c..bad9465f 100644 --- a/Limelight/ViewControllers/SettingsViewController.m +++ b/Limelight/ViewControllers/SettingsViewController.m @@ -430,14 +430,15 @@ BOOL isCustomResolution(CGSize res) { [self.keyboardToggleFingerNumSlider addTarget:self action:@selector(keyboardToggleFingerNumSliderMoved) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved. [self keyboardToggleFingerNumSliderMoved]; - // this setting will be affected touchMode, must be loaded before them. + // this setting will be affected by touchMode, must be loaded before them. NSInteger onscreenControlsLevel = [currentSettings.onscreenControls integerValue]; [self.onscreenControlSelector setSelectedSegmentIndex:onscreenControlsLevel]; [self.onscreenControlSelector addTarget:self action:@selector(onscreenControlChanged) forControlEvents:UIControlEventValueChanged]; [self onscreenControlChanged]; - + [self.oscVisualFeedbackSelector setSelectedSegmentIndex:currentSettings.oscVisualFeedback ? 1 : 0]; // load old setting of oscVisualFeedback // [self.touchModeSelector setSelectedSegmentIndex:currentSettings.absoluteTouchMode ? 1 : 0]; + // this part will enable/disable oscSelector & the visual feedback selector [self.touchModeSelector setSelectedSegmentIndex:currentSettings.touchMode.intValue]; //Load old touchMode setting [self.touchModeSelector addTarget:self action:@selector(touchModeChanged) forControlEvents:UIControlEventValueChanged]; [self touchModeChanged]; @@ -597,6 +598,7 @@ BOOL isCustomResolution(CGSize res) { bool isNativeTouch = [self.touchModeSelector selectedSegmentIndex] == PURE_NATIVE_TOUCH || [self.touchModeSelector selectedSegmentIndex] == REGULAR_NATIVE_TOUCH; [self.onscreenControlSelector setEnabled:oscSelectorEnabled]; + [self.oscVisualFeedbackSelector setEnabled:oscSelectorEnabled]; // this selector stay aligned with oscSelector [self widget:self.pointerVelocityModeDividerSlider setEnabled:isNativeTouch]; // pointer velocity scaling works only in native touch mode. [self widget:self.touchPointerVelocityFactorSlider setEnabled:isNativeTouch]; // pointer velocity scaling works only in native touch mode. @@ -893,6 +895,7 @@ BOOL isCustomResolution(CGSize res) { CGFloat pointerVelocityModeDivider = (CGFloat)(uint8_t)self.pointerVelocityModeDividerSlider.value/100; CGFloat touchPointerVelocityFactor =(CGFloat)(uint16_t)[self map_velocFactorDisplay_fromSliderValue:self.touchPointerVelocityFactorSlider.value]/100; CGFloat mousePointerVelocityFactor =(CGFloat)(uint16_t)self.mousePointerVelocityFactorSlider.value/100; + BOOL oscVisualFeedback = [self.oscVisualFeedbackSelector selectedSegmentIndex] == 1; BOOL liftStreamViewForKeyboard = [self.liftStreamViewForKeyboardSelector selectedSegmentIndex] == 1; BOOL showKeyboardToolbar = [self.showKeyboardToolbarSelector selectedSegmentIndex] == 1; BOOL optimizeGames = [self.optimizeSettingsSelector selectedSegmentIndex] == 1; @@ -919,6 +922,7 @@ BOOL isCustomResolution(CGSize res) { pointerVelocityModeDivider:pointerVelocityModeDivider touchPointerVelocityFactor:touchPointerVelocityFactor mousePointerVelocityFactor:mousePointerVelocityFactor + oscVisualFeedback:oscVisualFeedback liftStreamViewForKeyboard:liftStreamViewForKeyboard showKeyboardToolbar:showKeyboardToolbar optimizeGames:optimizeGames diff --git a/Limelight/mul.lproj/iPad.xcstrings b/Limelight/mul.lproj/iPad.xcstrings index b983089a..5a352e01 100644 --- a/Limelight/mul.lproj/iPad.xcstrings +++ b/Limelight/mul.lproj/iPad.xcstrings @@ -1,6 +1,36 @@ { "sourceLanguage" : "en", "strings" : { + "2Bp-XZ-cCw.text" : { + "comment" : "Class = \"UILabel\"; text = \"Turn on On-Screen Controls Visual Feedback \"; ObjectID = \"2Bp-XZ-cCw\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Turn on On-Screen Controls Visual Feedback " + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开屏显手柄视觉反馈" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开屏显手柄视觉反馈" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开屏显手柄视觉反馈" + } + } + } + }, "6w5-Md-NpV.text" : { "comment" : "Class = \"UILabel\"; text = \"Preferred Codec \"; ObjectID = \"6w5-Md-NpV\";", "extractionState" : "extracted_with_value", @@ -1903,6 +1933,66 @@ } } }, + "sIU-PH-H7V.segmentTitles[0]" : { + "comment" : "Class = \"UISegmentedControl\"; sIU-PH-H7V.segmentTitles[0] = \"No\"; ObjectID = \"sIU-PH-H7V\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + } + } + }, + "sIU-PH-H7V.segmentTitles[1]" : { + "comment" : "Class = \"UISegmentedControl\"; sIU-PH-H7V.segmentTitles[1] = \"Yes\"; ObjectID = \"sIU-PH-H7V\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Yes" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用" + } + } + } + }, "t9f-V8-GCm.text" : { "comment" : "Class = \"UILabel\"; text = \"Citrix X1 Mouse Support \"; ObjectID = \"t9f-V8-GCm\";", "extractionState" : "extracted_with_value", diff --git a/Limelight/mul.lproj/iPhone.xcstrings b/Limelight/mul.lproj/iPhone.xcstrings index 7dfff01f..709b3261 100644 --- a/Limelight/mul.lproj/iPhone.xcstrings +++ b/Limelight/mul.lproj/iPhone.xcstrings @@ -211,6 +211,36 @@ } } }, + "2LZ-cX-teZ.text" : { + "comment" : "Class = \"UILabel\"; text = \"Turn on On-Screen Controls Visual Feedback \"; ObjectID = \"2LZ-cX-teZ\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Turn on On-Screen Controls Visual Feedback " + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开屏显手柄视觉反馈" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开屏显手柄视觉反馈" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "打开屏显手柄视觉反馈" + } + } + } + }, "2p1-r1-Gvf.text" : { "comment" : "Class = \"UILabel\"; text = \"Swap A/B and X/Y Buttons \"; ObjectID = \"2p1-r1-Gvf\";", "extractionState" : "extracted_with_value", @@ -2119,6 +2149,66 @@ } } }, + "XbO-CV-orB.segmentTitles[0]" : { + "comment" : "Class = \"UISegmentedControl\"; XbO-CV-orB.segmentTitles[0] = \"No\"; ObjectID = \"XbO-CV-orB\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "No" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + } + } + }, + "XbO-CV-orB.segmentTitles[1]" : { + "comment" : "Class = \"UISegmentedControl\"; XbO-CV-orB.segmentTitles[1] = \"Yes\"; ObjectID = \"XbO-CV-orB\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Yes" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用" + } + } + } + }, "yJC-bq-EOU.text" : { "comment" : "Class = \"UILabel\"; text = \"Current Profile:\"; ObjectID = \"yJC-bq-EOU\";", "extractionState" : "extracted_with_value",