OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 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 "remoting/host/event_executor_win.h" |
| 6 |
| 7 #include <windows.h> |
| 8 #include "base/keyboard_codes.h" |
| 9 #include "base/stl_util-inl.h" |
| 10 |
| 11 namespace remoting { |
| 12 |
| 13 // TODO(hclam): Move this method to base. |
| 14 // TODO(hclam): Using values look ugly, change it to something else. |
| 15 static base::KeyboardCode WindowsKeyCodeForPosixKeyCode(int keycode) { |
| 16 switch (keycode) { |
| 17 case 0x08: |
| 18 return base::VKEY_BACK; |
| 19 case 0x09: |
| 20 return base::VKEY_TAB; |
| 21 case 0x0C: |
| 22 return base::VKEY_CLEAR; |
| 23 case 0x0D: |
| 24 return base::VKEY_RETURN; |
| 25 case 0x10: |
| 26 return base::VKEY_SHIFT; |
| 27 case 0x11: |
| 28 return base::VKEY_CONTROL; |
| 29 case 0x12: |
| 30 return base::VKEY_MENU; |
| 31 case 0x13: |
| 32 return base::VKEY_PAUSE; |
| 33 case 0x14: |
| 34 return base::VKEY_CAPITAL; |
| 35 case 0x15: |
| 36 return base::VKEY_KANA; |
| 37 case 0x17: |
| 38 return base::VKEY_JUNJA; |
| 39 case 0x18: |
| 40 return base::VKEY_FINAL; |
| 41 case 0x19: |
| 42 return base::VKEY_KANJI; |
| 43 case 0x1B: |
| 44 return base::VKEY_ESCAPE; |
| 45 case 0x1C: |
| 46 return base::VKEY_CONVERT; |
| 47 case 0x1D: |
| 48 return base::VKEY_NONCONVERT; |
| 49 case 0x1E: |
| 50 return base::VKEY_ACCEPT; |
| 51 case 0x1F: |
| 52 return base::VKEY_MODECHANGE; |
| 53 case 0x20: |
| 54 return base::VKEY_SPACE; |
| 55 case 0x21: |
| 56 return base::VKEY_PRIOR; |
| 57 case 0x22: |
| 58 return base::VKEY_NEXT; |
| 59 case 0x23: |
| 60 return base::VKEY_END; |
| 61 case 0x24: |
| 62 return base::VKEY_HOME; |
| 63 case 0x25: |
| 64 return base::VKEY_LEFT; |
| 65 case 0x26: |
| 66 return base::VKEY_UP; |
| 67 case 0x27: |
| 68 return base::VKEY_RIGHT; |
| 69 case 0x28: |
| 70 return base::VKEY_DOWN; |
| 71 case 0x29: |
| 72 return base::VKEY_SELECT; |
| 73 case 0x2A: |
| 74 return base::VKEY_PRINT; |
| 75 case 0x2B: |
| 76 return base::VKEY_EXECUTE; |
| 77 case 0x2C: |
| 78 return base::VKEY_SNAPSHOT; |
| 79 case 0x2D: |
| 80 return base::VKEY_INSERT; |
| 81 case 0x2E: |
| 82 return base::VKEY_DELETE; |
| 83 case 0x2F: |
| 84 return base::VKEY_HELP; |
| 85 case 0x30: |
| 86 return base::VKEY_0; |
| 87 case 0x31: |
| 88 return base::VKEY_1; |
| 89 case 0x32: |
| 90 return base::VKEY_2; |
| 91 case 0x33: |
| 92 return base::VKEY_3; |
| 93 case 0x34: |
| 94 return base::VKEY_4; |
| 95 case 0x35: |
| 96 return base::VKEY_5; |
| 97 case 0x36: |
| 98 return base::VKEY_6; |
| 99 case 0x37: |
| 100 return base::VKEY_7; |
| 101 case 0x38: |
| 102 return base::VKEY_8; |
| 103 case 0x39: |
| 104 return base::VKEY_9; |
| 105 case 0x41: |
| 106 return base::VKEY_A; |
| 107 case 0x42: |
| 108 return base::VKEY_B; |
| 109 case 0x43: |
| 110 return base::VKEY_C; |
| 111 case 0x44: |
| 112 return base::VKEY_D; |
| 113 case 0x45: |
| 114 return base::VKEY_E; |
| 115 case 0x46: |
| 116 return base::VKEY_F; |
| 117 case 0x47: |
| 118 return base::VKEY_G; |
| 119 case 0x48: |
| 120 return base::VKEY_H; |
| 121 case 0x49: |
| 122 return base::VKEY_I; |
| 123 case 0x4A: |
| 124 return base::VKEY_J; |
| 125 case 0x4B: |
| 126 return base::VKEY_K; |
| 127 case 0x4C: |
| 128 return base::VKEY_L; |
| 129 case 0x4D: |
| 130 return base::VKEY_M; |
| 131 case 0x4E: |
| 132 return base::VKEY_N; |
| 133 case 0x4F: |
| 134 return base::VKEY_O; |
| 135 case 0x50: |
| 136 return base::VKEY_P; |
| 137 case 0x51: |
| 138 return base::VKEY_Q; |
| 139 case 0x52: |
| 140 return base::VKEY_R; |
| 141 case 0x53: |
| 142 return base::VKEY_S; |
| 143 case 0x54: |
| 144 return base::VKEY_T; |
| 145 case 0x55: |
| 146 return base::VKEY_U; |
| 147 case 0x56: |
| 148 return base::VKEY_V; |
| 149 case 0x57: |
| 150 return base::VKEY_W; |
| 151 case 0x58: |
| 152 return base::VKEY_X; |
| 153 case 0x59: |
| 154 return base::VKEY_Y; |
| 155 case 0x5A: |
| 156 return base::VKEY_Z; |
| 157 case 0x5B: |
| 158 return base::VKEY_LWIN; |
| 159 case 0x5C: |
| 160 return base::VKEY_RWIN; |
| 161 case 0x5D: |
| 162 return base::VKEY_APPS; |
| 163 case 0x5F: |
| 164 return base::VKEY_SLEEP; |
| 165 case 0x60: |
| 166 return base::VKEY_NUMPAD0; |
| 167 case 0x61: |
| 168 return base::VKEY_NUMPAD1; |
| 169 case 0x62: |
| 170 return base::VKEY_NUMPAD2; |
| 171 case 0x63: |
| 172 return base::VKEY_NUMPAD3; |
| 173 case 0x64: |
| 174 return base::VKEY_NUMPAD4; |
| 175 case 0x65: |
| 176 return base::VKEY_NUMPAD5; |
| 177 case 0x66: |
| 178 return base::VKEY_NUMPAD6; |
| 179 case 0x67: |
| 180 return base::VKEY_NUMPAD7; |
| 181 case 0x68: |
| 182 return base::VKEY_NUMPAD8; |
| 183 case 0x69: |
| 184 return base::VKEY_NUMPAD9; |
| 185 case 0x6A: |
| 186 return base::VKEY_MULTIPLY; |
| 187 case 0x6B: |
| 188 return base::VKEY_ADD; |
| 189 case 0x6C: |
| 190 return base::VKEY_SEPARATOR; |
| 191 case 0x6D: |
| 192 return base::VKEY_SUBTRACT; |
| 193 case 0x6E: |
| 194 return base::VKEY_DECIMAL; |
| 195 case 0x6F: |
| 196 return base::VKEY_DIVIDE; |
| 197 case 0x70: |
| 198 return base::VKEY_F1; |
| 199 case 0x71: |
| 200 return base::VKEY_F2; |
| 201 case 0x72: |
| 202 return base::VKEY_F3; |
| 203 case 0x73: |
| 204 return base::VKEY_F4; |
| 205 case 0x74: |
| 206 return base::VKEY_F5; |
| 207 case 0x75: |
| 208 return base::VKEY_F6; |
| 209 case 0x76: |
| 210 return base::VKEY_F7; |
| 211 case 0x77: |
| 212 return base::VKEY_F8; |
| 213 case 0x78: |
| 214 return base::VKEY_F9; |
| 215 case 0x79: |
| 216 return base::VKEY_F10; |
| 217 case 0x7A: |
| 218 return base::VKEY_F11; |
| 219 case 0x7B: |
| 220 return base::VKEY_F12; |
| 221 case 0x7C: |
| 222 return base::VKEY_F13; |
| 223 case 0x7D: |
| 224 return base::VKEY_F14; |
| 225 case 0x7E: |
| 226 return base::VKEY_F15; |
| 227 case 0x7F: |
| 228 return base::VKEY_F16; |
| 229 case 0x80: |
| 230 return base::VKEY_F17; |
| 231 case 0x81: |
| 232 return base::VKEY_F18; |
| 233 case 0x82: |
| 234 return base::VKEY_F19; |
| 235 case 0x83: |
| 236 return base::VKEY_F20; |
| 237 case 0x84: |
| 238 return base::VKEY_F21; |
| 239 case 0x85: |
| 240 return base::VKEY_F22; |
| 241 case 0x86: |
| 242 return base::VKEY_F23; |
| 243 case 0x87: |
| 244 return base::VKEY_F24; |
| 245 case 0x90: |
| 246 return base::VKEY_NUMLOCK; |
| 247 case 0x91: |
| 248 return base::VKEY_SCROLL; |
| 249 case 0xA0: |
| 250 return base::VKEY_LSHIFT; |
| 251 case 0xA1: |
| 252 return base::VKEY_RSHIFT; |
| 253 case 0xA2: |
| 254 return base::VKEY_LCONTROL; |
| 255 case 0xA3: |
| 256 return base::VKEY_RCONTROL; |
| 257 case 0xA4: |
| 258 return base::VKEY_LMENU; |
| 259 case 0xA5: |
| 260 return base::VKEY_RMENU; |
| 261 case 0xA6: |
| 262 return base::VKEY_BROWSER_BACK; |
| 263 case 0xA7: |
| 264 return base::VKEY_BROWSER_FORWARD; |
| 265 case 0xA8: |
| 266 return base::VKEY_BROWSER_REFRESH; |
| 267 case 0xA9: |
| 268 return base::VKEY_BROWSER_STOP; |
| 269 case 0xAA: |
| 270 return base::VKEY_BROWSER_SEARCH; |
| 271 case 0xAB: |
| 272 return base::VKEY_BROWSER_FAVORITES; |
| 273 case 0xAC: |
| 274 return base::VKEY_BROWSER_HOME; |
| 275 case 0xAD: |
| 276 return base::VKEY_VOLUME_MUTE; |
| 277 case 0xAE: |
| 278 return base::VKEY_VOLUME_DOWN; |
| 279 case 0xAF: |
| 280 return base::VKEY_VOLUME_UP; |
| 281 case 0xB0: |
| 282 return base::VKEY_MEDIA_NEXT_TRACK; |
| 283 case 0xB1: |
| 284 return base::VKEY_MEDIA_PREV_TRACK; |
| 285 case 0xB2: |
| 286 return base::VKEY_MEDIA_STOP; |
| 287 case 0xB3: |
| 288 return base::VKEY_MEDIA_PLAY_PAUSE; |
| 289 case 0xB4: |
| 290 return base::VKEY_MEDIA_LAUNCH_MAIL; |
| 291 case 0xB5: |
| 292 return base::VKEY_MEDIA_LAUNCH_MEDIA_SELECT; |
| 293 case 0xB6: |
| 294 return base::VKEY_MEDIA_LAUNCH_APP1; |
| 295 case 0xB7: |
| 296 return base::VKEY_MEDIA_LAUNCH_APP2; |
| 297 case 0xBA: |
| 298 return base::VKEY_OEM_1; |
| 299 case 0xBB: |
| 300 return base::VKEY_OEM_PLUS; |
| 301 case 0xBC: |
| 302 return base::VKEY_OEM_COMMA; |
| 303 case 0xBD: |
| 304 return base::VKEY_OEM_MINUS; |
| 305 case 0xBE: |
| 306 return base::VKEY_OEM_PERIOD; |
| 307 case 0xBF: |
| 308 return base::VKEY_OEM_2; |
| 309 case 0xC0: |
| 310 return base::VKEY_OEM_3; |
| 311 case 0xDB: |
| 312 return base::VKEY_OEM_4; |
| 313 case 0xDC: |
| 314 return base::VKEY_OEM_5; |
| 315 case 0xDD: |
| 316 return base::VKEY_OEM_6; |
| 317 case 0xDE: |
| 318 return base::VKEY_OEM_7; |
| 319 case 0xDF: |
| 320 return base::VKEY_OEM_8; |
| 321 case 0xE2: |
| 322 return base::VKEY_OEM_102; |
| 323 case 0xE5: |
| 324 return base::VKEY_PROCESSKEY; |
| 325 case 0xE7: |
| 326 return base::VKEY_PACKET; |
| 327 case 0xF6: |
| 328 return base::VKEY_ATTN; |
| 329 case 0xF7: |
| 330 return base::VKEY_CRSEL; |
| 331 case 0xF8: |
| 332 return base::VKEY_EXSEL; |
| 333 case 0xF9: |
| 334 return base::VKEY_EREOF; |
| 335 case 0xFA: |
| 336 return base::VKEY_PLAY; |
| 337 case 0xFB: |
| 338 return base::VKEY_ZOOM; |
| 339 case 0xFC: |
| 340 return base::VKEY_NONAME; |
| 341 case 0xFD: |
| 342 return base::VKEY_PA1; |
| 343 case 0xFE: |
| 344 return base::VKEY_OEM_CLEAR; |
| 345 default: |
| 346 return base::VKEY_UNKNOWN; |
| 347 } |
| 348 } |
| 349 |
| 350 EventExecutorWin::EventExecutorWin() { |
| 351 } |
| 352 |
| 353 EventExecutorWin::~EventExecutorWin() { |
| 354 } |
| 355 |
| 356 void EventExecutorWin::HandleInputEvents(ClientMessageList* messages) { |
| 357 for (size_t i = 0; i < messages->size(); ++i) { |
| 358 chromotocol_pb::ClientMessage* msg = (*messages)[i]; |
| 359 if (msg->has_mouse_set_position_event()) { |
| 360 mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, |
| 361 static_cast<int>((msg->mouse_set_position_event().x() * 65535)), |
| 362 static_cast<int>((msg->mouse_set_position_event().y() * 65535)), |
| 363 0, 0); |
| 364 } else if (msg->has_mouse_move_event()) { |
| 365 mouse_event(MOUSEEVENTF_MOVE, |
| 366 msg->mouse_move_event().offset_x(), |
| 367 msg->mouse_move_event().offset_y(), 0, 0); |
| 368 } else if (msg->has_mouse_wheel_event()) { |
| 369 // TODO(hclam): Handle wheel events. |
| 370 } else if (msg->has_mouse_down_event()) { |
| 371 if (msg->mouse_down_event().button() == |
| 372 chromotocol_pb::MouseDownEvent::LEFT) { |
| 373 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); |
| 374 } else if (msg->mouse_down_event().button() == |
| 375 chromotocol_pb::MouseDownEvent::RIGHT) { |
| 376 mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0); |
| 377 } else { |
| 378 // TODO(hclam): Handle other buttons. |
| 379 } |
| 380 } else if (msg->has_mouse_up_event()) { |
| 381 if (msg->mouse_up_event().button() == |
| 382 chromotocol_pb::MouseUpEvent::LEFT) { |
| 383 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); |
| 384 } else if (msg->mouse_up_event().button() == |
| 385 chromotocol_pb::MouseUpEvent::RIGHT) { |
| 386 mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); |
| 387 } else { |
| 388 // TODO(hclam): Handle other buttons. |
| 389 } |
| 390 } else if (msg->has_key_event()) { |
| 391 base::KeyboardCode key_code = |
| 392 WindowsKeyCodeForPosixKeyCode(msg->key_event().key()); |
| 393 if (key_code != base::VKEY_UNKNOWN) { |
| 394 keybd_event(key_code, MapVirtualKey(key_code, 0), |
| 395 msg->key_event().pressed() ? 0 : KEYEVENTF_KEYUP, |
| 396 NULL); |
| 397 } |
| 398 } |
| 399 } |
| 400 // We simply delete all messages. |
| 401 // TODO(hclam): Delete messages processed. |
| 402 STLDeleteElements<ClientMessageList>(messages); |
| 403 } |
| 404 |
| 405 } // namespace remoting |
OLD | NEW |