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",