diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m index 7eadc482b..9d6ee71a5 100644 --- a/hw/xquartz/X11Application.m +++ b/hw/xquartz/X11Application.m @@ -997,22 +997,37 @@ static inline int ensure_flag(int flags, int device_independent, int device_depe float pressure; DeviceIntPtr pDev; int modifierFlags; + BOOL isTabletEvent; static NSPoint lastpt; /* convert location to be relative to top-left of primary display */ window = [e window]; + isTabletEvent = ([e type] == NSTabletPoint) || + (( [e type] == NSLeftMouseDown || [e type] == NSOtherMouseDown || [e type] == NSRightMouseDown || + [e type] == NSLeftMouseUp || [e type] == NSOtherMouseUp || [e type] == NSRightMouseUp || + [e type] == NSLeftMouseDragged || [e type] == NSOtherMouseDragged || [e type] == NSRightMouseDragged || + [e type] == NSMouseMoved ) && ([e subtype] == NSTabletPointEventSubtype || [e subtype] == NSTabletProximityEventSubtype)); + if (window != nil) { NSRect frame = [window frame]; location = [e locationInWindow]; location.x += frame.origin.x; location.y += frame.origin.y; lastpt = location; + } else if(isTabletEvent) { + // NSEvents for tablets are not consistent wrt deltaXY between events, so we cannot rely on that + // Thus tablets will be subject to the warp-pointer bug worked around by the delta, but tablets + // are not normally used in cases where that bug would present itself, so this is a fair tradeoff + // deltaX and deltaY are incorrect for NSMouseMoved, NSTabletPointEventSubtype + // http://xquartz.macosforge.org/trac/ticket/288 + location = [e locationInWindow]; + lastpt = location; } else { location.x = lastpt.x + [e deltaX]; location.y = lastpt.y - [e deltaY]; - lastpt = [NSEvent mouseLocation]; + lastpt = [e locationInWindow]; } /* Convert coordinate system */