diff --git a/Limelight/Input/CommandManager.swift b/Limelight/Input/CommandManager.swift index 5b43e196..926bf48f 100644 --- a/Limelight/Input/CommandManager.swift +++ b/Limelight/Input/CommandManager.swift @@ -51,11 +51,15 @@ import UIKit @objc public class CommandManager: NSObject { @objc public static let shared = CommandManager() - @objc public static let mouseButtonMappings: [String: Int32] = ["M_LEFT" : BUTTON_LEFT, - "M_MIDDLE" : BUTTON_MIDDLE, - "M_RIGHT" : BUTTON_RIGHT, - "M_X1" : BUTTON_X1, - "M_X2" : BUTTON_X2] + @objc public static let mouseButtonMappings: [String: Int32] = [ + "YSML" : BUTTON_LEFT, + "YSMR" : BUTTON_RIGHT, + "M_LEFT" : BUTTON_LEFT, + "M_MIDDLE" : BUTTON_MIDDLE, + "M_RIGHT" : BUTTON_RIGHT, + "M_X1" : BUTTON_X1, + "M_X2" : BUTTON_X2 + ] @objc public static let oscButtonMappings: [String: Int32] = [ @@ -86,19 +90,18 @@ import UIKit "OSCSTART", "OSCSELECT"] - @objc public static let touchPadCmds: [String] = ["LSVPAD", "RSVPAD", "LSPAD", "RSPAD", "MOUSEPAD", "DPAD", "WASDPAD", "ARROWPAD"] + @objc public static let touchPadCmds: [String] = ["LSVPAD", "RSVPAD", "LSPAD", "RSPAD", "MOUSEPAD", "DPAD", "WASDPAD", "ARROWPAD", "YSWASD"] @objc public static let stickTouchPads: [String] = ["LSVPAD", "RSVPAD", "LSPAD", "RSPAD"] @objc public static let nonVectorStickPads: [String] = ["LSPAD", "RSPAD"] @objc public static let specialOverlayButtonCmds: [String] = ["SETTINGS"] - @objc public static let specialGameWidgets: [String] = ["YSRT1", "YSB1","YSRT2", "YSB2", "YSEM", "YSYM"] + @objc public static let specialGameWidgets: [String] = ["YSRT1", "YSB1", "YSRT2", "YSB2", "YSEM", "YSML", "YSMR", "YSWASD"] @objc public static let yuanshenRsvButtonCmds: [String] = ["YSRT1", "YSB1"] - @objc public static let yuanshenMouseButtonCmds: [String] = ["YSEM", "YSYM"] + @objc public static let yuanshenMouseMoveButtonCmds: [String] = ["YSEM", "YSML", "YSMR"] static let keyboardButtonMappings: [String: Int16] = [ // Windows Key Codes "YSEM": 0x45, // 'E' & mousePad button in GenshinImpact - "YSYM": 0x59, // 'Y' & mousePad button in GenshinImpact "CTRL": 0x11, // VK_CONTROL "SHIFT": 0x10, // VK_SHIFT "ALT": 0x12, // VK_MENU diff --git a/Limelight/Input/OnScreenWidgetView.swift b/Limelight/Input/OnScreenWidgetView.swift index 6a4d5b93..96e82058 100644 --- a/Limelight/Input/OnScreenWidgetView.swift +++ b/Limelight/Input/OnScreenWidgetView.swift @@ -95,7 +95,7 @@ import UIKit private let moonlightPurple: CGColor = UIColor(red: 0.5, green: 0.5, blue: 1.0, alpha: 0.86).cgColor // whole button press down visual effect - private let buttonDownVisualEffectLayer = CAShapeLayer() + @objc public let buttonDownVisualEffectLayer = CAShapeLayer() private var buttonDownVisualEffectWidth: CGFloat @objc init(keyString: String, keyLabel: String, shape:String) { @@ -470,7 +470,7 @@ import UIKit DispatchQueue.global().async { // 后台执行耗时操作 usleep(200000) - DispatchQueue.main.async { + DispatchQueue.main.async { // switch to main thread to update UI if !self.touchBegan { self.crossMarkLayer.removeFromSuperlayer() self.stickBallLayer.removeFromSuperlayer() @@ -578,7 +578,7 @@ import UIKit if(buttonPressed & Direction.up.rawValue == Direction.up.rawValue){ showLrudDirectionIndicator(with: upIndicator) switch keyString { - case "WASDPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["W"]!,Int8(KEY_ACTION_DOWN), 0) + case "WASDPAD","YSWASD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["W"]!,Int8(KEY_ACTION_DOWN), 0) case "ARROWPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["UP_ARROW"]!,Int8(KEY_ACTION_DOWN), 0) case "DPAD": self.onScreenControls.pressDownControllerButton(UP_FLAG) default: break @@ -587,7 +587,7 @@ import UIKit else{ self.upIndicator.removeFromSuperlayer() switch keyString { - case "WASDPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["W"]!,Int8(KEY_ACTION_UP), 0) + case "WASDPAD","YSWASD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["W"]!,Int8(KEY_ACTION_UP), 0) case "ARROWPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["UP_ARROW"]!,Int8(KEY_ACTION_UP), 0) case "DPAD": self.onScreenControls.releaseControllerButton(UP_FLAG) default: break @@ -596,7 +596,7 @@ import UIKit if(buttonPressed & Direction.down.rawValue == Direction.down.rawValue){ showLrudDirectionIndicator(with: downIndicator) switch keyString { - case "WASDPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["S"]!,Int8(KEY_ACTION_DOWN), 0) + case "WASDPAD","YSWASD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["S"]!,Int8(KEY_ACTION_DOWN), 0) case "ARROWPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["DOWN_ARROW"]!,Int8(KEY_ACTION_DOWN), 0) case "DPAD": self.onScreenControls.pressDownControllerButton(DOWN_FLAG) default: break @@ -605,7 +605,7 @@ import UIKit else{ self.downIndicator.removeFromSuperlayer() switch keyString { - case "WASDPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["S"]!,Int8(KEY_ACTION_UP), 0) + case "WASDPAD","YSWASD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["S"]!,Int8(KEY_ACTION_UP), 0) case "ARROWPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["DOWN_ARROW"]!,Int8(KEY_ACTION_UP), 0) case "DPAD": self.onScreenControls.releaseControllerButton(DOWN_FLAG) default: break @@ -614,7 +614,7 @@ import UIKit if(buttonPressed & Direction.left.rawValue == Direction.left.rawValue){ showLrudDirectionIndicator(with: leftIndicator) switch keyString { - case "WASDPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["A"]!,Int8(KEY_ACTION_DOWN), 0) + case "WASDPAD","YSWASD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["A"]!,Int8(KEY_ACTION_DOWN), 0) case "ARROWPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["LEFT_ARROW"]!,Int8(KEY_ACTION_DOWN), 0) case "DPAD": self.onScreenControls.pressDownControllerButton(LEFT_FLAG) default: break @@ -623,7 +623,7 @@ import UIKit else{ self.leftIndicator.removeFromSuperlayer() switch keyString { - case "WASDPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["A"]!,Int8(KEY_ACTION_UP), 0) + case "WASDPAD","YSWASD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["A"]!,Int8(KEY_ACTION_UP), 0) case "ARROWPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["LEFT_ARROW"]!,Int8(KEY_ACTION_UP), 0) case "DPAD": self.onScreenControls.releaseControllerButton(LEFT_FLAG) default: break @@ -632,7 +632,7 @@ import UIKit if(buttonPressed & Direction.right.rawValue == Direction.right.rawValue){ showLrudDirectionIndicator(with: rightIndicator) switch keyString { - case "WASDPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["D"]!,Int8(KEY_ACTION_DOWN), 0) + case "WASDPAD","YSWASD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["D"]!,Int8(KEY_ACTION_DOWN), 0) case "ARROWPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["RIGHT_ARROW"]!,Int8(KEY_ACTION_DOWN), 0) case "DPAD": self.onScreenControls.pressDownControllerButton(RIGHT_FLAG) default: break @@ -641,7 +641,7 @@ import UIKit else{ self.rightIndicator.removeFromSuperlayer() switch keyString { - case "WASDPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["D"]!,Int8(KEY_ACTION_UP), 0) + case "WASDPAD","YSWASD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["D"]!,Int8(KEY_ACTION_UP), 0) case "ARROWPAD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["RIGHT_ARROW"]!,Int8(KEY_ACTION_UP), 0) case "DPAD": self.onScreenControls.releaseControllerButton(RIGHT_FLAG) default: break @@ -888,6 +888,15 @@ import UIKit break case "DPAD", "WASDPAD", "ARROWPAD": self.lrudIndicatorBall = createAndShowLrudBall(at: touchBeganLocation) + case "YSWASD": + self.lrudIndicatorBall = createAndShowLrudBall(at: touchBeganLocation) + if quickDoubleTapDetected { + LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["CTRL"]!,Int8(KEY_ACTION_DOWN), 0) + DispatchQueue.global(qos: .userInitiated).async { + usleep(100000) + LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["CTRL"]!,Int8(KEY_ACTION_UP), 0) + } + } break default: break @@ -928,6 +937,7 @@ import UIKit } // here is in edit mode: else{ + self.buttonDownVisualEffect() NotificationCenter.default.post(name: Notification.Name("OnScreenWidgetViewSelected"),object: self) // inform layout tool controller to fetch button size factors. self will be passed as the object of the notification } @@ -990,7 +1000,7 @@ import UIKit self.latestTouchLocation = currentTouchLocation switch self.keyString{ - case "MOUSEPAD": + case "MOUSEPAD","YSEM","YSML","YSMR": LiSendMouseMoveEvent(Int16(truncatingIfNeeded: Int(deltaX * 1.7 * sensitivityFactor)), Int16(truncatingIfNeeded: Int(deltaY * 1.7 * sensitivityFactor))) break case "LSPAD": @@ -1001,13 +1011,9 @@ import UIKit updateStickIndicator() case "LSVPAD": self.sendLeftStickTouchPadEvent(inputX: deltaX*1.5167*sensitivityFactor, inputY: deltaY*1.5167*sensitivityFactor) - case "RSVPAD": + case "RSVPAD", "YSRT1", "YSB1": self.sendRightStickTouchPadEvent(inputX: deltaX*1.5167*sensitivityFactor, inputY: deltaY*1.5167*sensitivityFactor); - case "YSRT1": - self.sendRightStickTouchPadEvent(inputX: deltaX*1.5167*sensitivityFactor, inputY: deltaY*1.5167*sensitivityFactor); - case "YSB1": - self.sendRightStickTouchPadEvent(inputX: deltaX*1.5167*sensitivityFactor, inputY: deltaY*1.5167*sensitivityFactor); - case "DPAD", "WASDPAD", "ARROWPAD": + case "DPAD", "WASDPAD", "ARROWPAD", "YSWASD": handleLrudTouchMove() default: break @@ -1052,13 +1058,9 @@ import UIKit self.resetStickBallPositionAndRemoveIndicator() case "LSVPAD": self.onScreenControls.clearLeftStickTouchPadFlag() - case "RSVPAD": + case "RSVPAD","YSRT1","YSB1": self.onScreenControls.clearRightStickTouchPadFlag() - case "YSRT1": - self.onScreenControls.clearRightStickTouchPadFlag() - case "YSB1": - self.onScreenControls.clearRightStickTouchPadFlag() - case "WASDPAD": + case "WASDPAD","YSWASD": LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["W"]!,Int8(KEY_ACTION_UP), 0) LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["A"]!,Int8(KEY_ACTION_UP), 0) LiSendKeyboardEvent(CommandManager.keyboardButtonMappings["S"]!,Int8(KEY_ACTION_UP), 0) @@ -1113,9 +1115,6 @@ import UIKit } } - self.buttonUpVisualEffect() - - if OnScreenWidgetView.editMode { guard let superview = superview else { return } @@ -1144,6 +1143,8 @@ import UIKit self.updateStickIndicator() } } + + self.buttonUpVisualEffect() } } diff --git a/Limelight/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m b/Limelight/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m index b358ae40..8ea6f573 100644 --- a/Limelight/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m +++ b/Limelight/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m @@ -438,7 +438,7 @@ [self.widgetAlphaSlider setValue: self->selectedWidgetView.backgroundAlpha]; [self.widgetBorderWidthSlider setValue:self->selectedWidgetView.borderWidth]; - NSSet *stickAndMouseTouchpads = [NSSet setWithObjects:@"YSB1", @"YSRT1", @"LSPAD", @"RSPAD", @"LSVPAD", @"RSVPAD", @"MOUSEPAD", nil]; + NSSet *stickAndMouseTouchpads = [NSSet setWithObjects:@"YSB1", @"YSRT1",@"YSB2", @"YSRT2", @"YSEM", @"YSML", @"LSPAD", @"RSPAD", @"LSVPAD", @"RSVPAD", @"MOUSEPAD", nil]; NSSet *nonVectorStickPads = [NSSet setWithObjects: @"LSPAD", @"RSPAD", nil]; @@ -512,7 +512,7 @@ [widgetHeightSliderLabel setText:[LocalizationHelper localizedStringForKey:@"Widget Height: %.2f", self.widgetHeightSlider.value]]; if(self->selectedWidgetView != nil && self->widgetViewSelected){ self->selectedWidgetView.translatesAutoresizingMaskIntoConstraints = true; // this is mandatory to prevent unexpected key view location change - if([CommandManager.oscButtonMappings.allKeys containsObject:selectedWidgetView.keyString] && ![CommandManager.oscRectangleButtonCmds containsObject:selectedWidgetView.keyString]) return; // don't change custom osc button height, except for dPad buttons which are in rectangle shape + if([self->selectedWidgetView.shape isEqualToString:@"round"]) return; // don't change height for round buttons, except for dPad buttons which are in rectangle shape self->selectedWidgetView.heightFactor = self.widgetHeightSlider.value; [self->selectedWidgetView resizeWidgetView]; } @@ -845,6 +845,7 @@ [self.OnScreenWidgetViews removeObject:self->selectedWidgetView]; [selectedWidgetView.stickBallLayer removeFromSuperlayer]; [selectedWidgetView.crossMarkLayer removeFromSuperlayer]; + [selectedWidgetView.buttonDownVisualEffectLayer removeFromSuperlayer]; } }