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

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

Issue 18856014: We should switch the keyboard layout to the layout the user set according to (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix MockInputMethodManager build. Created 7 years, 5 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/input_method_manager_impl.cc
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
index 4f21a46c14982239141d146e9f52e3f3432b1dcf..72893d79014a9c43023c49b51ce49817f52110ef 100644
--- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
+++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
@@ -108,8 +108,60 @@ const struct MigrationHangulKeyboardToInputMethodID {
{ "ro", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_romaja" },
};
+static bool ContainsTwoLetterLanguageCode(
+ const std::vector<InputMethodManagerImpl::TwoLetterLanguageCode>& all,
+ const std::string& lang) {
+ if (lang.size() < 2) {
+ return false;
+ }
+ return std::binary_search(
+ all.begin(),
+ all.end(),
+ InputMethodManagerImpl::TwoLetterLanguageCode(lang.c_str()));
+}
+
+// A list of languages having full 26 latin letter set on keyboard.
+// (If all input methods of a given language can be used at login screen.)
+const char* kFullLatinKeyboardLanguageList[] = {
Seigo Nonaka 2013/07/11 09:43:56 Please notice that there is "xkb:jp::jpn" keyboard
Alexander Alekseev 2013/07/12 20:10:49 That's a good point. I've been waiting for somethi
+ "ca", // Catalan
+ "cs", // Czech
+ "da", // Danish
+ "de", // German
+ "en", // English
+ "es", // Spanish
+ "et", // Estonian
+ "fi", // Finnish
+ "fr", // French
+ "hr", // Croatian
+ "hu", // Hungarian
+ "is", // Icelandic
+ "it", // Italian
+ "lt", // Lithuanian
+ "lv", // Latvian
+ "nb", // Norwegian (Bokmal)
+ "nl", // Dutch
+ "pl", // Polish
+ "pt", // Portuguese
+ "ro", // Romanian
+ "sk", // Slovak
+ "sl", // Slovenian
+ "sv", // Swedish
+ "tr", // Turkish
+};
+
} // namespace
+// Note, that language may be longer than 2 letters. Like "en-US".
+// but ContainsTwoLetterLanguageCode() compares only 2 first letters.
+bool InputMethodManagerImpl::IsLanguageFullLatinKeyboard(
+ const std::string& lang) const {
+ return ContainsTwoLetterLanguageCode(full_latin_keyboard_languages_, lang);
+}
+
+InputMethodManagerImpl::TwoLetterLanguageCode::TwoLetterLanguageCode(
+ const char* lang)
+ : val(base::ToLowerASCII(lang[0]) * 256 + base::ToLowerASCII(lang[1])) {}
+
InputMethodManagerImpl::InputMethodManagerImpl(
scoped_ptr<InputMethodDelegate> delegate)
: delegate_(delegate.Pass()),
@@ -118,6 +170,16 @@ InputMethodManagerImpl::InputMethodManagerImpl(
component_extension_ime_manager_(new ComponentExtensionIMEManager()),
weak_ptr_factory_(this) {
IBusDaemonController::GetInstance()->AddObserver(this);
+
+ full_latin_keyboard_languages_.reserve(
+ arraysize(kFullLatinKeyboardLanguageList));
+
+ for (size_t i = 0; i < arraysize(kFullLatinKeyboardLanguageList); ++i) {
+ full_latin_keyboard_languages_.push_back(
+ TwoLetterLanguageCode(kFullLatinKeyboardLanguageList[i]));
+ }
+ std::sort(full_latin_keyboard_languages_.begin(),
+ full_latin_keyboard_languages_.end());
}
InputMethodManagerImpl::~InputMethodManagerImpl() {
@@ -207,6 +269,11 @@ InputMethodManagerImpl::GetActiveInputMethods() const {
return result.Pass();
}
+const std::vector<std::string>&
+InputMethodManagerImpl::GetActiveInputMethodIds() const {
+ return active_input_method_ids_;
+}
+
size_t InputMethodManagerImpl::GetNumActiveInputMethods() const {
return active_input_method_ids_.size();
}
@@ -250,6 +317,46 @@ void InputMethodManagerImpl::EnableLayouts(const std::string& language_code,
ChangeInputMethod(initial_layout); // you can pass empty |initial_layout|.
}
+// Adds new input method to given list.
+bool InputMethodManagerImpl::EnableInputMethodImpl(
+ const std::string& input_method_id,
+ std::vector<std::string>& new_active_input_method_ids) const {
+ if (!util_.IsValidInputMethodId(input_method_id)) {
+ DVLOG(1) << "EnableInputMethod: Invalid ID: " << input_method_id;
+ return false;
+ }
+
+ if (!Contains(new_active_input_method_ids, input_method_id))
+ new_active_input_method_ids.push_back(input_method_id);
+
+ return true;
+}
+
+// starts or stops the system input method framework as needed.
Mattias Nissler (ping if slow) 2013/07/11 10:05:49 nit: Starts
Alexander Alekseev 2013/07/12 20:10:49 Done.
+void InputMethodManagerImpl::ReconfigureIMFramework() {
+ if (component_extension_ime_manager_->IsInitialized())
+ LoadNecessaryComponentExtensions();
+
+ if (ContainOnlyKeyboardLayout(active_input_method_ids_)) {
Mattias Nissler (ping if slow) 2013/07/11 10:05:49 nit: ContainOnlyKeyboardLayout should be ContainsO
Alexander Alekseev 2013/07/12 20:10:49 Done.
+ // Do NOT call ibus_controller_->Stop(); here to work around a crash issue
+ // at crosbug.com/27051.
Mattias Nissler (ping if slow) 2013/07/11 10:05:49 nit: new code should refer to crbug.com IMHO
Alexander Alekseev 2013/07/12 20:10:49 Done.
+ // TODO(yusukes): We can safely call Stop(); here once crosbug.com/26443
+ // is implemented.
+ } else {
+ MaybeInitializeCandidateWindowController();
+ IBusDaemonController::GetInstance()->Start();
+ }
+}
+
+bool InputMethodManagerImpl::EnableInputMethod(
+ const std::string& input_method_id) {
+ if (!EnableInputMethodImpl(input_method_id, active_input_method_ids_))
+ return false;
+
+ ReconfigureIMFramework();
+ return true;
+}
+
bool InputMethodManagerImpl::EnableInputMethods(
const std::vector<std::string>& new_active_input_method_ids) {
if (state_ == STATE_TERMINATING)
@@ -258,13 +365,9 @@ bool InputMethodManagerImpl::EnableInputMethods(
// Filter unknown or obsolete IDs.
std::vector<std::string> new_active_input_method_ids_filtered;
- for (size_t i = 0; i < new_active_input_method_ids.size(); ++i) {
- const std::string& input_method_id = new_active_input_method_ids[i];
- if (util_.IsValidInputMethodId(input_method_id))
- new_active_input_method_ids_filtered.push_back(input_method_id);
- else
- DVLOG(1) << "EnableInputMethods: Invalid ID: " << input_method_id;
- }
+ for (size_t i = 0; i < new_active_input_method_ids.size(); ++i)
+ EnableInputMethodImpl(new_active_input_method_ids[i],
+ new_active_input_method_ids_filtered);
if (new_active_input_method_ids_filtered.empty()) {
DVLOG(1) << "EnableInputMethods: No valid input method ID";
@@ -280,18 +383,7 @@ bool InputMethodManagerImpl::EnableInputMethods(
}
active_input_method_ids_.swap(new_active_input_method_ids_filtered);
- if (component_extension_ime_manager_->IsInitialized())
- LoadNecessaryComponentExtensions();
-
- if (ContainOnlyKeyboardLayout(active_input_method_ids_)) {
- // Do NOT call ibus_controller_->Stop(); here to work around a crash issue
- // at crosbug.com/27051.
- // TODO(yusukes): We can safely call Stop(); here once crosbug.com/26443
- // is implemented.
- } else {
- MaybeInitializeCandidateWindowController();
- IBusDaemonController::GetInstance()->Start();
- }
+ ReconfigureIMFramework();
// If |current_input_method| is no longer in |active_input_method_ids_|,
// ChangeInputMethod() picks the first one in |active_input_method_ids_|.

Powered by Google App Engine
This is Rietveld 408576698