Index: chrome/browser/chromeos/input_method/ibus_controller.h |
diff --git a/chrome/browser/chromeos/input_method/ibus_controller.h b/chrome/browser/chromeos/input_method/ibus_controller.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..741319d04229bad3191963386bb22da74a340d85 |
--- /dev/null |
+++ b/chrome/browser/chromeos/input_method/ibus_controller.h |
@@ -0,0 +1,322 @@ |
+// Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROMEOS_INPUT_METHOD_H_ |
+#define CHROMEOS_INPUT_METHOD_H_ |
+ |
+#include <sstream> |
+#include <string> |
+#include <utility> |
+#include <vector> |
+ |
+#include <base/basictypes.h> |
+#include <base/logging.h> // DCHECK |
+#include <base/string_split.h> |
+ |
+namespace chromeos { |
+ |
+// A structure which represents an input method. All methods in this class have |
+// to be in chromeos_input_method.h since Chrome also creates an instance of |
+// the class. |
+struct InputMethodDescriptor { |
+ InputMethodDescriptor() { |
+ } |
+ |
+ // Do not call this function directly. Use CreateInputMethodDescriptor() in |
+ // chromeos_input_method.cc whenever possible. |
+ InputMethodDescriptor(const std::string& in_id, |
+ const std::string& in_display_name, |
+ const std::string& in_keyboard_layout, |
+ const std::string& in_virtual_keyboard_layouts, |
+ const std::string& in_language_code) |
+ : virtual_keyboard_layouts_(in_virtual_keyboard_layouts), |
+ id(in_id), |
+ display_name(in_display_name), |
+ keyboard_layout(in_keyboard_layout), |
+ language_code(in_language_code) { |
+ DCHECK(keyboard_layout.find(",") == std::string::npos); |
+ } |
+ |
+ bool operator==(const InputMethodDescriptor& other) const { |
+ return (id == other.id); |
+ } |
+ |
+ // Debug print function. |
+ std::string ToString() const { |
+ std::stringstream stream; |
+ stream << "id=" << id |
+ << ", display_name=" << display_name |
+ << ", keyboard_layout=" << keyboard_layout |
+ << ", virtual_keyboard_layouts=" << virtual_keyboard_layouts_ |
+ << ", language_code=" << language_code; |
+ return stream.str(); |
+ } |
+ |
+ // TODO(yusukes): When libcros is moved to Chrome, do the following: |
+ // 1. Change the type of the virtual_keyboard_layouts_ variable to |
+ // std::vector<std::string> and rename it back to virtual_keyboard_layouts. |
+ // 2. Remove the virtual_keyboard_layouts() function. |
+ // We can't do them right now because it will break ABI compatibility... |
+ std::vector<std::string> virtual_keyboard_layouts() const { |
+ std::vector<std::string> layout_names; |
+ base::SplitString(virtual_keyboard_layouts_, ',', &layout_names); |
+ return layout_names; |
+ } |
+ |
+ // Preferred virtual keyboard layouts for the input method. Comma separated |
+ // layout names in order of priority, such as "handwriting,us", could appear. |
+ // Note: DO NOT ACCESS THIS VARIABLE DIRECTLY. USE virtual_keyboard_layouts() |
+ // INSTEAD. SEE THE TODO ABOVE. |
+ std::string virtual_keyboard_layouts_; |
+ |
+ // An ID that identifies an input method engine (e.g., "t:latn-post", |
+ // "pinyin", "hangul"). |
+ std::string id; |
+ // An input method name which can be used in the UI (e.g., "Pinyin"). |
+ std::string display_name; |
+ // A preferred physical keyboard layout for the input method (e.g., "us", |
+ // "us(dvorak)", "jp"). Comma separated layout names do NOT appear. |
+ std::string keyboard_layout; |
+ // Language codes like "ko", "ja", "zh_CN", and "t". |
+ // "t" is used for languages in the "Others" category. |
+ std::string language_code; |
+}; |
+typedef std::vector<InputMethodDescriptor> InputMethodDescriptors; |
+ |
+// A structure which represents a property for an input method engine. For |
+// details, please check a comment for the LanguageRegisterImePropertiesFunction |
+// typedef below. |
+// TODO(yusukes): Rename this struct. "InputMethodProperty" might be better? |
+struct ImeProperty { |
+ ImeProperty(const std::string& in_key, |
+ const std::string& in_label, |
+ bool in_is_selection_item, |
+ bool in_is_selection_item_checked, |
+ int in_selection_item_id) |
+ : key(in_key), |
+ label(in_label), |
+ is_selection_item(in_is_selection_item), |
+ is_selection_item_checked(in_is_selection_item_checked), |
+ selection_item_id(in_selection_item_id) { |
+ DCHECK(!key.empty()); |
+ } |
+ |
+ ImeProperty() |
+ : is_selection_item(false), |
+ is_selection_item_checked(false), |
+ selection_item_id(kInvalidSelectionItemId) { |
+ } |
+ |
+ // Debug print function. |
+ std::string ToString() const { |
+ std::stringstream stream; |
+ stream << "key=" << key |
+ << ", label=" << label |
+ << ", is_selection_item=" << is_selection_item |
+ << ", is_selection_item_checked=" << is_selection_item_checked |
+ << ", selection_item_id=" << selection_item_id; |
+ return stream.str(); |
+ } |
+ |
+ std::string key; // A key which identifies the property. Non-empty string. |
+ // (e.g. "InputMode.HalfWidthKatakana") |
+ // DEPRECATED: TODO(yusukes): Remove this when it's ready. |
+ std::string deprecated_icon_path; |
+ std::string label; // A description of the property. Non-empty string. |
+ // (e.g. "Switch to full punctuation mode", "Hiragana") |
+ bool is_selection_item; // true if the property is a selection item. |
+ bool is_selection_item_checked; // true if |is_selection_item| is true and |
+ // the selection_item is selected. |
+ int selection_item_id; // A group ID (>= 0) of the selection item. |
+ // kInvalidSelectionItemId if |is_selection_item| is |
+ // false. |
+ static const int kInvalidSelectionItemId = -1; |
+}; |
+typedef std::vector<ImeProperty> ImePropertyList; |
+ |
+// A structure which represents a value of an input method configuration item. |
+// This struct is used by SetImeConfig(). |
+// TODO(yusukes): Rename this struct. "InputMethodConfigValue" might be better? |
+struct ImeConfigValue { |
+ ImeConfigValue() |
+ : type(kValueTypeString), |
+ int_value(0), |
+ bool_value(false) { |
+ } |
+ |
+ // Debug print function. |
+ std::string ToString() const { |
+ std::stringstream stream; |
+ stream << "type=" << type; |
+ switch (type) { |
+ case kValueTypeString: |
+ stream << ", string_value=" << string_value; |
+ break; |
+ case kValueTypeInt: |
+ stream << ", int_value=" << int_value; |
+ break; |
+ case kValueTypeBool: |
+ stream << ", bool_value=" << (bool_value ? "true" : "false"); |
+ break; |
+ case kValueTypeStringList: |
+ stream << ", string_list_value="; |
+ for (size_t i = 0; i < string_list_value.size(); ++i) { |
+ if (i) { |
+ stream << ","; |
+ } |
+ stream << string_list_value[i]; |
+ } |
+ break; |
+ } |
+ return stream.str(); |
+ } |
+ |
+ enum ValueType { |
+ kValueTypeString = 0, |
+ kValueTypeInt, |
+ kValueTypeBool, |
+ kValueTypeStringList, |
+ }; |
+ |
+ // A value is stored on |string_value| member if |type| is kValueTypeString. |
+ // The same is true for other enum values. |
+ ValueType type; |
+ |
+ std::string string_value; |
+ int int_value; |
+ bool bool_value; |
+ std::vector<std::string> string_list_value; |
+}; |
+ |
+// A monitor function which is called when current input method is changed by a |
+// user. |
+typedef void(*LanguageCurrentInputMethodMonitorFunction)( |
+ void* language_library, const InputMethodDescriptor& current_input_method); |
+ |
+// A monitor function which is called when "RegisterProperties" signal is sent |
+// from ibus-daemon. The signal contains a list of properties for a specific |
+// input method engine. For example, Japanese input method might have the |
+// following properties: |
+// |
+// ---------------------------------- |
+// key: InputMode.Hiragana |
+// label: Hiragana |
+// is_selection_item: true |
+// is_selection_item_checked: true |
+// selection_item_id: 1 |
+// ---------------------------------- |
+// key: InputMode.Katakana |
+// label: Katakana |
+// is_selection_item: true |
+// is_selection_item_checked: false |
+// selection_item_id: 1 |
+// ---------------------------------- |
+// ... |
+// ---------------------------------- |
+typedef void(*LanguageRegisterImePropertiesFunction)( |
+ void* language_library, const ImePropertyList& prop_list); |
+ |
+// A monitor function which is called when "UpdateProperty" signal is sent |
+// from ibus-daemon. The signal contains one or more properties which is updated |
+// recently. Keys the signal contains are a subset of keys registered by the |
+// "RegisterProperties" signal above. For example, |
+// Japanese input method might send the following properties: |
+// |
+// ---------------------------------- |
+// key: InputMode.Hiragana |
+// label: Hiragana |
+// is_selection_item: true |
+// is_selection_item_checked: false |
+// selection_item_id: ... |
+// ---------------------------------- |
+// key: InputMode.Katakana |
+// label: Katakana |
+// is_selection_item: true |
+// is_selection_item_checked: true |
+// selection_item_id: ... |
+// ---------------------------------- |
+// |
+// Note: Please do not use selection_item_ids in |prop_list|. Dummy values are |
+// filled in the field. |
+typedef void(*LanguageUpdateImePropertyFunction)( |
+ void* language_library, const ImePropertyList& prop_list); |
+ |
+// A monitor function which is called when ibus connects or disconnects. |
+typedef void(*LanguageConnectionChangeMonitorFunction)( |
+ void* language_library, bool connected); |
+ |
+// Establishes IBus connection to the ibus-daemon. LanguageXXXFunction functions |
+// will be called when status of input method engines is changed. |
+class InputMethodStatusConnection; |
+extern InputMethodStatusConnection* (*MonitorInputMethodStatus)( |
+ void* language_library, |
+ LanguageCurrentInputMethodMonitorFunction current_input_method, |
+ LanguageRegisterImePropertiesFunction register_ime_properties, |
+ LanguageUpdateImePropertyFunction update_ime_property, |
+ LanguageConnectionChangeMonitorFunction connection_changed); |
+ |
+// Stops ibus-daemon. Returns true on success. |
+extern bool (*StopInputMethodProcess)(InputMethodStatusConnection* connection); |
+ |
+// Gets all input method engines that are supported, including ones not active. |
+// Caller has to delete the returned list. This function never returns NULL. |
+extern InputMethodDescriptors* (*GetSupportedInputMethodDescriptors)(); |
+ |
+// Changes the current input method engine to |name|. Returns true on success. |
+// Examples of names: "pinyin", "m17n:ar:kbd", "xkb:us:dvorak:eng". |
+extern bool (*ChangeInputMethod)( |
+ InputMethodStatusConnection* connection, const char* name); |
+ |
+// Sets whether the input method property specified by |key| is activated. |
+// If |activated| is true, activates the property. If |activated| is false, |
+// deactivates the property. |
+// TODO(yusukes): "SetInputMethodPropertyActivated" might be better? |
+extern void (*SetImePropertyActivated)(InputMethodStatusConnection* connection, |
+ const char* key, |
+ bool activated); |
+ |
+// Sets a configuration of ibus-daemon or IBus engines to |value|. |
+// Returns true if the configuration is successfully set. |
+// |
+// To set 'panel/custom_font', |section| should be "panel", and |
+// |config_name| should be "custom_font". |
+// TODO(yusukes): "SetInputMethodConfig" might be better? |
+extern bool (*SetImeConfig)(InputMethodStatusConnection* connection, |
+ const char* section, |
+ const char* config_name, |
+ const ImeConfigValue& value); |
+ |
+// Returns the keyboard overlay ID corresponding to |input_method_id|. |
+// Returns an empty string if there is no corresponding keyboard overlay ID. |
+extern std::string (*GetKeyboardOverlayId)( |
+ const std::string& input_method_id); |
+ |
+// Sends a handwriting stroke to ibus-daemon. The std::pair contains x and y |
+// coordinates. (0.0, 0.0) represents the top-left corner of a handwriting area, |
+// and (1.0, 1.0) does the bottom-right. For example, the second stroke for ロ |
+// (Katakana character Ro) would be something like [(0,0), (1,0), (1,1)]. |
+// stroke.size() should always be >= 2 (i.e. a single dot is not allowed). |
+typedef std::vector<std::pair<double, double> > HandwritingStroke; |
+extern void (*SendHandwritingStroke)( |
+ InputMethodStatusConnection* connection, const HandwritingStroke& stroke); |
+ |
+// Clears the last N handwriting strokes. Pass zero for clearing all strokes. |
+// TODO(yusukes): Currently ibus-daemon only accepts 0 for |n_strokes|. |
+extern void (*CancelHandwriting)(InputMethodStatusConnection* connection, |
+ int n_strokes); |
+ |
+// |
+// FUNCTIONS BELOW ARE ONLY FOR UNIT TESTS. DO NOT USE THEM. |
+// |
+bool InputMethodIdIsWhitelisted(const std::string& input_method_id); |
+bool XkbLayoutIsSupported(const std::string& xkb_layout); |
+InputMethodDescriptor CreateInputMethodDescriptor( |
+ const std::string& id, |
+ const std::string& display_name, |
+ const std::string& raw_layout, |
+ const std::string& language_code); |
+ |
+} // namespace chromeos |
+ |
+#endif // CHROMEOS_INPUT_METHOD_H_ |