From 535d6009ad1222a338695b62d63b9a96e6874a5b Mon Sep 17 00:00:00 2001 From: True Zhuanjia Date: Tue, 19 May 2026 11:23:30 +0800 Subject: [PATCH] controller report issue fixes --- VoidLink/Input/OnScreenWidgetView.swift | 28 ++++++++++++------- ...LayoutOnScreenControlsViewController.swift | 2 +- .../ViewControllers/SettingsViewController.m | 5 +++- .../StreamFrameViewController.m | 2 ++ 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/VoidLink/Input/OnScreenWidgetView.swift b/VoidLink/Input/OnScreenWidgetView.swift index 3678e421..bf130b56 100644 --- a/VoidLink/Input/OnScreenWidgetView.swift +++ b/VoidLink/Input/OnScreenWidgetView.swift @@ -632,14 +632,14 @@ import ObjectiveC.runtime self.sensitivityYMax = 16.0 } - self.hasYawFactor = self.motionControlButtonString == "GYRO" && (oscProfile.mapGyroTo == MapGyroTo.mapGyroToMouse || oscProfile.yawPitchToRightStick) + self.hasYawFactor = self.motionControlButtonString == "GYRO" && (oscProfile.mapGyroTo == .mapGyroToMouse || oscProfile.yawPitchToRightStick) self.hasPitchFactor = self.hasYawFactor self.yawFactorMin = 0 self.yawFactorMax = 1.0 self.pitchFactorMin = 0 self.pitchFactorMax = 1.0 - self.hasRollFactor = self.motionControlButtonString == "GYRO" && (oscProfile.mapGyroTo == MapGyroTo.mapGyroToControllerStick && oscProfile.rollToLeftStick) + self.hasRollFactor = self.motionControlButtonString == "GYRO" && (oscProfile.mapGyroTo == .mapGyroToControllerStick && oscProfile.rollToLeftStick) self.hasAutoTap = self.widgetType == WidgetTypeEnum.button && self.functionalButtonString == "" && self.motionControlButtonString == "" self.isMousePadWithButtonActions = CommandManager.mousePadWithButtonActions.contains(self.touchPadString) && widgetType == WidgetTypeEnum.touchPad @@ -1808,7 +1808,7 @@ import ObjectiveC.runtime let targetX = self.weightedTouchInputToStickOffset(input: weightedTouchX) let targetY = -self.weightedTouchInputToStickOffset(input: weightedTouchY) - let mixRightStickInputToGyro = (oscProfile.mapGyroTo == MapGyroTo.mapGyroToControllerStick + let mixRightStickInputToGyro = (oscProfile.mapGyroTo == .mapGyroToControllerStick && oscProfile.yawPitchToRightStick) if !mixRightStickInputToGyro || (self.motionHandler?.gyroMixInputStarted() != true) { @@ -1816,13 +1816,14 @@ import ObjectiveC.runtime self.onScreenControls?.sendRightStickTouchPadEvent(stickOffsetVector.dx, stickOffsetVector.dy) } self.motionHandler?.mixOnScreenRightStickAndGyroInput(x: targetX, y: targetY) + if !OnScreenWidgetView.gamepadArrivalReported {OnScreenWidgetView.gamepadArrivalReported = true} } private func sendLeftStickTouchPadEvent(weightedTouchX:CGFloat, weightedTouchY:CGFloat, circulate:Bool=false){ let targetX = self.weightedTouchInputToStickOffset(input: weightedTouchX) let targetY = -self.weightedTouchInputToStickOffset(input: weightedTouchY) - let mixLeftStickInputToGyro = (oscProfile.mapGyroTo == MapGyroTo.mapGyroToControllerStick + let mixLeftStickInputToGyro = (oscProfile.mapGyroTo == .mapGyroToControllerStick && oscProfile.rollToLeftStick) if !mixLeftStickInputToGyro || (self.motionHandler?.gyroMixInputStarted() != true) { @@ -1830,6 +1831,7 @@ import ObjectiveC.runtime self.onScreenControls?.sendLeftStickTouchPadEvent(stickOffsetVector.dx, stickOffsetVector.dy) } self.motionHandler?.mixOnScreenLeftStickAndGyroInput(x: targetX, y: targetY) + if !OnScreenWidgetView.gamepadArrivalReported {OnScreenWidgetView.gamepadArrivalReported = true} } private func sendLeftTriggerTouchPadEvent(inputY: CGFloat){ @@ -1872,6 +1874,7 @@ import ObjectiveC.runtime for comboString in comboStrings { if CommandManager.oscButtonMappings.keys.contains(comboString) { self.sendOscButtonDownEvent(oscString: comboString) + if !OnScreenWidgetView.gamepadArrivalReported {OnScreenWidgetView.gamepadArrivalReported = true} } if CommandManager.keyboardButtonMappings.keys.contains(comboString) { LiSendKeyboardEvent(CommandManager.keyboardButtonMappings[comboString]!,Int8(KEY_ACTION_DOWN), 0) @@ -2642,8 +2645,10 @@ import ObjectiveC.runtime switch self.motionControlButtonString { case "GYRO": self.motionHandler?.startGyroByOnScreenButton(self, yawFactor: yawFactor, pitchFactor: pitchFactor, rollFactor: rollFactor) + if !OnScreenWidgetView.gamepadArrivalReported {OnScreenWidgetView.gamepadArrivalReported = oscProfile.mapGyroTo == .mapGyroToControllerStick} case "GYROPAUSE": self.motionHandler?.stopGyroUpdate(interruptNoneGyroInput:false) + if !OnScreenWidgetView.gamepadArrivalReported {OnScreenWidgetView.gamepadArrivalReported = oscProfile.mapGyroTo == .mapGyroToControllerStick} break case "ACCEL": break @@ -2835,7 +2840,7 @@ import ObjectiveC.runtime private func clearRightStickTouchPadFlag(){ if !hasInertia {stickOffsetVector = .zero} - let mixRightStickInputToGyro = (oscProfile.mapGyroTo == MapGyroTo.mapGyroToControllerStick + let mixRightStickInputToGyro = (oscProfile.mapGyroTo == .mapGyroToControllerStick && oscProfile.yawPitchToRightStick) if !mixRightStickInputToGyro || self.motionHandler?.gyroMixInputStarted() != true { self.onScreenControls?.clearRightStickTouchPadFlag() @@ -2845,7 +2850,7 @@ import ObjectiveC.runtime private func clearLeftStickTouchPadFlag(){ if !hasInertia {stickOffsetVector = .zero} - let mixLeftStickInputToGyro = (oscProfile.mapGyroTo == MapGyroTo.mapGyroToControllerStick + let mixLeftStickInputToGyro = (oscProfile.mapGyroTo == .mapGyroToControllerStick && oscProfile.rollToLeftStick) if !mixLeftStickInputToGyro || self.motionHandler?.gyroMixInputStarted() != true { self.onScreenControls?.clearLeftStickTouchPadFlag() @@ -3806,6 +3811,7 @@ import ObjectiveC.runtime return OnScreenWidgetView.mapping.keys.max() ?? -1 } + @objc static var gamepadArrivalReported: Bool = false override func didMoveToSuperview() { super.didMoveToSuperview() OnScreenWidgetView.installAutoDockIfNeeded() @@ -3817,14 +3823,14 @@ import ObjectiveC.runtime label.alpha = 1 autoDockRestoreOriginalAlpha() if self.motionControlButtonString == "GYRO" { - self.motionHandler?.stopGyroUpdate(interruptNoneGyroInput: true) + if OnScreenWidgetView.gamepadArrivalReported {self.motionHandler?.stopGyroUpdate(interruptNoneGyroInput: true)} self.motionHandler?.gyroStarter = nil } if self.motionControlButtonString == "ACCEL" {} if self.motionControlButtonString == "MOTION" {} if self.widgetType == WidgetTypeEnum.button && !OnScreenWidgetView.editMode { - self.sendComboButtonsUpEvent(comboStrings: self.comboButtonStrings) + if OnScreenWidgetView.gamepadArrivalReported {self.sendComboButtonsUpEvent(comboStrings: self.comboButtonStrings)} self.functionalWidgetDelegate?.alterAbsTouchDragWith(mouseButton:BUTTON_LEFT) } buttonDownVisualEffectLayer.removeFromSuperlayer() @@ -3843,8 +3849,10 @@ import ObjectiveC.runtime stickWheelLayer.removeFromSuperlayer() stickWheelLayerSmall.removeFromSuperlayer() self.inertialScroller.timer?.clean() - self.clearLeftStickTouchPadFlag() - self.clearRightStickTouchPadFlag() + if OnScreenWidgetView.gamepadArrivalReported { + self.clearLeftStickTouchPadFlag() + self.clearRightStickTouchPadFlag() + } self.autoTapTimer?.clean() self.onScreenControls = nil } diff --git a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.swift b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.swift index 8a4132c7..60c74832 100644 --- a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.swift +++ b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.swift @@ -811,7 +811,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg private func refreshPanelForSelectedWidget(_ widgetView: OnScreenWidgetView) { // hideStickIndicators() - clearSickInput() + if OnScreenWidgetView.gamepadArrivalReported {clearSickInput()} enableCommonWidgetTools() widgetViewSelected = true controllerLayerSelected = false diff --git a/VoidLink/ViewControllers/SettingsViewController.m b/VoidLink/ViewControllers/SettingsViewController.m index 84420e22..eecb1d06 100644 --- a/VoidLink/ViewControllers/SettingsViewController.m +++ b/VoidLink/ViewControllers/SettingsViewController.m @@ -489,7 +489,7 @@ BOOL isCustomResolution(int resolutionSelected) { if(PencilHandler.shared) [PencilHandler.shared setupPressureLUTWithProfile:oscProfile]; } - if(!leftStickMinOffsetSliderNotMoved || !rightStickMinOffsetSliderNotMoved){ + if(!leftStickMinOffsetSliderNotMoved || !rightStickMinOffsetSliderNotMoved || OnScreenWidgetView.gamepadArrivalReported){ if(OnScreenControls.shared){ [OnScreenControls.shared clearLeftStickTouchPadFlag]; [OnScreenControls.shared clearRightStickTouchPadFlag]; @@ -2972,18 +2972,21 @@ BOOL isCustomResolution(int resolutionSelected) { [self findDynamicLabelFromStack:_gyroToStickMinOffsetStack].text = [NSString stringWithFormat:@" %d ", (int16_t)sender.value]; if(settingsViewJustExpanded) return; LiSendControllerEvent(0, 0, 0, _rollToLeftStickSwitch.isOn?sender.value:0, 0, _yawPitchToRightStickSwitch.isOn?sender.value:0, 0); + OnScreenWidgetView.gamepadArrivalReported = true; } - (void)leftStickMinOffsetSliderMoved:(UISlider* )sender{ [self findDynamicLabelFromStack:_leftStickMinOffsetStack].text = [NSString stringWithFormat:@" %d ", (int16_t)sender.value]; if(settingsViewJustExpanded) return; LiSendControllerEvent(0, 0, 0, sender.value, 0, 0, 0); + OnScreenWidgetView.gamepadArrivalReported = true; } - (void)rightStickMinOffsetSliderMoved:(UISlider* )sender{ [self findDynamicLabelFromStack:_rightStickMinOffsetStack].text = [NSString stringWithFormat:@" %d ", (int16_t)sender.value]; if(settingsViewJustExpanded) return; LiSendControllerEvent(0, 0, 0, 0, 0, sender.value, 0); + OnScreenWidgetView.gamepadArrivalReported = true; } - (void)invokeOscLayout{ diff --git a/VoidLink/ViewControllers/StreamFrameViewController.m b/VoidLink/ViewControllers/StreamFrameViewController.m index 9258c491..593b4356 100644 --- a/VoidLink/ViewControllers/StreamFrameViewController.m +++ b/VoidLink/ViewControllers/StreamFrameViewController.m @@ -965,6 +965,8 @@ } _mainFrameViewcontroller.sessionLaunchedWithAbsoluteTouch = _settings.touchMode.intValue == AbsoluteTouch; + + OnScreenWidgetView.gamepadArrivalReported = false; } - (void)keyboardWillShow:(NSNotification *)notification{