Skip to content

Commit 8bfaefa

Browse files
authored
[macOS] Add coordinates to Hover events (#4304)
## Description I've noticed that on `macOS` `Hover` gesture does not provide coordinates, while on other platforms it does. This PR fixes this mismatch. ## Test plan <details> <summary>Details</summary> ```tsx import { View } from 'react-native'; import { GestureDetector, GestureHandlerRootView, useHoverGesture, } from 'react-native-gesture-handler'; export default function App() { const hover = useHoverGesture({ onBegin: (e) => console.log(e), }); return ( <GestureHandlerRootView> <GestureDetector gesture={hover}> <View style={{ width: 100, height: 100, backgroundColor: 'red' }} /> </GestureDetector> </GestureHandlerRootView> ); } ``` </details>
1 parent ee147ab commit 8bfaefa

1 file changed

Lines changed: 22 additions & 25 deletions

File tree

packages/react-native-gesture-handler/apple/Handlers/RNHoverHandler.m

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -202,33 +202,30 @@ - (void)unbindFromView
202202
_view = nil;
203203
}
204204

205+
- (RNGestureHandlerEventExtraData *)extraDataForEvent:(NSEvent *)event
206+
{
207+
CGPoint windowLocation = [event locationInWindow];
208+
CGPoint relativePos = [_view convertPoint:windowLocation fromView:nil];
209+
CGPoint absolutePos = [_view.window.contentView convertPoint:windowLocation fromView:nil];
210+
211+
return [RNGestureHandlerEventExtraData forPosition:relativePos
212+
withAbsolutePosition:absolutePos
213+
withNumberOfTouches:1
214+
withPointerType:_pointerType];
215+
}
216+
205217
- (void)mouseEntered:(NSEvent *)event
206218
{
207-
[self sendEventsInState:RNGestureHandlerStateBegan
208-
forViewWithTag:_view.reactTag
209-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
210-
withNumberOfTouches:1
211-
withPointerType:_pointerType]];
212-
[self sendEventsInState:RNGestureHandlerStateActive
213-
forViewWithTag:_view.reactTag
214-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
215-
withNumberOfTouches:1
216-
withPointerType:_pointerType]];
217-
}
218-
219-
- (void)mouseExited:(NSEvent *)theEvent
220-
{
221-
[self sendEventsInState:RNGestureHandlerStateEnd
222-
forViewWithTag:_view.reactTag
223-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
224-
withNumberOfTouches:1
225-
withPointerType:_pointerType]];
226-
227-
[self sendEventsInState:RNGestureHandlerStateUndetermined
228-
forViewWithTag:_view.reactTag
229-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
230-
withNumberOfTouches:1
231-
withPointerType:_pointerType]];
219+
RNGestureHandlerEventExtraData *extraData = [self extraDataForEvent:event];
220+
[self sendEventsInState:RNGestureHandlerStateBegan forViewWithTag:_view.reactTag withExtraData:extraData];
221+
[self sendEventsInState:RNGestureHandlerStateActive forViewWithTag:_view.reactTag withExtraData:extraData];
222+
}
223+
224+
- (void)mouseExited:(NSEvent *)event
225+
{
226+
RNGestureHandlerEventExtraData *extraData = [self extraDataForEvent:event];
227+
[self sendEventsInState:RNGestureHandlerStateEnd forViewWithTag:_view.reactTag withExtraData:extraData];
228+
[self sendEventsInState:RNGestureHandlerStateUndetermined forViewWithTag:_view.reactTag withExtraData:extraData];
232229
}
233230

234231
@end

0 commit comments

Comments
 (0)