Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Side by Side Diff: aura/event_win.cc

Issue 7886042: Move Aura to UI subdir. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « aura/event.cc ('k') | aura/event_x.cc » ('j') | ui/aura/aura.gyp » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 "aura/event.h"
6
7 #include "base/logging.h"
8 #include "ui/base/keycodes/keyboard_code_conversion_win.h"
9
10 namespace aura {
11
12 namespace {
13
14 bool IsClientMouseEvent(const NativeEvent& native_event) {
15 return native_event.message == WM_MOUSELEAVE ||
16 native_event.message == WM_MOUSEHOVER ||
17 (native_event.message >= WM_MOUSEFIRST &&
18 native_event.message <= WM_MOUSELAST);
19 }
20
21 bool IsNonClientMouseEvent(const NativeEvent& native_event) {
22 return native_event.message == WM_NCMOUSELEAVE ||
23 native_event.message == WM_NCMOUSEHOVER ||
24 (native_event.message >= WM_NCMOUSEMOVE &&
25 native_event.message <= WM_NCXBUTTONDBLCLK);
26 }
27
28 // Returns a mask corresponding to the set of modifier keys that are currently
29 // pressed. Windows key messages don't come with control key state as parameters
30 // as with mouse messages, so we need to explicitly ask for these states.
31 int GetKeyStateFlags() {
32 int flags = 0;
33 flags |= (GetKeyState(VK_MENU) & 0x80)? ui::EF_ALT_DOWN : 0;
34 flags |= (GetKeyState(VK_SHIFT) & 0x80)? ui::EF_SHIFT_DOWN : 0;
35 flags |= (GetKeyState(VK_CONTROL) & 0x80)? ui::EF_CONTROL_DOWN : 0;
36 return flags;
37 }
38
39 bool IsButtonDown(NativeEvent native_event) {
40 return (native_event.wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON |
41 MK_XBUTTON1 | MK_XBUTTON2)) != 0;
42 }
43
44 // Convert windows message identifiers to Event types.
45 ui::EventType EventTypeFromNative(NativeEvent native_event) {
46 switch (native_event.message) {
47 case WM_KEYDOWN:
48 case WM_SYSKEYDOWN:
49 case WM_CHAR:
50 return ui::ET_KEY_PRESSED;
51 case WM_KEYUP:
52 case WM_SYSKEYUP:
53 return ui::ET_KEY_RELEASED;
54 case WM_LBUTTONDBLCLK:
55 case WM_LBUTTONDOWN:
56 case WM_MBUTTONDBLCLK:
57 case WM_MBUTTONDOWN:
58 case WM_NCLBUTTONDBLCLK:
59 case WM_NCLBUTTONDOWN:
60 case WM_NCMBUTTONDBLCLK:
61 case WM_NCMBUTTONDOWN:
62 case WM_NCRBUTTONDBLCLK:
63 case WM_NCRBUTTONDOWN:
64 case WM_NCXBUTTONDBLCLK:
65 case WM_NCXBUTTONDOWN:
66 case WM_RBUTTONDBLCLK:
67 case WM_RBUTTONDOWN:
68 case WM_XBUTTONDBLCLK:
69 case WM_XBUTTONDOWN:
70 return ui::ET_MOUSE_PRESSED;
71 case WM_LBUTTONUP:
72 case WM_MBUTTONUP:
73 case WM_NCLBUTTONUP:
74 case WM_NCMBUTTONUP:
75 case WM_NCRBUTTONUP:
76 case WM_NCXBUTTONUP:
77 case WM_RBUTTONUP:
78 case WM_XBUTTONUP:
79 return ui::ET_MOUSE_RELEASED;
80 case WM_MOUSEMOVE:
81 return IsButtonDown(native_event) ? ui::ET_MOUSE_DRAGGED :
82 ui::ET_MOUSE_MOVED;
83 case WM_NCMOUSEMOVE:
84 return ui::ET_MOUSE_MOVED;
85 case WM_MOUSEWHEEL:
86 return ui::ET_MOUSEWHEEL;
87 case WM_MOUSELEAVE:
88 case WM_NCMOUSELEAVE:
89 return ui::ET_MOUSE_EXITED;
90 default:
91 NOTREACHED();
92 }
93 return ui::ET_UNKNOWN;
94 }
95
96 // Get views::Event flags from a native Windows message
97 int EventFlagsFromNative(NativeEvent native_event) {
98 int flags = 0;
99
100 // TODO(msw): ORing the pressed/released button into the flags is _wrong_.
101 // It makes it impossible to tell which button was modified when multiple
102 // buttons are/were held down. We need to instead put the modified button into
103 // a separate member on the MouseEvent, then audit all consumers of
104 // MouseEvents to fix them to use the resulting values correctly.
105 switch (native_event.message) {
106 case WM_LBUTTONDBLCLK:
107 case WM_LBUTTONDOWN:
108 case WM_LBUTTONUP:
109 case WM_NCLBUTTONDBLCLK:
110 case WM_NCLBUTTONDOWN:
111 case WM_NCLBUTTONUP:
112 native_event.wParam |= MK_LBUTTON;
113 break;
114 case WM_MBUTTONDBLCLK:
115 case WM_MBUTTONDOWN:
116 case WM_MBUTTONUP:
117 case WM_NCMBUTTONDBLCLK:
118 case WM_NCMBUTTONDOWN:
119 case WM_NCMBUTTONUP:
120 native_event.wParam |= MK_MBUTTON;
121 break;
122 case WM_RBUTTONDBLCLK:
123 case WM_RBUTTONDOWN:
124 case WM_RBUTTONUP:
125 case WM_NCRBUTTONDBLCLK:
126 case WM_NCRBUTTONDOWN:
127 case WM_NCRBUTTONUP:
128 native_event.wParam |= MK_RBUTTON;
129 break;
130 case WM_NCXBUTTONDBLCLK:
131 case WM_NCXBUTTONDOWN:
132 case WM_NCXBUTTONUP:
133 case WM_XBUTTONDBLCLK:
134 case WM_XBUTTONDOWN:
135 case WM_XBUTTONUP:
136 native_event.wParam |= MK_XBUTTON1;
137 break;
138 }
139
140 // Check if the event occurred in the non-client area.
141 if (IsNonClientMouseEvent(native_event))
142 flags |= ui::EF_IS_NON_CLIENT;
143
144 // Check for double click events.
145 switch (native_event.message) {
146 case WM_NCLBUTTONDBLCLK:
147 case WM_NCMBUTTONDBLCLK:
148 case WM_NCRBUTTONDBLCLK:
149 case WM_NCXBUTTONDBLCLK:
150 case WM_LBUTTONDBLCLK:
151 case WM_MBUTTONDBLCLK:
152 case WM_RBUTTONDBLCLK:
153 case WM_XBUTTONDBLCLK:
154 flags |= ui::EF_IS_DOUBLE_CLICK;
155 break;
156 }
157
158 // For non-client mouse message, the WPARAM value represents the hit test
159 // result, instead of the key state.
160 switch (native_event.message) {
161 case WM_NCLBUTTONDOWN:
162 case WM_NCLBUTTONUP:
163 flags |= ui::EF_LEFT_BUTTON_DOWN;
164 break;
165 case WM_NCMBUTTONDOWN:
166 case WM_NCMBUTTONUP:
167 flags |= ui::EF_MIDDLE_BUTTON_DOWN;
168 break;
169 case WM_NCRBUTTONDOWN:
170 case WM_NCRBUTTONUP:
171 flags |= ui::EF_RIGHT_BUTTON_DOWN;
172 break;
173 default: {
174 UINT win_flags = GET_KEYSTATE_WPARAM(native_event.wParam);
175 flags |= (win_flags & MK_CONTROL) ? ui::EF_CONTROL_DOWN : 0;
176 flags |= (win_flags & MK_SHIFT) ? ui::EF_SHIFT_DOWN : 0;
177 flags |= (GetKeyState(VK_MENU) < 0) ? ui::EF_ALT_DOWN : 0;
178 flags |= (win_flags & MK_LBUTTON) ? ui::EF_LEFT_BUTTON_DOWN : 0;
179 flags |= (win_flags & MK_MBUTTON) ? ui::EF_MIDDLE_BUTTON_DOWN : 0;
180 flags |= (win_flags & MK_RBUTTON) ? ui::EF_RIGHT_BUTTON_DOWN : 0;
181 break;
182 }
183 }
184
185 return flags;
186 }
187
188 } // namespace
189
190 void Event::Init() {
191 ZeroMemory(&native_event_, sizeof(native_event_));
192 }
193
194 void Event::InitWithNativeEvent(NativeEvent native_event) {
195 native_event_ = native_event;
196 }
197
198 LocatedEvent::LocatedEvent(NativeEvent native_event)
199 : Event(native_event, EventTypeFromNative(native_event),
200 EventFlagsFromNative(native_event)),
201 location_(native_event.pt.x, native_event.pt.y) {
202 }
203
204 MouseEvent::MouseEvent(NativeEvent native_event)
205 : LocatedEvent(native_event) {
206 if (IsNonClientMouseEvent(native_event)) {
207 // Non-client message. The position is contained in a POINTS structure in
208 // LPARAM, and is in screen coordinates so we have to convert to client.
209 POINT native_point = location_.ToPOINT();
210 ScreenToClient(native_event.hwnd, &native_point);
211 location_ = gfx::Point(native_point);
212 }
213 }
214
215 KeyEvent::KeyEvent(NativeEvent native_event)
216 : Event(native_event,
217 EventTypeFromNative(native_event),
218 GetKeyStateFlags()),
219 key_code_(ui::KeyboardCodeForWindowsKeyCode(native_event.wParam)) {
220 }
221
222 } // namespace aura
OLDNEW
« no previous file with comments | « aura/event.cc ('k') | aura/event_x.cc » ('j') | ui/aura/aura.gyp » ('J')

Powered by Google App Engine
This is Rietveld 408576698