1 /*
2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #include "config.h"
32 #include "WebInputEvent.h"
33 #include "platform/KeyboardCodes.h"
34 #include "wtf/Assertions.h"
35 #include "wtf/StringExtras.h"
36 #include <ctype.h>
37
38 using namespace WebCore;
39
40 namespace blink {
41
42 struct SameSizeAsWebInputEvent {
43 int inputData[5];
44 };
45
46 struct SameSizeAsWebKeyboardEvent : public SameSizeAsWebInputEvent {
47 int keyboardData[12];
48 };
49
50 struct SameSizeAsWebMouseEvent : public SameSizeAsWebInputEvent {
51 int mouseData[10];
52 };
53
54 struct SameSizeAsWebMouseWheelEvent : public SameSizeAsWebMouseEvent {
55 int mousewheelData[10];
56 };
57
58 struct SameSizeAsWebGestureEvent : public SameSizeAsWebInputEvent {
59 int gestureData[9];
60 };
61
62 struct SameSizeAsWebTouchEvent : public SameSizeAsWebInputEvent {
63 WebTouchPoint touchPoints[3 * WebTouchEvent::touchesLengthCap];
64 int touchData[3];
65 };
66
67 COMPILE_ASSERT(sizeof(WebInputEvent) == sizeof(SameSizeAsWebInputEvent), WebInputEvent_has_gaps);
68 COMPILE_ASSERT(sizeof(WebKeyboardEvent) == sizeof(SameSizeAsWebKeyboardEvent), WebKeyboardEvent_has_gaps);
69 COMPILE_ASSERT(sizeof(WebMouseEvent) == sizeof(SameSizeAsWebMouseEvent), WebMouseEvent_has_gaps);
70 COMPILE_ASSERT(sizeof(WebMouseWheelEvent) == sizeof(SameSizeAsWebMouseWheelEvent), WebMouseWheelEvent_has_gaps);
71 COMPILE_ASSERT(sizeof(WebGestureEvent) == sizeof(SameSizeAsWebGestureEvent), WebGestureEvent_has_gaps);
72 COMPILE_ASSERT(sizeof(WebTouchEvent) == sizeof(SameSizeAsWebTouchEvent), WebTouchEvent_has_gaps);
73
staticKeyIdentifiers(unsigned short keyCode)74 static const char* staticKeyIdentifiers(unsigned short keyCode)
75 {
76 switch (keyCode) {
77 case VKEY_MENU:
78 return "Alt";
79 case VKEY_CONTROL:
80 return "Control";
81 case VKEY_SHIFT:
82 return "Shift";
83 case VKEY_CAPITAL:
84 return "CapsLock";
85 case VKEY_LWIN:
86 case VKEY_RWIN:
87 return "Win";
88 case VKEY_CLEAR:
89 return "Clear";
90 case VKEY_DOWN:
91 return "Down";
92 case VKEY_END:
93 return "End";
94 case VKEY_RETURN:
95 return "Enter";
96 case VKEY_EXECUTE:
97 return "Execute";
98 case VKEY_F1:
99 return "F1";
100 case VKEY_F2:
101 return "F2";
102 case VKEY_F3:
103 return "F3";
104 case VKEY_F4:
105 return "F4";
106 case VKEY_F5:
107 return "F5";
108 case VKEY_F6:
109 return "F6";
110 case VKEY_F7:
111 return "F7";
112 case VKEY_F8:
113 return "F8";
114 case VKEY_F9:
115 return "F9";
116 case VKEY_F10:
117 return "F10";
118 case VKEY_F11:
119 return "F11";
120 case VKEY_F12:
121 return "F12";
122 case VKEY_F13:
123 return "F13";
124 case VKEY_F14:
125 return "F14";
126 case VKEY_F15:
127 return "F15";
128 case VKEY_F16:
129 return "F16";
130 case VKEY_F17:
131 return "F17";
132 case VKEY_F18:
133 return "F18";
134 case VKEY_F19:
135 return "F19";
136 case VKEY_F20:
137 return "F20";
138 case VKEY_F21:
139 return "F21";
140 case VKEY_F22:
141 return "F22";
142 case VKEY_F23:
143 return "F23";
144 case VKEY_F24:
145 return "F24";
146 case VKEY_HELP:
147 return "Help";
148 case VKEY_HOME:
149 return "Home";
150 case VKEY_INSERT:
151 return "Insert";
152 case VKEY_LEFT:
153 return "Left";
154 case VKEY_NEXT:
155 return "PageDown";
156 case VKEY_PRIOR:
157 return "PageUp";
158 case VKEY_PAUSE:
159 return "Pause";
160 case VKEY_SNAPSHOT:
161 return "PrintScreen";
162 case VKEY_RIGHT:
163 return "Right";
164 case VKEY_SCROLL:
165 return "Scroll";
166 case VKEY_SELECT:
167 return "Select";
168 case VKEY_UP:
169 return "Up";
170 case VKEY_DELETE:
171 return "U+007F"; // Standard says that DEL becomes U+007F.
172 case VKEY_MEDIA_NEXT_TRACK:
173 return "MediaNextTrack";
174 case VKEY_MEDIA_PREV_TRACK:
175 return "MediaPreviousTrack";
176 case VKEY_MEDIA_STOP:
177 return "MediaStop";
178 case VKEY_MEDIA_PLAY_PAUSE:
179 return "MediaPlayPause";
180 case VKEY_VOLUME_MUTE:
181 return "VolumeMute";
182 case VKEY_VOLUME_DOWN:
183 return "VolumeDown";
184 case VKEY_VOLUME_UP:
185 return "VolumeUp";
186 default:
187 return 0;
188 }
189 }
190
setKeyIdentifierFromWindowsKeyCode()191 void WebKeyboardEvent::setKeyIdentifierFromWindowsKeyCode()
192 {
193 const char* id = staticKeyIdentifiers(windowsKeyCode);
194 if (id) {
195 strncpy(keyIdentifier, id, sizeof(keyIdentifier) - 1);
196 keyIdentifier[sizeof(keyIdentifier) - 1] = '\0';
197 } else
198 snprintf(keyIdentifier, sizeof(keyIdentifier), "U+%04X", toupper(windowsKeyCode));
199 }
200
201 // static
windowsKeyCodeWithoutLocation(int keycode)202 int WebKeyboardEvent::windowsKeyCodeWithoutLocation(int keycode)
203 {
204 switch (keycode) {
205 case VK_LCONTROL:
206 case VK_RCONTROL:
207 return VK_CONTROL;
208 case VK_LSHIFT:
209 case VK_RSHIFT:
210 return VK_SHIFT;
211 case VK_LMENU:
212 case VK_RMENU:
213 return VK_MENU;
214 default:
215 return keycode;
216 }
217 }
218
219 // static
locationModifiersFromWindowsKeyCode(int keycode)220 int WebKeyboardEvent::locationModifiersFromWindowsKeyCode(int keycode)
221 {
222 switch (keycode) {
223 case VK_LCONTROL:
224 case VK_LSHIFT:
225 case VK_LMENU:
226 case VK_LWIN:
227 return IsLeft;
228 case VK_RCONTROL:
229 case VK_RSHIFT:
230 case VK_RMENU:
231 case VK_RWIN:
232 return IsRight;
233 default:
234 return 0;
235 }
236 }
237
238 } // namespace blink
239