Commit 0a56ef35 authored by Ken Thomases's avatar Ken Thomases Committed by Alexandre Julliard

winemac: Handle mouse moves in -[WineApplication sendEvent:] instead of WineWindow.

parent 38f7a4d5
......@@ -47,6 +47,9 @@
CGFloat primaryScreenHeight;
BOOL primaryScreenHeightValid;
WineWindow* lastTargetWindow;
BOOL forceNextMouseMoveAbsolute;
NSMutableArray* orderedWineWindows;
NSMutableDictionary* originalDisplayModes;
......
......@@ -554,10 +554,40 @@ int macdrv_err_on;
*/
- (void) sendEvent:(NSEvent*)anEvent
{
if ([anEvent type] == NSFlagsChanged)
NSEventType type = [anEvent type];
if (type == NSFlagsChanged)
self.lastFlagsChanged = anEvent;
[super sendEvent:anEvent];
if (type == NSMouseMoved || type == NSLeftMouseDragged ||
type == NSRightMouseDragged || type == NSOtherMouseDragged)
{
WineWindow* targetWindow;
targetWindow = (WineWindow*)[anEvent window];
if ([targetWindow isKindOfClass:[WineWindow class]])
{
BOOL absolute = forceNextMouseMoveAbsolute || (targetWindow != lastTargetWindow);
forceNextMouseMoveAbsolute = FALSE;
[targetWindow postMouseMovedEvent:anEvent absolute:absolute];
lastTargetWindow = targetWindow;
}
else
lastTargetWindow = nil;
}
else if (type == NSLeftMouseDown || type == NSLeftMouseUp ||
type == NSRightMouseDown || type == NSRightMouseUp ||
type == NSOtherMouseDown || type == NSOtherMouseUp ||
type == NSScrollWheel)
{
// Since mouse button and scroll wheel events deliver absolute cursor
// position, the accumulating delta from move events is invalidated.
// Make sure next mouse move event starts over from an absolute baseline.
forceNextMouseMoveAbsolute = TRUE;
}
}
......@@ -583,12 +613,22 @@ int macdrv_err_on;
// activated. This will provoke a re-synchronization of Wine's notion of
// the desktop rect with the actual state.
[self sendDisplaysChanged:TRUE];
// The cursor probably moved while we were inactive. Accumulated mouse
// movement deltas are invalidated. Make sure the next mouse move event
// starts over from an absolute baseline.
forceNextMouseMoveAbsolute = TRUE;
}
- (void)applicationDidChangeScreenParameters:(NSNotification *)notification
{
primaryScreenHeightValid = FALSE;
[self sendDisplaysChanged:FALSE];
// When the display configuration changes, the cursor position may jump.
// Accumulated mouse movement deltas are invalidated. Make sure the next
// mouse move event starts over from an absolute baseline.
forceNextMouseMoveAbsolute = TRUE;
}
- (void)applicationDidResignActive:(NSNotification *)notification
......@@ -627,6 +667,8 @@ int macdrv_err_on;
NSWindow* window = [note object];
[keyWindows removeObjectIdenticalTo:window];
[orderedWineWindows removeObjectIdenticalTo:window];
if (window == lastTargetWindow)
lastTargetWindow = nil;
}];
[nc addObserver:self
......
......@@ -48,7 +48,6 @@
NSUInteger lastModifierFlags;
BOOL forceNextMouseMoveAbsolute;
double mouseMoveDeltaX, mouseMoveDeltaY;
NSInteger levelWhenActive;
......@@ -64,4 +63,6 @@
- (void) adjustWindowLevel;
- (void) postMouseMovedEvent:(NSEvent *)theEvent absolute:(BOOL)absolute;
@end
......@@ -264,7 +264,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
if (!window) return nil;
window->normalStyleMask = [window styleMask];
window->forceNextMouseMoveAbsolute = TRUE;
/* Standardize windows to eliminate differences between titled and
borderless windows and between NSWindow and NSPanel. */
......@@ -285,8 +284,7 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
[contentView setAutoresizesSubviews:NO];
trackingArea = [[[NSTrackingArea alloc] initWithRect:[contentView bounds]
options:(NSTrackingMouseEnteredAndExited |
NSTrackingMouseMoved |
options:(NSTrackingMouseMoved |
NSTrackingActiveAlways |
NSTrackingInVisibleRect)
owner:window
......@@ -508,7 +506,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
{
self.latentParentWindow = [self parentWindow];
[latentParentWindow removeChildWindow:self];
forceNextMouseMoveAbsolute = TRUE;
[self orderOut:nil];
[NSApp wineWindow:self ordered:NSWindowOut relativeTo:nil];
[NSApp removeWindowsItem:self];
......@@ -739,11 +736,11 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
event:theEvent];
}
- (void) postMouseMovedEvent:(NSEvent *)theEvent
- (void) postMouseMovedEvent:(NSEvent *)theEvent absolute:(BOOL)absolute
{
macdrv_event event;
if (forceNextMouseMoveAbsolute)
if (absolute)
{
CGPoint point = CGEventGetLocation([theEvent CGEvent]);
......@@ -753,8 +750,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
mouseMoveDeltaX = 0;
mouseMoveDeltaY = 0;
forceNextMouseMoveAbsolute = FALSE;
}
else
{
......@@ -961,14 +956,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
}
}
- (void) mouseEntered:(NSEvent *)theEvent { forceNextMouseMoveAbsolute = TRUE; }
- (void) mouseExited:(NSEvent *)theEvent { forceNextMouseMoveAbsolute = TRUE; }
- (void) mouseMoved:(NSEvent *)theEvent { [self postMouseMovedEvent:theEvent]; }
- (void) mouseDragged:(NSEvent *)theEvent { [self postMouseMovedEvent:theEvent]; }
- (void) rightMouseDragged:(NSEvent *)theEvent { [self postMouseMovedEvent:theEvent]; }
- (void) otherMouseDragged:(NSEvent *)theEvent { [self postMouseMovedEvent:theEvent]; }
- (void) scrollWheel:(NSEvent *)theEvent
{
CGPoint pt;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment