From ab7ccc7732abc4d73af1d44f570367aafc8370e9 Mon Sep 17 00:00:00 2001 From: TrueZhuanjia Date: Fri, 25 Jul 2025 19:56:46 +0800 Subject: [PATCH] fix: profile saving issue caused by launching osw tool via tap gesture --- VoidLink/Input/CommandManager.swift | 4 +-- VoidLink/Input/OnScreenControls.m | 4 +-- VoidLink/Input/StreamView.h | 2 +- VoidLink/Input/StreamView.m | 4 +-- .../LayoutOnScreenControlsViewController.h | 2 +- .../LayoutOnScreenControlsViewController.m | 20 +++++------ .../StreamFrameViewController.m | 36 ++++++++++++------- 7 files changed, 41 insertions(+), 31 deletions(-) diff --git a/VoidLink/Input/CommandManager.swift b/VoidLink/Input/CommandManager.swift index 5a2c239d..d07cc750 100644 --- a/VoidLink/Input/CommandManager.swift +++ b/VoidLink/Input/CommandManager.swift @@ -417,7 +417,7 @@ import UIKit print("No match found for input: \(input)") return nil } - print("Regex matched for input: \(input)") + // print("Regex matched for input: \(input)") let matchedString = (input as NSString).substring(with: match.range(at: 0)) let keyStrings = matchedString.split(separator: "+").map { String($0) } @@ -475,7 +475,7 @@ import UIKit print("No match found for input: \(input)") return nil } - print("Regex matched for input: \(input)") + // print("Regex matched for input: \(input)") let matchedString = (input as NSString).substring(with: match.range(at: 0)) let cmdStrings = matchedString.split(separator: "-").map { String($0) } diff --git a/VoidLink/Input/OnScreenControls.m b/VoidLink/Input/OnScreenControls.m index 13b585ba..924420c6 100644 --- a/VoidLink/Input/OnScreenControls.m +++ b/VoidLink/Input/OnScreenControls.m @@ -343,7 +343,7 @@ static float L3_Y; if(position.x < 1.0 && position.y < 1.0) { position.x = position.x * _view.bounds.size.width; position.y = position.y * _view.bounds.size.height; - NSLog(@"denormalizing position: %f, %f", position.x, position.y); + // NSLog(@"denormalizing position: %f, %f", position.x, position.y); } return position; } @@ -1930,7 +1930,7 @@ static float L3_Y; if(alpha < 0.23) targetAlpha = 0.23; if(alpha == 0.0 || alpha == 1.0) targetAlpha = 5.0f/6.0f; // invalid alpha value - NSLog(@"alphas: %f",targetAlpha); + // NSLog(@"alphas: %f",targetAlpha); if (layer == self._aButton || layer == self._bButton || diff --git a/VoidLink/Input/StreamView.h b/VoidLink/Input/StreamView.h index 1fff07fc..8aea19c1 100644 --- a/VoidLink/Input/StreamView.h +++ b/VoidLink/Input/StreamView.h @@ -50,7 +50,7 @@ andConfig:(StreamConfiguration*)streamConfig; - (void) reloadOnScreenControlsWith:(ControllerSupport*)controllerSupport andConfig:(StreamConfiguration*)streamConfig; -- (void) clearOnScreenKeyboardButtons; +- (void) clearOnScreenWidgets; - (void) reloadOnScreenWidgetViews; - (CGSize) getVideoAreaSize; diff --git a/VoidLink/Input/StreamView.m b/VoidLink/Input/StreamView.m index 29e8636d..8f838f8f 100644 --- a/VoidLink/Input/StreamView.m +++ b/VoidLink/Input/StreamView.m @@ -399,7 +399,7 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; } -- (void) clearOnScreenKeyboardButtons{ +- (void) clearOnScreenWidgets{ for (UIView *subview in self->streamFrameTopLayerView.subviews) { // 检查子视图是否是特定类型的实例 if ([subview isKindOfClass:[OnScreenWidgetView class]]) { @@ -422,7 +422,7 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; // NSLog(@"reload on screen keyboard buttons here"); // remove all keyboard widget views first - [self clearOnScreenKeyboardButtons]; + [self clearOnScreenWidgets]; // bool customOscEnabled = [self isOscEnabled] && settings.onscreenControls.intValue == OnScreenControlsLevelCustom; diff --git a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.h b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.h index 8215aaab..c2272de5 100644 --- a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.h +++ b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.h @@ -27,7 +27,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)presentProfilesTableView; @property LayoutOnScreenControls *layoutOSC; // object that contains a view which contains the on screen controller buttons that allows the user to drag and positions each button on the screen using touch -@property (nonatomic) NSMutableSet* OnScreenWidgetViews; +@property (nonatomic) NSMutableSet* onScreenWidgetViews; @property int OSCSegmentSelected; @property (nonatomic, assign) bool quickSwitchEnabled; diff --git a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m index 2746a3f2..2879fa9e 100644 --- a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m +++ b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m @@ -62,7 +62,7 @@ - (void) viewWillDisappear:(BOOL)animated{ OnScreenWidgetView.editMode = false; - for (OnScreenWidgetView* widgetView in self.OnScreenWidgetViews){ + for (OnScreenWidgetView* widgetView in self.onScreenWidgetViews){ [widgetView.stickBallLayer removeFromSuperlayer]; [widgetView.crossMarkLayer removeFromSuperlayer]; } @@ -89,7 +89,7 @@ } } - [self.OnScreenWidgetViews removeAllObjects]; + [self.onScreenWidgetViews removeAllObjects]; NSLog(@"reload os Key here"); @@ -120,7 +120,7 @@ [widgetView resizeWidgetView]; // resize must be called after relocation [widgetView adjustTransparencyWithAlpha:buttonState.backgroundAlpha]; [widgetView adjustBorderWithWidth:buttonState.borderWidth]; - [self.OnScreenWidgetViews addObject:widgetView]; + [self.onScreenWidgetViews addObject:widgetView]; } } } @@ -128,8 +128,8 @@ - (void) viewDidLoad { [super viewDidLoad]; profilesManager = [OSCProfilesManager sharedManager:self.view.bounds]; - self.OnScreenWidgetViews = [[NSMutableSet alloc] init]; // will be revised to read persisted data , somewhere else - [OSCProfilesManager setOnScreenWidgetViewsSet:self.OnScreenWidgetViews]; // pass the keyboard button dict to profiles manager + self.onScreenWidgetViews = [[NSMutableSet alloc] init]; // will be revised to read persisted data , somewhere else + [OSCProfilesManager setOnScreenWidgetViewsSet:self.onScreenWidgetViews]; // pass the keyboard button dict to profiles manager //isToolbarHidden = NO; // keeps track if the toolbar is hidden up above the screen so that we know whether to hide or show it when the user taps the toolbar's hide/show button _quickSwitchEnabled = false; @@ -253,7 +253,7 @@ #pragma mark - Class Helper Functions - (void)handleReturnToForeground { - [OSCProfilesManager setOnScreenWidgetViewsSet:self.OnScreenWidgetViews]; // pass the keyboard button dict to profiles manager + [OSCProfilesManager setOnScreenWidgetViewsSet:self.onScreenWidgetViews]; // pass the keyboard button dict to profiles manager } /* fades the 'Undo Button' in or out depending on whether the user has any OSC layout changes to undo */ @@ -588,10 +588,10 @@ [newWidget resizeWidgetView]; // resize must be called after relocation [newWidget adjustTransparencyWithAlpha:widget.backgroundAlpha]; [newWidget adjustBorderWithWidth:widget.borderWidth]; - [self.OnScreenWidgetViews addObject:newWidget]; + [self.onScreenWidgetViews addObject:newWidget]; self->selectedWidgetView = newWidget; if(!createNew){ - [self.OnScreenWidgetViews removeObject:widget]; + [self.onScreenWidgetViews removeObject:widget]; [widget removeFromSuperview]; } } @@ -604,7 +604,7 @@ widgetView.guidelineDelegate = (id)self; widgetView.translatesAutoresizingMaskIntoConstraints = NO; // weird but this is mandatory, or you will find no key views added to the right place widgetView.minStickOffset = [widgetInitParams[@"minStickOffsetString"] floatValue]; - [self.OnScreenWidgetViews addObject:widgetView]; + [self.onScreenWidgetViews addObject:widgetView]; // Add the widgetView to the view controller's view [self.view insertSubview:widgetView belowSubview:self.widgetPanelStack]; [widgetView setLocationWithPosition:CGPointMake(90, 130)]; @@ -1253,7 +1253,7 @@ if(!isToolbarHidden && self->selectedWidgetView != nil && [self layerIsOverlappingWithTrashcanButton:selectedWidgetView.layer]){ [self->selectedWidgetView removeFromSuperview]; - [self.OnScreenWidgetViews removeObject:self->selectedWidgetView]; + [self.onScreenWidgetViews removeObject:self->selectedWidgetView]; [self clearStickIndicator]; [selectedWidgetView.buttonDownVisualEffectLayer removeFromSuperlayer]; } diff --git a/VoidLink/ViewControllers/StreamFrameViewController.m b/VoidLink/ViewControllers/StreamFrameViewController.m index 4c3ecca4..b3e665cd 100644 --- a/VoidLink/ViewControllers/StreamFrameViewController.m +++ b/VoidLink/ViewControllers/StreamFrameViewController.m @@ -218,15 +218,8 @@ } - (void)configOscLayoutTool{ + if([self isOscLayoutToolEnabled]){ - _oscLayoutTapRecoginizer = [[CustomTapGestureRecognizer alloc] initWithTarget:self action:@selector(openWidgetLayoutTool)]; - _oscLayoutTapRecoginizer.numberOfTouchesRequired = _settings.oscLayoutToolFingers.intValue; //tap a predefined number of fingers to open osc layout tool - _oscLayoutTapRecoginizer.tapDownTimeThreshold = 0.2; - _oscLayoutTapRecoginizer.delaysTouchesBegan = NO; - _oscLayoutTapRecoginizer.delaysTouchesEnded = NO; - if(_settings.touchMode.intValue == AbsoluteTouch) _oscLayoutTapRecoginizer.immediateTriggering = true; // make immediate triggering on for absolute touch mode - - [self.view addGestureRecognizer:_oscLayoutTapRecoginizer]; // /* 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); @@ -242,20 +235,22 @@ _layoutOnScreenControlsVC.view.backgroundColor = UIColor.clearColor; _layoutOnScreenControlsVC.modalPresentationStyle = UIModalPresentationOverCurrentContext; } + //NSLog(@"in osc frameview gestures: %d", (uint32_t)[self.view.gestureRecognizers count]); + //NSLog(@"in osc streamview gestures: %d", (uint32_t)[_streamView.gestureRecognizers count]); } - (void)presentToolboxViewController{ + [self configOscLayoutTool]; ToolboxViewController* oldToolboxVC = toolBoxViewController; toolBoxViewController = [[ToolboxViewController alloc] init]; toolBoxViewController.specialEntryDelegate = self; toolBoxViewController.specialEntries = oldToolboxVC.specialEntries; - [self configOscLayoutTool]; [self presentViewController:toolBoxViewController animated:YES completion:^{ //[self->toolBoxViewController setupConstraints]; }]; } -- (void)configSwipeGestures{ +- (void)configGestures{ _slideToSettingsRecognizer = [[CustomEdgeSlideGestureRecognizer alloc] initWithTarget:self action:@selector(edgeSwiped)]; _slideToSettingsRecognizer.edges = _settings.slideToSettingsScreenEdge.intValue; _slideToSettingsRecognizer.normalizedThresholdDistance = _settings.slideToSettingsDistance.floatValue; @@ -271,6 +266,17 @@ _slideToCmdToolRecognizer.delaysTouchesBegan = NO; _slideToCmdToolRecognizer.delaysTouchesEnded = NO; [self.view addGestureRecognizer:_slideToCmdToolRecognizer]; + + if([self isOscLayoutToolEnabled]){ + _oscLayoutTapRecoginizer = [[CustomTapGestureRecognizer alloc] initWithTarget:self action:@selector(handleWidgetLayoutGesture)]; + _oscLayoutTapRecoginizer.numberOfTouchesRequired = _settings.oscLayoutToolFingers.intValue; //tap a predefined number of fingers to open osc layout tool + _oscLayoutTapRecoginizer.tapDownTimeThreshold = 0.2; + _oscLayoutTapRecoginizer.delaysTouchesBegan = NO; + _oscLayoutTapRecoginizer.delaysTouchesEnded = NO; + if(_settings.touchMode.intValue == AbsoluteTouch) _oscLayoutTapRecoginizer.immediateTriggering = true; // make immediate triggering on for absolute touch mode + [self.view addGestureRecognizer:_oscLayoutTapRecoginizer]; // + } + } - (void)configZoomGestureAndAddStreamView{ @@ -310,7 +316,7 @@ overlayLevel = _settings.statsOverlayLevel.intValue; [self configOscLayoutTool]; [self updateToolboxSpecialEntries]; - [self configSwipeGestures]; + [self configGestures]; [self configZoomGestureAndAddStreamView]; [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 @@ -628,10 +634,14 @@ [_streamView keyboardWillHide]; } +- (void)handleWidgetLayoutGesture{ + [self configOscLayoutTool]; + [self openWidgetLayoutTool]; +} - (void)openWidgetLayoutTool{ [self->_streamView disableOnScreenControls]; - [self->_streamView clearOnScreenKeyboardButtons]; // clear all onScreenKeyboardButtons before entering edit mode + [self->_streamView clearOnScreenWidgets]; // clear all onScreenKeyboardButtons before entering edit mode _layoutOnScreenControlsVC.quickSwitchEnabled = false; _layoutOnScreenControlsVC.toolbarStackView.hidden = false; _layoutOnScreenControlsVC.toolbarRootView.hidden = false; @@ -640,7 +650,7 @@ - (void)switchWidgetProfile{ [self->_streamView disableOnScreenControls]; - [self->_streamView clearOnScreenKeyboardButtons]; // clear all onScreenKeyboardButtons before entering edit mode + [self->_streamView clearOnScreenWidgets]; // clear all onScreenKeyboardButtons before entering edit mode _layoutOnScreenControlsVC.quickSwitchEnabled = true; _layoutOnScreenControlsVC.toolbarStackView.hidden = true; _layoutOnScreenControlsVC.toolbarRootView.hidden = true;