diff options
-rw-r--r-- | chrome/browser/chromeos/preferences.cc | 6 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/language_menu_button.cc | 55 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/language_menu_button.h | 15 | ||||
-rw-r--r-- | chrome/browser/sync/glue/synchronized_preferences.h | 2 | ||||
-rw-r--r-- | chrome/common/pref_names.cc | 8 | ||||
-rw-r--r-- | chrome/common/pref_names.h | 2 |
6 files changed, 79 insertions, 9 deletions
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc index 702aa4b..0cee1dce 100644 --- a/chrome/browser/chromeos/preferences.cc +++ b/chrome/browser/chromeos/preferences.cc @@ -25,6 +25,8 @@ void Preferences::RegisterUserPrefs(PrefService* prefs) { prefs->RegisterBooleanPref(prefs::kVertEdgeScrollEnabled, false); prefs->RegisterIntegerPref(prefs::kTouchpadSpeedFactor, 9); prefs->RegisterIntegerPref(prefs::kTouchpadSensitivity, 5); + prefs->RegisterStringPref(prefs::kLanguageCurrentInputMethod, L""); + prefs->RegisterStringPref(prefs::kLanguagePreviousInputMethod, L""); prefs->RegisterStringPref(prefs::kLanguageHotkeyNextEngineInMenu, kHotkeyNextEngineInMenu); prefs->RegisterStringPref(prefs::kLanguageHotkeyPreviousEngine, @@ -143,6 +145,10 @@ void Preferences::NotifyPrefChanged(const std::wstring* pref_name) { PARAM_RANGE_TOUCH_SENSITIVITY, sensitivity_.GetValue()); } + + // We don't handle prefs::kLanguageCurrentInputMethod and PreviousInputMethod + // here. + if (!pref_name || *pref_name == prefs::kLanguageHotkeyNextEngineInMenu) { SetLanguageConfigStringListAsCSV(kHotKeySectionName, kNextEngineInMenuConfigName, diff --git a/chrome/browser/chromeos/status/language_menu_button.cc b/chrome/browser/chromeos/status/language_menu_button.cc index 29f2858..e45dcf5 100644 --- a/chrome/browser/chromeos/status/language_menu_button.cc +++ b/chrome/browser/chromeos/status/language_menu_button.cc @@ -14,6 +14,7 @@ #include "chrome/browser/chromeos/cros/cros_library.h" #include "chrome/browser/chromeos/status/language_menu_l10n_util.h" #include "chrome/browser/chromeos/status/status_area_host.h" +#include "chrome/browser/profile.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" @@ -116,6 +117,15 @@ std::wstring FormatInputLanguage( return formatted; } +// Returns PrefService object associated with |host|. Returns NULL if we are NOT +// within a browser. +PrefService* GetPrefService(chromeos::StatusAreaHost* host) { + if (host->GetProfile()) { + return host->GetProfile()->GetPrefs(); + } + return NULL; +} + } // namespace namespace chromeos { @@ -150,14 +160,34 @@ LanguageMenuButton::LanguageMenuButton(StatusAreaHost* host) RebuildModel(); // Grab the real estate. UpdateIcon(kSpacer, L"" /* no tooltip */); - // Display the default input method name. - const std::wstring name - = FormatInputLanguage(input_method_descriptors_->at(0), false, false); - // TODO(yusukes): The assumption that the input method at index 0 is enabled - // by default is not always true. We should fix the logic once suzhe's patches - // for issue 2627 (get/set ibus state without focus) are submitted. - UpdateIcon(name, L"" /* no tooltip */); - CrosLibrary::Get()->GetLanguageLibrary()->AddObserver(this); + + // Draw the default indicator "EN". The default indicator "EN" is used when + // |pref_service| is not available (for example, unit tests) or |pref_service| + // is available, but Chrome preferences are not available (for example, + // initial OS boot). + UpdateIcon(L"EN", L""); + + // Sync current and previous input methods on Chrome prefs with ibus-daemon. + // InputMethodChanged() will be called soon and the indicator will be updated. + LanguageLibrary* library = CrosLibrary::Get()->GetLanguageLibrary(); + PrefService* pref_service = GetPrefService(host_); + if (pref_service) { + previous_input_method_pref_.Init( + prefs::kLanguagePreviousInputMethod, pref_service, this); + const std::wstring& previous_input_method_id = + previous_input_method_pref_.GetValue(); + if (!previous_input_method_id.empty()) { + library->ChangeInputMethod(WideToUTF8(previous_input_method_id)); + } + current_input_method_pref_.Init( + prefs::kLanguageCurrentInputMethod, pref_service, this); + const std::wstring& current_input_method_id = + current_input_method_pref_.GetValue(); + if (!current_input_method_id.empty()) { + library->ChangeInputMethod(WideToUTF8(current_input_method_id)); + } + } + library->AddObserver(this); } LanguageMenuButton::~LanguageMenuButton() { @@ -376,6 +406,15 @@ void LanguageMenuButton::InputMethodChanged(LanguageLibrary* obj) { const std::wstring name = FormatInputLanguage(input_method, false, false); const std::wstring tooltip = FormatInputLanguage(input_method, true, true); UpdateIcon(name, tooltip); + // Update Chrome prefs as well. + if (GetPrefService(host_)) { + const std::wstring& previous_input_method_id = + current_input_method_pref_.GetValue(); + // Sometimes (e.g. initial boot) |previous_input_method_id| is an empty + // string. + previous_input_method_pref_.SetValue(previous_input_method_id); + current_input_method_pref_.SetValue(UTF8ToWide(input_method.id)); + } } void LanguageMenuButton::ImePropertiesChanged(LanguageLibrary* obj) { diff --git a/chrome/browser/chromeos/status/language_menu_button.h b/chrome/browser/chromeos/status/language_menu_button.h index c044c5f..525bd24 100644 --- a/chrome/browser/chromeos/status/language_menu_button.h +++ b/chrome/browser/chromeos/status/language_menu_button.h @@ -8,6 +8,9 @@ #include "app/menus/simple_menu_model.h" #include "chrome/browser/chromeos/cros/language_library.h" #include "chrome/browser/chromeos/status/status_area_button.h" +#include "chrome/browser/pref_member.h" +#include "chrome/common/notification_observer.h" +#include "chrome/common/notification_service.h" #include "views/controls/menu/menu_2.h" #include "views/controls/menu/view_menu_delegate.h" @@ -22,7 +25,8 @@ class StatusAreaHost; class LanguageMenuButton : public views::MenuButton, public views::ViewMenuDelegate, public menus::MenuModel, - public LanguageLibrary::Observer { + public LanguageLibrary::Observer, + public NotificationObserver { public: explicit LanguageMenuButton(StatusAreaHost* host); virtual ~LanguageMenuButton(); @@ -50,6 +54,11 @@ class LanguageMenuButton : public views::MenuButton, virtual void ImePropertiesChanged(LanguageLibrary* obj); virtual void FocusChanged(LanguageLibrary* obj); + // NotificationObserver implementation. + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) {} + protected: // views::View implementation. virtual void LocaleChanged(); @@ -81,6 +90,10 @@ class LanguageMenuButton : public views::MenuButton, // The current input method list. scoped_ptr<InputMethodDescriptors> input_method_descriptors_; + // Objects for reading/writing the Chrome prefs. + StringPrefMember previous_input_method_pref_; + StringPrefMember current_input_method_pref_; + // Languages that need the input method name displayed. std::set<std::string> need_method_name_; diff --git a/chrome/browser/sync/glue/synchronized_preferences.h b/chrome/browser/sync/glue/synchronized_preferences.h index 1870813..3ec3946 100644 --- a/chrome/browser/sync/glue/synchronized_preferences.h +++ b/chrome/browser/sync/glue/synchronized_preferences.h @@ -132,6 +132,8 @@ static const wchar_t* kSynchronizedPreferences[] = { // prefs::kLanguageHotkeyPreviousEngine, // prefs::kLanguagePinyinDoublePinyinSchema, // prefs::kLanguagePinyinLookupTablePageSize, + // + // We don't sync prefs::kLanguageCurrentInputMethod and PreviousInputMethod. #endif }; diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 99998fb8..44cfe57 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc @@ -194,6 +194,14 @@ const wchar_t kTouchpadSpeedFactor[] = L"settings.touchpad.speed_factor"; // A integer pref for the touchpad sensitivity. const wchar_t kTouchpadSensitivity[] = L"settings.touchpad.sensitivity"; +// A string pref set to the current input method. +const wchar_t kLanguageCurrentInputMethod[] = + L"settings.language.current_input_method"; + +// A string pref set to the previous input method. +const wchar_t kLanguagePreviousInputMethod[] = + L"settings.language.previous_input_method"; + // A string pref (comma-separated list) set to the "next engine in menu" // hot-key lists. const wchar_t kLanguageHotkeyNextEngineInMenu[] = diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index cbd9f18..86dce96 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h @@ -73,6 +73,8 @@ extern const wchar_t kTapToClickEnabled[]; extern const wchar_t kVertEdgeScrollEnabled[]; extern const wchar_t kTouchpadSpeedFactor[]; extern const wchar_t kTouchpadSensitivity[]; +extern const wchar_t kLanguageCurrentInputMethod[]; +extern const wchar_t kLanguagePreviousInputMethod[]; extern const wchar_t kLanguageHotkeyNextEngineInMenu[]; extern const wchar_t kLanguageHotkeyPreviousEngine[]; extern const wchar_t kLanguagePreloadEngines[]; |