Chromium Code Reviews| Index: remoting/host/input_injector_x11.cc |
| diff --git a/remoting/host/input_injector_x11.cc b/remoting/host/input_injector_x11.cc |
| index 3c9d0a88fe17565532968acb8a2f348e25f0d80d..2e4bdc6880e74f2795edbed05a7ab8e5cf8d0fe5 100644 |
| --- a/remoting/host/input_injector_x11.cc |
| +++ b/remoting/host/input_injector_x11.cc |
| @@ -19,12 +19,15 @@ |
| #include "base/compiler_specific.h" |
| #include "base/location.h" |
| #include "base/macros.h" |
| +#include "base/memory/ptr_util.h" |
| #include "base/single_thread_task_runner.h" |
| #include "base/strings/utf_string_conversion_utils.h" |
| #include "build/build_config.h" |
| #include "remoting/base/logging.h" |
| #include "remoting/host/clipboard.h" |
| #include "remoting/host/linux/unicode_to_keysym.h" |
| +#include "remoting/host/linux/x11_character_injector.h" |
| +#include "remoting/host/linux/x11_keyboard_impl.h" |
| #include "remoting/host/linux/x11_util.h" |
| #include "remoting/proto/internal.pb.h" |
| #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" |
| @@ -45,56 +48,6 @@ using protocol::TextEvent; |
| using protocol::MouseEvent; |
| using protocol::TouchEvent; |
| -bool FindKeycodeForKeySym(Display* display, |
| - KeySym key_sym, |
| - uint32_t* keycode, |
| - uint32_t* modifiers) { |
| - *keycode = XKeysymToKeycode(display, key_sym); |
| - |
| - const uint32_t kModifiersToTry[] = { |
| - 0, |
| - ShiftMask, |
| - Mod2Mask, |
| - Mod3Mask, |
| - Mod4Mask, |
| - ShiftMask | Mod2Mask, |
| - ShiftMask | Mod3Mask, |
| - ShiftMask | Mod4Mask, |
| - }; |
| - |
| - // TODO(sergeyu): Is there a better way to find modifiers state? |
| - for (size_t i = 0; i < arraysize(kModifiersToTry); ++i) { |
| - unsigned long key_sym_with_mods; |
| - if (XkbLookupKeySym(display, *keycode, kModifiersToTry[i], nullptr, |
| - &key_sym_with_mods) && |
| - key_sym_with_mods == key_sym) { |
| - *modifiers = kModifiersToTry[i]; |
| - return true; |
| - } |
| - } |
| - |
| - return false; |
| -} |
| - |
| -// Finds a keycode and set of modifiers that generate character with the |
| -// specified |code_point|. |
| -bool FindKeycodeForUnicode(Display* display, |
| - uint32_t code_point, |
| - uint32_t* keycode, |
| - uint32_t* modifiers) { |
| - std::vector<uint32_t> keysyms; |
| - GetKeySymsForUnicode(code_point, &keysyms); |
| - |
| - for (std::vector<uint32_t>::iterator it = keysyms.begin(); |
| - it != keysyms.end(); ++it) { |
| - if (FindKeycodeForKeySym(display, *it, keycode, modifiers)) { |
| - return true; |
| - } |
| - } |
| - |
| - return false; |
| -} |
| - |
| bool IsModifierKey(ui::DomCode dom_code) { |
| return dom_code == ui::DomCode::CONTROL_LEFT || |
| dom_code == ui::DomCode::SHIFT_LEFT || |
| @@ -199,6 +152,8 @@ class InputInjectorX11 : public InputInjector { |
| std::unique_ptr<Clipboard> clipboard_; |
| + std::unique_ptr<X11CharacterInjector> character_injector_; |
| + |
| bool saved_auto_repeat_enabled_; |
| DISALLOW_COPY_AND_ASSIGN(Core); |
| @@ -364,21 +319,8 @@ void InputInjectorX11::Core::InjectTextEvent(const TextEvent& event) { |
| text.c_str(), text.size(), &index, &code_point)) { |
| continue; |
| } |
| - |
| - uint32_t keycode; |
| - uint32_t modifiers; |
| - if (!FindKeycodeForUnicode(display_, code_point, &keycode, &modifiers)) |
| - continue; |
| - |
| - XkbLockModifiers(display_, XkbUseCoreKbd, modifiers, modifiers); |
| - |
| - XTestFakeKeyEvent(display_, keycode, True, CurrentTime); |
| - XTestFakeKeyEvent(display_, keycode, False, CurrentTime); |
| - |
| - XkbLockModifiers(display_, XkbUseCoreKbd, modifiers, 0); |
| + character_injector_->Inject(code_point); |
| } |
| - |
| - XFlush(display_); |
| } |
| InputInjectorX11::Core::~Core() { |
| @@ -634,6 +576,9 @@ void InputInjectorX11::Core::Start( |
| InitMouseButtonMap(); |
| clipboard_->Start(std::move(client_clipboard)); |
| + |
| + character_injector_.reset( |
| + new X11CharacterInjector(base::MakeUnique<X11KeyboardImpl>(display_))); |
|
Yuwei
2016/09/26 17:57:19
I think passing a unique_ptr<X11Keyboard> can avoi
Sergey Ulanov
2016/09/27 18:40:48
I agree.
|
| } |
| void InputInjectorX11::Core::Stop() { |
| @@ -643,6 +588,7 @@ void InputInjectorX11::Core::Stop() { |
| } |
| clipboard_.reset(); |
| + character_injector_.reset(); |
| } |
| } // namespace |