add mouseButton support for pencil side tap & toolbox menu

This commit is contained in:
True Zhuanjia committed 2026-02-09 16:19:42 +08:00
1 parent bbd2e37067
commit 0152f48886
6 files changed
+49 -44

No files matched your search

+31 -26
View File
@@ -446,23 +446,25 @@ import UIKit
} }
// extractKeyStrings from keyboardCMDString // extractKeyStrings from keyboardCMDString
@objc public func extractKeyStrings(from keyboardCmd: String) -> [String]? { @objc public func extractAutoReleaseButtonStrings(from cmd: String) -> [String]? {
let keyboardCmd = keyboardCmd.uppercased() let cmd = cmd.uppercased()
let keys = CommandManager.keyboardButtonMappings.keys.joined(separator: "|") let mergedKeys = (Set(CommandManager.keyboardButtonMappings.keys)
.union(Set(CommandManager.mouseButtonMappings.keys)))
let keys = mergedKeys.joined(separator: "|")
let pattern = "^(?:(\(keys))(?:\\+(\(keys))*)*)$" let pattern = "^(?:(\(keys))(?:\\+(\(keys))*)*)$"
guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else { guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else {
print("Failed to create regex") print("Failed to create regex")
return nil return nil
} }
let range = NSRange(location: 0, length: keyboardCmd.utf16.count) let range = NSRange(location: 0, length: cmd.utf16.count)
guard let match = regex.firstMatch(in: keyboardCmd, options: [], range: range) else { guard let match = regex.firstMatch(in: cmd, options: [], range: range) else {
print("No match found for input: \(keyboardCmd)") print("No match found for input: \(cmd)")
return nil return nil
} }
// print("Regex matched for input: \(input)") // print("Regex matched for input: \(input)")
let matchedString = (keyboardCmd as NSString).substring(with: match.range(at: 0)) let matchedString = (cmd as NSString).substring(with: match.range(at: 0))
let keyStrings = matchedString.split(separator: "+").map { String($0) } let keyStrings = matchedString.split(separator: "+").map { String($0) }
guard !keyStrings.isEmpty else { guard !keyStrings.isEmpty else {
@@ -473,7 +475,8 @@ import UIKit
var validKeyStrings: [String] = [] var validKeyStrings: [String] = []
for key in keyStrings { for key in keyStrings {
if CommandManager.keyboardButtonMappings.keys.contains(key) { if (CommandManager.keyboardButtonMappings.keys.contains(key)
|| CommandManager.mouseButtonMappings.keys.contains(key)) {
validKeyStrings.append(key) validKeyStrings.append(key)
} else { } else {
print(" '\(key)' is not defined in key mappings") print(" '\(key)' is not defined in key mappings")
@@ -552,7 +555,7 @@ import UIKit
@objc public func addCommand(_ command: RemoteCommand) -> Bool { @objc public func addCommand(_ command: RemoteCommand) -> Bool {
command.cmdString = command.cmdString.uppercased() // convert all letters to upper case command.cmdString = command.cmdString.uppercased() // convert all letters to upper case
if(command.alias.trimmingCharacters(in: .whitespacesAndNewlines).count == 0) {command.alias = command.cmdString} // copy cmd string as alias when alias is empty if(command.alias.trimmingCharacters(in: .whitespacesAndNewlines).count == 0) {command.alias = command.cmdString} // copy cmd string as alias when alias is empty
let keyStrings = extractKeyStrings(from: command.cmdString) let keyStrings = extractAutoReleaseButtonStrings(from: command.cmdString)
if (keyStrings == nil) {return false} // in case of non-keyboard command strings, return false if (keyStrings == nil) {return false} // in case of non-keyboard command strings, return false
commands.append(command) commands.append(command)
saveCommands() saveCommands()
@@ -591,39 +594,41 @@ import UIKit
} }
} }
private func saveCommands() { private func saveCommands() {
if let data = try? NSKeyedArchiver.archivedData(withRootObject: commands, requiringSecureCoding: false) { if let data = try? NSKeyedArchiver.archivedData(withRootObject: commands, requiringSecureCoding: false) {
UserDefaults.standard.set(data, forKey: "savedCommands") UserDefaults.standard.set(data, forKey: "savedCommands")
} }
} }
@objc public func sendKeyComboCommand(keyboardCmdStrings: [String]?, delay: TimeInterval = 0.2, index: Int = 0) { // we need a large delay for WAN streaming @objc public func sendAutoReleaseComboCommand(cmdString: [String]?, delay: TimeInterval = 0.2, index: Int = 0) { // we need a large delay for WAN streaming
// 如果已处理完所有按键,则开始释放按键 // 如果已处理完所有按键,则开始释放按键
guard let keyboardCmdStrings = keyboardCmdStrings else { return } guard let cmdString = cmdString else { return }
guard index < keyboardCmdStrings.count else { guard index < cmdString.count else {
// 释放按键 // 释放按键
for keyStr in keyboardCmdStrings.reversed() { // 从后往前释放按键 DispatchQueue.main.asyncAfter(deadline: .now()) {
if let keyCode = CommandManager.keyboardButtonMappings[keyStr] { for keyStr in cmdString.reversed() { // 从后往前释放按键
LiSendKeyboardEvent(keyCode, Int8(KEY_ACTION_UP), 0) // 释放按键 if let keyCode = CommandManager.keyboardButtonMappings[keyStr] {
LiSendKeyboardEvent(keyCode, Int8(KEY_ACTION_UP), 0) // 释放按键
}
if let mouseButtonCode = CommandManager.mouseButtonMappings[keyStr]{
LiSendMouseButtonEvent(CChar(BUTTON_ACTION_RELEASE), mouseButtonCode)
}
} }
} }
return return
} }
// 获取当前按键的映射值 // 获取当前按键的映射值
if let keyCode = CommandManager.keyboardButtonMappings[keyboardCmdStrings[index]] { if let keyCode = CommandManager.keyboardButtonMappings[cmdString[index]] {
// 发送当前按键的按下事件 // 发送当前按键的按下事件
LiSendKeyboardEvent(keyCode, Int8(KEY_ACTION_DOWN), 0) LiSendKeyboardEvent(keyCode, Int8(KEY_ACTION_DOWN), 0)
} else if let mouseButtonCode = CommandManager.mouseButtonMappings[cmdString[index]]{
// 延迟后递归处理下一个按键 LiSendMouseButtonEvent(CChar(BUTTON_ACTION_PRESS), mouseButtonCode)
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
self.sendKeyComboCommand(keyboardCmdStrings: keyboardCmdStrings, delay: delay, index: index + 1)
}
} else { } else {
print("No mapping found for \(keyboardCmdStrings[index])") print("No mapping found for \(cmdString[index])")
// 如果当前按键没有映射,跳过当前按键并继续下一个 }
self.sendKeyComboCommand(keyboardCmdStrings: keyboardCmdStrings, delay: delay, index: index + 1) // 延迟后递归处理下一个按键
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
self.sendAutoReleaseComboCommand(cmdString: cmdString, delay: delay, index: index + 1)
} }
} }
+3 -3
View File
@@ -1505,11 +1505,11 @@ import SVGKit
if !OnScreenWidgetView.editMode && self.cmdString.contains("+") && !self.cmdString.contains("-"){ if !OnScreenWidgetView.editMode && self.cmdString.contains("+") && !self.cmdString.contains("-"){
if buttonMode == .movable, moveableButtonLongPressed() {return} if buttonMode == .movable, moveableButtonLongPressed() {return}
self.buttonDownVisualEffect() self.buttonDownVisualEffect()
var keyboardCmdStrings = CommandManager.shared.extractKeyStrings(from: self.cmdString)! var autoReleaseComboButtons = CommandManager.shared.extractAutoReleaseButtonStrings(from: self.cmdString)!
keyboardCmdStrings.removeAll{ autoReleaseComboButtons.removeAll{
Set(CommandManager.pencilProButtonCmds).contains($0) Set(CommandManager.pencilProButtonCmds).contains($0)
} }
CommandManager.shared.sendKeyComboCommand(keyboardCmdStrings: keyboardCmdStrings) // send multi-key command CommandManager.shared.sendAutoReleaseComboCommand(cmdString: autoReleaseComboButtons) // send multi-key command
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.buttonUpVisualEffect() self.buttonUpVisualEffect()
} }
+10 -10
View File
@@ -256,8 +256,8 @@ import UIKit
func pencilInteractionDidTap(_ interaction: UIPencilInteraction) { func pencilInteractionDidTap(_ interaction: UIPencilInteraction) {
if !pencilProEnabled {return} if !pencilProEnabled {return}
if doubleTapShorcuts.isEmpty {return} if doubleTapShorcuts.isEmpty {return}
let keyStrings = CommandManager.shared.extractKeyStrings(from: doubleTapShorcuts[shorcutIndex]) let keyStrings = CommandManager.shared.extractAutoReleaseButtonStrings(from: doubleTapShorcuts[shorcutIndex])
CommandManager.shared.sendKeyComboCommand(keyboardCmdStrings: keyStrings, delay: 0.1) CommandManager.shared.sendAutoReleaseComboCommand(cmdString: keyStrings, delay: 0.1)
shorcutIndex = (shorcutIndex + 1) % doubleTapShorcuts.count shorcutIndex = (shorcutIndex + 1) % doubleTapShorcuts.count
} }
@@ -311,10 +311,10 @@ import UIKit
} }
let okAction = UIAlertAction(title: SwiftLocalizationHelper.localizedString(forKey: "OK"), style: .default) { _ in let okAction = UIAlertAction(title: SwiftLocalizationHelper.localizedString(forKey: "OK"), style: .default) { _ in
let keyboardShortcut = alert.textFields?[0].text ?? "" let comboButtons = alert.textFields?[0].text ?? ""
let keyStrings = CommandManager.shared.extractKeyStrings(from: keyboardShortcut) let keyStrings = CommandManager.shared.extractAutoReleaseButtonStrings(from: comboButtons)
if keyStrings?.count ?? 0 > 0 || keyboardShortcut == "" { if keyStrings?.count ?? 0 > 0 || comboButtons == "" {
eraserShortcut = keyboardShortcut eraserShortcut = comboButtons
} }
enterBrushShortcut(in: viewController) enterBrushShortcut(in: viewController)
} }
@@ -348,10 +348,10 @@ import UIKit
} }
let okAction = UIAlertAction(title: SwiftLocalizationHelper.localizedString(forKey: "OK"), style: .default) { _ in let okAction = UIAlertAction(title: SwiftLocalizationHelper.localizedString(forKey: "OK"), style: .default) { _ in
let keyboardShortcut = alert.textFields?[0].text ?? "" let comboButtons = alert.textFields?[0].text ?? ""
let keyStrings = CommandManager.shared.extractKeyStrings(from: keyboardShortcut) let keyStrings = CommandManager.shared.extractAutoReleaseButtonStrings(from: comboButtons)
if keyStrings?.count ?? 0 > 0 || keyboardShortcut == "" { if keyStrings?.count ?? 0 > 0 || comboButtons == "" {
brushShortcut = keyboardShortcut brushShortcut = comboButtons
} }
if selectedProfile?.brushShortcut != brushShortcut if selectedProfile?.brushShortcut != brushShortcut
@@ -778,7 +778,7 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
NSString *widgetShape = [widgetInitParams[@"shape"] lowercaseString]; NSString *widgetShape = [widgetInitParams[@"shape"] lowercaseString];
widgetInitParams[@"cmdString"] = cmdString; widgetInitParams[@"cmdString"] = cmdString;
bool noValidKeyboardString = [CommandManager.shared extractKeyStringsFrom:cmdString] == nil; // this is a invalid string. bool noValidKeyboardString = [CommandManager.shared extractAutoReleaseButtonStringsFrom:cmdString] == nil; // this is a invalid string.
bool noValidSuperComboButtonString = [CommandManager.shared extractCmdStringsFrom:cmdString] == nil; // this is a invalid string. bool noValidSuperComboButtonString = [CommandManager.shared extractCmdStringsFrom:cmdString] == nil; // this is a invalid string.
bool noValidMouseButtonString = ![CommandManager.mouseButtonMappings.allKeys containsObject:cmdString]; bool noValidMouseButtonString = ![CommandManager.mouseButtonMappings.allKeys containsObject:cmdString];
bool noValidTouchPadString = ![CommandManager.touchPadCmds containsObject:cmdString]; bool noValidTouchPadString = ![CommandManager.touchPadCmds containsObject:cmdString];
@@ -1332,8 +1332,8 @@
&& [Utils hdrSupported]){ && [Utils hdrSupported]){
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)); dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC));
dispatch_after(delay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_after(delay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSArray* hdrCommand = [CommandManager.shared extractKeyStringsFrom:@"WIN+ALT+B"]; NSArray* hdrCommand = [CommandManager.shared extractAutoReleaseButtonStringsFrom:@"WIN+ALT+B"];
[CommandManager.shared sendKeyComboCommandWithKeyboardCmdStrings:hdrCommand delay:0.15 index:0]; [CommandManager.shared sendAutoReleaseComboCommandWithCmdString:hdrCommand delay:0.15 index:0];
}); });
} }
} }
@@ -405,8 +405,8 @@ import UIKit
private func sendKeyboardCommand(_ cmd: RemoteCommand) { private func sendKeyboardCommand(_ cmd: RemoteCommand) {
print("Sending key-value") print("Sending key-value")
let keyboardCmdStrings = CommandManager.shared.extractKeyStrings(from: cmd.cmdString) let keyboardCmdStrings = CommandManager.shared.extractAutoReleaseButtonStrings(from: cmd.cmdString)
CommandManager.shared.sendKeyComboCommand(keyboardCmdStrings: keyboardCmdStrings!) CommandManager.shared.sendAutoReleaseComboCommand(cmdString: keyboardCmdStrings!)
} }
public func gestureRecognizer( public func gestureRecognizer(