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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/chromeos/input_method/input_method_manager_impl.h" 5 #include "chrome/browser/chromeos/input_method/input_method_manager_impl.h"
6 6
7 #include <algorithm> // std::find 7 #include <algorithm> // std::find
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 const char* keyboard_id; 101 const char* keyboard_id;
102 const char* ime_id; 102 const char* ime_id;
103 } kMigrationHangulKeyboardToInputMethodID[] = { 103 } kMigrationHangulKeyboardToInputMethodID[] = {
104 { "2", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_2set" }, 104 { "2", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_2set" },
105 { "3f", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3setfinal" }, 105 { "3f", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3setfinal" },
106 { "39", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3set390" }, 106 { "39", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3set390" },
107 { "3s", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3setnoshift" }, 107 { "3s", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_3setnoshift" },
108 { "ro", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_romaja" }, 108 { "ro", "_comp_ime_bdgdidmhaijohebebipajioienkglgfohangul_romaja" },
109 }; 109 };
110 110
111 static bool ContainsTwoLetterLanguageCode(
112 const std::vector<InputMethodManagerImpl::TwoLetterLanguageCode>& all,
113 const std::string& lang) {
114 if (lang.size() < 2) {
115 return false;
116 }
117 return std::binary_search(
118 all.begin(),
119 all.end(),
120 InputMethodManagerImpl::TwoLetterLanguageCode(lang.c_str()));
121 }
122
123 // A list of languages having full 26 latin letter set on keyboard.
124 // (If all input methods of a given language can be used at login screen.)
125 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
126 "ca", // Catalan
127 "cs", // Czech
128 "da", // Danish
129 "de", // German
130 "en", // English
131 "es", // Spanish
132 "et", // Estonian
133 "fi", // Finnish
134 "fr", // French
135 "hr", // Croatian
136 "hu", // Hungarian
137 "is", // Icelandic
138 "it", // Italian
139 "lt", // Lithuanian
140 "lv", // Latvian
141 "nb", // Norwegian (Bokmal)
142 "nl", // Dutch
143 "pl", // Polish
144 "pt", // Portuguese
145 "ro", // Romanian
146 "sk", // Slovak
147 "sl", // Slovenian
148 "sv", // Swedish
149 "tr", // Turkish
150 };
151
111 } // namespace 152 } // namespace
112 153
154 // Note, that language may be longer than 2 letters. Like "en-US".
155 // but ContainsTwoLetterLanguageCode() compares only 2 first letters.
156 bool InputMethodManagerImpl::IsLanguageFullLatinKeyboard(
157 const std::string& lang) const {
158 return ContainsTwoLetterLanguageCode(full_latin_keyboard_languages_, lang);
159 }
160
161 InputMethodManagerImpl::TwoLetterLanguageCode::TwoLetterLanguageCode(
162 const char* lang)
163 : val(base::ToLowerASCII(lang[0]) * 256 + base::ToLowerASCII(lang[1])) {}
164
113 InputMethodManagerImpl::InputMethodManagerImpl( 165 InputMethodManagerImpl::InputMethodManagerImpl(
114 scoped_ptr<InputMethodDelegate> delegate) 166 scoped_ptr<InputMethodDelegate> delegate)
115 : delegate_(delegate.Pass()), 167 : delegate_(delegate.Pass()),
116 state_(STATE_LOGIN_SCREEN), 168 state_(STATE_LOGIN_SCREEN),
117 util_(delegate_.get(), GetSupportedInputMethods()), 169 util_(delegate_.get(), GetSupportedInputMethods()),
118 component_extension_ime_manager_(new ComponentExtensionIMEManager()), 170 component_extension_ime_manager_(new ComponentExtensionIMEManager()),
119 weak_ptr_factory_(this) { 171 weak_ptr_factory_(this) {
120 IBusDaemonController::GetInstance()->AddObserver(this); 172 IBusDaemonController::GetInstance()->AddObserver(this);
173
174 full_latin_keyboard_languages_.reserve(
175 arraysize(kFullLatinKeyboardLanguageList));
176
177 for (size_t i = 0; i < arraysize(kFullLatinKeyboardLanguageList); ++i) {
178 full_latin_keyboard_languages_.push_back(
179 TwoLetterLanguageCode(kFullLatinKeyboardLanguageList[i]));
180 }
181 std::sort(full_latin_keyboard_languages_.begin(),
182 full_latin_keyboard_languages_.end());
121 } 183 }
122 184
123 InputMethodManagerImpl::~InputMethodManagerImpl() { 185 InputMethodManagerImpl::~InputMethodManagerImpl() {
124 if (ibus_controller_.get()) 186 if (ibus_controller_.get())
125 ibus_controller_->RemoveObserver(this); 187 ibus_controller_->RemoveObserver(this);
126 IBusDaemonController::GetInstance()->RemoveObserver(this); 188 IBusDaemonController::GetInstance()->RemoveObserver(this);
127 if (candidate_window_controller_.get()) { 189 if (candidate_window_controller_.get()) {
128 candidate_window_controller_->RemoveObserver(this); 190 candidate_window_controller_->RemoveObserver(this);
129 candidate_window_controller_->Shutdown(); 191 candidate_window_controller_->Shutdown();
130 } 192 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 } 262 }
201 if (result->empty()) { 263 if (result->empty()) {
202 // Initially |active_input_method_ids_| is empty. browser_tests might take 264 // Initially |active_input_method_ids_| is empty. browser_tests might take
203 // this path. 265 // this path.
204 result->push_back( 266 result->push_back(
205 InputMethodUtil::GetFallbackInputMethodDescriptor()); 267 InputMethodUtil::GetFallbackInputMethodDescriptor());
206 } 268 }
207 return result.Pass(); 269 return result.Pass();
208 } 270 }
209 271
272 const std::vector<std::string>&
273 InputMethodManagerImpl::GetActiveInputMethodIds() const {
274 return active_input_method_ids_;
275 }
276
210 size_t InputMethodManagerImpl::GetNumActiveInputMethods() const { 277 size_t InputMethodManagerImpl::GetNumActiveInputMethods() const {
211 return active_input_method_ids_.size(); 278 return active_input_method_ids_.size();
212 } 279 }
213 280
214 void InputMethodManagerImpl::EnableLayouts(const std::string& language_code, 281 void InputMethodManagerImpl::EnableLayouts(const std::string& language_code,
215 const std::string& initial_layout) { 282 const std::string& initial_layout) {
216 if (state_ == STATE_TERMINATING) 283 if (state_ == STATE_TERMINATING)
217 return; 284 return;
218 285
219 std::vector<std::string> candidates; 286 std::vector<std::string> candidates;
(...skipping 23 matching lines...) Expand all
243 // Not efficient, but should be fine, as the two vectors are very 310 // Not efficient, but should be fine, as the two vectors are very
244 // short (2-5 items). 311 // short (2-5 items).
245 if (!Contains(layouts, candidate)) 312 if (!Contains(layouts, candidate))
246 layouts.push_back(candidate); 313 layouts.push_back(candidate);
247 } 314 }
248 315
249 active_input_method_ids_.swap(layouts); 316 active_input_method_ids_.swap(layouts);
250 ChangeInputMethod(initial_layout); // you can pass empty |initial_layout|. 317 ChangeInputMethod(initial_layout); // you can pass empty |initial_layout|.
251 } 318 }
252 319
320 // Adds new input method to given list.
321 bool InputMethodManagerImpl::EnableInputMethodImpl(
322 const std::string& input_method_id,
323 std::vector<std::string>& new_active_input_method_ids) const {
324 if (!util_.IsValidInputMethodId(input_method_id)) {
325 DVLOG(1) << "EnableInputMethod: Invalid ID: " << input_method_id;
326 return false;
327 }
328
329 if (!Contains(new_active_input_method_ids, input_method_id))
330 new_active_input_method_ids.push_back(input_method_id);
331
332 return true;
333 }
334
335 // 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.
336 void InputMethodManagerImpl::ReconfigureIMFramework() {
337 if (component_extension_ime_manager_->IsInitialized())
338 LoadNecessaryComponentExtensions();
339
340 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.
341 // Do NOT call ibus_controller_->Stop(); here to work around a crash issue
342 // 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.
343 // TODO(yusukes): We can safely call Stop(); here once crosbug.com/26443
344 // is implemented.
345 } else {
346 MaybeInitializeCandidateWindowController();
347 IBusDaemonController::GetInstance()->Start();
348 }
349 }
350
351 bool InputMethodManagerImpl::EnableInputMethod(
352 const std::string& input_method_id) {
353 if (!EnableInputMethodImpl(input_method_id, active_input_method_ids_))
354 return false;
355
356 ReconfigureIMFramework();
357 return true;
358 }
359
253 bool InputMethodManagerImpl::EnableInputMethods( 360 bool InputMethodManagerImpl::EnableInputMethods(
254 const std::vector<std::string>& new_active_input_method_ids) { 361 const std::vector<std::string>& new_active_input_method_ids) {
255 if (state_ == STATE_TERMINATING) 362 if (state_ == STATE_TERMINATING)
256 return false; 363 return false;
257 364
258 // Filter unknown or obsolete IDs. 365 // Filter unknown or obsolete IDs.
259 std::vector<std::string> new_active_input_method_ids_filtered; 366 std::vector<std::string> new_active_input_method_ids_filtered;
260 367
261 for (size_t i = 0; i < new_active_input_method_ids.size(); ++i) { 368 for (size_t i = 0; i < new_active_input_method_ids.size(); ++i)
262 const std::string& input_method_id = new_active_input_method_ids[i]; 369 EnableInputMethodImpl(new_active_input_method_ids[i],
263 if (util_.IsValidInputMethodId(input_method_id)) 370 new_active_input_method_ids_filtered);
264 new_active_input_method_ids_filtered.push_back(input_method_id);
265 else
266 DVLOG(1) << "EnableInputMethods: Invalid ID: " << input_method_id;
267 }
268 371
269 if (new_active_input_method_ids_filtered.empty()) { 372 if (new_active_input_method_ids_filtered.empty()) {
270 DVLOG(1) << "EnableInputMethods: No valid input method ID"; 373 DVLOG(1) << "EnableInputMethods: No valid input method ID";
271 return false; 374 return false;
272 } 375 }
273 376
274 // Copy extension IDs to |new_active_input_method_ids_filtered|. We have to 377 // Copy extension IDs to |new_active_input_method_ids_filtered|. We have to
275 // keep relative order of the extension input method IDs. 378 // keep relative order of the extension input method IDs.
276 for (size_t i = 0; i < active_input_method_ids_.size(); ++i) { 379 for (size_t i = 0; i < active_input_method_ids_.size(); ++i) {
277 const std::string& input_method_id = active_input_method_ids_[i]; 380 const std::string& input_method_id = active_input_method_ids_[i];
278 if (extension_ime_util::IsExtensionIME(input_method_id)) 381 if (extension_ime_util::IsExtensionIME(input_method_id))
279 new_active_input_method_ids_filtered.push_back(input_method_id); 382 new_active_input_method_ids_filtered.push_back(input_method_id);
280 } 383 }
281 active_input_method_ids_.swap(new_active_input_method_ids_filtered); 384 active_input_method_ids_.swap(new_active_input_method_ids_filtered);
282 385
283 if (component_extension_ime_manager_->IsInitialized()) 386 ReconfigureIMFramework();
284 LoadNecessaryComponentExtensions();
285
286 if (ContainOnlyKeyboardLayout(active_input_method_ids_)) {
287 // Do NOT call ibus_controller_->Stop(); here to work around a crash issue
288 // at crosbug.com/27051.
289 // TODO(yusukes): We can safely call Stop(); here once crosbug.com/26443
290 // is implemented.
291 } else {
292 MaybeInitializeCandidateWindowController();
293 IBusDaemonController::GetInstance()->Start();
294 }
295 387
296 // If |current_input_method| is no longer in |active_input_method_ids_|, 388 // If |current_input_method| is no longer in |active_input_method_ids_|,
297 // ChangeInputMethod() picks the first one in |active_input_method_ids_|. 389 // ChangeInputMethod() picks the first one in |active_input_method_ids_|.
298 ChangeInputMethod(current_input_method_.id()); 390 ChangeInputMethod(current_input_method_.id());
299 return true; 391 return true;
300 } 392 }
301 393
302 bool InputMethodManagerImpl::MigrateOldInputMethods( 394 bool InputMethodManagerImpl::MigrateOldInputMethods(
303 std::vector<std::string>* input_method_ids) { 395 std::vector<std::string>* input_method_ids) {
304 bool rewritten = false; 396 bool rewritten = false;
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 else 1030 else
939 DVLOG(1) << "Failed to initialize the candidate window controller"; 1031 DVLOG(1) << "Failed to initialize the candidate window controller";
940 } 1032 }
941 1033
942 bool InputMethodManagerImpl::IsIBusConnectionAlive() { 1034 bool InputMethodManagerImpl::IsIBusConnectionAlive() {
943 return DBusThreadManager::Get() && DBusThreadManager::Get()->GetIBusClient(); 1035 return DBusThreadManager::Get() && DBusThreadManager::Get()->GetIBusClient();
944 } 1036 }
945 1037
946 } // namespace input_method 1038 } // namespace input_method
947 } // namespace chromeos 1039 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698