From 99952281cb1c61ec7d51d30f7bf14aa50742f569 Mon Sep 17 00:00:00 2001 From: TrueZhuanjia Date: Tue, 28 Oct 2025 08:37:26 +0800 Subject: [PATCH] fixed: legacy on-screen control layers pass through native touch events --- VoidLink/Input/NativeTouchHandler.m | 8 +++++++- VoidLink/Input/OnScreenControls.m | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/VoidLink/Input/NativeTouchHandler.m b/VoidLink/Input/NativeTouchHandler.m index dd2e440a..b7aaf31a 100644 --- a/VoidLink/Input/NativeTouchHandler.m +++ b/VoidLink/Input/NativeTouchHandler.m @@ -213,6 +213,7 @@ if (asyncNativeTouch) dispatch_async(dispatch_get_global_queue(touchDownQos, 0), ^{ for (UITouch* touch in touches){ // continue to the next loop if current touch is already captured by OSC. works only in regular native touch + if([OnScreenControls.touchAddrsCapturedByOnScreenControls containsObject:@((uintptr_t)touch)]) continue; [self handleTouchDown:touch]; //generate & populate pointerId if(self->activateCoordSelector) [self populatePointerObjIntoDict:touch]; [self sendTouchEvent:touch withTouchtype:LI_TOUCH_EVENT_DOWN]; @@ -221,6 +222,7 @@ else{ for (UITouch* touch in touches){ // continue to the next loop if current touch is already captured by OSC. works only in regular native touch + if([OnScreenControls.touchAddrsCapturedByOnScreenControls containsObject:@((uintptr_t)touch)]) continue; [self handleTouchDown:touch]; //generate & populate pointerId if(self->activateCoordSelector) [self populatePointerObjIntoDict:touch]; [self sendTouchEvent:touch withTouchtype:LI_TOUCH_EVENT_DOWN]; @@ -242,7 +244,11 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, moveEventIntervalNSec), dispatch_get_main_queue(), ^{ for (UITouch* touch in touches){ - if([OnScreenControls.touchAddrsCapturedByOnScreenControls containsObject:@((uintptr_t)touch)]) continue; + NSNumber* touchAddrObj = @((uintptr_t)touch); + if([OnScreenControls.touchAddrsCapturedByOnScreenControls containsObject:touchAddrObj]){ + [OnScreenControls.touchAddrsCapturedByOnScreenControls removeObject:touchAddrObj]; + continue; + } [self sendTouchEvent:touch withTouchtype:LI_TOUCH_EVENT_UP]; //send touch event before remove pointerId [self removePointerId:touch]; //then remove pointerId if(self->activateCoordSelector) [self removePointerObjFromDict:touch]; diff --git a/VoidLink/Input/OnScreenControls.m b/VoidLink/Input/OnScreenControls.m index 90b49d46..91abd658 100644 --- a/VoidLink/Input/OnScreenControls.m +++ b/VoidLink/Input/OnScreenControls.m @@ -1437,7 +1437,7 @@ static float L3_Y; for (UITouch* touch in touches) { // remove the touch obj from touchesCapturedByOnScreenButtons - if([touchAddrsCapturedByOnScreenControls containsObject:@((uintptr_t)touch)]) [touchAddrsCapturedByOnScreenControls removeObject:@((uintptr_t)touch)]; + // if([touchAddrsCapturedByOnScreenControls containsObject:@((uintptr_t)touch)]) [touchAddrsCapturedByOnScreenControls removeObject:@((uintptr_t)touch)]; if (touch == _aTouch) { [_controllerSupport clearButtonFlag:_controller flags:A_FLAG];