OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/host/input_injector.h" | 5 #include "remoting/host/input_injector.h" |
6 | 6 |
7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
8 #include <X11/extensions/XTest.h> | 8 #include <X11/extensions/XTest.h> |
9 #include <X11/extensions/XInput.h> | 9 #include <X11/extensions/XInput.h> |
10 | 10 |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 } | 366 } |
367 | 367 |
368 void InputInjectorLinux::Core::InitMouseButtonMap() { | 368 void InputInjectorLinux::Core::InitMouseButtonMap() { |
369 // TODO(rmsousa): Run this on global/device mapping change events. | 369 // TODO(rmsousa): Run this on global/device mapping change events. |
370 | 370 |
371 // Do not touch global pointer mapping, since this may affect the local user. | 371 // Do not touch global pointer mapping, since this may affect the local user. |
372 // Instead, try to work around it by reversing the mapping. | 372 // Instead, try to work around it by reversing the mapping. |
373 // Note that if a user has a global mapping that completely disables a button | 373 // Note that if a user has a global mapping that completely disables a button |
374 // (by assigning 0 to it), we won't be able to inject it. | 374 // (by assigning 0 to it), we won't be able to inject it. |
375 int num_buttons = XGetPointerMapping(display_, NULL, 0); | 375 int num_buttons = XGetPointerMapping(display_, NULL, 0); |
376 scoped_array<unsigned char> pointer_mapping(new unsigned char[num_buttons]); | 376 scoped_ptr<unsigned char[]> pointer_mapping(new unsigned char[num_buttons]); |
377 num_buttons = XGetPointerMapping(display_, pointer_mapping.get(), | 377 num_buttons = XGetPointerMapping(display_, pointer_mapping.get(), |
378 num_buttons); | 378 num_buttons); |
379 for (int i = 0; i < kNumPointerButtons; i++) { | 379 for (int i = 0; i < kNumPointerButtons; i++) { |
380 pointer_button_map_[i] = -1; | 380 pointer_button_map_[i] = -1; |
381 } | 381 } |
382 for (int i = 0; i < num_buttons; i++) { | 382 for (int i = 0; i < num_buttons; i++) { |
383 // Reverse the mapping. | 383 // Reverse the mapping. |
384 if (pointer_mapping[i] > 0 && pointer_mapping[i] <= kNumPointerButtons) | 384 if (pointer_mapping[i] > 0 && pointer_mapping[i] <= kNumPointerButtons) |
385 pointer_button_map_[pointer_mapping[i] - 1] = i + 1; | 385 pointer_button_map_[pointer_mapping[i] - 1] = i + 1; |
386 } | 386 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 return; | 422 return; |
423 } | 423 } |
424 | 424 |
425 XDevice* device = XOpenDevice(display_, device_id); | 425 XDevice* device = XOpenDevice(display_, device_id); |
426 if (!device) { | 426 if (!device) { |
427 LOG(ERROR) << "Cannot open XTest device."; | 427 LOG(ERROR) << "Cannot open XTest device."; |
428 return; | 428 return; |
429 } | 429 } |
430 | 430 |
431 int num_device_buttons = XGetDeviceButtonMapping(display_, device, NULL, 0); | 431 int num_device_buttons = XGetDeviceButtonMapping(display_, device, NULL, 0); |
432 scoped_array<unsigned char> button_mapping(new unsigned char[num_buttons]); | 432 scoped_ptr<unsigned char[]> button_mapping(new unsigned char[num_buttons]); |
433 for (int i = 0; i < num_device_buttons; i++) { | 433 for (int i = 0; i < num_device_buttons; i++) { |
434 button_mapping[i] = i + 1; | 434 button_mapping[i] = i + 1; |
435 } | 435 } |
436 error = XSetDeviceButtonMapping(display_, device, button_mapping.get(), | 436 error = XSetDeviceButtonMapping(display_, device, button_mapping.get(), |
437 num_device_buttons); | 437 num_device_buttons); |
438 if (error != Success) | 438 if (error != Success) |
439 LOG(ERROR) << "Failed to set XTest device button mapping: " << error; | 439 LOG(ERROR) << "Failed to set XTest device button mapping: " << error; |
440 | 440 |
441 XCloseDevice(display_, device); | 441 XCloseDevice(display_, device); |
442 } | 442 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | 498 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
499 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { | 499 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { |
500 scoped_ptr<InputInjectorLinux> injector( | 500 scoped_ptr<InputInjectorLinux> injector( |
501 new InputInjectorLinux(main_task_runner)); | 501 new InputInjectorLinux(main_task_runner)); |
502 if (!injector->Init()) | 502 if (!injector->Init()) |
503 return scoped_ptr<InputInjector>(NULL); | 503 return scoped_ptr<InputInjector>(NULL); |
504 return injector.PassAs<InputInjector>(); | 504 return injector.PassAs<InputInjector>(); |
505 } | 505 } |
506 | 506 |
507 } // namespace remoting | 507 } // namespace remoting |
OLD | NEW |