Chromium Code Reviews| Index: ui/base/cocoa/events_mac.mm |
| diff --git a/ui/base/cocoa/events_mac.mm b/ui/base/cocoa/events_mac.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..763e5a6fec5e19badac86c21a4a07c0e4b19ac7d |
| --- /dev/null |
| +++ b/ui/base/cocoa/events_mac.mm |
| @@ -0,0 +1,182 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include <Cocoa/Cocoa.h> |
| + |
| +#include "ui/base/events.h" |
| + |
| +#include "base/logging.h" |
| +#import "ui/base/keycodes/keyboard_code_conversion_mac.h" |
| +#include "ui/gfx/point.h" |
| + |
| +namespace ui { |
| + |
| +EventType EventTypeFromNative(const base::NativeEvent& native_event) { |
| + NSEventType native_type = [native_event type]; |
| + switch (native_type) { |
| + case NSLeftMouseDown: |
| + case NSRightMouseDown: |
| + case NSOtherMouseDown: |
| + return ET_MOUSE_PRESSED; |
| + |
| + case NSLeftMouseUp: |
| + case NSRightMouseUp: |
| + case NSOtherMouseUp: |
| + return ET_MOUSE_RELEASED; |
| + |
| + case NSMouseMoved: |
| + return ET_MOUSE_MOVED; |
| + |
| + case NSLeftMouseDragged: |
| + case NSRightMouseDragged: |
| + case NSOtherMouseDragged: |
| + return ET_MOUSE_DRAGGED; |
| + |
| + case NSMouseEntered: |
| + return ET_MOUSE_ENTERED; |
| + |
| + case NSMouseExited: |
| + return ET_MOUSE_EXITED; |
| + |
| + case NSKeyDown: |
| + return ET_KEY_PRESSED; |
| + |
| + case NSKeyUp: |
| + return ET_KEY_RELEASED; |
| + |
| + case NSFlagsChanged: |
| + return ET_KEY_PRESSED; |
| + |
| + case NSScrollWheel: |
| + return ET_MOUSEWHEEL; |
| + |
| + case NSAppKitDefined: |
| + case NSSystemDefined: |
| + case NSApplicationDefined: |
| + case NSPeriodic: |
| + case NSCursorUpdate: |
| + case NSTabletPoint: |
| + case NSTabletProximity: |
| + default: |
| + return ET_UNKNOWN; |
| + } |
| +} |
| + |
| +int EventFlagsFromNative(const base::NativeEvent& native_event) { |
| + int event_flags = 0; |
| + NSUInteger modifiers = [native_event modifierFlags]; |
| + |
| + if (modifiers & NSAlphaShiftKeyMask) |
| + event_flags = event_flags | EF_CAPS_LOCK_DOWN; |
| + |
| + if (modifiers & NSShiftKeyMask) |
| + event_flags = event_flags | EF_SHIFT_DOWN; |
| + |
| + if (modifiers & NSControlKeyMask) |
| + event_flags = event_flags | EF_CONTROL_DOWN; |
| + |
| + if (modifiers & NSAlternateKeyMask) |
| + event_flags = event_flags | EF_ALT_DOWN; |
| + |
| + if (modifiers & NSCommandKeyMask) |
| + event_flags = event_flags | EF_COMMAND_DOWN; |
| + |
| + NSEventType type = [native_event type]; |
| + |
| + if (type == NSLeftMouseDown || |
| + type == NSLeftMouseUp || |
| + type == NSLeftMouseDragged) { |
| + event_flags = event_flags | EF_LEFT_BUTTON_DOWN; |
|
Nico
2011/12/19 20:54:49
mouse up gets "LEFT_BUTTON_DOWN"? o_O
dhollowa
2011/12/19 23:19:11
I agree this is a bad name for the enum, but is th
|
| + } |
| + |
| + if (type == NSRightMouseDown || |
| + type == NSRightMouseUp || |
| + type == NSRightMouseDragged) { |
| + event_flags = event_flags | EF_RIGHT_BUTTON_DOWN; |
| + } |
| + |
| + if (type == NSOtherMouseDown || |
| + type == NSOtherMouseUp || |
| + type == NSOtherMouseDragged) { |
| + event_flags = event_flags | EF_MIDDLE_BUTTON_DOWN; |
| + } |
| + |
| + return event_flags; |
| +} |
| + |
| +gfx::Point EventLocationFromNative(const base::NativeEvent& native_event) { |
|
Nico
2011/12/19 20:54:49
Can you (in a different CL) add a comment to this
dhollowa
2011/12/19 23:19:11
I added it in this CL.
On 2011/12/19 20:54:49, Ni
|
| + NSWindow* window = [native_event window]; |
| + NSPoint location = [native_event locationInWindow]; |
| + |
| + // Convert |location| to be relative to coordinate system of |contentView|. |
| + // Note: this assumes that ui::Event coordinates are rooted in the top-level |
| + // view (with flipped coordinates). A more general (but costly) approach |
| + // would be to hit-test the view of the event and use the found view's |
| + // coordinate system. Currently there is no need for this generality, and |
| + // speed is preferred. Flipped views are not suppported. |
| + DCHECK([[window contentView] isFlipped] == NO); |
| + location = [[window contentView] convertPoint:location fromView:nil]; |
| + location.y = [[window contentView] bounds].size.height - location.y; |
| + |
| + return gfx::Point(NSPointToCGPoint(location)); |
| +} |
| + |
| +KeyboardCode KeyboardCodeFromNative(const base::NativeEvent& native_event) { |
| + return ui::KeyboardCodeFromNSEvent(native_event); |
| +} |
| + |
| +bool IsMouseEvent(const base::NativeEvent& native_event) { |
|
Nico
2011/12/19 20:54:49
Huh, this function is likely the same on all platf
dhollowa
2011/12/19 23:19:11
Other platforms are able to avoid two-stage tests.
Nico
2011/12/19 23:30:28
My hunch is that this is not performance-sensitive
|
| + EventType type = EventTypeFromNative(native_event); |
| + return type == ET_MOUSE_PRESSED || |
| + type == ET_MOUSE_DRAGGED || |
| + type == ET_MOUSE_RELEASED || |
| + type == ET_MOUSE_MOVED || |
| + type == ET_MOUSE_ENTERED || |
| + type == ET_MOUSE_EXITED; |
| +} |
| + |
| +int GetMouseWheelOffset(const base::NativeEvent& native_event) { |
|
Nico
2011/12/19 20:54:49
blech…can you change this function to return x/y i
dhollowa
2011/12/19 23:19:11
I've added it to my list. This is very much a wor
|
| + // TODO(dhollowa): Come back to this once comparisons can be made with other |
| + // platforms. |
| + return [native_event deltaY]; |
| +} |
| + |
| +int GetTouchId(const base::NativeEvent& native_event) { |
| + // Touch is currently unsupported. |
| + return 0; |
| +} |
| + |
| +float GetTouchRadiusX(const base::NativeEvent& native_event) { |
| + // Touch is currently unsupported. |
| + return 1.0; |
| +} |
| + |
| +float GetTouchRadiusY(const base::NativeEvent& native_event) { |
| + // Touch is currently unsupported. |
| + return 1.0; |
| +} |
| + |
| +float GetTouchAngle(const base::NativeEvent& native_event) { |
| + // Touch is currently unsupported. |
| + return 0.0; |
| +} |
| + |
| +float GetTouchForce(const base::NativeEvent& native_event) { |
| + // Touch is currently unsupported. |
| + return 0.0; |
| +} |
| + |
| +base::NativeEvent CreateNoopEvent() { |
| + return [NSEvent otherEventWithType:NSApplicationDefined |
| + location:NSZeroPoint |
| + modifierFlags:0 |
| + timestamp:[NSDate timeIntervalSinceReferenceDate] |
| + windowNumber:0 |
| + context:nil |
| + subtype:0 |
| + data1:0 |
| + data2:0]; |
| +} |
| + |
| +} // namespace ui |