Fix search results being clipped in app list.
[chromium-blink-merge.git] / ui / events / cocoa / events_mac.mm
blob64eb972e15e25c225ed9ba2ca939444ec572025e
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/events/event_utils.h"
7 #include <Cocoa/Cocoa.h>
9 #include "base/logging.h"
10 #import "base/mac/mac_util.h"
11 #import "base/mac/sdk_forward_declarations.h"
12 #include "base/time/time.h"
13 #include "build/build_config.h"
14 #include "ui/events/cocoa/cocoa_event_utils.h"
15 #include "ui/events/event_utils.h"
16 #import "ui/events/keycodes/keyboard_code_conversion_mac.h"
17 #include "ui/gfx/geometry/point.h"
18 #include "ui/gfx/geometry/vector2d.h"
20 namespace ui {
22 void UpdateDeviceList() {
23   NOTIMPLEMENTED();
26 EventType EventTypeFromNative(const base::NativeEvent& native_event) {
27   NSEventType type = [native_event type];
28   switch (type) {
29     case NSKeyDown:
30       return ET_KEY_PRESSED;
31     case NSKeyUp:
32       return ET_KEY_RELEASED;
33     case NSLeftMouseDown:
34     case NSRightMouseDown:
35     case NSOtherMouseDown:
36       return ET_MOUSE_PRESSED;
37     case NSLeftMouseUp:
38     case NSRightMouseUp:
39     case NSOtherMouseUp:
40       return ET_MOUSE_RELEASED;
41     case NSLeftMouseDragged:
42     case NSRightMouseDragged:
43     case NSOtherMouseDragged:
44       return ET_MOUSE_DRAGGED;
45     case NSMouseMoved:
46       return ET_MOUSE_MOVED;
47     case NSScrollWheel:
48       return ET_MOUSEWHEEL;
49     case NSMouseEntered:
50       return ET_MOUSE_ENTERED;
51     case NSMouseExited:
52       return ET_MOUSE_EXITED;
53     case NSEventTypeSwipe:
54       return ET_SCROLL_FLING_START;
55     case NSAppKitDefined:
56     case NSSystemDefined:
57       return ET_UNKNOWN;
58     case NSFlagsChanged:
59     case NSApplicationDefined:
60     case NSPeriodic:
61     case NSCursorUpdate:
62     case NSTabletPoint:
63     case NSTabletProximity:
64     case NSEventTypeGesture:
65     case NSEventTypeMagnify:
66     case NSEventTypeRotate:
67     case NSEventTypeBeginGesture:
68     case NSEventTypeEndGesture:
69       NOTIMPLEMENTED() << type;
70       break;
71     default:
72       NOTIMPLEMENTED() << type;
73       break;
74   }
75   return ET_UNKNOWN;
78 int EventFlagsFromNative(const base::NativeEvent& event) {
79   NSUInteger modifiers = [event modifierFlags];
80   return EventFlagsFromNSEventWithModifiers(event, modifiers);
83 base::TimeDelta EventTimeFromNative(const base::NativeEvent& native_event) {
84   NSTimeInterval since_system_startup = [native_event timestamp];
85   // Truncate to extract seconds before doing floating point arithmetic.
86   int64_t seconds = since_system_startup;
87   since_system_startup -= seconds;
88   int64_t microseconds = since_system_startup * 1000000;
89   return base::TimeDelta::FromSeconds(seconds) +
90       base::TimeDelta::FromMicroseconds(microseconds);
93 gfx::Point EventLocationFromNative(const base::NativeEvent& native_event) {
94   NSWindow* window = [native_event window];
95   if (!window) {
96     NOTIMPLEMENTED();  // Point will be in screen coordinates.
97     return gfx::Point();
98   }
99   NSPoint location = [native_event locationInWindow];
100   NSRect content_rect = [window contentRectForFrameRect:[window frame]];
101   return gfx::Point(location.x, NSHeight(content_rect) - location.y);
104 gfx::Point EventSystemLocationFromNative(
105     const base::NativeEvent& native_event) {
106   NOTIMPLEMENTED();
107   return gfx::Point();
110 int EventButtonFromNative(const base::NativeEvent& native_event) {
111   NOTIMPLEMENTED();
112   return 0;
115 int GetChangedMouseButtonFlagsFromNative(
116     const base::NativeEvent& native_event) {
117   NSEventType type = [native_event type];
118   switch (type) {
119     case NSLeftMouseDown:
120     case NSLeftMouseUp:
121     case NSLeftMouseDragged:
122       return EF_LEFT_MOUSE_BUTTON;
123     case NSRightMouseDown:
124     case NSRightMouseUp:
125     case NSRightMouseDragged:
126       return EF_RIGHT_MOUSE_BUTTON;
127     case NSOtherMouseDown:
128     case NSOtherMouseUp:
129     case NSOtherMouseDragged:
130       return EF_MIDDLE_MOUSE_BUTTON;
131   }
132   return 0;
135 gfx::Vector2d GetMouseWheelOffset(const base::NativeEvent& event) {
136   if ([event respondsToSelector:@selector(hasPreciseScrollingDeltas)] &&
137       [event hasPreciseScrollingDeltas]) {
138     // Handle continuous scrolling devices such as a Magic Mouse or a trackpad.
139     // -scrollingDelta{X|Y} have float return types but they return values that
140     // are already rounded to integers.
141     // The values are the same as the values returned from calling
142     // CGEventGetIntegerValueField(kCGScrollWheelEventPointDeltaAxis{1|2}).
143     return gfx::Vector2d([event scrollingDeltaX], [event scrollingDeltaY]);
144   } else {
145     // Empirically, a value of 0.1 is typical for one mousewheel click. Positive
146     // values when scrolling up or to the left. Scrolling quickly results in a
147     // higher delta per click, up to about 15.0. (Quartz documentation suggests
148     // +/-10).
149     // Multiply by 1000 to vaguely approximate WHEEL_DELTA on Windows (120).
150     const CGFloat kWheelDeltaMultiplier = 1000;
151     return gfx::Vector2d(kWheelDeltaMultiplier * [event deltaX],
152                          kWheelDeltaMultiplier * [event deltaY]);
153   }
156 base::NativeEvent CopyNativeEvent(const base::NativeEvent& event) {
157   return [event copy];
160 void ReleaseCopiedNativeEvent(const base::NativeEvent& event) {
161   [event release];
164 void ClearTouchIdIfReleased(const base::NativeEvent& native_event) {
165   NOTIMPLEMENTED();
168 int GetTouchId(const base::NativeEvent& native_event) {
169   NOTIMPLEMENTED();
170   return 0;
173 float GetTouchRadiusX(const base::NativeEvent& native_event) {
174   NOTIMPLEMENTED();
175   return 0.f;
178 float GetTouchRadiusY(const base::NativeEvent& native_event) {
179   NOTIMPLEMENTED();
180   return 0.f;
183 float GetTouchAngle(const base::NativeEvent& native_event) {
184   NOTIMPLEMENTED();
185   return 0.f;
188 float GetTouchForce(const base::NativeEvent& native_event) {
189   NOTIMPLEMENTED();
190   return 0.f;
193 bool GetScrollOffsets(const base::NativeEvent& native_event,
194                       float* x_offset,
195                       float* y_offset,
196                       float* x_offset_ordinal,
197                       float* y_offset_ordinal,
198                       int* finger_count) {
199   NOTIMPLEMENTED();
200   return false;
203 bool GetFlingData(const base::NativeEvent& native_event,
204                   float* vx,
205                   float* vy,
206                   float* vx_ordinal,
207                   float* vy_ordinal,
208                   bool* is_cancel) {
209   NOTIMPLEMENTED();
210   return false;
213 KeyboardCode KeyboardCodeFromNative(const base::NativeEvent& native_event) {
214   return KeyboardCodeFromNSEvent(native_event);
217 DomCode CodeFromNative(const base::NativeEvent& native_event) {
218   return CodeFromNSEvent(native_event);
221 uint32 PlatformKeycodeFromNative(const base::NativeEvent& native_event) {
222   return native_event.keyCode;
225 uint32 WindowsKeycodeFromNative(const base::NativeEvent& native_event) {
226   return static_cast<uint32>(KeyboardCodeFromNSEvent(native_event));
229 uint16 TextFromNative(const base::NativeEvent& native_event) {
230   NSString* text = @"";
231   if ([native_event type] != NSFlagsChanged)
232     text = [native_event characters];
234   // These exceptions are based on WebInputEventFactoryMac.mm:
235   uint32 windows_keycode = WindowsKeycodeFromNative(native_event);
236   if (windows_keycode == '\r')
237     text = @"\r";
238   if ([text isEqualToString:@"\x7F"])
239     text = @"\x8";
240   if (windows_keycode == 9)
241     text = @"\x9";
243   uint16 return_value;
244   [text getCharacters:&return_value];
245   return return_value;
248 uint16 UnmodifiedTextFromNative(const base::NativeEvent& native_event) {
249   NSString* text = @"";
250   if ([native_event type] != NSFlagsChanged)
251     text = [native_event charactersIgnoringModifiers];
253   // These exceptions are based on WebInputEventFactoryMac.mm:
254   uint32 windows_keycode = WindowsKeycodeFromNative(native_event);
255   if (windows_keycode == '\r')
256     text = @"\r";
257   if ([text isEqualToString:@"\x7F"])
258     text = @"\x8";
259   if (windows_keycode == 9)
260     text = @"\x9";
262   uint16 return_value;
263   [text getCharacters:&return_value];
264   return return_value;
267 bool IsCharFromNative(const base::NativeEvent& native_event) {
268   return false;
271 }  // namespace ui