Index: chrome/browser/chromeos/input_method/ibus_engine_controller.cc |
diff --git a/chrome/browser/chromeos/input_method/ibus_engine_controller.cc b/chrome/browser/chromeos/input_method/ibus_engine_controller.cc |
index 9cc8edbedb240e17b75931b9136d167e02c228c7..6aaf2c9f10acdacc0fb76179e1358cfd8b546e20 100644 |
--- a/chrome/browser/chromeos/input_method/ibus_engine_controller.cc |
+++ b/chrome/browser/chromeos/input_method/ibus_engine_controller.cc |
@@ -129,7 +129,11 @@ class IBusEngineControllerImpl : public IBusEngineController { |
// Check the IBus connection status. |
bool result = true; |
if (ibus_bus_is_connected(ibus_)) { |
- LOG(INFO) << "ibus_bus_is_connected(). IBus connection is ready."; |
+ if (!g_factory_) { |
+ g_factory_ = ibus_factory_new(ibus_bus_get_connection(ibus_)); |
+ } |
+ |
+ VLOG(1) << "ibus_bus_is_connected(). IBus connection is ready."; |
result = MaybeCreateComponent(); |
} |
@@ -620,6 +624,10 @@ class IBusEngineControllerImpl : public IBusEngineController { |
g_return_if_fail(user_data); |
IBusEngineControllerImpl* self |
= static_cast<IBusEngineControllerImpl*>(user_data); |
+ if (!g_factory_) { |
+ g_factory_ = ibus_factory_new(ibus_bus_get_connection(bus)); |
+ } |
+ |
if (!self->MaybeCreateComponent()) { |
LOG(ERROR) << "MaybeCreateComponent() failed"; |
return; |
@@ -629,10 +637,11 @@ class IBusEngineControllerImpl : public IBusEngineController { |
// Handles "disconnected" signal from ibus-daemon. |
static void IBusBusDisconnectedCallback(IBusBus* bus, gpointer user_data) { |
LOG(WARNING) << "IBus connection is terminated."; |
+ g_factory_ = NULL; |
} |
bool MaybeCreateComponent() { |
- if (!ibus_ || !ibus_bus_is_connected(ibus_)) { |
+ if (!ibus_ || !ibus_bus_is_connected(ibus_) || !g_factory_) { |
return false; |
} |
@@ -655,8 +664,7 @@ class IBusEngineControllerImpl : public IBusEngineController { |
"", |
layout_.c_str())); |
- IBusFactory* factory = ibus_factory_new(ibus_bus_get_connection(ibus_)); |
- ibus_factory_add_engine(factory, engine_id_.c_str(), |
+ ibus_factory_add_engine(g_factory_, engine_id_.c_str(), |
IBUS_TYPE_CHROMEOS_ENGINE); |
ibus_bus_register_component(ibus_, component); |
g_object_unref(component); |
@@ -871,11 +879,14 @@ class IBusEngineControllerImpl : public IBusEngineController { |
std::set<IBusChromeOSEngine*> engine_instances_; |
static ConnectionMap* g_connections_; |
+ static IBusFactory* g_factory_; |
}; |
IBusEngineControllerImpl::ConnectionMap* |
IBusEngineControllerImpl::g_connections_ = NULL; |
+IBusFactory* IBusEngineControllerImpl::g_factory_ = NULL; |
+ |
void ibus_chromeos_engine_class_init(IBusChromeOSEngineClass *klass) { |
IBusEngineControllerImpl::InitEngineClass(klass); |
} |