OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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. | |
4 | |
5 #include <Cocoa/Cocoa.h> | |
6 | |
7 #include "ui/events/event_constants.h" | |
8 | |
9 #include "base/event_types.h" | |
10 #include "base/logging.h" | |
11 #include "base/time/time.h" | |
12 #include "ui/events/event_utils.h" | |
13 #import "ui/events/keycodes/keyboard_code_conversion_mac.h" | |
14 #include "ui/gfx/point.h" | |
15 | |
16 namespace ui { | |
17 | |
18 EventType EventTypeFromNative(const base::NativeEvent& native_event) { | |
19 NSEventType native_type = [native_event type]; | |
20 switch (native_type) { | |
21 case NSLeftMouseDown: | |
22 case NSRightMouseDown: | |
23 case NSOtherMouseDown: | |
24 return ET_MOUSE_PRESSED; | |
25 | |
26 case NSLeftMouseUp: | |
27 case NSRightMouseUp: | |
28 case NSOtherMouseUp: | |
29 return ET_MOUSE_RELEASED; | |
30 | |
31 case NSMouseMoved: | |
32 return ET_MOUSE_MOVED; | |
33 | |
34 case NSLeftMouseDragged: | |
35 case NSRightMouseDragged: | |
36 case NSOtherMouseDragged: | |
37 return ET_MOUSE_DRAGGED; | |
38 | |
39 case NSMouseEntered: | |
40 return ET_MOUSE_ENTERED; | |
41 | |
42 case NSMouseExited: | |
43 return ET_MOUSE_EXITED; | |
44 | |
45 case NSKeyDown: | |
46 return ET_KEY_PRESSED; | |
47 | |
48 case NSKeyUp: | |
49 return ET_KEY_RELEASED; | |
50 | |
51 case NSFlagsChanged: | |
52 return ET_KEY_PRESSED; | |
53 | |
54 case NSScrollWheel: | |
55 return ET_MOUSEWHEEL; | |
56 | |
57 case NSAppKitDefined: | |
58 case NSSystemDefined: | |
59 case NSApplicationDefined: | |
60 case NSPeriodic: | |
61 case NSCursorUpdate: | |
62 case NSTabletPoint: | |
63 case NSTabletProximity: | |
64 default: | |
65 return ET_UNKNOWN; | |
66 } | |
67 } | |
68 | |
69 int EventFlagsFromNative(const base::NativeEvent& native_event) { | |
70 int event_flags = 0; | |
71 NSUInteger modifiers = [native_event modifierFlags]; | |
72 | |
73 if (modifiers & NSAlphaShiftKeyMask) | |
74 event_flags = event_flags | EF_CAPS_LOCK_DOWN; | |
75 | |
76 if (modifiers & NSShiftKeyMask) | |
77 event_flags = event_flags | EF_SHIFT_DOWN; | |
78 | |
79 if (modifiers & NSControlKeyMask) | |
80 event_flags = event_flags | EF_CONTROL_DOWN; | |
81 | |
82 if (modifiers & NSAlternateKeyMask) | |
83 event_flags = event_flags | EF_ALT_DOWN; | |
84 | |
85 if (modifiers & NSCommandKeyMask) | |
86 event_flags = event_flags | EF_COMMAND_DOWN; | |
87 | |
88 NSEventType type = [native_event type]; | |
89 | |
90 if (type == NSLeftMouseDown || | |
91 type == NSLeftMouseUp || | |
92 type == NSLeftMouseDragged) { | |
93 event_flags = event_flags | EF_LEFT_MOUSE_BUTTON; | |
94 } | |
95 | |
96 if (type == NSRightMouseDown || | |
97 type == NSRightMouseUp || | |
98 type == NSRightMouseDragged) { | |
99 event_flags = event_flags | EF_RIGHT_MOUSE_BUTTON; | |
100 } | |
101 | |
102 if (type == NSOtherMouseDown || | |
103 type == NSOtherMouseUp || | |
104 type == NSOtherMouseDragged) { | |
105 event_flags = event_flags | EF_MIDDLE_MOUSE_BUTTON; | |
106 } | |
107 | |
108 return event_flags; | |
109 } | |
110 | |
111 base::TimeDelta EventTimeFromNative(const base::NativeEvent& native_event) { | |
112 return base::TimeDelta::FromMicroseconds( | |
113 [native_event timestamp] * 1000000.0f); | |
114 } | |
115 | |
116 gfx::Point EventLocationFromNative(const base::NativeEvent& native_event) { | |
117 NSWindow* window = [native_event window]; | |
118 NSPoint location = [native_event locationInWindow]; | |
119 | |
120 // Convert |location| to be relative to coordinate system of |contentView|. | |
121 // Note: this assumes that ui::Event coordinates are rooted in the top-level | |
122 // view (with flipped coordinates). A more general (but costly) approach | |
123 // would be to hit-test the view of the event and use the found view's | |
124 // coordinate system. Currently there is no need for this generality, and | |
125 // speed is preferred. Flipped views are not suppported. | |
126 DCHECK([[window contentView] isFlipped] == NO); | |
127 location = [[window contentView] convertPoint:location fromView:nil]; | |
128 location.y = [[window contentView] bounds].size.height - location.y; | |
129 | |
130 return gfx::Point(NSPointToCGPoint(location)); | |
131 } | |
132 | |
133 gfx::Point EventSystemLocationFromNative( | |
134 const base::NativeEvent& native_event) { | |
135 // TODO(port): Needs to always return screen position here. Returning normal | |
136 // origin for now since that's obviously wrong. | |
137 return gfx::Point(0, 0); | |
138 } | |
139 | |
140 KeyboardCode KeyboardCodeFromNative(const base::NativeEvent& native_event) { | |
141 return ui::KeyboardCodeFromNSEvent(native_event); | |
142 } | |
143 | |
144 bool IsMouseEvent(const base::NativeEvent& native_event) { | |
145 EventType type = EventTypeFromNative(native_event); | |
146 return type == ET_MOUSE_PRESSED || | |
147 type == ET_MOUSE_DRAGGED || | |
148 type == ET_MOUSE_RELEASED || | |
149 type == ET_MOUSE_MOVED || | |
150 type == ET_MOUSE_ENTERED || | |
151 type == ET_MOUSE_EXITED; | |
152 } | |
153 | |
154 gfx::Vector2d GetMouseWheelOffset(const base::NativeEvent& native_event) { | |
155 // TODO(dhollowa): Come back to this once comparisons can be made with other | |
156 // platforms. | |
157 return gfx::Vector2d([native_event deltaX], [native_event deltaY]); | |
158 } | |
159 | |
160 void ClearTouchIdIfReleased(const base::NativeEvent& xev) { | |
161 // Touch is currently unsupported. | |
162 } | |
163 | |
164 int GetTouchId(const base::NativeEvent& native_event) { | |
165 // Touch is currently unsupported. | |
166 return 0; | |
167 } | |
168 | |
169 float GetTouchRadiusX(const base::NativeEvent& native_event) { | |
170 // Touch is currently unsupported. | |
171 return 1.0; | |
172 } | |
173 | |
174 float GetTouchRadiusY(const base::NativeEvent& native_event) { | |
175 // Touch is currently unsupported. | |
176 return 1.0; | |
177 } | |
178 | |
179 float GetTouchAngle(const base::NativeEvent& native_event) { | |
180 // Touch is currently unsupported. | |
181 return 0.0; | |
182 } | |
183 | |
184 float GetTouchForce(const base::NativeEvent& native_event) { | |
185 // Touch is currently unsupported. | |
186 return 0.0; | |
187 } | |
188 | |
189 bool GetScrollOffsets(const base::NativeEvent& native_event, | |
190 float* x_offset, | |
191 float* y_offset, | |
192 int* finger_count) { | |
193 return false; | |
194 } | |
195 | |
196 bool IsNoopEvent(const base::NativeEvent& event) { | |
197 return ([event type] == NSApplicationDefined && [event subtype] == 0); | |
198 } | |
199 | |
200 base::NativeEvent CreateNoopEvent() { | |
201 return [NSEvent otherEventWithType:NSApplicationDefined | |
202 location:NSZeroPoint | |
203 modifierFlags:0 | |
204 timestamp:[NSDate timeIntervalSinceReferenceDate] | |
205 windowNumber:0 | |
206 context:nil | |
207 subtype:0 | |
208 data1:0 | |
209 data2:0]; | |
210 } | |
211 | |
212 } // namespace ui | |
OLD | NEW |