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 34 #include <ctype.h> 35 #include "core/platform/chromium/KeyboardCodes.h" 36 #include "wtf/Assertions.h" 37 #include "wtf/StringExtras.h" 38 39 using namespace WebCore; 40 41 namespace WebKit { 42 43 struct SameSizeAsWebInputEvent { 44 int inputData[5]; 45 }; 46 47 struct SameSizeAsWebKeyboardEvent : public SameSizeAsWebInputEvent { 48 int keyboardData[12]; 49 }; 50 51 struct SameSizeAsWebMouseEvent : public SameSizeAsWebInputEvent { 52 int mouseData[10]; 53 }; 54 55 struct SameSizeAsWebMouseWheelEvent : public SameSizeAsWebMouseEvent { 56 int mousewheelData[10]; 57 }; 58 59 struct SameSizeAsWebGestureEvent : public SameSizeAsWebInputEvent { 60 int gestureData[9]; 61 }; 62 63 struct SameSizeAsWebTouchEvent : public SameSizeAsWebInputEvent { 64 WebTouchPoint touchPoints[3 * WebTouchEvent::touchesLengthCap]; 65 int touchData[3]; 66 }; 67 68 COMPILE_ASSERT(sizeof(WebInputEvent) == sizeof(SameSizeAsWebInputEvent), WebInputEvent_has_gaps); 69 COMPILE_ASSERT(sizeof(WebKeyboardEvent) == sizeof(SameSizeAsWebKeyboardEvent), WebKeyboardEvent_has_gaps); 70 COMPILE_ASSERT(sizeof(WebMouseEvent) == sizeof(SameSizeAsWebMouseEvent), WebMouseEvent_has_gaps); 71 COMPILE_ASSERT(sizeof(WebMouseWheelEvent) == sizeof(SameSizeAsWebMouseWheelEvent), WebMouseWheelEvent_has_gaps); 72 COMPILE_ASSERT(sizeof(WebGestureEvent) == sizeof(SameSizeAsWebGestureEvent), WebGestureEvent_has_gaps); 73 COMPILE_ASSERT(sizeof(WebTouchEvent) == sizeof(SameSizeAsWebTouchEvent), WebTouchEvent_has_gaps); 74 75 static const char* staticKeyIdentifiers(unsigned short keyCode) 76 { 77 switch (keyCode) { 78 case VKEY_MENU: 79 return "Alt"; 80 case VKEY_CONTROL: 81 return "Control"; 82 case VKEY_SHIFT: 83 return "Shift"; 84 case VKEY_CAPITAL: 85 return "CapsLock"; 86 case VKEY_LWIN: 87 case VKEY_RWIN: 88 return "Win"; 89 case VKEY_CLEAR: 90 return "Clear"; 91 case VKEY_DOWN: 92 return "Down"; 93 case VKEY_END: 94 return "End"; 95 case VKEY_RETURN: 96 return "Enter"; 97 case VKEY_EXECUTE: 98 return "Execute"; 99 case VKEY_F1: 100 return "F1"; 101 case VKEY_F2: 102 return "F2"; 103 case VKEY_F3: 104 return "F3"; 105 case VKEY_F4: 106 return "F4"; 107 case VKEY_F5: 108 return "F5"; 109 case VKEY_F6: 110 return "F6"; 111 case VKEY_F7: 112 return "F7"; 113 case VKEY_F8: 114 return "F8"; 115 case VKEY_F9: 116 return "F9"; 117 case VKEY_F10: 118 return "F10"; 119 case VKEY_F11: 120 return "F11"; 121 case VKEY_F12: 122 return "F12"; 123 case VKEY_F13: 124 return "F13"; 125 case VKEY_F14: 126 return "F14"; 127 case VKEY_F15: 128 return "F15"; 129 case VKEY_F16: 130 return "F16"; 131 case VKEY_F17: 132 return "F17"; 133 case VKEY_F18: 134 return "F18"; 135 case VKEY_F19: 136 return "F19"; 137 case VKEY_F20: 138 return "F20"; 139 case VKEY_F21: 140 return "F21"; 141 case VKEY_F22: 142 return "F22"; 143 case VKEY_F23: 144 return "F23"; 145 case VKEY_F24: 146 return "F24"; 147 case VKEY_HELP: 148 return "Help"; 149 case VKEY_HOME: 150 return "Home"; 151 case VKEY_INSERT: 152 return "Insert"; 153 case VKEY_LEFT: 154 return "Left"; 155 case VKEY_NEXT: 156 return "PageDown"; 157 case VKEY_PRIOR: 158 return "PageUp"; 159 case VKEY_PAUSE: 160 return "Pause"; 161 case VKEY_SNAPSHOT: 162 return "PrintScreen"; 163 case VKEY_RIGHT: 164 return "Right"; 165 case VKEY_SCROLL: 166 return "Scroll"; 167 case VKEY_SELECT: 168 return "Select"; 169 case VKEY_UP: 170 return "Up"; 171 case VKEY_DELETE: 172 return "U+007F"; // Standard says that DEL becomes U+007F. 173 case VKEY_MEDIA_NEXT_TRACK: 174 return "MediaNextTrack"; 175 case VKEY_MEDIA_PREV_TRACK: 176 return "MediaPreviousTrack"; 177 case VKEY_MEDIA_STOP: 178 return "MediaStop"; 179 case VKEY_MEDIA_PLAY_PAUSE: 180 return "MediaPlayPause"; 181 case VKEY_VOLUME_MUTE: 182 return "VolumeMute"; 183 case VKEY_VOLUME_DOWN: 184 return "VolumeDown"; 185 case VKEY_VOLUME_UP: 186 return "VolumeUp"; 187 default: 188 return 0; 189 } 190 } 191 192 void WebKeyboardEvent::setKeyIdentifierFromWindowsKeyCode() 193 { 194 const char* id = staticKeyIdentifiers(windowsKeyCode); 195 if (id) { 196 strncpy(keyIdentifier, id, sizeof(keyIdentifier) - 1); 197 keyIdentifier[sizeof(keyIdentifier) - 1] = '\0'; 198 } else 199 snprintf(keyIdentifier, sizeof(keyIdentifier), "U+%04X", toupper(windowsKeyCode)); 200 } 201 202 // static 203 int WebKeyboardEvent::windowsKeyCodeWithoutLocation(int keycode) 204 { 205 switch (keycode) { 206 case VK_LCONTROL: 207 case VK_RCONTROL: 208 return VK_CONTROL; 209 case VK_LSHIFT: 210 case VK_RSHIFT: 211 return VK_SHIFT; 212 case VK_LMENU: 213 case VK_RMENU: 214 return VK_MENU; 215 default: 216 return keycode; 217 } 218 } 219 220 // static 221 int WebKeyboardEvent::locationModifiersFromWindowsKeyCode(int keycode) 222 { 223 switch (keycode) { 224 case VK_LCONTROL: 225 case VK_LSHIFT: 226 case VK_LMENU: 227 case VK_LWIN: 228 return IsLeft; 229 case VK_RCONTROL: 230 case VK_RSHIFT: 231 case VK_RMENU: 232 case VK_RWIN: 233 return IsRight; 234 default: 235 return 0; 236 } 237 } 238 239 } // namespace WebKit 240