diff options
author | stuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-29 18:15:33 +0000 |
---|---|---|
committer | stuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-29 18:15:33 +0000 |
commit | b49ec50466482cdc03d827d6fd53485a3efffd7b (patch) | |
tree | bcda012b66d8bb2a4a3399f6848c03b6ac050e4a /chrome/browser/cocoa/base_view.mm | |
parent | c586d02075ee5e4e1d82516a96dd14e2948ce842 (diff) | |
download | chromium_src-b49ec50466482cdc03d827d6fd53485a3efffd7b.zip chromium_src-b49ec50466482cdc03d827d6fd53485a3efffd7b.tar.gz chromium_src-b49ec50466482cdc03d827d6fd53485a3efffd7b.tar.bz2 |
Enable mouse enter/exit events for the content area on Mac
Fixes mouse-exit events for plugins touching the edge of the content area; likely also fixes similar bugs in HTML.
BUG=33100
TEST=Plugins should receive mouse exit events on edges touching the content area edge.
Review URL: http://codereview.chromium.org/1774014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45962 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa/base_view.mm')
-rw-r--r-- | chrome/browser/cocoa/base_view.mm | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/chrome/browser/cocoa/base_view.mm b/chrome/browser/cocoa/base_view.mm index e5ed3a2..cee8951 100644 --- a/chrome/browser/cocoa/base_view.mm +++ b/chrome/browser/cocoa/base_view.mm @@ -12,6 +12,7 @@ trackingArea_ = [[NSTrackingArea alloc] initWithRect:frame options:NSTrackingMouseMoved | + NSTrackingMouseEnteredAndExited | NSTrackingActiveInActiveApp | NSTrackingInVisibleRect owner:self @@ -37,6 +38,7 @@ } - (void)mouseDown:(NSEvent *)theEvent { + dragging_ = YES; [self mouseEvent:theEvent]; } @@ -50,6 +52,22 @@ - (void)mouseUp:(NSEvent *)theEvent { [self mouseEvent:theEvent]; + + dragging_ = NO; + if (pendingExitEvent_.get()) { + NSEvent* exitEvent = + [NSEvent enterExitEventWithType:NSMouseExited + location:[theEvent locationInWindow] + modifierFlags:[theEvent modifierFlags] + timestamp:[theEvent timestamp] + windowNumber:[theEvent windowNumber] + context:[theEvent context] + eventNumber:[pendingExitEvent_.get() eventNumber] + trackingNumber:[pendingExitEvent_.get() trackingNumber] + userData:[pendingExitEvent_.get() userData]]; + [self mouseEvent:exitEvent]; + pendingExitEvent_.reset(); + } } - (void)rightMouseUp:(NSEvent *)theEvent { @@ -77,10 +95,23 @@ } - (void)mouseEntered:(NSEvent *)theEvent { + if (pendingExitEvent_.get()) { + pendingExitEvent_.reset(); + return; + } + [self mouseEvent:theEvent]; } - (void)mouseExited:(NSEvent *)theEvent { + // The tracking area will send an exit event even during a drag, which isn't + // how the event flow for drags should work. This stores the exit event, and + // sends it when the drag completes instead. + if (dragging_) { + pendingExitEvent_.reset([theEvent retain]); + return; + } + [self mouseEvent:theEvent]; } |