diff --git a/Limelight/Database/TemporarySettings.h b/Limelight/Database/TemporarySettings.h index b82b2a8d..45d36ba0 100644 --- a/Limelight/Database/TemporarySettings.h +++ b/Limelight/Database/TemporarySettings.h @@ -11,6 +11,7 @@ #define REGULAR_NATIVE_TOUCH 1 #define PURE_NATIVE_TOUCH 2 #define ABSOLUTE_TOUCH 3 +#define OSC_TOOL_FINGERS 5 @interface TemporarySettings : NSObject diff --git a/Limelight/Input/RelativeTouchHandler.h b/Limelight/Input/RelativeTouchHandler.h index 8db13186..9fedfba1 100644 --- a/Limelight/Input/RelativeTouchHandler.h +++ b/Limelight/Input/RelativeTouchHandler.h @@ -14,10 +14,10 @@ NS_ASSUME_NONNULL_BEGIN @interface RelativeTouchHandler : UIResponder -@property (nonatomic, readonly) CustomTapGestureRecognizer* mouseRightClickTapRecognizer; // this object will be passed to onscreencontrol class for areVirtualControllerTaps flag setting - (id)initWithView:(StreamView*)view andSettings:(TemporarySettings*)settings; +- (CustomTapGestureRecognizer* )getMouseRightClickTapRecognizer; // rightClickTapRec must be created from relativeTouchHandler,since there's a attr must be accessed directly from recognizer, and it's also a relative touch specific recognizer. @end diff --git a/Limelight/Input/RelativeTouchHandler.m b/Limelight/Input/RelativeTouchHandler.m index e6f6954a..662f12e2 100644 --- a/Limelight/Input/RelativeTouchHandler.m +++ b/Limelight/Input/RelativeTouchHandler.m @@ -15,6 +15,7 @@ static const int REFERENCE_WIDTH = 1280; static const int REFERENCE_HEIGHT = 720; +//static CustomTapGestureRecognizer* mouseRightClickTapRecognizer; @implementation RelativeTouchHandler { TemporarySettings* currentSettings; @@ -30,22 +31,15 @@ static const int REFERENCE_HEIGHT = 720; #endif UIView* view; + CustomTapGestureRecognizer* mouseRightClickTapRecognizer; } - (id)initWithView:(StreamView*)view andSettings:(TemporarySettings*)settings { self = [self init]; self->view = view; self->currentSettings = settings; - // replace righclick recoginizing with my CustomTapGestureRecognizer for better experience, higher recoginizing rate. - _mouseRightClickTapRecognizer = [[CustomTapGestureRecognizer alloc] initWithTarget:self action:@selector(mouseRightClick)]; - _mouseRightClickTapRecognizer.numberOfTouchesRequired = 2; - _mouseRightClickTapRecognizer.tapDownTimeThreshold = RIGHTCLICK_TAP_DOWN_TIME_THRESHOLD_S; // tap down time in seconds. - _mouseRightClickTapRecognizer.delaysTouchesBegan = NO; - _mouseRightClickTapRecognizer.delaysTouchesEnded = NO; - [self->view addGestureRecognizer:_mouseRightClickTapRecognizer]; - #if TARGET_OS_TV remotePressRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(remoteButtonPressed:)]; remotePressRecognizer.allowedPressTypes = @[@(UIPressTypeSelect)]; @@ -60,6 +54,20 @@ static const int REFERENCE_HEIGHT = 720; return self; } +// rightClickTapRec must be created from relativeTouchHandler,since there's a attr must be accessed directly from recognizer, and it's also a relative touch specific recognizer, having a right click selector in this touch handler class. +- (CustomTapGestureRecognizer* )getMouseRightClickTapRecognizer{ + // replace righclick recoginizing with my CustomTapGestureRecognizer for better experience, higher recoginizing rate. + mouseRightClickTapRecognizer = [[CustomTapGestureRecognizer alloc] initWithTarget:self action:@selector(mouseRightClick)]; + mouseRightClickTapRecognizer.numberOfTouchesRequired = 2; + mouseRightClickTapRecognizer.tapDownTimeThreshold = RIGHTCLICK_TAP_DOWN_TIME_THRESHOLD_S; // tap down time in seconds. + mouseRightClickTapRecognizer.delaysTouchesBegan = NO; + mouseRightClickTapRecognizer.delaysTouchesEnded = NO; + // [self->view addGestureRecognizer:mouseRightClickTapRecognizer]; //this recognizer will be added & removed by streamframeviewcontroller, instead of here by the touchHouandler. + return mouseRightClickTapRecognizer; // make sure callers outside the class get the same recognizer as the one created within the current class. +} + + + - (void)mouseRightClick { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ Log(LOG_D, @"Sending right mouse button press"); @@ -132,7 +140,7 @@ static const int REFERENCE_HEIGHT = 720; CGPoint secondLocation = [[[[event allTouches] allObjects] objectAtIndex:1] locationInView:view]; CGPoint avgLocation = CGPointMake((firstLocation.x + secondLocation.x) / 2, (firstLocation.y + secondLocation.y) / 2); - if ((CACurrentMediaTime() - _mouseRightClickTapRecognizer.gestureCapturedTime > RIGHTCLICK_TAP_DOWN_TIME_THRESHOLD_S) && touchLocation.y != avgLocation.y) { //prevent sending scrollevent while right click gesture is being recognized. The time threshold is only 150ms, resulting in a barely noticeable delay before the scroll event is activated. + if ((CACurrentMediaTime() - mouseRightClickTapRecognizer.gestureCapturedTime > RIGHTCLICK_TAP_DOWN_TIME_THRESHOLD_S) && touchLocation.y != avgLocation.y) { //prevent sending scrollevent while right click gesture is being recognized. The time threshold is only 150ms, resulting in a barely noticeable delay before the scroll event is activated. LiSendHighResScrollEvent((avgLocation.y - touchLocation.y) * 10); } diff --git a/Limelight/Input/StreamView.h b/Limelight/Input/StreamView.h index abf46c5e..ef50a688 100644 --- a/Limelight/Input/StreamView.h +++ b/Limelight/Input/StreamView.h @@ -39,6 +39,8 @@ - (uint16_t)getRotationFromAzimuthAngle:(float)azimuthAngle; - (OnScreenControlsLevel) getCurrentOscState; +- (UIResponder* )getTouchHandler; +- (OnScreenControls* )getOnScreenControlsObj; #if !TARGET_OS_TV - (void) updateCursorLocation:(CGPoint)location isMouse:(BOOL)isMouse; diff --git a/Limelight/Input/StreamView.m b/Limelight/Input/StreamView.m index 09510778..c14fda05 100644 --- a/Limelight/Input/StreamView.m +++ b/Limelight/Input/StreamView.m @@ -79,6 +79,8 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; [self removeGestureRecognizer:keyboardToggleRecognizer]; // for reconfig streamview in realtime isInputingText = false; + + //keyboardToggleRecognizer is one of the only recognizers defined within the stream view class keyboardToggleRecognizer = [[CustomTapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleKeyboard)]; keyboardToggleRecognizer.numberOfTouchesRequired = settings.keyboardToggleFingers.intValue; //will be changed accordinly by touch modes. keyboardToggleRecognizer.tapDownTimeThreshold = 0.3; // tap down time threshold in seconds. @@ -105,14 +107,14 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; switch (settings.touchMode.intValue) { case REGULAR_NATIVE_TOUCH: keyboardToggleRecognizer.immediateTriggering = false; - if(settings.onscreenControls.intValue == OnScreenControlsLevelCustom) keyboardToggleRecognizer.numberOfTouchesRequired = 3; //fixing keyboard taps to 3, in order to invoke OSC rebase in stream view by 4-finger tap. + //if(settings.onscreenControls.intValue == OnScreenControlsLevelCustom) keyboardToggleRecognizer.numberOfTouchesRequired = 3; //decprecated: fixing keyboard taps to 3, in order to invoke OSC rebase in stream view by 4-finger tap. case PURE_NATIVE_TOUCH: self->touchHandler = [[NativeTouchHandler alloc] initWithView:self andSettings:settings];break; case RELATIVE_TOUCH: self->touchHandler = [[RelativeTouchHandler alloc] initWithView:self andSettings:settings]; keyboardToggleRecognizer.immediateTriggering = false; - if(settings.onscreenControls.intValue == OnScreenControlsLevelCustom) keyboardToggleRecognizer.numberOfTouchesRequired = 3; //fixing keyboard taps to 3, in order to invoke OSC rebase in stream view by 4-finger tap. + //if(settings.onscreenControls.intValue == OnScreenControlsLevelCustom) keyboardToggleRecognizer.numberOfTouchesRequired = 3; //deprecated: fixing keyboard taps to 3, in order to invoke OSC rebase in stream view by 4-finger tap. break; case ABSOLUTE_TOUCH: self->touchHandler = [[AbsoluteTouchHandler alloc] initWithView:self]; @@ -124,11 +126,6 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; } onScreenControls = [[OnScreenControls alloc] initWithView:self controllerSup:controllerSupport streamConfig:streamConfig]; - // here we pass the tap recognizer to the onscreencontrols obj - if (settings.touchMode.intValue == RELATIVE_TOUCH){ - RelativeTouchHandler* relativeTouchHandler = (RelativeTouchHandler*) touchHandler; - onScreenControls.mouseRightClickTapRecognizer = relativeTouchHandler.mouseRightClickTapRecognizer; - } OnScreenControlsLevel level = (OnScreenControlsLevel)[settings.onscreenControls integerValue]; if (settings.touchMode.intValue != RELATIVE_TOUCH && settings.touchMode.intValue != REGULAR_NATIVE_TOUCH ) { @@ -187,6 +184,15 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; [self becomeFirstResponder]; } + +- (UIResponder* )getTouchHandler{ + return self->touchHandler; +} + +- (OnScreenControls* )getOnScreenControlsObj{ + return self->onScreenControls; +} + // this method also deals with lifting streamview for local keyboard - (void)keyboardWillShow:(NSNotification *)notification{ if(settings.liftStreamViewForKeyboard && !isInputingText){ @@ -205,6 +211,8 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; // NSLog(@"keyboard will show"); } + + // this method also deals with recovering streamview when local keyboard is turned off - (void)keyboardWillHide:(NSNotification *)notification{ diff --git a/Limelight/Localization/Localizable.xcstrings b/Limelight/Localization/Localizable.xcstrings index 1b3d7d6d..61ea437a 100644 --- a/Limelight/Localization/Localizable.xcstrings +++ b/Limelight/Localization/Localizable.xcstrings @@ -2119,48 +2119,48 @@ } } }, - "Tap 4 fingers to change on-screen controller layout in stream view" : { + "Tap 5 fingers to change on-screen controller layout in stream view" : { "extractionState" : "manual", "localizations" : { "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "在串流视图中轻按4根手指修改虚拟手柄布局" + "value" : "在串流视图中轻按5根手指修改虚拟手柄布局" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "在串流视图中轻按4根手指修改虚拟手柄布局" + "value" : "在串流视图中轻按5根手指修改虚拟手柄布局" } }, "zh-HK" : { "stringUnit" : { "state" : "translated", - "value" : "在串流视图中轻按4根手指修改虚拟手柄布局" + "value" : "在串流视图中轻按5根手指修改虚拟手柄布局" } } } }, - "Tap 4 Fingers to Change OSC Layout in Stream View" : { + "Tap 5 Fingers to Change OSC Layout in Stream View" : { "extractionState" : "manual", "localizations" : { "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "在串流视图中轻按4根手指修改虚拟手柄布局" + "value" : "在串流视图中轻按5根手指修改虚拟手柄布局" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "在串流视图中轻按4根手指修改虚拟手柄布局" + "value" : "在串流视图中轻按5根手指修改虚拟手柄布局" } }, "zh-HK" : { "stringUnit" : { "state" : "translated", - "value" : "在串流视图中轻按4根手指修改虚拟手柄布局" + "value" : "在串流视图中轻按5根手指修改虚拟手柄布局" } } } diff --git a/Limelight/ViewControllers/SettingsViewController.m b/Limelight/ViewControllers/SettingsViewController.m index bad9465f..1c27ee97 100644 --- a/Limelight/ViewControllers/SettingsViewController.m +++ b/Limelight/ViewControllers/SettingsViewController.m @@ -483,7 +483,7 @@ BOOL isCustomResolution(CGSize res) { - (void)showCustomOSCTip { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:[LocalizationHelper localizedStringForKey:@"Rebase in Stream View"] - message:[LocalizationHelper localizedStringForKey:@"Tap 4 fingers to change on-screen controller layout in stream view"] + message:[LocalizationHelper localizedStringForKey:@"Tap 5 fingers to change on-screen controller layout in stream view"] preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *okAction = [UIAlertAction actionWithTitle:[LocalizationHelper localizedStringForKey: @"Got it!"] style:UIAlertActionStyleDefault @@ -513,11 +513,12 @@ BOOL isCustomResolution(CGSize res) { bool oscEnabled = ([self.touchModeSelector selectedSegmentIndex] == RELATIVE_TOUCH || [self.touchModeSelector selectedSegmentIndex] == REGULAR_NATIVE_TOUCH) && [self.onscreenControlSelector selectedSegmentIndex] != OnScreenControlsLevelOff; bool customOscEnabled = oscEnabled && [self.onscreenControlSelector selectedSegmentIndex] == OnScreenControlsLevelCustom; - [self widget:self.keyboardToggleFingerNumSlider setEnabled:!customOscEnabled]; + // [self widget:self.keyboardToggleFingerNumSlider setEnabled:!customOscEnabled]; if(customOscEnabled && !justEnteredSettingsViewDoNotOpenOscLayoutTool) { - [self.keyboardToggleFingerNumSlider setValue:3.0]; - [self keyboardToggleFingerNumSliderMoved]; - [self.onscreenControllerLabel setText:[LocalizationHelper localizedStringForKey: @"Tap 4 Fingers to Change OSC Layout in Stream View"]]; + // [self.keyboardToggleFingerNumSlider setValue:3.0]; + // [self keyboardToggleFingerNumSliderMoved]; + [self keyboardToggleFingerNumSliderMoved]; // go to exclude 5 fingers + [self.onscreenControllerLabel setText:[LocalizationHelper localizedStringForKey: @"Tap 5 Fingers to Change OSC Layout in Stream View"]]; [self showCustomOSCTip]; justEnteredSettingsViewDoNotOpenOscLayoutTool = false; //if (self.layoutOnScreenControlsVC.isBeingPresented == NO) @@ -605,12 +606,13 @@ BOOL isCustomResolution(CGSize res) { [self widget:self.mousePointerVelocityFactorSlider setEnabled:[self.touchModeSelector selectedSegmentIndex] == RELATIVE_TOUCH]; // mouse velocity scaling works only in relative touch mode. // number of touches required to toggle keyboard will be fixed to 3 when OSC is enabled. - [self widget:self.keyboardToggleFingerNumSlider setEnabled: !customOscEnabled]; // cancel OSC limitation for regular native touch, + // [self widget:self.keyboardToggleFingerNumSlider setEnabled: !customOscEnabled]; // cancel OSC limitation for regular native touch, // when CustomOSC is enabled: if(customOscEnabled) { - [self.keyboardToggleFingerNumSlider setValue:3.0]; - [self.keyboardToggleFingerNumLabel setText:[LocalizationHelper localizedStringForKey:@"To Toggle Local Keyboard: Tap %d Fingers", (uint16_t)self.keyboardToggleFingerNumSlider.value]]; - [self.onscreenControllerLabel setText:[LocalizationHelper localizedStringForKey: @"Tap 4 Fingers to Change OSC Layout in Stream View"]]; + // [self.keyboardToggleFingerNumSlider setValue:3.0]; + // [self.keyboardToggleFingerNumLabel setText:[LocalizationHelper localizedStringForKey:@"To Toggle Local Keyboard: Tap %d Fingers", (uint16_t)self.keyboardToggleFingerNumSlider.value]]; + [self.onscreenControllerLabel setText:[LocalizationHelper localizedStringForKey: @"Tap 5 Fingers to Change OSC Layout in Stream View"]]; + [self keyboardToggleFingerNumSliderMoved]; // go exclude 5 fingers //if (self.layoutOnScreenControlsVC.isBeingPresented == NO) } else{ @@ -807,8 +809,19 @@ BOOL isCustomResolution(CGSize res) { } - (void) keyboardToggleFingerNumSliderMoved{ - if (self.keyboardToggleFingerNumSlider.value > 10.5f) [self.keyboardToggleFingerNumLabel setText:[LocalizationHelper localizedStringForKey:@"Local Keyboard Toggle Disabled"]]; - else [self.keyboardToggleFingerNumLabel setText:[LocalizationHelper localizedStringForKey:@"To Toggle Local Keyboard: Tap %d Fingers", (uint16_t)self.keyboardToggleFingerNumSlider.value]]; // Initiate label display + bool oscEnabled = ([self.touchModeSelector selectedSegmentIndex] == RELATIVE_TOUCH || [self.touchModeSelector selectedSegmentIndex] == REGULAR_NATIVE_TOUCH) && [self.onscreenControlSelector selectedSegmentIndex] != OnScreenControlsLevelOff; + bool customOscEnabled = oscEnabled && [self.onscreenControlSelector selectedSegmentIndex] == OnScreenControlsLevelCustom; + + CGFloat sliderValue = self.keyboardToggleFingerNumSlider.value; + if(customOscEnabled){ + // exclude 5 fingers when custom osc is enabled + if(sliderValue > OSC_TOOL_FINGERS - 1 && sliderValue < OSC_TOOL_FINGERS) [self.keyboardToggleFingerNumSlider setValue:4.0]; + if(sliderValue >= OSC_TOOL_FINGERS && sliderValue < OSC_TOOL_FINGERS + 1) [self.keyboardToggleFingerNumSlider setValue:6.0]; + } + + sliderValue = self.keyboardToggleFingerNumSlider.value; + if(sliderValue > 10.5f) [self.keyboardToggleFingerNumLabel setText:[LocalizationHelper localizedStringForKey:@"Local Keyboard Toggle Disabled"]]; + else [self.keyboardToggleFingerNumLabel setText:[LocalizationHelper localizedStringForKey:@"To Toggle Local Keyboard: Tap %d Fingers", (uint16_t)sliderValue]]; // Initiate label display, exclude 5 fingers. } - (void) slideToMenuDistanceSliderMoved{ diff --git a/Limelight/ViewControllers/StreamFrameViewController.m b/Limelight/ViewControllers/StreamFrameViewController.m index aa1ecd03..9e620725 100644 --- a/Limelight/ViewControllers/StreamFrameViewController.m +++ b/Limelight/ViewControllers/StreamFrameViewController.m @@ -15,7 +15,9 @@ #import "CustomEdgeSwipeGestureRecognizer.h" #import "CustomTapGestureRecognizer.h" #import "LocalizationHelper.h" +#import "RelativeTouchHandler.h" #import "Moonlight-Swift.h" +#import "SettingsViewController.h" #include #include @@ -56,22 +58,24 @@ #if !TARGET_OS_TV CustomEdgeSwipeGestureRecognizer *_slideToSettingsRecognizer; CustomEdgeSwipeGestureRecognizer *_slideToCmdToolRecognizer; - CustomTapGestureRecognizer *_oscLayoutTapRecoginizer; + CustomTapGestureRecognizer *_oscLayoutTapRecognizer; + CustomTapGestureRecognizer *_mouseRightClickRecognizer; + LayoutOnScreenControlsViewController *_layoutOnScreenControlsVC; #endif } - (void)configOscLayoutTool{ - [self.view removeGestureRecognizer:_oscLayoutTapRecoginizer]; + [self.view removeGestureRecognizer:_oscLayoutTapRecognizer]; if((_settings.touchMode.intValue == RELATIVE_TOUCH || _settings.touchMode.intValue == REGULAR_NATIVE_TOUCH) && _settings.onscreenControls.intValue == OnScreenControlsLevelCustom){ - _oscLayoutTapRecoginizer = [[CustomTapGestureRecognizer alloc] initWithTarget:self action:@selector(layoutOSC)]; - _oscLayoutTapRecoginizer.numberOfTouchesRequired = 4; //tap 4 fingers to invoke OSC rebase - _oscLayoutTapRecoginizer.tapDownTimeThreshold = 1; - _oscLayoutTapRecoginizer.delaysTouchesBegan = NO; - _oscLayoutTapRecoginizer.delaysTouchesEnded = NO; + _oscLayoutTapRecognizer = [[CustomTapGestureRecognizer alloc] initWithTarget:self action:@selector(layoutOSC)]; + _oscLayoutTapRecognizer.numberOfTouchesRequired = OSC_TOOL_FINGERS; //Tap 5 fingers to invoke OSC rebase + _oscLayoutTapRecognizer.tapDownTimeThreshold = 1; + _oscLayoutTapRecognizer.delaysTouchesBegan = NO; + _oscLayoutTapRecognizer.delaysTouchesEnded = NO; - [self.view addGestureRecognizer:_oscLayoutTapRecoginizer]; + [self.view addGestureRecognizer:_oscLayoutTapRecognizer]; /* sets a reference to the correct 'LayoutOnScreenControlsViewController' depending on whether the user is on an iPhone or iPad */ _layoutOnScreenControlsVC = [[LayoutOnScreenControlsViewController alloc] init]; BOOL isIPhone = ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone); @@ -94,6 +98,22 @@ [self presentViewController:cmdManViewController animated:YES completion:nil]; } +- (void)configMouseRightClickGesture{ + [self.view removeGestureRecognizer:_mouseRightClickRecognizer];// remove the recognizer first + OnScreenControls* onScreenControls = [_streamView getOnScreenControlsObj];// retrieve onScreenControls obj from sreamview + onScreenControls.mouseRightClickTapRecognizer = nil; + + if(_settings.touchMode.intValue == RELATIVE_TOUCH){ + // retrieve mouse right click recognizer from streamview + RelativeTouchHandler* touchHandler = (RelativeTouchHandler* ) [_streamView getTouchHandler]; + _mouseRightClickRecognizer = [touchHandler getMouseRightClickTapRecognizer]; + onScreenControls.mouseRightClickTapRecognizer = _mouseRightClickRecognizer; // pass the recognizer to the onscreen controls obj. + // add the recognizer to the streamframe view. + [self.view addGestureRecognizer:_mouseRightClickRecognizer]; + } + // reset this recognizer for streamview. +} + - (void)configSwipeGestures{ [self.view removeGestureRecognizer:_slideToSettingsRecognizer]; _slideToSettingsRecognizer = [[CustomEdgeSwipeGestureRecognizer alloc] initWithTarget:self action:@selector(edgeSwiped)]; @@ -139,9 +159,11 @@ - (void)reConfigStreamViewRealtime{ //[self.view removeGestureRecognizer:] _settings = [[[DataManager alloc] init] getSettings]; //StreamFrameViewController retrieve the settings here. + /* [self configOscLayoutTool]; [self configSwipeGestures]; - [self configZoomGesture]; + [self configMouseRightClickGesture]; // added in relative touch mode. + [self configZoomGesture]; */ [self->_streamView disableOnScreenControls]; //don't know why but this must be called outside the streamview class, just put it here. execute in streamview class cause hang [self.mainFrameViewcontroller reloadStreamConfig]; // reload streamconfig _controllerSupport = [[ControllerSupport alloc] initWithConfig:self.streamConfig delegate:self]; // reload controllerSupport obj, this is mandatory for OSC reload,especially when the stream view is launched without OSC @@ -155,6 +177,11 @@ selector:@selector(updateStatsOverlay) userInfo:nil repeats:_settings.statsOverlay]; + // these must be congured in the last step: + [self configOscLayoutTool]; + [self configSwipeGestures]; + [self configMouseRightClickGesture]; // added in relative touch mode. + [self configZoomGesture]; } @@ -270,6 +297,7 @@ #else [self configSwipeGestures]; // swipe & exit gesture configured here + [self configMouseRightClickGesture]; // added in relative touch mode. [self configOscLayoutTool]; //_oscLayoutTapRecoginizer will be added or removed to the view here #endif