summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chromeos/preferences.cc6
-rw-r--r--chrome/browser/chromeos/status/language_menu_button.cc55
-rw-r--r--chrome/browser/chromeos/status/language_menu_button.h15
-rw-r--r--chrome/browser/sync/glue/synchronized_preferences.h2
-rw-r--r--chrome/common/pref_names.cc8
-rw-r--r--chrome/common/pref_names.h2
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[];