Fix[input]: fix mouse input on Mac Catalyst

This commit is contained in:
khanhduytran0 committed 2025-04-13 17:25:26 +07:00
1 parent c5042e2ce9
commit f883ebe3e2
1 file changed
+21 -38
+21 -38
View File
@@ -32,7 +32,7 @@ int memorystatus_control(uint32_t command, int32_t pid, uint32_t flags, void *bu
static int currentHotbarSlot = -1;
static GameSurfaceView* pojavWindow;
@interface SurfaceViewController ()<UITextFieldDelegate, UIPointerInteractionDelegate, UIGestureRecognizerDelegate> {
@interface SurfaceViewController ()<UITextFieldDelegate, UIGestureRecognizerDelegate> {
}
@property(nonatomic) NSDictionary* metadata;
@@ -122,7 +122,7 @@ static GameSurfaceView* pojavWindow;
pojavWindow = self.surfaceView;
self.touchView = [[UIView alloc] initWithFrame:self.view.frame];
self.touchView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.1];
self.touchView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
self.touchView.multipleTouchEnabled = YES;
[self.touchView addSubview:self.surfaceView];
@@ -131,17 +131,13 @@ static GameSurfaceView* pojavWindow;
[self performSelector:@selector(setupCategory_Navigation)];
if (self.isMacCatalystApp) {
UIHoverGestureRecognizer *hoverGesture = [[NSClassFromString(@"UIHoverGestureRecognizer") alloc]
initWithTarget:self action:@selector(surfaceOnHover:)];
[self.surfaceView addGestureRecognizer:hoverGesture];
}
UIHoverGestureRecognizer *hoverGesture = [[NSClassFromString(@"UIHoverGestureRecognizer") alloc] initWithTarget:self action:@selector(surfaceOnHover:)];
[self.touchView addGestureRecognizer:hoverGesture];
self.tapGesture = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(surfaceOnClick:)];
if (!self.isMacCatalystApp) {
self.tapGesture.allowedTouchTypes = @[@(UITouchTypeDirect)];
}
self.tapGesture.allowedTouchTypes = @[@(UITouchTypeDirect)];
self.tapGesture.delegate = self;
self.tapGesture.numberOfTapsRequired = 1;
self.tapGesture.numberOfTouchesRequired = 1;
@@ -179,10 +175,6 @@ static GameSurfaceView* pojavWindow;
self.scrollPanGesture.maximumNumberOfTouches = 2;
[self.touchView addGestureRecognizer:self.scrollPanGesture];
if (!isTVOS) {
[self.touchView addInteraction:[[NSClassFromString(@"UIPointerInteraction") alloc] initWithDelegate:self]];
}
// Virtual mouse
virtualMouseEnabled = getPrefBool(@"control.virtmouse_enable");
virtualMouseFrame = CGRectMake(self.view.frame.size.width / 2, self.view.frame.size.height / 2, 18, 27);
@@ -216,9 +208,7 @@ static GameSurfaceView* pojavWindow;
NSLog(@"Input: Mouse connected!");
GCMouse* mouse = note.object;
[self registerMouseCallbacks:mouse];
self.mousePointerView.hidden = isGrabbing;
virtualMouseEnabled = YES;
[self setNeedsUpdateOfPrefersPointerLocked];
self.mousePointerView.hidden = isGrabbing || !virtualMouseEnabled; [self setNeedsUpdateOfPrefersPointerLocked];
if (getPrefBool(@"control.hardware_hide")) {
self.ctrlView.hidden = YES;
}
@@ -237,7 +227,7 @@ static GameSurfaceView* pojavWindow;
}
}];
if (GCMouse.current != nil) {
[self registerMouseCallbacks: GCMouse.current];
[self registerMouseCallbacks:GCMouse.current];
}
@@ -369,6 +359,8 @@ static GameSurfaceView* pojavWindow;
((CAMetalLayer *)self.surfaceView.layer).developerHUDProperties = perfHUDEnabled ? @{@"mode": @"default"} : nil;
}
}
// Update pointer lock state
[self setNeedsUpdateOfPrefersPointerLocked];
}
- (void)updateSavedResolution {
@@ -429,6 +421,7 @@ static GameSurfaceView* pojavWindow;
}
self.scrollPanGesture.enabled = !isGrabbing;
self.mousePointerView.hidden = isGrabbing || !virtualMouseEnabled;
[self setNeedsUpdateOfPrefersPointerLocked];
// Update buttons visibility
[self updateControlHiddenState:NO];
@@ -659,7 +652,7 @@ static GameSurfaceView* pojavWindow;
}
- (BOOL)prefersPointerLocked {
return GCMouse.mice.count > 0;
return GCMouse.mice.count > 0 && (isGrabbing || virtualMouseEnabled);
}
- (void)registerMouseCallbacks:(GCMouse *)mouse {
@@ -668,19 +661,13 @@ static GameSurfaceView* pojavWindow;
if (!self.view.window.windowScene.pointerLockState.locked) {
return;
}
[self sendTouchPoint:CGPointMake(deltaX * 2.0 / 3.0, -deltaY * 2.0 / 3.0) withEvent:ACTION_MOVE_MOTION];
[self sendTouchPoint:CGPointMake(deltaX, -deltaY) withEvent:ACTION_MOVE_MOTION];
};
mouse.mouseInput.leftButton.pressedChangedHandler = ^(GCControllerButtonInput * _Nonnull button, float value, BOOL pressed) {
if (!self.view.window.windowScene.pointerLockState.locked) {
return;
}
CallbackBridge_nativeSendMouseButton(GLFW_MOUSE_BUTTON_LEFT, pressed, 0);
};
mouse.mouseInput.middleButton.pressedChangedHandler = ^(GCControllerButtonInput * _Nonnull button, float value, BOOL pressed) {
if (!self.view.window.windowScene.pointerLockState.locked) {
return;
}
CallbackBridge_nativeSendMouseButton(GLFW_MOUSE_BUTTON_MIDDLE, pressed, 0);
};
mouse.mouseInput.rightButton.pressedChangedHandler = ^(GCControllerButtonInput * _Nonnull button, float value, BOOL pressed) {
@@ -826,14 +813,6 @@ static GameSurfaceView* pojavWindow;
}
}
- (UIPointerRegion *)pointerInteraction:(UIPointerInteraction *)interaction regionForRequest:(UIPointerRegionRequest *)request defaultRegion:(UIPointerRegion *)defaultRegion {
return nil;
}
- (UIPointerStyle *)pointerInteraction:(UIPointerInteraction *)interaction styleForRegion:(UIPointerRegion *)region {
return [NSClassFromString(@"UIPointerStyle") hiddenPointerStyle];
}
#pragma mark - Input view stuff
-(BOOL)textFieldShouldReturn:(UITextField *)textField {
@@ -897,6 +876,7 @@ static GameSurfaceView* pojavWindow;
virtualMouseEnabled = !virtualMouseEnabled;
self.mousePointerView.hidden = !virtualMouseEnabled;
setPrefBool(@"control.virtmouse_enable", virtualMouseEnabled);
[self setNeedsUpdateOfPrefersPointerLocked];
}
break;
@@ -1001,7 +981,7 @@ int touchesMovedCount;
[super touchesBegan:touches withEvent:event];
int i = 0;
for (UITouch *touch in touches) {
if (!self.isMacCatalystApp && touch.type == UITouchTypeIndirectPointer) {
if (touch.type == UITouchTypeIndirectPointer) {
continue; // handle this in a different place
}
CGPoint locationInView = [touch locationInView:self.rootView];
@@ -1022,11 +1002,14 @@ int touchesMovedCount;
// Equals to Android ACTION_MOVE
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
for (UITouch *touch in touches) {
if (!self.isMacCatalystApp && touch.type == UITouchTypeIndirectPointer) {
if (touch.type == UITouchTypeIndirectPointer) {
if (!isGrabbing && !virtualMouseEnabled) {
CGPoint point = [touch locationInView:self.rootView];
[self sendTouchPoint:point withEvent:ACTION_MOVE];
}
continue; // handle this in a different place
}
if (self.hotbarTouch != touch && [self isTouchInactive:self.primaryTouch]) {
@@ -1042,7 +1025,7 @@ int touchesMovedCount;
- (void)touchesEndedGlobal:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches) {
if (!self.isMacCatalystApp && touch.type == UITouchTypeIndirectPointer) {
if (touch.type == UITouchTypeIndirectPointer) {
continue; // handle this in a different place
}
[self sendTouchEvent:touch withUIEvent:event withEvent:ACTION_UP];