| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "ui/base/ime/input_method_auralinux.h" | 5 #include "ui/base/ime/input_method_auralinux.h" |
| 6 | 6 |
| 7 #include "base/environment.h" | 7 #include "base/environment.h" |
| 8 #include "ui/base/ime/linux/linux_input_method_context_factory.h" | 8 #include "ui/base/ime/linux/linux_input_method_context_factory.h" |
| 9 #include "ui/base/ime/text_input_client.h" | 9 #include "ui/base/ime/text_input_client.h" |
| 10 #include "ui/events/event.h" | 10 #include "ui/events/event.h" |
| 11 | 11 |
| 12 namespace ui { | 12 namespace ui { |
| 13 | 13 |
| 14 InputMethodAuraLinux::InputMethodAuraLinux( | 14 InputMethodAuraLinux::InputMethodAuraLinux( |
| 15 internal::InputMethodDelegate* delegate) { | 15 internal::InputMethodDelegate* delegate) { |
| 16 SetDelegate(delegate); | 16 SetDelegate(delegate); |
| 17 } | 17 } |
| 18 | 18 |
| 19 InputMethodAuraLinux::~InputMethodAuraLinux() {} | 19 InputMethodAuraLinux::~InputMethodAuraLinux() {} |
| 20 | 20 |
| 21 // static | |
| 22 void InputMethodAuraLinux::Initialize() { | |
| 23 #if (USE_X11) | |
| 24 // Force a IBus IM context to run in synchronous mode. | |
| 25 // | |
| 26 // Background: IBus IM context runs by default in asynchronous mode. In | |
| 27 // this mode, gtk_im_context_filter_keypress() consumes all the key events | |
| 28 // and returns true while asynchronously sending the event to an underlying | |
| 29 // IME implementation. When the event has not actually been consumed by | |
| 30 // the underlying IME implementation, the context pushes the event back to | |
| 31 // the GDK event queue marking the event as already handled by the IBus IM | |
| 32 // context. | |
| 33 // | |
| 34 // The problem here is that those pushed-back GDK events are never handled | |
| 35 // when base::MessagePumpX11 is used, which only handles X events. So, we | |
| 36 // make a IBus IM context run in synchronous mode by setting an environment | |
| 37 // variable. This is only the interface to change the mode. | |
| 38 // | |
| 39 // Another possible solution is to use GDK event loop instead of X event | |
| 40 // loop. | |
| 41 // | |
| 42 // Since there is no reentrant version of setenv(3C), it's a caller's duty | |
| 43 // to avoid race conditions. This function should be called in the main | |
| 44 // thread on a very early stage, and supposed to be called from | |
| 45 // ui::InitializeInputMethod(). | |
| 46 scoped_ptr<base::Environment> env(base::Environment::Create()); | |
| 47 env->SetVar("IBUS_ENABLE_SYNC_MODE", "1"); | |
| 48 #endif | |
| 49 } | |
| 50 | |
| 51 // Overriden from InputMethod. | 21 // Overriden from InputMethod. |
| 52 | 22 |
| 53 void InputMethodAuraLinux::Init(bool focused) { | 23 void InputMethodAuraLinux::Init(bool focused) { |
| 54 CHECK(LinuxInputMethodContextFactory::instance()) | 24 CHECK(LinuxInputMethodContextFactory::instance()) |
| 55 << "This failure was likely caused because " | 25 << "This failure was likely caused because " |
| 56 << "ui::InitializeInputMethod(ForTesting) was not called " | 26 << "ui::InitializeInputMethod(ForTesting) was not called " |
| 57 << "before instantiating this class."; | 27 << "before instantiating this class."; |
| 58 input_method_context_ = | 28 input_method_context_ = |
| 59 LinuxInputMethodContextFactory::instance()->CreateInputMethodContext( | 29 LinuxInputMethodContextFactory::instance()->CreateInputMethodContext( |
| 60 this); | 30 this); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 TextInputClient* focused_before, | 146 TextInputClient* focused_before, |
| 177 TextInputClient* focused) { | 147 TextInputClient* focused) { |
| 178 input_method_context_->Reset(); | 148 input_method_context_->Reset(); |
| 179 input_method_context_->OnTextInputTypeChanged( | 149 input_method_context_->OnTextInputTypeChanged( |
| 180 focused ? focused->GetTextInputType() : TEXT_INPUT_TYPE_NONE); | 150 focused ? focused->GetTextInputType() : TEXT_INPUT_TYPE_NONE); |
| 181 | 151 |
| 182 InputMethodBase::OnDidChangeFocusedClient(focused_before, focused); | 152 InputMethodBase::OnDidChangeFocusedClient(focused_before, focused); |
| 183 } | 153 } |
| 184 | 154 |
| 185 } // namespace ui | 155 } // namespace ui |
| OLD | NEW |