diff --git a/Limelight/Database/DataManager.h b/Limelight/Database/DataManager.h index 0a9e0bc7..eb0d5f5b 100644 --- a/Limelight/Database/DataManager.h +++ b/Limelight/Database/DataManager.h @@ -17,11 +17,13 @@ framerate:(NSInteger)framerate height:(NSInteger)height width:(NSInteger)width - audioConfig:(NSInteger)audioConfig + audioConfig:(NSInteger)audioConfig onscreenControls:(NSInteger)onscreenControls keyboardToggleFingers:(NSInteger)keyboardToggleFingers swipeExitScreenEdge:(NSInteger)swipeExitScreenEdge swipeToExitDistance:(CGFloat)swipeToExitDistance + pointerVelocityModeDivider:(CGFloat)pointerVelocityModeDivider + touchPointerVelocityFactor:(CGFloat)touchPointerVelocityFactor liftStreamViewForKeyboard:(BOOL)liftStreamViewForKeyboard showKeyboardToolbar:(BOOL)showKeyboardToolbar optimizeGames:(BOOL)optimizeGames diff --git a/Limelight/Database/DataManager.m b/Limelight/Database/DataManager.m index 608fe3f5..6c6191c7 100644 --- a/Limelight/Database/DataManager.m +++ b/Limelight/Database/DataManager.m @@ -61,6 +61,8 @@ keyboardToggleFingers:(NSInteger)keyboardToggleFingers swipeExitScreenEdge:(NSInteger)swipeExitScreenEdge swipeToExitDistance:(CGFloat)swipeToExitDistance + pointerVelocityModeDivider:(CGFloat)pointerVelocityModeDivider + touchPointerVelocityFactor:(CGFloat)touchPointerVelocityFactor liftStreamViewForKeyboard:(BOOL)liftStreamViewForKeyboard showKeyboardToolbar:(BOOL)showKeyboardToolbar optimizeGames:(BOOL)optimizeGames @@ -85,6 +87,8 @@ settingsToSave.keyboardToggleFingers = [NSNumber numberWithInteger:(uint16_t)keyboardToggleFingers]; settingsToSave.swipeExitScreenEdge = [NSNumber numberWithInteger:(uint32_t)swipeExitScreenEdge]; settingsToSave.swipeToExitDistance = [NSNumber numberWithFloat:swipeToExitDistance]; + settingsToSave.pointerVelocityModeDivider = [NSNumber numberWithFloat:pointerVelocityModeDivider]; + settingsToSave.touchPointerVelocityFactor = [NSNumber numberWithFloat:touchPointerVelocityFactor]; settingsToSave.liftStreamViewForKeyboard = liftStreamViewForKeyboard; settingsToSave.showKeyboardToolbar = showKeyboardToolbar; settingsToSave.optimizeGames = optimizeGames; diff --git a/Limelight/Database/TemporarySettings.h b/Limelight/Database/TemporarySettings.h index 13cf6bad..d55a00f7 100644 --- a/Limelight/Database/TemporarySettings.h +++ b/Limelight/Database/TemporarySettings.h @@ -21,6 +21,8 @@ @property (nonatomic, retain) NSNumber * keyboardToggleFingers; @property (nonatomic, retain) NSNumber * swipeExitScreenEdge; @property (nonatomic, retain) NSNumber * swipeToExitDistance; +@property (nonatomic, retain) NSNumber * touchPointerVelocityFactor; +@property (nonatomic, retain) NSNumber * pointerVelocityModeDivider; @property (nonatomic, retain) NSString * uniqueId; @property (nonatomic) enum { CODEC_PREF_AUTO, diff --git a/Limelight/Database/TemporarySettings.m b/Limelight/Database/TemporarySettings.m index d8cd6288..08657aa6 100644 --- a/Limelight/Database/TemporarySettings.m +++ b/Limelight/Database/TemporarySettings.m @@ -90,6 +90,8 @@ self.swipeToExitDistance = settings.swipeToExitDistance; self.liftStreamViewForKeyboard = settings.liftStreamViewForKeyboard; self.showKeyboardToolbar = settings.showKeyboardToolbar; + self.touchPointerVelocityFactor = settings.touchPointerVelocityFactor; + self.pointerVelocityModeDivider = settings.pointerVelocityModeDivider; #endif self.uniqueId = settings.uniqueId; diff --git a/Limelight/Input/NativeTouchHandler.h b/Limelight/Input/NativeTouchHandler.h index 09cbc83b..1ebb7b79 100644 --- a/Limelight/Input/NativeTouchHandler.h +++ b/Limelight/Input/NativeTouchHandler.h @@ -16,7 +16,8 @@ NS_ASSUME_NONNULL_BEGIN + (void)populatePointerId:(UITouch*)touch; + (void)removePointerId:(UITouch*)touch; + (uint32_t) retrievePointerIdFromDict:(UITouch*)touch; - ++ (void)setPointerVelocityDivider:(CGFloat)dividerLocation; ++ (void)setPointerVelocityFactor:(CGFloat)velocityFactor; + (void)populatePointerObjIntoDict:(UITouch*)touch; + (void)removePointerObjFromDict:(UITouch*)touch; + (void)updatePointerObjInDict:(UITouch *)touch; diff --git a/Limelight/Input/NativeTouchHandler.m b/Limelight/Input/NativeTouchHandler.m index f70adfa4..bf1eba52 100644 --- a/Limelight/Input/NativeTouchHandler.m +++ b/Limelight/Input/NativeTouchHandler.m @@ -34,6 +34,15 @@ StreamView *streamView; CGFloat velocityY; } ++ (void)setPointerVelocityDivider:(CGFloat)dividerLocation{ + pointerVelocityDivider = dividerLocation; +} + ++ (void)setPointerVelocityFactor:(CGFloat)velocityFactor{ + pointerVelocityFactor = velocityFactor; +} + + - (instancetype)initWith:(UITouch *)touch{ self = [self init]; self->initialPoint = [touch locationInView:streamView]; @@ -59,7 +68,7 @@ StreamView *streamView; pointerIdDict = [NSMutableDictionary dictionary]; pointerIdSet = [NSMutableSet set]; pointerDict = [NSMutableDictionary dictionary]; - pointerVelocityDividerLocation = CGRectGetHeight([[UIScreen mainScreen] bounds]) *pointerVelocityDivider; + pointerVelocityDividerLocation = CGRectGetHeight([[UIScreen mainScreen] bounds]) * pointerVelocityDivider; } + (void)populatePointerObjIntoDict:(UITouch*)touch{ @@ -81,11 +90,9 @@ StreamView *streamView; + (CGPoint)selectCoordsFor:(UITouch *)touch{ - if (pointerVelocityFactor != 1.0f){ - TouchPointer *pointer = [pointerDict objectForKey:@((uint64_t)touch)]; - if((pointer -> initialPoint).x > pointerVelocityDividerLocation){ - return pointer->latestRelativePoint; - } + TouchPointer *pointer = [pointerDict objectForKey:@((uint64_t)touch)]; + if((pointer -> initialPoint).x > pointerVelocityDividerLocation){ //if first contact coords locates on the right side of divider. + return pointer->latestRelativePoint; } return [touch locationInView:streamView]; } diff --git a/Limelight/Input/StreamView.m b/Limelight/Input/StreamView.m index a645238b..e9343f50 100644 --- a/Limelight/Input/StreamView.m +++ b/Limelight/Input/StreamView.m @@ -57,12 +57,14 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; - (void) setupStreamView:(ControllerSupport*)controllerSupport interactionDelegate:(id)interactionDelegate config:(StreamConfiguration*)streamConfig { - [TouchPointer initContextWith:self]; self->interactionDelegate = interactionDelegate; self->streamAspectRatio = (float)streamConfig.width / (float)streamConfig.height; settings = [[[DataManager alloc] init] getSettings]; + [TouchPointer initContextWith:self]; + [TouchPointer setPointerVelocityDivider:settings.pointerVelocityModeDivider.floatValue]; + [TouchPointer setPointerVelocityFactor:settings.touchPointerVelocityFactor.floatValue]; keysDown = [[NSMutableSet alloc] init]; keyInputField = [[KeyboardInputField alloc] initWithFrame:CGRectZero]; @@ -333,7 +335,7 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; - (void)sendTouchEvent:(UITouch*)event touchType:(uint8_t)touchType{ CGPoint targetCoords; - if(true) targetCoords = [TouchPointer selectCoordsFor:event]; + if(settings.pointerVelocityModeDivider.floatValue != 1.0) targetCoords = [TouchPointer selectCoordsFor:event]; // coordinates of touch pointer replaced to relative ones here. else targetCoords = [event locationInView:self]; CGPoint location = [self adjustCoordinatesForVideoArea:targetCoords]; CGSize videoSize = [self getVideoAreaSize]; @@ -343,6 +345,8 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; - (void)handleUITouch:(UITouch*)event index:(int)index{ uint8_t type; + BOOL pointerVelocityScaleEnabled = (settings.pointerVelocityModeDivider.floatValue != 1.0); // when the divider is 1.0, means 0% of screen shall pass velocity-scaled pointer to sunshine. + // NSLog(@"handleUITouch %ld,%d",(long)event.phase,(uint32_t)event); //#define LI_TOUCH_EVENT_HOVER 0x00 //#define LI_TOUCH_EVENT_DOWN 0x01 @@ -368,12 +372,12 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; case UITouchPhaseBegan://开始触摸 type = LI_TOUCH_EVENT_DOWN; [TouchPointer populatePointerId:event]; //获取并记录pointerId - if(true) [TouchPointer populatePointerObjIntoDict:event]; + if(pointerVelocityScaleEnabled) [TouchPointer populatePointerObjIntoDict:event]; break; case UITouchPhaseMoved://移动 case UITouchPhaseStationary: type = LI_TOUCH_EVENT_MOVE; - if(true) [TouchPointer updatePointerObjInDict:event]; + if(pointerVelocityScaleEnabled) [TouchPointer updatePointerObjInDict:event]; break; case UITouchPhaseRegionEntered://停留 case UITouchPhaseRegionMoved://停留 @@ -383,13 +387,13 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; type = LI_TOUCH_EVENT_CANCEL; [self sendTouchEvent:event touchType:type]; //先发送,再删除 [TouchPointer removePointerId:event]; //删除pointerId - if(true) [TouchPointer removePointerObjFromDict:event]; + if(pointerVelocityScaleEnabled) [TouchPointer removePointerObjFromDict:event]; return; case UITouchPhaseEnded://触摸结束 type = LI_TOUCH_EVENT_UP; [self sendTouchEvent:event touchType:type]; //先发送,再删除 [TouchPointer removePointerId:event]; //删除pointerId - if(true) [TouchPointer removePointerObjFromDict:event]; + if(pointerVelocityScaleEnabled) [TouchPointer removePointerObjFromDict:event]; return; default: return; diff --git a/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents index 57bd8c42..b6fdc962 100644 --- a/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents @@ -35,14 +35,16 @@ + + - + \ No newline at end of file diff --git a/Limelight/ViewControllers/SettingsViewController.h b/Limelight/ViewControllers/SettingsViewController.h index ebc521b3..52005628 100644 --- a/Limelight/ViewControllers/SettingsViewController.h +++ b/Limelight/ViewControllers/SettingsViewController.h @@ -34,6 +34,12 @@ @property (strong, nonatomic) IBOutlet UISegmentedControl *swipeExitScreenEdgeSelector; @property (strong, nonatomic) IBOutlet UILabel *swipeToExitDistanceUILabel; @property (strong, nonatomic) IBOutlet UISlider *swipeToExitDistanceSlider; +@property (strong, nonatomic) IBOutlet UISlider *pointerVelocityModeDividerSlider; +@property (strong, nonatomic) IBOutlet UILabel *pointerVelocityModeDividerUILabel; +@property (strong, nonatomic) IBOutlet UISlider *touchPointerVelocityFactorSlider; +@property (strong, nonatomic) IBOutlet UILabel *touchPointerVelocityFactorUILabel; + + #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunguarded-availability" diff --git a/Limelight/ViewControllers/SettingsViewController.m b/Limelight/ViewControllers/SettingsViewController.m index fdc71155..97587f2e 100644 --- a/Limelight/ViewControllers/SettingsViewController.m +++ b/Limelight/ViewControllers/SettingsViewController.m @@ -275,6 +275,22 @@ BOOL isCustomResolution(CGSize res) { [self.swipeToExitDistanceSlider setValue:(CGFloat)currentSettings.swipeToExitDistance.floatValue animated:YES]; // Load old setting. [self.swipeToExitDistanceUILabel setText:[NSString stringWithFormat:@"Swipe & Exit Distance: %.2f * screen-width", self.swipeToExitDistanceSlider.value]]; // Initiate label display [self.swipeToExitDistanceSlider addTarget:self action:@selector(swipeToExitDistanceSliderMoved) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved. + + [self.pointerVelocityModeDividerSlider setValue:currentSettings.pointerVelocityModeDivider.floatValue * 100 animated:YES]; // Load old setting. + [self.pointerVelocityModeDividerUILabel setText:[NSString stringWithFormat:@"Touch Pointer Velocity: Scaled on %d%% of Right Screen", 100 - (uint8_t)self.pointerVelocityModeDividerSlider.value]]; // Initiate label display + [self.pointerVelocityModeDividerSlider addTarget:self action:@selector(pointerVelocityModeDividerSliderMoved) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved. + + [self.touchPointerVelocityFactorSlider setValue:currentSettings.touchPointerVelocityFactor.floatValue * 100 animated:YES]; // Load old setting. + [self.touchPointerVelocityFactorUILabel setText:[NSString stringWithFormat:@"Touch Pointer Velocity Factor: %d%%", (uint16_t)self.touchPointerVelocityFactorSlider.value]]; // Initiate label display + [self.touchPointerVelocityFactorSlider addTarget:self action:@selector(touchPointerVelocityFactorSliderMoved) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved. +} + +- (void) pointerVelocityModeDividerSliderMoved { + [self.pointerVelocityModeDividerUILabel setText:[NSString stringWithFormat:@"Touch Pointer Velocity: Scaled on %d%% of Right Screen", 100 - (uint8_t)self.pointerVelocityModeDividerSlider.value]]; +} + +- (void) touchPointerVelocityFactorSliderMoved { + [self.touchPointerVelocityFactorUILabel setText:[NSString stringWithFormat:@"Touch Pointer Velocity Factor: %d%%", (uint16_t)self.touchPointerVelocityFactorSlider.value]]; // Initiate label display } - (uint32_t) getScreenEdgeFromSelector { @@ -300,6 +316,8 @@ BOOL isCustomResolution(CGSize res) { - (void) touchModeChanged { // Disable on-screen controls in absolute touch mode [self.onscreenControlSelector setEnabled:[self.touchModeSelector selectedSegmentIndex] == 0]; + [self.pointerVelocityModeDividerSlider setEnabled:[self.touchModeSelector selectedSegmentIndex] == 1]; // pointer velocity scaling works only in native touch mode. + [self.touchPointerVelocityFactorSlider setEnabled:[self.touchModeSelector selectedSegmentIndex] == 1]; // pointer velocity scaling works only in native touch mode. } - (void) updateBitrate { @@ -573,6 +591,8 @@ BOOL isCustomResolution(CGSize res) { // NSLog(@"saveSettings keyboardToggleFingers %d", (uint16_t)keyboardToggleFingers); CGFloat swipeToExitDistance = self.swipeToExitDistanceSlider.value; uint32_t swipeExitScreenEdge = [self getScreenEdgeFromSelector]; + CGFloat pointerVelocityModeDivider = (CGFloat)(uint8_t)self.pointerVelocityModeDividerSlider.value/100; + CGFloat touchPointerVelocityFactor =(CGFloat)(uint16_t)self.touchPointerVelocityFactorSlider.value/100; BOOL liftStreamViewForKeyboard = [self.liftStreamViewForKeyboardSelector selectedSegmentIndex] == 1; BOOL showKeyboardToolbar = [self.showKeyboardToolbarSelector selectedSegmentIndex] == 1; BOOL optimizeGames = [self.optimizeSettingsSelector selectedSegmentIndex] == 1; @@ -594,6 +614,8 @@ BOOL isCustomResolution(CGSize res) { keyboardToggleFingers:keyboardToggleFingers swipeExitScreenEdge:swipeExitScreenEdge swipeToExitDistance:swipeToExitDistance + pointerVelocityModeDivider:pointerVelocityModeDivider + touchPointerVelocityFactor:touchPointerVelocityFactor liftStreamViewForKeyboard:liftStreamViewForKeyboard showKeyboardToolbar:showKeyboardToolbar optimizeGames:optimizeGames diff --git a/iPad.storyboard b/iPad.storyboard index c74e6901..0914f23c 100644 --- a/iPad.storyboard +++ b/iPad.storyboard @@ -110,7 +110,7 @@ - + @@ -142,14 +142,14 @@ - + @@ -159,7 +159,7 @@ - + @@ -179,14 +179,14 @@ - + @@ -196,14 +196,14 @@ - + @@ -213,21 +213,21 @@ - + @@ -237,14 +237,14 @@ - + @@ -256,14 +256,14 @@ - + @@ -273,14 +273,14 @@ - + @@ -290,14 +290,14 @@ - + @@ -307,14 +307,14 @@ - + @@ -324,7 +324,7 @@ - + @@ -334,14 +334,14 @@ - + @@ -351,14 +351,14 @@ - + @@ -368,12 +368,12 @@ - + - + + + + + + + + + + + + + @@ -412,6 +438,8 @@ + + @@ -422,6 +450,8 @@ + + diff --git a/iPhone.storyboard b/iPhone.storyboard index a0c9bbfb..b8b3f7b6 100644 --- a/iPhone.storyboard +++ b/iPhone.storyboard @@ -160,8 +160,21 @@ + + + + + + - + - + @@ -193,14 +206,14 @@ - + @@ -210,21 +223,21 @@ - + @@ -234,14 +247,14 @@ - + @@ -251,14 +264,14 @@ - + @@ -268,14 +281,14 @@ - + @@ -285,14 +298,14 @@ - + @@ -304,14 +317,14 @@ - + @@ -321,14 +334,14 @@ - + @@ -338,14 +351,14 @@ - + @@ -355,14 +368,14 @@ - + @@ -372,7 +385,7 @@ - + @@ -391,19 +404,19 @@ - + - + @@ -412,6 +425,19 @@ + + + + + + @@ -431,6 +457,8 @@ + + @@ -441,6 +469,8 @@ + +