| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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.h" | 5 #include "chrome/browser/chromeos/input_method/input_method_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include <glib.h> | 9 #include <glib.h> |
| 10 | 10 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 #if !defined(TOUCH_UI) | 33 #if !defined(TOUCH_UI) |
| 34 #include "chrome/browser/chromeos/input_method/candidate_window.h" | 34 #include "chrome/browser/chromeos/input_method/candidate_window.h" |
| 35 #endif | 35 #endif |
| 36 | 36 |
| 37 #include <X11/X.h> // ShiftMask, ControlMask, etc. | 37 #include <X11/X.h> // ShiftMask, ControlMask, etc. |
| 38 #include <X11/Xutil.h> // for XK_* macros. | 38 #include <X11/Xutil.h> // for XK_* macros. |
| 39 | 39 |
| 40 namespace { | 40 namespace { |
| 41 | 41 |
| 42 const char kIBusDaemonPath[] = "/usr/bin/ibus-daemon"; | 42 const char kIBusDaemonPath[] = "/usr/bin/ibus-daemon"; |
| 43 const size_t kMaxInputMethodsPerHotkey = 2; |
| 43 | 44 |
| 44 // For hotkey handling. | 45 // For hotkey handling. |
| 45 enum HotkeyEvents { | 46 enum HotkeyEvent { |
| 47 // Global hotkeys. |
| 46 kPreviousInputMethod = 0, | 48 kPreviousInputMethod = 0, |
| 47 kNextInputMethod, | 49 kNextInputMethod, |
| 50 // Input method specific hotkeys. |
| 51 kJapaneseInputMethod, |
| 52 kJapaneseLayout, |
| 53 kJapaneseInputMethodOrLayout, |
| 54 kKoreanInputMethodOrLayout, |
| 48 }; | 55 }; |
| 49 | 56 |
| 57 // Details of the input method specific hotkeys. |
| 58 const struct InputMethodSpecificHotkeySetting { |
| 59 const char* input_method_ids[kMaxInputMethodsPerHotkey]; |
| 60 int event_id; |
| 61 KeySym keysym; |
| 62 uint32 modifiers; |
| 63 bool trigger_on_press; // if true. false means 'trigger on release'. |
| 64 } kInputMethodSpecificHotkeySettings[] = { |
| 65 { |
| 66 { "mozc-jp" }, |
| 67 kJapaneseInputMethod, |
| 68 XK_Henkan, |
| 69 0x0, |
| 70 true, |
| 71 }, |
| 72 { |
| 73 { "xkb:jp::jpn" }, |
| 74 kJapaneseLayout, |
| 75 XK_Muhenkan, |
| 76 0x0, |
| 77 true, |
| 78 }, |
| 79 { |
| 80 { "mozc-jp", "xkb:jp::jpn" }, |
| 81 kJapaneseInputMethodOrLayout, |
| 82 XK_Zenkaku_Hankaku, |
| 83 0x0, |
| 84 true, |
| 85 }, |
| 86 { |
| 87 { "mozc-hangul", "xkb:kr:kr104:kor" }, |
| 88 kKoreanInputMethodOrLayout, |
| 89 XK_Hangul, |
| 90 0x0, |
| 91 true, |
| 92 }, |
| 93 { |
| 94 { "mozc-hangul", "xkb:kr:kr104:kor" }, |
| 95 kKoreanInputMethodOrLayout, |
| 96 XK_space, |
| 97 ShiftMask, |
| 98 true, |
| 99 }, |
| 100 }; |
| 101 |
| 102 const size_t kInputMethodSpecificHotkeySettingsLen = |
| 103 arraysize(kInputMethodSpecificHotkeySettings); |
| 104 |
| 50 // Finds a property which has |new_prop.key| from |prop_list|, and replaces the | 105 // Finds a property which has |new_prop.key| from |prop_list|, and replaces the |
| 51 // property with |new_prop|. Returns true if such a property is found. | 106 // property with |new_prop|. Returns true if such a property is found. |
| 52 bool FindAndUpdateProperty( | 107 bool FindAndUpdateProperty( |
| 53 const chromeos::input_method::ImeProperty& new_prop, | 108 const chromeos::input_method::ImeProperty& new_prop, |
| 54 chromeos::input_method::ImePropertyList* prop_list) { | 109 chromeos::input_method::ImePropertyList* prop_list) { |
| 55 for (size_t i = 0; i < prop_list->size(); ++i) { | 110 for (size_t i = 0; i < prop_list->size(); ++i) { |
| 56 chromeos::input_method::ImeProperty& prop = prop_list->at(i); | 111 chromeos::input_method::ImeProperty& prop = prop_list->at(i); |
| 57 if (prop.key == new_prop.key) { | 112 if (prop.key == new_prop.key) { |
| 58 const int saved_id = prop.selection_item_id; | 113 const int saved_id = prop.selection_item_id; |
| 59 // Update the list except the radio id. As written in | 114 // Update the list except the radio id. As written in |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 // details. | 152 // details. |
| 98 notification_registrar_.Add(this, content::NOTIFICATION_APP_TERMINATING, | 153 notification_registrar_.Add(this, content::NOTIFICATION_APP_TERMINATING, |
| 99 NotificationService::AllSources()); | 154 NotificationService::AllSources()); |
| 100 | 155 |
| 101 ibus_controller_ = IBusController::Create(); | 156 ibus_controller_ = IBusController::Create(); |
| 102 // The observer should be added before Connect() so we can capture the | 157 // The observer should be added before Connect() so we can capture the |
| 103 // initial connection change. | 158 // initial connection change. |
| 104 ibus_controller_->AddObserver(this); | 159 ibus_controller_->AddObserver(this); |
| 105 ibus_controller_->Connect(); | 160 ibus_controller_->Connect(); |
| 106 | 161 |
| 162 // Initialize extra_hotkeys_. |
| 163 for (size_t i = 0; i < kInputMethodSpecificHotkeySettingsLen; ++i) { |
| 164 const char* const* input_method_ids = |
| 165 kInputMethodSpecificHotkeySettings[i].input_method_ids; |
| 166 for (size_t j = 0; |
| 167 j < kMaxInputMethodsPerHotkey && input_method_ids[j]; |
| 168 ++j) { |
| 169 extra_hotkeys_.insert(std::make_pair( |
| 170 input_method_ids[j], &kInputMethodSpecificHotkeySettings[i])); |
| 171 } |
| 172 } |
| 173 |
| 174 // Register global input method hotkeys: Control+space and Shift+Alt. |
| 107 InitHotkeyManager(); | 175 InitHotkeyManager(); |
| 108 } | 176 } |
| 109 | 177 |
| 110 virtual ~InputMethodManagerImpl() { | 178 virtual ~InputMethodManagerImpl() { |
| 111 hotkey_manager_.RemoveObserver(this); | 179 hotkey_manager_.RemoveObserver(this); |
| 112 ibus_controller_->RemoveObserver(this); | 180 ibus_controller_->RemoveObserver(this); |
| 113 } | 181 } |
| 114 | 182 |
| 115 virtual void AddObserver(InputMethodManager::Observer* observer) { | 183 virtual void AddObserver(InputMethodManager::Observer* observer) { |
| 116 if (!observers_.size()) { | 184 if (!observers_.size()) { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 if (section == language_prefs::kGeneralSectionName && | 290 if (section == language_prefs::kGeneralSectionName && |
| 223 config_name == language_prefs::kPreloadEnginesConfigName && | 291 config_name == language_prefs::kPreloadEnginesConfigName && |
| 224 value.type == ImeConfigValue::kValueTypeStringList) { | 292 value.type == ImeConfigValue::kValueTypeStringList) { |
| 225 active_input_method_ids_ = value.string_list_value; | 293 active_input_method_ids_ = value.string_list_value; |
| 226 | 294 |
| 227 std::map<std::string, InputMethodDescriptor>::const_iterator ix; | 295 std::map<std::string, InputMethodDescriptor>::const_iterator ix; |
| 228 for (ix = extra_input_method_ids_.begin(); | 296 for (ix = extra_input_method_ids_.begin(); |
| 229 ix != extra_input_method_ids_.end(); ++ix) { | 297 ix != extra_input_method_ids_.end(); ++ix) { |
| 230 active_input_method_ids_.push_back(ix->first); | 298 active_input_method_ids_.push_back(ix->first); |
| 231 } | 299 } |
| 300 |
| 301 UpdateInputMethodSpecificHotkeys(); |
| 232 } | 302 } |
| 233 | 303 |
| 234 // Before calling FlushImeConfig(), start input method process if necessary. | 304 // Before calling FlushImeConfig(), start input method process if necessary. |
| 235 MaybeStartInputMethodDaemon(section, config_name, value); | 305 MaybeStartInputMethodDaemon(section, config_name, value); |
| 236 | 306 |
| 237 const ConfigKeyType key = std::make_pair(section, config_name); | 307 const ConfigKeyType key = std::make_pair(section, config_name); |
| 238 current_config_values_[key] = value; | 308 current_config_values_[key] = value; |
| 239 if (ime_connected_) { | 309 if (ime_connected_) { |
| 240 pending_config_requests_[key] = value; | 310 pending_config_requests_[key] = value; |
| 241 FlushImeConfig(); | 311 FlushImeConfig(); |
| 242 } | 312 } |
| 243 | 313 |
| 244 // Stop input method process if necessary. | 314 // Stop input method process if necessary. |
| 245 MaybeStopInputMethodDaemon(section, config_name, value); | 315 MaybeStopInputMethodDaemon(section, config_name, value); |
| 246 // Change the current keyboard layout if necessary. | 316 // Change the current keyboard layout if necessary. |
| 247 MaybeChangeCurrentKeyboardLayout(section, config_name, value); | 317 MaybeChangeCurrentKeyboardLayout(section, config_name, value); |
| 248 return pending_config_requests_.empty(); | 318 return pending_config_requests_.empty(); |
| 249 } | 319 } |
| 250 | 320 |
| 321 // TODO(yusukes): Support input method specific hotkeys. |
| 251 virtual void AddActiveIme(const std::string& id, | 322 virtual void AddActiveIme(const std::string& id, |
| 252 const std::string& name, | 323 const std::string& name, |
| 253 const std::vector<std::string>& layouts, | 324 const std::vector<std::string>& layouts, |
| 254 const std::string& language) { | 325 const std::string& language) { |
| 255 std::string virtual_layouts = JoinString(layouts, ','); | 326 std::string virtual_layouts = JoinString(layouts, ','); |
| 256 | 327 |
| 257 extra_input_method_ids_[id] = | 328 extra_input_method_ids_[id] = |
| 258 InputMethodDescriptor::CreateInputMethodDescriptor( | 329 InputMethodDescriptor::CreateInputMethodDescriptor( |
| 259 id, virtual_layouts, language); | 330 id, virtual_layouts, language); |
| 260 active_input_method_ids_.push_back(id); | 331 active_input_method_ids_.push_back(id); |
| 332 // TODO(yusukes): Call UpdateInputMethodSpecificHotkeys() here once IME |
| 333 // extension supports hotkeys. |
| 261 } | 334 } |
| 262 | 335 |
| 263 virtual void RemoveActiveIme(const std::string& id) { | 336 virtual void RemoveActiveIme(const std::string& id) { |
| 264 std::vector<std::string>::iterator ix = | 337 std::vector<std::string>::iterator ix = |
| 265 std::find(active_input_method_ids_.begin(), | 338 std::find(active_input_method_ids_.begin(), |
| 266 active_input_method_ids_.end(), | 339 active_input_method_ids_.end(), |
| 267 id); | 340 id); |
| 268 if (ix != active_input_method_ids_.end()) { | 341 if (ix != active_input_method_ids_.end()) { |
| 269 active_input_method_ids_.erase(ix); | 342 active_input_method_ids_.erase(ix); |
| 270 } | 343 } |
| 271 | |
| 272 extra_input_method_ids_.erase(id); | 344 extra_input_method_ids_.erase(id); |
| 345 // TODO(yusukes): Call UpdateInputMethodSpecificHotkeys() here once IME |
| 346 // extension supports hotkeys. |
| 273 } | 347 } |
| 274 | 348 |
| 275 virtual bool GetExtraDescriptor(const std::string& id, | 349 virtual bool GetExtraDescriptor(const std::string& id, |
| 276 InputMethodDescriptor* descriptor) { | 350 InputMethodDescriptor* descriptor) { |
| 277 std::map<std::string, InputMethodDescriptor>::const_iterator ix = | 351 std::map<std::string, InputMethodDescriptor>::const_iterator ix = |
| 278 extra_input_method_ids_.find(id); | 352 extra_input_method_ids_.find(id); |
| 279 if (ix != extra_input_method_ids_.end()) { | 353 if (ix != extra_input_method_ids_.end()) { |
| 280 *descriptor = ix->second; | 354 *descriptor = ix->second; |
| 281 return true; | 355 return true; |
| 282 } else { | 356 } else { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 virtual void ClearAllVirtualKeyboardPreferences() { | 416 virtual void ClearAllVirtualKeyboardPreferences() { |
| 343 virtual_keyboard_selector_.ClearAllUserPreferences(); | 417 virtual_keyboard_selector_.ClearAllUserPreferences(); |
| 344 UpdateVirtualKeyboardUI(); | 418 UpdateVirtualKeyboardUI(); |
| 345 } | 419 } |
| 346 | 420 |
| 347 virtual HotkeyManager* GetHotkeyManager() { | 421 virtual HotkeyManager* GetHotkeyManager() { |
| 348 return &hotkey_manager_; | 422 return &hotkey_manager_; |
| 349 } | 423 } |
| 350 | 424 |
| 351 virtual void HotkeyPressed(HotkeyManager* manager, int event_id) { | 425 virtual void HotkeyPressed(HotkeyManager* manager, int event_id) { |
| 352 switch (HotkeyEvents(event_id)) { | 426 const HotkeyEvent event = HotkeyEvent(event_id); |
| 427 switch (event) { |
| 353 case kPreviousInputMethod: | 428 case kPreviousInputMethod: |
| 354 SwitchToPreviousInputMethod(); | 429 SwitchToPreviousInputMethod(); |
| 355 break; | 430 break; |
| 356 case kNextInputMethod: | 431 case kNextInputMethod: |
| 357 SwitchToNextInputMethod(); | 432 SwitchToNextInputMethod(); |
| 358 break; | 433 break; |
| 434 case kJapaneseInputMethod: |
| 435 case kJapaneseLayout: |
| 436 case kJapaneseInputMethodOrLayout: |
| 437 case kKoreanInputMethodOrLayout: |
| 438 SwitchToInputMethod(event); |
| 439 break; |
| 359 } | 440 } |
| 360 // TODO(yusukes): handle engine specific hotkeys like Henkan, Muhenkan, and | |
| 361 // Hangul. | |
| 362 } | 441 } |
| 363 | 442 |
| 364 static InputMethodManagerImpl* GetInstance() { | 443 static InputMethodManagerImpl* GetInstance() { |
| 365 return Singleton<InputMethodManagerImpl, | 444 return Singleton<InputMethodManagerImpl, |
| 366 DefaultSingletonTraits<InputMethodManagerImpl> >::get(); | 445 DefaultSingletonTraits<InputMethodManagerImpl> >::get(); |
| 367 } | 446 } |
| 368 | 447 |
| 369 private: | 448 private: |
| 370 friend struct DefaultSingletonTraits<InputMethodManagerImpl>; | 449 friend struct DefaultSingletonTraits<InputMethodManagerImpl>; |
| 371 | 450 |
| (...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 954 ShiftMask | Mod1Mask, | 1033 ShiftMask | Mod1Mask, |
| 955 false); | 1034 false); |
| 956 hotkey_manager_.AddHotkey(kNextInputMethod, | 1035 hotkey_manager_.AddHotkey(kNextInputMethod, |
| 957 XK_Meta_L, | 1036 XK_Meta_L, |
| 958 ShiftMask | Mod1Mask, | 1037 ShiftMask | Mod1Mask, |
| 959 false); | 1038 false); |
| 960 hotkey_manager_.AddHotkey(kNextInputMethod, | 1039 hotkey_manager_.AddHotkey(kNextInputMethod, |
| 961 XK_Meta_R, | 1040 XK_Meta_R, |
| 962 ShiftMask | Mod1Mask, | 1041 ShiftMask | Mod1Mask, |
| 963 false); | 1042 false); |
| 1043 // Input method specific hotkeys will be added in SetImeConfig(). |
| 964 | 1044 |
| 965 // TODO(yusukes): Support engine specific hotkeys like XK_Henkan, Muhenkan, | |
| 966 // and Hangul. | |
| 967 hotkey_manager_.AddObserver(this); | 1045 hotkey_manager_.AddObserver(this); |
| 968 } | 1046 } |
| 969 | 1047 |
| 1048 void UpdateInputMethodSpecificHotkeys() { |
| 1049 // Remove all input method specific hotkeys first. |
| 1050 for (size_t i = 0; i < kInputMethodSpecificHotkeySettingsLen; ++i) { |
| 1051 hotkey_manager_.RemoveHotkey( |
| 1052 kInputMethodSpecificHotkeySettings[i].event_id); |
| 1053 } |
| 1054 |
| 1055 for (size_t i = 0; i < active_input_method_ids_.size(); ++i) { |
| 1056 typedef std::map<std::string, |
| 1057 const InputMethodSpecificHotkeySetting*>::const_iterator Iter; |
| 1058 std::pair<Iter, Iter> result = extra_hotkeys_.equal_range( |
| 1059 active_input_method_ids_[i]); |
| 1060 for (Iter iter = result.first; iter != result.second; ++iter) { |
| 1061 hotkey_manager_.AddHotkey(iter->second->event_id, |
| 1062 iter->second->keysym, |
| 1063 iter->second->modifiers, |
| 1064 iter->second->trigger_on_press); |
| 1065 } |
| 1066 } |
| 1067 // TODO(yusukes): Check hotkeys for IME extensions. |
| 1068 } |
| 1069 |
| 970 // Handles "Shift+Alt" hotkey. | 1070 // Handles "Shift+Alt" hotkey. |
| 971 void SwitchToNextInputMethod() { | 1071 void SwitchToNextInputMethod() { |
| 972 // Sanity checks. | 1072 // Sanity checks. |
| 973 if (active_input_method_ids_.empty()) { | 1073 if (active_input_method_ids_.empty()) { |
| 974 LOG(ERROR) << "active input method is empty"; | 1074 LOG(ERROR) << "active input method is empty"; |
| 975 return; | 1075 return; |
| 976 } | 1076 } |
| 977 if (current_input_method_.id().empty()) { | 1077 if (current_input_method_.id().empty()) { |
| 978 LOG(ERROR) << "current_input_method_ is unknown"; | 1078 LOG(ERROR) << "current_input_method_ is unknown"; |
| 979 return; | 1079 return; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1012 active_input_method_ids_.end(), | 1112 active_input_method_ids_.end(), |
| 1013 previous_input_method_.id()); | 1113 previous_input_method_.id()); |
| 1014 if (iter == active_input_method_ids_.end()) { | 1114 if (iter == active_input_method_ids_.end()) { |
| 1015 // previous_input_method_ is not supported. | 1115 // previous_input_method_ is not supported. |
| 1016 SwitchToNextInputMethod(); | 1116 SwitchToNextInputMethod(); |
| 1017 } else { | 1117 } else { |
| 1018 ChangeInputMethod(*iter); | 1118 ChangeInputMethod(*iter); |
| 1019 } | 1119 } |
| 1020 } | 1120 } |
| 1021 | 1121 |
| 1122 // Handles input method specific hotkeys like XK_Henkan. |
| 1123 void SwitchToInputMethod(HotkeyEvent event) { |
| 1124 // Sanity check. |
| 1125 if (active_input_method_ids_.empty()) { |
| 1126 LOG(ERROR) << "active input method is empty"; |
| 1127 return; |
| 1128 } |
| 1129 |
| 1130 // Get the list of input method ids for |event_id|. For example, get |
| 1131 // { "mozc-hangul", "xkb:kr:kr104:kor" } for kKoreanInputMethodOrLayout. |
| 1132 const char* const* input_method_ids_to_switch = NULL; |
| 1133 switch (event) { |
| 1134 case kPreviousInputMethod: |
| 1135 case kNextInputMethod: |
| 1136 // These events should not be handled here. |
| 1137 break; |
| 1138 case kJapaneseInputMethod: |
| 1139 case kJapaneseLayout: |
| 1140 case kJapaneseInputMethodOrLayout: |
| 1141 case kKoreanInputMethodOrLayout: |
| 1142 for (size_t i = 0; i < kInputMethodSpecificHotkeySettingsLen; ++i) { |
| 1143 if (event == kInputMethodSpecificHotkeySettings[i].event_id) { |
| 1144 input_method_ids_to_switch = |
| 1145 kInputMethodSpecificHotkeySettings[i].input_method_ids; |
| 1146 } |
| 1147 } |
| 1148 break; |
| 1149 } |
| 1150 if (!input_method_ids_to_switch) { |
| 1151 LOG(ERROR) << "Unknown event: " << event; |
| 1152 return; |
| 1153 } |
| 1154 |
| 1155 // Obtain the intersection of input_method_ids_to_switch and |
| 1156 // active_input_method_ids_. The order of IDs in active_input_method_ids_ is |
| 1157 // preserved. |
| 1158 std::vector<std::string> ids; |
| 1159 for (size_t i = 0; i < kMaxInputMethodsPerHotkey; ++i) { |
| 1160 const char* id = input_method_ids_to_switch[i]; |
| 1161 if (id && std::find(active_input_method_ids_.begin(), |
| 1162 active_input_method_ids_.end(), |
| 1163 id) != active_input_method_ids_.end()) { |
| 1164 ids.push_back(id); |
| 1165 } |
| 1166 } |
| 1167 if (ids.empty()) { |
| 1168 LOG(ERROR) << "No input method for " << event << " is active"; |
| 1169 return; |
| 1170 } |
| 1171 |
| 1172 // If current_input_method_ is not in ids, switch to ids[0]. If |
| 1173 // current_input_method_ is ids[N], switch to ids[N+1]. |
| 1174 std::vector<std::string>::const_iterator iter = |
| 1175 std::find(ids.begin(), ids.end(), current_input_method_.id()); |
| 1176 if (iter != ids.end()) { |
| 1177 ++iter; |
| 1178 } |
| 1179 if (iter == ids.end()) { |
| 1180 iter = ids.begin(); |
| 1181 } |
| 1182 ChangeInputMethod(*iter); |
| 1183 } |
| 1184 |
| 1022 // A reference to the language api, to allow callbacks when the input method | 1185 // A reference to the language api, to allow callbacks when the input method |
| 1023 // status changes. | 1186 // status changes. |
| 1024 IBusController* ibus_controller_; | 1187 IBusController* ibus_controller_; |
| 1025 ObserverList<InputMethodManager::Observer> observers_; | 1188 ObserverList<InputMethodManager::Observer> observers_; |
| 1026 ObserverList<VirtualKeyboardObserver> virtual_keyboard_observers_; | 1189 ObserverList<VirtualKeyboardObserver> virtual_keyboard_observers_; |
| 1027 | 1190 |
| 1028 // The input method which was/is selected. | 1191 // The input method which was/is selected. |
| 1029 InputMethodDescriptor previous_input_method_; | 1192 InputMethodDescriptor previous_input_method_; |
| 1030 InputMethodDescriptor current_input_method_; | 1193 InputMethodDescriptor current_input_method_; |
| 1031 | 1194 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1081 // An object which keeps a list of available virtual keyboards. | 1244 // An object which keeps a list of available virtual keyboards. |
| 1082 VirtualKeyboardSelector virtual_keyboard_selector_; | 1245 VirtualKeyboardSelector virtual_keyboard_selector_; |
| 1083 | 1246 |
| 1084 // The active input method ids cache. | 1247 // The active input method ids cache. |
| 1085 std::vector<std::string> active_input_method_ids_; | 1248 std::vector<std::string> active_input_method_ids_; |
| 1086 | 1249 |
| 1087 // Extra input methods that have been explicitly added to the menu, such as | 1250 // Extra input methods that have been explicitly added to the menu, such as |
| 1088 // those created by extension. | 1251 // those created by extension. |
| 1089 std::map<std::string, InputMethodDescriptor> extra_input_method_ids_; | 1252 std::map<std::string, InputMethodDescriptor> extra_input_method_ids_; |
| 1090 | 1253 |
| 1254 // A muitlmap from input method id to input method specific hotkey |
| 1255 // information. e.g. "mozc-jp" to XK_ZenkakuHankaku, "mozc-jp" to XK_Henkan. |
| 1256 std::multimap<std::string, |
| 1257 const InputMethodSpecificHotkeySetting*> extra_hotkeys_; |
| 1091 // An object which detects Control+space and Shift+Alt key presses. | 1258 // An object which detects Control+space and Shift+Alt key presses. |
| 1092 HotkeyManager hotkey_manager_; | 1259 HotkeyManager hotkey_manager_; |
| 1093 | 1260 |
| 1094 DISALLOW_COPY_AND_ASSIGN(InputMethodManagerImpl); | 1261 DISALLOW_COPY_AND_ASSIGN(InputMethodManagerImpl); |
| 1095 }; | 1262 }; |
| 1096 | 1263 |
| 1097 // static | 1264 // static |
| 1098 InputMethodManager* InputMethodManager::GetInstance() { | 1265 InputMethodManager* InputMethodManager::GetInstance() { |
| 1099 return InputMethodManagerImpl::GetInstance(); | 1266 return InputMethodManagerImpl::GetInstance(); |
| 1100 } | 1267 } |
| 1101 | 1268 |
| 1102 } // namespace input_method | 1269 } // namespace input_method |
| 1103 } // namespace chromeos | 1270 } // namespace chromeos |
| 1104 | 1271 |
| 1105 // Allows InvokeLater without adding refcounting. This class is a Singleton and | 1272 // Allows InvokeLater without adding refcounting. This class is a Singleton and |
| 1106 // won't be deleted until it's last InvokeLater is run. | 1273 // won't be deleted until it's last InvokeLater is run. |
| 1107 DISABLE_RUNNABLE_METHOD_REFCOUNT( | 1274 DISABLE_RUNNABLE_METHOD_REFCOUNT( |
| 1108 chromeos::input_method::InputMethodManagerImpl); | 1275 chromeos::input_method::InputMethodManagerImpl); |
| OLD | NEW |