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 @@ ...@@ -47,6 +47,9 @@
CGFloat primaryScreenHeight; CGFloat primaryScreenHeight;
BOOL primaryScreenHeightValid; BOOL primaryScreenHeightValid;
WineWindow* lastTargetWindow;
BOOL forceNextMouseMoveAbsolute;
NSMutableArray* orderedWineWindows; NSMutableArray* orderedWineWindows;
NSMutableDictionary* originalDisplayModes; NSMutableDictionary* originalDisplayModes;
......
...@@ -554,10 +554,40 @@ int macdrv_err_on; ...@@ -554,10 +554,40 @@ int macdrv_err_on;
*/ */
- (void) sendEvent:(NSEvent*)anEvent - (void) sendEvent:(NSEvent*)anEvent
{ {
if ([anEvent type] == NSFlagsChanged) NSEventType type = [anEvent type];
if (type == NSFlagsChanged)
self.lastFlagsChanged = anEvent; self.lastFlagsChanged = anEvent;
[super sendEvent: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; ...@@ -583,12 +613,22 @@ int macdrv_err_on;
// activated. This will provoke a re-synchronization of Wine's notion of // activated. This will provoke a re-synchronization of Wine's notion of
// the desktop rect with the actual state. // the desktop rect with the actual state.
[self sendDisplaysChanged:TRUE]; [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 - (void)applicationDidChangeScreenParameters:(NSNotification *)notification
{ {
primaryScreenHeightValid = FALSE; primaryScreenHeightValid = FALSE;
[self sendDisplaysChanged: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 - (void)applicationDidResignActive:(NSNotification *)notification
...@@ -627,6 +667,8 @@ int macdrv_err_on; ...@@ -627,6 +667,8 @@ int macdrv_err_on;
NSWindow* window = [note object]; NSWindow* window = [note object];
[keyWindows removeObjectIdenticalTo:window]; [keyWindows removeObjectIdenticalTo:window];
[orderedWineWindows removeObjectIdenticalTo:window]; [orderedWineWindows removeObjectIdenticalTo:window];
if (window == lastTargetWindow)
lastTargetWindow = nil;
}]; }];
[nc addObserver:self [nc addObserver:self
......
...@@ -48,7 +48,6 @@ ...@@ -48,7 +48,6 @@
NSUInteger lastModifierFlags; NSUInteger lastModifierFlags;
BOOL forceNextMouseMoveAbsolute;
double mouseMoveDeltaX, mouseMoveDeltaY; double mouseMoveDeltaX, mouseMoveDeltaY;
NSInteger levelWhenActive; NSInteger levelWhenActive;
...@@ -64,4 +63,6 @@ ...@@ -64,4 +63,6 @@
- (void) adjustWindowLevel; - (void) adjustWindowLevel;
- (void) postMouseMovedEvent:(NSEvent *)theEvent absolute:(BOOL)absolute;
@end @end
...@@ -264,7 +264,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers) ...@@ -264,7 +264,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
if (!window) return nil; if (!window) return nil;
window->normalStyleMask = [window styleMask]; window->normalStyleMask = [window styleMask];
window->forceNextMouseMoveAbsolute = TRUE;
/* Standardize windows to eliminate differences between titled and /* Standardize windows to eliminate differences between titled and
borderless windows and between NSWindow and NSPanel. */ borderless windows and between NSWindow and NSPanel. */
...@@ -285,8 +284,7 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers) ...@@ -285,8 +284,7 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
[contentView setAutoresizesSubviews:NO]; [contentView setAutoresizesSubviews:NO];
trackingArea = [[[NSTrackingArea alloc] initWithRect:[contentView bounds] trackingArea = [[[NSTrackingArea alloc] initWithRect:[contentView bounds]
options:(NSTrackingMouseEnteredAndExited | options:(NSTrackingMouseMoved |
NSTrackingMouseMoved |
NSTrackingActiveAlways | NSTrackingActiveAlways |
NSTrackingInVisibleRect) NSTrackingInVisibleRect)
owner:window owner:window
...@@ -508,7 +506,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers) ...@@ -508,7 +506,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
{ {
self.latentParentWindow = [self parentWindow]; self.latentParentWindow = [self parentWindow];
[latentParentWindow removeChildWindow:self]; [latentParentWindow removeChildWindow:self];
forceNextMouseMoveAbsolute = TRUE;
[self orderOut:nil]; [self orderOut:nil];
[NSApp wineWindow:self ordered:NSWindowOut relativeTo:nil]; [NSApp wineWindow:self ordered:NSWindowOut relativeTo:nil];
[NSApp removeWindowsItem:self]; [NSApp removeWindowsItem:self];
...@@ -739,11 +736,11 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers) ...@@ -739,11 +736,11 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
event:theEvent]; event:theEvent];
} }
- (void) postMouseMovedEvent:(NSEvent *)theEvent - (void) postMouseMovedEvent:(NSEvent *)theEvent absolute:(BOOL)absolute
{ {
macdrv_event event; macdrv_event event;
if (forceNextMouseMoveAbsolute) if (absolute)
{ {
CGPoint point = CGEventGetLocation([theEvent CGEvent]); CGPoint point = CGEventGetLocation([theEvent CGEvent]);
...@@ -753,8 +750,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers) ...@@ -753,8 +750,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
mouseMoveDeltaX = 0; mouseMoveDeltaX = 0;
mouseMoveDeltaY = 0; mouseMoveDeltaY = 0;
forceNextMouseMoveAbsolute = FALSE;
} }
else else
{ {
...@@ -961,14 +956,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers) ...@@ -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 - (void) scrollWheel:(NSEvent *)theEvent
{ {
CGPoint pt; 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