| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/cros/input_method_library.h" | 5 #include "chrome/browser/chromeos/cros/input_method_library.h" |
| 6 | 6 |
| 7 #include <glib.h> | 7 #include <glib.h> |
| 8 #include <signal.h> | 8 #include <signal.h> |
| 9 | 9 |
| 10 #include "unicode/uloc.h" | 10 #include "unicode/uloc.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 | 43 |
| 44 class InputMethodLibraryImpl : public InputMethodLibrary { | 44 class InputMethodLibraryImpl : public InputMethodLibrary { |
| 45 public: | 45 public: |
| 46 InputMethodLibraryImpl() | 46 InputMethodLibraryImpl() |
| 47 : input_method_status_connection_(NULL), | 47 : input_method_status_connection_(NULL), |
| 48 previous_input_method_("", "", "", ""), | 48 previous_input_method_("", "", "", ""), |
| 49 current_input_method_("", "", "", ""), | 49 current_input_method_("", "", "", ""), |
| 50 ime_running_(false), | 50 ime_running_(false), |
| 51 ime_connected_(false), | 51 ime_connected_(false), |
| 52 defer_ime_startup_(false), | 52 defer_ime_startup_(false), |
| 53 active_input_method_(kHardwareKeyboardLayout), | 53 active_input_method_(language_prefs::kHardwareKeyboardLayout), |
| 54 need_input_method_set_(false), | 54 need_input_method_set_(false), |
| 55 ime_handle_(0), | 55 ime_handle_(0), |
| 56 candidate_window_handle_(0), | 56 candidate_window_handle_(0), |
| 57 failure_count_(0) { | 57 failure_count_(0) { |
| 58 scoped_ptr<InputMethodDescriptors> input_method_descriptors( | 58 scoped_ptr<InputMethodDescriptors> input_method_descriptors( |
| 59 CreateFallbackInputMethodDescriptors()); | 59 CreateFallbackInputMethodDescriptors()); |
| 60 current_input_method_ = input_method_descriptors->at(0); | 60 current_input_method_ = input_method_descriptors->at(0); |
| 61 } | 61 } |
| 62 | 62 |
| 63 ~InputMethodLibraryImpl() { | 63 ~InputMethodLibraryImpl() { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 } | 98 } |
| 99 if (!result || result->empty()) { | 99 if (!result || result->empty()) { |
| 100 result = CreateFallbackInputMethodDescriptors(); | 100 result = CreateFallbackInputMethodDescriptors(); |
| 101 } | 101 } |
| 102 return result; | 102 return result; |
| 103 } | 103 } |
| 104 | 104 |
| 105 void ChangeInputMethod(const std::string& input_method_id) { | 105 void ChangeInputMethod(const std::string& input_method_id) { |
| 106 active_input_method_ = input_method_id; | 106 active_input_method_ = input_method_id; |
| 107 if (EnsureLoadedAndStarted()) { | 107 if (EnsureLoadedAndStarted()) { |
| 108 if (input_method_id != kHardwareKeyboardLayout) { | 108 if (input_method_id != language_prefs::kHardwareKeyboardLayout) { |
| 109 StartInputMethodProcesses(); | 109 StartInputMethodProcesses(); |
| 110 } | 110 } |
| 111 chromeos::ChangeInputMethod( | 111 chromeos::ChangeInputMethod( |
| 112 input_method_status_connection_, input_method_id.c_str()); | 112 input_method_status_connection_, input_method_id.c_str()); |
| 113 } | 113 } |
| 114 } | 114 } |
| 115 | 115 |
| 116 void SetImePropertyActivated(const std::string& key, bool activated) { | 116 void SetImePropertyActivated(const std::string& key, bool activated) { |
| 117 DCHECK(!key.empty()); | 117 DCHECK(!key.empty()); |
| 118 if (EnsureLoadedAndStarted()) { | 118 if (EnsureLoadedAndStarted()) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 | 164 |
| 165 virtual const ImePropertyList& current_ime_properties() const { | 165 virtual const ImePropertyList& current_ime_properties() const { |
| 166 return current_ime_properties_; | 166 return current_ime_properties_; |
| 167 } | 167 } |
| 168 | 168 |
| 169 private: | 169 private: |
| 170 void MaybeUpdateImeState( | 170 void MaybeUpdateImeState( |
| 171 const char* section, | 171 const char* section, |
| 172 const char* config_name, | 172 const char* config_name, |
| 173 const ImeConfigValue& value) { | 173 const ImeConfigValue& value) { |
| 174 if (!strcmp(kGeneralSectionName, section) && | 174 if (!strcmp(language_prefs::kGeneralSectionName, section) && |
| 175 !strcmp(kPreloadEnginesConfigName, config_name)) { | 175 !strcmp(language_prefs::kPreloadEnginesConfigName, config_name)) { |
| 176 if (EnsureLoadedAndStarted()) { | 176 if (EnsureLoadedAndStarted()) { |
| 177 if (value.type == ImeConfigValue::kValueTypeStringList && | 177 if (value.type == ImeConfigValue::kValueTypeStringList && |
| 178 value.string_list_value.size() == 1 && | 178 value.string_list_value.size() == 1 && |
| 179 value.string_list_value[0] == kHardwareKeyboardLayout) { | 179 value.string_list_value[0] == |
| 180 language_prefs::kHardwareKeyboardLayout) { |
| 180 StopInputMethodProcesses(); | 181 StopInputMethodProcesses(); |
| 181 } else if (!defer_ime_startup_) { | 182 } else if (!defer_ime_startup_) { |
| 182 StartInputMethodProcesses(); | 183 StartInputMethodProcesses(); |
| 183 } | 184 } |
| 184 chromeos::SetActiveInputMethods(input_method_status_connection_, value); | 185 chromeos::SetActiveInputMethods(input_method_status_connection_, value); |
| 185 } | 186 } |
| 186 } | 187 } |
| 187 } | 188 } |
| 188 | 189 |
| 189 void FlushImeConfig() { | 190 void FlushImeConfig() { |
| 190 bool active_input_methods_are_changed = false; | 191 bool active_input_methods_are_changed = false; |
| 191 bool completed = false; | 192 bool completed = false; |
| 192 if (EnsureLoadedAndStarted()) { | 193 if (EnsureLoadedAndStarted()) { |
| 193 InputMethodConfigRequests::iterator iter = | 194 InputMethodConfigRequests::iterator iter = |
| 194 pending_config_requests_.begin(); | 195 pending_config_requests_.begin(); |
| 195 while (iter != pending_config_requests_.end()) { | 196 while (iter != pending_config_requests_.end()) { |
| 196 const std::string& section = iter->first.first; | 197 const std::string& section = iter->first.first; |
| 197 const std::string& config_name = iter->first.second; | 198 const std::string& config_name = iter->first.second; |
| 198 const ImeConfigValue& value = iter->second; | 199 const ImeConfigValue& value = iter->second; |
| 199 if (chromeos::SetImeConfig(input_method_status_connection_, | 200 if (chromeos::SetImeConfig(input_method_status_connection_, |
| 200 section.c_str(), | 201 section.c_str(), |
| 201 config_name.c_str(), | 202 config_name.c_str(), |
| 202 value)) { | 203 value)) { |
| 203 // Check if it's a change in active input methods. | 204 // Check if it's a change in active input methods. |
| 204 if (config_name == kPreloadEnginesConfigName) { | 205 if (config_name == language_prefs::kPreloadEnginesConfigName) { |
| 205 active_input_methods_are_changed = true; | 206 active_input_methods_are_changed = true; |
| 206 } | 207 } |
| 207 // Successfully sent. Remove the command and proceed to the next one. | 208 // Successfully sent. Remove the command and proceed to the next one. |
| 208 pending_config_requests_.erase(iter++); | 209 pending_config_requests_.erase(iter++); |
| 209 } else { | 210 } else { |
| 210 // If SetImeConfig() fails, subsequent calls will likely fail. | 211 // If SetImeConfig() fails, subsequent calls will likely fail. |
| 211 break; | 212 break; |
| 212 } | 213 } |
| 213 } | 214 } |
| 214 if (pending_config_requests_.empty()) { | 215 if (pending_config_requests_.empty()) { |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 library->candidate_window_handle_ = 0; | 444 library->candidate_window_handle_ = 0; |
| 444 } | 445 } |
| 445 | 446 |
| 446 library->MaybeLaunchIme(); | 447 library->MaybeLaunchIme(); |
| 447 } | 448 } |
| 448 | 449 |
| 449 void StopInputMethodProcesses() { | 450 void StopInputMethodProcesses() { |
| 450 ime_running_ = false; | 451 ime_running_ = false; |
| 451 if (ime_handle_) { | 452 if (ime_handle_) { |
| 452 chromeos::ChangeInputMethod(input_method_status_connection_, | 453 chromeos::ChangeInputMethod(input_method_status_connection_, |
| 453 kHardwareKeyboardLayout); | 454 language_prefs::kHardwareKeyboardLayout); |
| 454 kill(ime_handle_, SIGTERM); | 455 kill(ime_handle_, SIGTERM); |
| 455 ime_handle_ = 0; | 456 ime_handle_ = 0; |
| 456 } | 457 } |
| 457 if (candidate_window_handle_) { | 458 if (candidate_window_handle_) { |
| 458 kill(candidate_window_handle_, SIGTERM); | 459 kill(candidate_window_handle_, SIGTERM); |
| 459 candidate_window_handle_ = 0; | 460 candidate_window_handle_ = 0; |
| 460 } | 461 } |
| 461 } | 462 } |
| 462 | 463 |
| 463 void SetDeferImeStartup(bool defer) { | 464 void SetDeferImeStartup(bool defer) { |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 return new InputMethodLibraryStubImpl(); | 714 return new InputMethodLibraryStubImpl(); |
| 714 else | 715 else |
| 715 return new InputMethodLibraryImpl(); | 716 return new InputMethodLibraryImpl(); |
| 716 } | 717 } |
| 717 | 718 |
| 718 } // namespace chromeos | 719 } // namespace chromeos |
| 719 | 720 |
| 720 // Allows InvokeLater without adding refcounting. This class is a Singleton and | 721 // Allows InvokeLater without adding refcounting. This class is a Singleton and |
| 721 // won't be deleted until it's last InvokeLater is run. | 722 // won't be deleted until it's last InvokeLater is run. |
| 722 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::InputMethodLibraryImpl); | 723 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::InputMethodLibraryImpl); |
| OLD | NEW |