| 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..978e8b6cf9df60f191fd3f40a6e0b8db6f845200 100644
|
| --- a/remoting/host/input_injector_x11.cc
|
| +++ b/remoting/host/input_injector_x11.cc
|
| @@ -25,6 +25,7 @@
|
| #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_util.h"
|
| #include "remoting/proto/internal.pb.h"
|
| #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
|
| @@ -45,56 +46,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 +150,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 +317,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 +574,8 @@ void InputInjectorX11::Core::Start(
|
| InitMouseButtonMap();
|
|
|
| clipboard_->Start(std::move(client_clipboard));
|
| +
|
| + character_injector_.reset(new X11CharacterInjector(display_));
|
| }
|
|
|
| void InputInjectorX11::Core::Stop() {
|
| @@ -643,6 +585,7 @@ void InputInjectorX11::Core::Stop() {
|
| }
|
|
|
| clipboard_.reset();
|
| + character_injector_.reset();
|
| }
|
|
|
| } // namespace
|
|
|