winemac: Handle mouse moves in -[WineApplication sendEvent:] instead of WineWindow.
This commit is contained in:
parent
38f7a4d518
commit
0a56ef356a
|
@ -47,6 +47,9 @@ @interface WineApplication : NSApplication <NSApplicationDelegate>
|
|||
CGFloat primaryScreenHeight;
|
||||
BOOL primaryScreenHeightValid;
|
||||
|
||||
WineWindow* lastTargetWindow;
|
||||
BOOL forceNextMouseMoveAbsolute;
|
||||
|
||||
NSMutableArray* orderedWineWindows;
|
||||
|
||||
NSMutableDictionary* originalDisplayModes;
|
||||
|
|
|
@ -554,10 +554,40 @@ - (void) setCursorWithFrames:(NSArray*)frames
|
|||
*/
|
||||
- (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 @@ - (void)applicationDidBecomeActive:(NSNotification *)notification
|
|||
// 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 @@ - (void)applicationWillFinishLaunching:(NSNotification *)notification
|
|||
NSWindow* window = [note object];
|
||||
[keyWindows removeObjectIdenticalTo:window];
|
||||
[orderedWineWindows removeObjectIdenticalTo:window];
|
||||
if (window == lastTargetWindow)
|
||||
lastTargetWindow = nil;
|
||||
}];
|
||||
|
||||
[nc addObserver:self
|
||||
|
|
|
@ -48,7 +48,6 @@ @interface WineWindow : NSPanel <NSWindowDelegate>
|
|||
|
||||
NSUInteger lastModifierFlags;
|
||||
|
||||
BOOL forceNextMouseMoveAbsolute;
|
||||
double mouseMoveDeltaX, mouseMoveDeltaY;
|
||||
|
||||
NSInteger levelWhenActive;
|
||||
|
@ -64,4 +63,6 @@ @interface WineWindow : NSPanel <NSWindowDelegate>
|
|||
|
||||
- (void) adjustWindowLevel;
|
||||
|
||||
- (void) postMouseMovedEvent:(NSEvent *)theEvent absolute:(BOOL)absolute;
|
||||
|
||||
@end
|
||||
|
|
|
@ -264,7 +264,6 @@ + (WineWindow*) createWindowWithFeatures:(const struct macdrv_window_features*)w
|
|||
|
||||
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 @@ + (WineWindow*) createWindowWithFeatures:(const struct macdrv_window_features*)w
|
|||
[contentView setAutoresizesSubviews:NO];
|
||||
|
||||
trackingArea = [[[NSTrackingArea alloc] initWithRect:[contentView bounds]
|
||||
options:(NSTrackingMouseEnteredAndExited |
|
||||
NSTrackingMouseMoved |
|
||||
options:(NSTrackingMouseMoved |
|
||||
NSTrackingActiveAlways |
|
||||
NSTrackingInVisibleRect)
|
||||
owner:window
|
||||
|
@ -508,7 +506,6 @@ - (void) doOrderOut
|
|||
{
|
||||
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 @@ - (void) postKeyEvent:(NSEvent *)theEvent
|
|||
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 @@ - (void) postMouseMovedEvent:(NSEvent *)theEvent
|
|||
|
||||
mouseMoveDeltaX = 0;
|
||||
mouseMoveDeltaY = 0;
|
||||
|
||||
forceNextMouseMoveAbsolute = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -961,14 +956,6 @@ - (void) flagsChanged:(NSEvent *)theEvent
|
|||
}
|
||||
}
|
||||
|
||||
- (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;
|
||||
|
|
Loading…
Reference in New Issue