Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(933)

Unified Diff: chrome/browser/chromeos/input_method/ibus_engine_controller.cc

Issue 10834108: Replace InputMethodEngineIBus. (Closed) Base URL: http://git.chromium.org/chromium/src.git@input_method_engine_ibus
Patch Set: Address comments Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
deleted file mode 100644
index 5fd91e786cca7d5d8793dc08685fb34db944f6d6..0000000000000000000000000000000000000000
--- a/chrome/browser/chromeos/input_method/ibus_engine_controller.cc
+++ /dev/null
@@ -1,974 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/input_method/ibus_engine_controller.h"
-
-#if defined(HAVE_IBUS)
-#include <ibus.h>
-#endif
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "base/logging.h"
-#include "base/stl_util.h"
-
-namespace chromeos {
-namespace input_method {
-
-IBusEngineController::EngineProperty::EngineProperty()
- : sensitive(false), visible(false), type(PROPERTY_TYPE_NORMAL),
- checked(false), modified(0) {
-}
-
-IBusEngineController::EngineProperty::~EngineProperty() {
- STLDeleteContainerPointers(children.begin(), children.end());
-}
-
-#if defined(HAVE_IBUS)
-
-#define IBUS_TYPE_CHROMEOS_ENGINE (ibus_chromeos_engine_get_type())
-#define IBUS_CHROMEOS_ENGINE(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj), IBUS_TYPE_CHROMEOS_ENGINE, \
- IBusChromeOSEngine))
-#define IBUS_CHROMEOS_ENGINE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass), IBUS_TYPE_CHROMEOS_ENGINE, \
- IBusChromeOSEngineClass))
-#define CHROMEOS_IS_EXTENSION_ENGINE(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj), IBUS_TYPE_CHROMEOS_ENGINE))
-#define CHROMEOS_IS_EXTENSION_ENGINE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass), IBUS_TYPE_CHROMEOS_ENGINE))
-#define IBUS_CHROMEOS_ENGINE_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS((obj), IBUS_TYPE_CHROMEOS_ENGINE, \
- IBusChromeOSEngineClass))
-
-class IBusEngineControllerImpl;
-struct IBusChromeOSEngine {
- IBusEngine parent;
- IBusEngineControllerImpl* connection;
- IBusLookupTable* table;
-};
-
-struct IBusChromeOSEngineClass {
- IBusEngineClass parent_class;
-};
-
-G_DEFINE_TYPE(IBusChromeOSEngine, ibus_chromeos_engine, IBUS_TYPE_ENGINE)
-
-const int kDefaultCandidatePageSize = 9;
-
-class IBusEngineControllerImpl : public IBusEngineController {
- public:
- typedef std::map<std::string, IBusEngineControllerImpl*> ConnectionMap;
- explicit IBusEngineControllerImpl(IBusEngineController::Observer* observer)
- : observer_(observer),
- ibus_(NULL),
- active_engine_(NULL),
- preedit_text_(NULL),
- preedit_cursor_(0),
- table_visible_(false),
- cursor_visible_(false),
- vertical_(false),
- page_size_(kDefaultCandidatePageSize),
- cursor_position_(0),
- aux_text_visible_(false),
- active_(false),
- focused_(false) {
- if (!g_connections_) {
- g_connections_ = new ConnectionMap;
- }
- }
-
- ~IBusEngineControllerImpl() {
- for (std::set<IBusChromeOSEngine*>::iterator ix = engine_instances_.begin();
- ix != engine_instances_.end(); ++ix) {
- (*ix)->connection = NULL;
- }
- if (preedit_text_) {
- g_object_unref(preedit_text_);
- preedit_text_ = NULL;
- }
- if (ibus_) {
- DisconnectIBusSignals();
- g_object_unref(ibus_);
- }
- g_connections_->erase(engine_id_);
- ClearProperties();
- DVLOG(1) << "Removing engine: " << engine_id_;
- }
-
- // Initializes the object. Returns true on success.
- bool Init(const char* engine_id, const char* engine_name,
- const char* description, const char* language,
- const char* layout) {
- engine_id_ = engine_id;
- engine_name_ = engine_name;
- description_ = description;
- language_ = language;
- layout_ = layout;
-
- bus_name_ = "org.freedesktop.IBus.";
- bus_name_ += engine_id;
-
- // engine_id_ must be unique.
- if (g_connections_->find(engine_id_) != g_connections_->end()) {
- DVLOG(1) << "ibus engine name already in use: " << engine_id_;
- return false;
- }
-
- // Initialize an IBus bus.
- ibus_init();
- ibus_ = ibus_bus_new();
-
- // Check the IBus connection status.
- if (!ibus_) {
- DVLOG(1) << "ibus_bus_new() failed";
- return false;
- }
-
- (*g_connections_)[engine_id_] = this;
- DVLOG(1) << "Adding engine: " << engine_id_;
-
- // Check the IBus connection status.
- bool result = true;
- if (ibus_bus_is_connected(ibus_)) {
- DVLOG(1) << "ibus_bus_is_connected(). IBus connection is ready.";
- result = MaybeCreateComponent();
- }
-
- // Start listening the gobject signals regardless of the bus connection
- // status.
- ConnectIBusSignals();
- return result;
- }
-
- virtual void SetPreeditText(const char* text, int cursor) {
- if (active_engine_) {
- DVLOG(1) << "SetPreeditText";
- if (preedit_text_) {
- g_object_unref(preedit_text_);
- preedit_text_ = NULL;
- }
- preedit_cursor_ = cursor;
- preedit_text_ = static_cast<IBusText*>(
- g_object_ref_sink(ibus_text_new_from_string(text)));
- ibus_engine_update_preedit_text(IBUS_ENGINE(active_engine_),
- preedit_text_,
- preedit_cursor_, TRUE);
- }
- }
-
- virtual void SetPreeditUnderline(int start, int end, int type) {
- DVLOG(1) << "SetPreeditUnderline";
- if (active_engine_ && preedit_text_) {
- // Translate the type to ibus's constants.
- int underline_type;
- switch (type) {
- case UNDERLINE_NONE:
- underline_type = IBUS_ATTR_UNDERLINE_NONE;
- break;
-
- case UNDERLINE_SINGLE:
- underline_type = IBUS_ATTR_UNDERLINE_SINGLE;
- break;
-
- case UNDERLINE_DOUBLE:
- underline_type = IBUS_ATTR_UNDERLINE_DOUBLE;
- break;
-
- case UNDERLINE_LOW:
- underline_type = IBUS_ATTR_UNDERLINE_LOW;
- break;
-
- case UNDERLINE_ERROR:
- underline_type = IBUS_ATTR_UNDERLINE_ERROR;
- break;
-
- default:
- return;
- }
-
- ibus_text_append_attribute(preedit_text_, IBUS_ATTR_TYPE_UNDERLINE,
- underline_type, start, end);
- ibus_engine_update_preedit_text(IBUS_ENGINE(active_engine_),
- preedit_text_,
- preedit_cursor_, TRUE);
- }
- }
-
- virtual void CommitText(const char* text) {
- if (active_engine_) {
- DVLOG(1) << "CommitText";
- // Reset the preedit text when a commit occurs.
- SetPreeditText("", 0);
- if (preedit_text_) {
- g_object_unref(preedit_text_);
- preedit_text_ = NULL;
- }
- IBusText* ibus_text = static_cast<IBusText*>(
- ibus_text_new_from_string(text));
- ibus_engine_commit_text(IBUS_ENGINE(active_engine_), ibus_text);
- }
- }
-
- virtual void SetTableVisible(bool visible) {
- table_visible_ = visible;
- if (active_engine_) {
- DVLOG(1) << "SetTableVisible";
- ibus_engine_update_lookup_table(IBUS_ENGINE(active_engine_),
- active_engine_->table,
- table_visible_);
- if (visible) {
- ibus_engine_show_lookup_table(IBUS_ENGINE(active_engine_));
- } else {
- ibus_engine_hide_lookup_table(IBUS_ENGINE(active_engine_));
- }
- }
- }
-
- virtual void SetCursorVisible(bool visible) {
- cursor_visible_ = visible;
- if (active_engine_) {
- DVLOG(1) << "SetCursorVisible";
- ibus_lookup_table_set_cursor_visible(active_engine_->table, visible);
- ibus_engine_update_lookup_table(IBUS_ENGINE(active_engine_),
- active_engine_->table,
- table_visible_);
- }
- }
-
- virtual void SetOrientationVertical(bool vertical) {
- vertical_ = vertical;
- if (active_engine_) {
- DVLOG(1) << "SetOrientationVertical";
- ibus_lookup_table_set_orientation(active_engine_->table,
- vertical ? IBUS_ORIENTATION_VERTICAL :
- IBUS_ORIENTATION_HORIZONTAL);
- ibus_engine_update_lookup_table(IBUS_ENGINE(active_engine_),
- active_engine_->table,
- table_visible_);
- }
- }
-
- virtual void SetPageSize(unsigned int size) {
- page_size_ = size;
- if (active_engine_) {
- DVLOG(1) << "SetPageSize";
- ibus_lookup_table_set_page_size(active_engine_->table, size);
- ibus_engine_update_lookup_table(IBUS_ENGINE(active_engine_),
- active_engine_->table,
- table_visible_);
- }
- }
-
- virtual void ClearCandidates() {
- if (active_engine_) {
- DVLOG(1) << "ClearCandidates";
- ibus_lookup_table_clear(active_engine_->table);
- ibus_engine_update_lookup_table(IBUS_ENGINE(active_engine_),
- active_engine_->table,
- table_visible_);
- }
- }
-
- virtual void SetCandidates(std::vector<Candidate> candidates) {
- // Text with this foreground color will be treated as an annotation.
- const guint kAnnotationForegroundColor = 0x888888;
- if (active_engine_) {
- DVLOG(1) << "SetCandidates";
- ibus_lookup_table_clear(active_engine_->table);
-
- for (std::vector<Candidate>::iterator ix = candidates.begin();
- ix != candidates.end(); ++ix ) {
- if (!ix->annotation.empty()) {
- // If there's an annotation, append it to the value.
- std::string candidate(ix->value);
- candidate += " ";
- size_t start = g_utf8_strlen(candidate.c_str(), -1);
- candidate += ix->annotation;
-
- // Set the foreground color of the annotation text so that the
- // candidate window will treat it properly.
- size_t end = start + g_utf8_strlen(ix->annotation.c_str(), -1);
- IBusText* ibus_text = static_cast<IBusText*>(
- ibus_text_new_from_string(candidate.c_str()));
- ibus_text_append_attribute(ibus_text,
- IBUS_ATTR_TYPE_FOREGROUND,
- kAnnotationForegroundColor,
- start,
- end);
- ibus_lookup_table_append_candidate(active_engine_->table, ibus_text);
- } else {
- IBusText* ibus_text = static_cast<IBusText*>(
- ibus_text_new_from_string(ix->value.c_str()));
- ibus_lookup_table_append_candidate(active_engine_->table, ibus_text);
- }
-
- // Add the label if it's set.
- if (!ix->label.empty()) {
- IBusText* ibus_label = static_cast<IBusText*>(
- ibus_text_new_from_string(ix->label.c_str()));
- ibus_lookup_table_set_label(active_engine_->table,
- std::distance(candidates.begin(), ix),
- ibus_label);
- }
- }
- ibus_engine_update_lookup_table(IBUS_ENGINE(active_engine_),
- active_engine_->table,
- table_visible_);
- }
- }
-
- virtual void SetCandidateAuxText(const char* text) {
- aux_text_ = text;
- if (active_engine_) {
- DVLOG(1) << "SetCandidateAuxText";
- IBusText* ibus_text = static_cast<IBusText*>(
- ibus_text_new_from_string(aux_text_.c_str()));
- ibus_engine_update_auxiliary_text(IBUS_ENGINE(active_engine_), ibus_text,
- aux_text_visible_);
- ibus_engine_update_lookup_table(IBUS_ENGINE(active_engine_),
- active_engine_->table,
- table_visible_);
- }
- }
-
- virtual void SetCandidateAuxTextVisible(bool visible) {
- aux_text_visible_ = visible;
- if (active_engine_) {
- DVLOG(1) << "SetCandidateAuxTextVisible";
- IBusText* ibus_text = static_cast<IBusText*>(
- ibus_text_new_from_string(aux_text_.c_str()));
- ibus_engine_update_auxiliary_text(IBUS_ENGINE(active_engine_), ibus_text,
- aux_text_visible_);
- ibus_engine_update_lookup_table(IBUS_ENGINE(active_engine_),
- active_engine_->table,
- table_visible_);
- }
- }
-
- virtual void SetCursorPosition(unsigned int position) {
- cursor_position_ = position;
- if (active_engine_) {
- DVLOG(1) << "SetCursorPosition";
- ibus_lookup_table_set_cursor_pos(active_engine_->table, position);
- ibus_engine_update_lookup_table(IBUS_ENGINE(active_engine_),
- active_engine_->table,
- table_visible_);
- }
- }
-
- virtual bool RegisterProperties(
- const std::vector<EngineProperty*>& properties) {
- DVLOG(1) << "RegisterProperties";
- ClearProperties();
- CopyProperties(properties, &properties_);
-
- if (active_engine_) {
- if (!SetProperties()) {
- return false;
- }
- }
- return true;
- }
-
- void ClearProperties() {
- STLDeleteContainerPointers(properties_.begin(), properties_.end());
- properties_.clear();
- property_map_.clear();
- }
-
- virtual bool UpdateProperties(
- const std::vector<EngineProperty*>& properties) {
- DVLOG(1) << "UpdateProperties";
- return UpdatePropertyList(properties);
- }
-
- void CopyProperties(const std::vector<EngineProperty*>& properties,
- std::vector<EngineProperty*>* dest) {
- for (std::vector<EngineProperty*>::const_iterator property =
- properties.begin(); property != properties.end(); ++property) {
- if (property_map_.find((*property)->key) != property_map_.end()) {
- DVLOG(1) << "Property collision on name: " << (*property)->key;
- return;
- }
-
- EngineProperty* new_property = new EngineProperty;
- dest->push_back(new_property);
- property_map_[(*property)->key] = new_property;
-
- new_property->key = (*property)->key;
- new_property->label = (*property)->label;
- new_property->tooltip = (*property)->tooltip;
- new_property->sensitive = (*property)->sensitive;
- new_property->visible = (*property)->visible;
- new_property->type = (*property)->type;
- new_property->checked = (*property)->checked;
-
- CopyProperties((*property)->children, &(new_property->children));
- }
- }
-
- IBusPropList *MakePropertyList(
- const std::vector<EngineProperty*>& properties) {
- IBusPropList *prop_list = ibus_prop_list_new();
- for (std::vector<EngineProperty*>::const_iterator property =
- properties.begin(); property != properties.end(); ++property) {
- IBusPropList *children = NULL;
- if (!(*property)->children.empty()) {
- children = MakePropertyList((*property)->children);
- }
-
- IBusPropType type = PROP_TYPE_NORMAL;
- switch ((*property)->type) {
- case PROPERTY_TYPE_NORMAL:
- type = PROP_TYPE_NORMAL;
- break;
- case PROPERTY_TYPE_TOGGLE:
- type = PROP_TYPE_TOGGLE;
- break;
- case PROPERTY_TYPE_RADIO:
- type = PROP_TYPE_RADIO;
- break;
- case PROPERTY_TYPE_SEPARATOR:
- type = PROP_TYPE_SEPARATOR;
- break;
- case PROPERTY_TYPE_MENU:
- type = PROP_TYPE_MENU;
- break;
- default:
- NOTREACHED();
- break;
- }
-
- IBusPropState state = (*property)->checked ? PROP_STATE_CHECKED :
- PROP_STATE_UNCHECKED;
-
- IBusProperty *ibus_property =
- ibus_property_new((*property)->key.c_str(),
- type,
- static_cast<IBusText*>(
- ibus_text_new_from_string(
- (*property)->label.c_str())),
- NULL,
- static_cast<IBusText*>(
- ibus_text_new_from_string(
- (*property)->tooltip.c_str())),
- (*property)->sensitive,
- (*property)->visible,
- state,
- children);
-
- ibus_prop_list_append(prop_list, ibus_property);
- }
- return prop_list;
- }
-
- bool SetProperties() {
- IBusPropList *prop_list = MakePropertyList(properties_);
- ibus_engine_register_properties(IBUS_ENGINE(active_engine_), prop_list);
- return true;
- }
-
- bool UpdatePropertyList(const std::vector<EngineProperty*>& properties) {
- for (std::vector<EngineProperty*>::const_iterator property =
- properties.begin(); property != properties.end(); ++property) {
- std::map<std::string, EngineProperty*>::iterator cur_property =
- property_map_.find((*property)->key);
- if (cur_property == property_map_.end()) {
- DVLOG(1) << "Missing property: " << (*property)->key;
- return false;
- }
-
- if ((*property)->modified & PROPERTY_MODIFIED_LABEL) {
- cur_property->second->label = (*property)->label;
- }
- if ((*property)->modified & PROPERTY_MODIFIED_TOOLTIP) {
- cur_property->second->tooltip = (*property)->tooltip;
- }
- if ((*property)->modified & PROPERTY_MODIFIED_SENSITIVE) {
- cur_property->second->sensitive = (*property)->sensitive;
- }
- if ((*property)->modified & PROPERTY_MODIFIED_VISIBLE) {
- cur_property->second->visible = (*property)->visible;
- }
- if ((*property)->modified & PROPERTY_MODIFIED_TYPE) {
- cur_property->second->type = (*property)->type;
- }
- if ((*property)->modified & PROPERTY_MODIFIED_CHECKED) {
- cur_property->second->checked = (*property)->checked;
- }
-
- if (active_engine_) {
- IBusPropType type = PROP_TYPE_NORMAL;
- switch (cur_property->second->type) {
- case PROPERTY_TYPE_NORMAL:
- type = PROP_TYPE_NORMAL;
- break;
- case PROPERTY_TYPE_TOGGLE:
- type = PROP_TYPE_TOGGLE;
- break;
- case PROPERTY_TYPE_RADIO:
- type = PROP_TYPE_RADIO;
- break;
- case PROPERTY_TYPE_SEPARATOR:
- type = PROP_TYPE_SEPARATOR;
- break;
- case PROPERTY_TYPE_MENU:
- type = PROP_TYPE_MENU;
- break;
- default:
- NOTREACHED();
- break;
- }
-
- IBusPropState state = cur_property->second->checked ?
- PROP_STATE_CHECKED : PROP_STATE_UNCHECKED;
-
- IBusProperty *ibus_property =
- ibus_property_new(cur_property->second->key.c_str(),
- type,
- static_cast<IBusText*>(
- ibus_text_new_from_string(
- cur_property->second->label.c_str())),
- NULL,
- static_cast<IBusText*>(
- ibus_text_new_from_string(
- cur_property->second->tooltip.c_str())),
- cur_property->second->sensitive,
- cur_property->second->visible,
- state,
- NULL);
-
- ibus_engine_update_property(IBUS_ENGINE(active_engine_), ibus_property);
- }
- if (!UpdatePropertyList((*property)->children)) {
- return false;
- }
- }
- return true;
- }
-
- virtual void KeyEventDone(KeyEventHandle* key_data, bool handled) {
- GDBusMethodInvocation* invocation =
- reinterpret_cast<GDBusMethodInvocation*>(key_data);
-
- g_dbus_method_invocation_return_value(invocation,
- g_variant_new("(b)", handled));
- }
-
-
- static void InitEngineClass(IBusChromeOSEngineClass *klass) {
- GObjectClass *object_class = G_OBJECT_CLASS(klass);
- IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS(klass);
- IBusEngineClass *engine_class = IBUS_ENGINE_CLASS(klass);
-
- object_class->constructor = EngineConstructor;
- ibus_object_class->destroy = (IBusObjectDestroyFunc) OnDestroy;
-
- IBUS_SERVICE_CLASS(klass)->service_method_call = OnServiceMethodCall;
-
- engine_class->process_key_event = NULL;
- engine_class->reset = OnReset;
- engine_class->enable = OnEnable;
- engine_class->disable = OnDisable;
- engine_class->focus_in = OnFocusIn;
- engine_class->focus_out = OnFocusOut;
- engine_class->page_up = OnPageUp;
- engine_class->page_down = OnPageDown;
- engine_class->cursor_up = OnCursorUp;
- engine_class->cursor_down = OnCursorDown;
- engine_class->property_activate = OnPropertyActivate;
- engine_class->candidate_clicked = OnCandidateClicked;
- }
-
- static void InitEngine(IBusChromeOSEngine* engine) {
- }
-
- private:
- // Installs gobject signal handlers to |ibus_|.
- void ConnectIBusSignals() {
- if (!ibus_) {
- return;
- }
- DVLOG(1) << "ConnectIBusSignals";
- g_signal_connect(ibus_,
- "connected",
- G_CALLBACK(IBusBusConnectedCallback),
- this);
- g_signal_connect(ibus_,
- "disconnected",
- G_CALLBACK(IBusBusDisconnectedCallback),
- this);
- }
-
- // Removes gobject signal handlers from |ibus_|.
- void DisconnectIBusSignals() {
- if (!ibus_) {
- return;
- }
- g_signal_handlers_disconnect_by_func(
- ibus_,
- reinterpret_cast<gpointer>(G_CALLBACK(IBusBusConnectedCallback)),
- this);
- g_signal_handlers_disconnect_by_func(
- ibus_,
- reinterpret_cast<gpointer>(G_CALLBACK(IBusBusDisconnectedCallback)),
- this);
- }
-
- // Handles "connected" signal from ibus-daemon.
- static void IBusBusConnectedCallback(IBusBus* bus, gpointer user_data) {
- DVLOG(1) << "IBus connection is recovered.";
- g_return_if_fail(user_data);
- IBusEngineControllerImpl* self
- = static_cast<IBusEngineControllerImpl*>(user_data);
- DCHECK(ibus_bus_is_connected(self->ibus_));
- if (!self->MaybeCreateComponent()) {
- DVLOG(1) << "MaybeCreateComponent() failed";
- return;
- }
- }
-
- // Handles "disconnected" signal from ibus-daemon.
- static void IBusBusDisconnectedCallback(IBusBus* bus, gpointer user_data) {
- DVLOG(1) << "IBus connection is terminated.";
- if (g_factory_) {
- g_object_unref(g_factory_);
- g_factory_ = NULL;
- }
- }
-
- bool MaybeCreateComponent() {
- if (!ibus_ || !ibus_bus_is_connected(ibus_)) {
- return false;
- }
-
- DVLOG(1) << "MaybeCreateComponent";
- IBusComponent* component = ibus_component_new(bus_name_.c_str(),
- description_.c_str(),
- "",
- "",
- engine_name_.c_str(),
- "",
- "",
- "");
- g_object_ref_sink(component);
- ibus_component_add_engine(component,
- ibus_engine_desc_new(engine_id_.c_str(),
- description_.c_str(),
- description_.c_str(),
- language_.c_str(),
- "",
- engine_name_.c_str(),
- "",
- layout_.c_str()));
-
- if (!g_factory_) {
- g_factory_ = ibus_factory_new(ibus_bus_get_connection(ibus_));
- g_object_ref_sink(g_factory_);
- }
-
- ibus_factory_add_engine(g_factory_, engine_id_.c_str(),
- IBUS_TYPE_CHROMEOS_ENGINE);
- ibus_bus_register_component(ibus_, component);
- g_object_unref(component);
-
- return true;
- }
-
- static void OnServiceMethodCall(IBusService* service,
- GDBusConnection* connection,
- const gchar* sender,
- const gchar* object_path,
- const gchar* interface_name,
- const gchar* method_name,
- GVariant* parameters,
- GDBusMethodInvocation* invocation) {
- if (g_strcmp0(method_name, "ProcessKeyEvent") == 0) {
- // Override the default ProcessKeyEvent handler so that we can send the
- // response asynchronously.
- IBusEngine *engine = IBUS_ENGINE(service);
-
- guint keyval;
- guint keycode;
- guint state;
- g_variant_get(parameters, "(uuu)", &keyval, &keycode, &state);
-
- OnProcessKeyEvent(engine, keyval, keycode, state, invocation);
- } else {
- IBUS_SERVICE_CLASS(
- ibus_chromeos_engine_parent_class)->service_method_call(
- service,
- connection,
- sender,
- object_path,
- interface_name,
- method_name,
- parameters,
- invocation);
- }
- }
-
- static void OnProcessKeyEvent(IBusEngine* ibus_engine, guint keyval,
- guint keycode, guint modifiers,
- GDBusMethodInvocation* key_data) {
- DVLOG(1) << "OnProcessKeyEvent";
- IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine);
- if (engine->connection) {
- engine->connection->observer_->OnKeyEvent(
- !(modifiers & IBUS_RELEASE_MASK),
- keyval, keycode,
- modifiers & IBUS_MOD1_MASK,
- modifiers & IBUS_CONTROL_MASK,
- modifiers & IBUS_SHIFT_MASK,
- reinterpret_cast<KeyEventHandle*>(key_data));
- }
- }
-
- static void OnReset(IBusEngine* ibus_engine) {
- DVLOG(1) << "OnReset";
- IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine);
- if (engine->connection) {
- engine->connection->observer_->OnReset();
- }
- }
-
- static void OnEnable(IBusEngine* ibus_engine) {
- DVLOG(1) << "OnEnable";
- IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine);
- if (engine->connection) {
- engine->connection->active_engine_ = engine;
- engine->connection->active_ = true;
- engine->connection->observer_->OnEnable();
- if (engine->connection->focused_) {
- engine->connection->observer_->OnFocusIn();
- }
- engine->connection->SetProperties();
- }
- }
-
- static void OnDisable(IBusEngine* ibus_engine) {
- DVLOG(1) << "OnDisable";
- IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine);
- if (engine->connection) {
- engine->connection->active_ = false;
- engine->connection->observer_->OnDisable();
- if (engine->connection->active_engine_ == engine) {
- engine->connection->active_engine_ = NULL;
- }
- }
- }
-
- static void OnFocusIn(IBusEngine* ibus_engine) {
- DVLOG(1) << "OnFocusIn";
- IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine);
- if (engine->connection) {
- engine->connection->focused_ = true;
- if (engine->connection->active_) {
- engine->connection->observer_->OnFocusIn();
- }
- engine->connection->SetProperties();
- }
- }
-
- static void OnFocusOut(IBusEngine* ibus_engine) {
- DVLOG(1) << "OnFocusOut";
- IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine);
- if (engine->connection) {
- engine->connection->focused_ = false;
- if (engine->connection->active_) {
- engine->connection->observer_->OnFocusOut();
- }
- }
- }
-
- static void OnPageUp(IBusEngine* ibus_engine) {
- // Not implemented
- }
-
- static void OnPageDown(IBusEngine* ibus_engine) {
- // Not implemented
- }
-
- static void OnCursorUp(IBusEngine* ibus_engine) {
- // Not implemented
- }
-
- static void OnCursorDown(IBusEngine* ibus_engine) {
- // Not implemented
- }
-
- static void OnPropertyActivate(IBusEngine* ibus_engine,
- const gchar *prop_name, guint prop_state) {
- DVLOG(1) << "OnPropertyActivate";
- IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine);
- if (engine->connection) {
- engine->connection->observer_->OnPropertyActivate(prop_name, prop_state);
- }
- }
-
- static void OnCandidateClicked(IBusEngine* ibus_engine, guint index,
- guint button, guint state) {
- DVLOG(1) << "OnCandidateClicked";
- IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine);
- if (engine->connection) {
- int pressed_button = 0;
- if (button & IBUS_BUTTON1_MASK) {
- pressed_button |= MOUSE_BUTTON_1_MASK;
- }
- if (button & IBUS_BUTTON2_MASK) {
- pressed_button |= MOUSE_BUTTON_2_MASK;
- }
- if (button & IBUS_BUTTON3_MASK) {
- pressed_button |= MOUSE_BUTTON_3_MASK;
- }
- engine->connection->observer_->OnCandidateClicked(index, pressed_button,
- state);
- }
- }
-
- static GObject* EngineConstructor(GType type, guint n_construct_params,
- GObjectConstructParam *construct_params) {
- IBusChromeOSEngine* engine = (IBusChromeOSEngine*)
- G_OBJECT_CLASS(ibus_chromeos_engine_parent_class)
- ->constructor(type, n_construct_params, construct_params);
- const gchar* name = ibus_engine_get_name((IBusEngine*)engine);
- ConnectionMap::iterator connection = g_connections_->find(name);
- if (connection == g_connections_->end()) {
- DVLOG(1) << "Connection never created: " << name;
- engine->connection = NULL;
- engine->table = NULL;
- return (GObject *) engine;
- }
-
- connection->second->engine_instances_.insert(engine);
-
- if (!connection->second->active_engine_) {
- connection->second->active_engine_ = engine;
- }
-
- engine->connection = connection->second;
-
- engine->table = ibus_lookup_table_new(connection->second->page_size_,
- connection->second->cursor_position_,
- connection->second->cursor_visible_,
- false); // table_round
- g_object_ref_sink(engine->table);
- ibus_lookup_table_set_orientation(engine->table,
- connection->second->vertical_ ?
- IBUS_ORIENTATION_VERTICAL :
- IBUS_ORIENTATION_HORIZONTAL);
- ibus_engine_update_lookup_table(IBUS_ENGINE(engine), engine->table,
- connection->second->table_visible_);
-
-
- connection->second->SetProperties();
-
- return (GObject *) engine;
- }
-
- static void OnDestroy(IBusChromeOSEngine* chromeos_engine) {
- const gchar* name = ibus_engine_get_name((IBusEngine*)chromeos_engine);
- ConnectionMap::iterator connection = g_connections_->find(name);
- if (connection == g_connections_->end()) {
- DVLOG(1) << "Connection already destroyed, or never created: " << name;
- } else {
- connection->second->engine_instances_.erase(chromeos_engine);
- if (connection->second->active_engine_ == chromeos_engine) {
- connection->second->active_engine_ = NULL;
- }
- }
- if (chromeos_engine->table) {
- g_object_unref(chromeos_engine->table);
- chromeos_engine->table = NULL;
- }
- if (chromeos_engine->connection &&
- ibus_bus_is_connected(chromeos_engine->connection->ibus_)) {
- // Connection may be NULL since extension IME can be uninstalled before
- // |OnDestroy| is called.
- // We can't call |destroy| function without ibus-daemon connection,
- // otherwise browser goes into deadlock state.
- // TODO(nona): investigate the reason of dead-lock.
- IBUS_OBJECT_CLASS(ibus_chromeos_engine_parent_class)
- ->destroy(IBUS_OBJECT(chromeos_engine));
- }
- }
-
- IBusEngineController::Observer* observer_;
- IBusBus* ibus_;
- IBusChromeOSEngine* active_engine_;
-
- std::string engine_id_;
- std::string engine_name_;
- std::string description_;
- std::string language_;
- std::string layout_;
- std::string bus_name_;
-
- IBusText* preedit_text_;
- int preedit_cursor_;
- bool table_visible_;
- bool cursor_visible_;
- bool vertical_;
- unsigned int page_size_;
- unsigned int cursor_position_;
- std::string aux_text_;
- bool aux_text_visible_;
- std::vector<EngineProperty*> properties_;
- std::map<std::string, EngineProperty*> property_map_;
-
- bool active_;
- bool focused_;
-
- 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);
-}
-
-void ibus_chromeos_engine_init(IBusChromeOSEngine* engine) {
- IBusEngineControllerImpl::InitEngine(engine);
-}
-
-#endif // HAVE_IBUS
-
-// static
-IBusEngineController* IBusEngineController::Create(Observer* observer,
- const char* engine_id,
- const char* engine_name,
- const char* description,
- const char* language,
- const char* layout) {
-#if defined(HAVE_IBUS)
- IBusEngineControllerImpl* connection = new IBusEngineControllerImpl(observer);
- if (!connection->Init(engine_id, engine_name, description, language,
- layout)) {
- DVLOG(1) << "Failed to Init() IBusEngineControllerImpl. "
- << "Returning NULL";
- delete connection;
- connection = NULL;
- }
- return connection;
-#else
- return NULL;
-#endif
-}
-
-IBusEngineController::~IBusEngineController() {
-}
-
-} // namespace input_method
-} // namespace chromeos
« no previous file with comments | « chrome/browser/chromeos/input_method/ibus_engine_controller.h ('k') | chrome/browser/chromeos/input_method/ibus_keymap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698