blob: ffc34d7f2a71e8e14a93559c5181ca00104c4dc6 [file] [log] [blame]
// Copyright (c) 2012 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/events/event_constants.h"
#include "base/event_types.h"
#include "base/logging.h"
#include "base/time/time.h"
#include "ui/events/event_utils.h"
#import "ui/events/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_MOUSE_BUTTON;
}
if (type == NSRightMouseDown ||
type == NSRightMouseUp ||
type == NSRightMouseDragged) {
event_flags = event_flags | EF_RIGHT_MOUSE_BUTTON;
}
if (type == NSOtherMouseDown ||
type == NSOtherMouseUp ||
type == NSOtherMouseDragged) {
event_flags = event_flags | EF_MIDDLE_MOUSE_BUTTON;
}
return event_flags;
}
base::TimeDelta EventTimeFromNative(const base::NativeEvent& native_event) {
return base::TimeDelta::FromMicroseconds(
[native_event timestamp] * 1000000.0f);
}
gfx::Point EventLocationFromNative(const base::NativeEvent& native_event) {
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));
}
gfx::Point EventSystemLocationFromNative(
const base::NativeEvent& native_event) {
// TODO(port): Needs to always return screen position here. Returning normal
// origin for now since that's obviously wrong.
return gfx::Point(0, 0);
}
KeyboardCode KeyboardCodeFromNative(const base::NativeEvent& native_event) {
return ui::KeyboardCodeFromNSEvent(native_event);
}
std::string CodeFromNative(const base::NativeEvent& native_event) {
return ui::CodeFromNSEvent(native_event);
}
bool IsMouseEvent(const base::NativeEvent& native_event) {
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;
}
gfx::Vector2d GetMouseWheelOffset(const base::NativeEvent& native_event) {
// TODO(dhollowa): Come back to this once comparisons can be made with other
// platforms.
return gfx::Vector2d([native_event deltaX], [native_event deltaY]);
}
void ClearTouchIdIfReleased(const base::NativeEvent& xev) {
// Touch is currently unsupported.
}
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;
}
bool GetScrollOffsets(const base::NativeEvent& native_event,
float* x_offset,
float* y_offset,
int* finger_count) {
return false;
}
bool IsNoopEvent(const base::NativeEvent& event) {
return ([event type] == NSApplicationDefined && [event subtype] == 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