Index: chrome/browser/chromeos/input_method/xkeyboard.cc |
diff --git a/chrome/browser/chromeos/input_method/xkeyboard.cc b/chrome/browser/chromeos/input_method/xkeyboard.cc |
index 118824ef381969399d57a9076a8d4d679b5665fa..2e5a6088096d80cf56f06cbe2a66b73bfb920e7c 100644 |
--- a/chrome/browser/chromeos/input_method/xkeyboard.cc |
+++ b/chrome/browser/chromeos/input_method/xkeyboard.cc |
@@ -137,19 +137,31 @@ class XKeyboard { |
// Sets the current keyboard layout to |layout_name|. This function does not |
// change the current mapping of the modifier keys. Returns true on success. |
bool SetLayout(const std::string& layout_name) { |
- if (SetLayoutInternal(layout_name, current_modifier_map_)) { |
+ if (SetLayoutInternal(layout_name, current_modifier_map_, false)) { |
current_layout_name_ = layout_name; |
return true; |
} |
return false; |
} |
+ // Sets the current keyboard layout to |current_layout_name_| again. |
+ // See crosbug.com/15851 for details. |
+ bool ReapplyLayout() { |
+ if (current_layout_name_.empty()) { |
+ LOG(ERROR) << "Can't reapply XKB layout: layout unknown"; |
+ return false; |
+ } |
+ VLOG(1) << "ReapplyLayout: setting to " << current_layout_name_; |
+ return SetLayoutInternal( |
+ current_layout_name_, current_modifier_map_, true /* force */); |
+ } |
+ |
// Remaps modifier keys. This function does not change the current keyboard |
// layout. Returns true on success. |
bool RemapModifierKeys(const ModifierMap& modifier_map) { |
const std::string layout_name = current_layout_name_.empty() ? |
kDefaultLayoutName : current_layout_name_; |
- if (SetLayoutInternal(layout_name, modifier_map)) { |
+ if (SetLayoutInternal(layout_name, modifier_map, false)) { |
current_layout_name_ = layout_name; |
current_modifier_map_ = modifier_map; |
return true; |
@@ -210,7 +222,8 @@ class XKeyboard { |
// This function is used by SetLayout() and RemapModifierKeys(). Calls |
// setxkbmap command if needed, and updates the last_full_layout_name_ cache. |
bool SetLayoutInternal(const std::string& layout_name, |
- const ModifierMap& modifier_map) { |
+ const ModifierMap& modifier_map, |
+ bool force) { |
if (!CrosLibrary::Get()->EnsureLoaded()) { |
// We should not try to change a layout inside ui_tests. |
return false; |
@@ -225,7 +238,7 @@ class XKeyboard { |
if (!current_layout_name_.empty()) { |
const std::string current_layout = CreateFullXkbLayoutName( |
current_layout_name_, current_modifier_map_); |
- if (current_layout == layouts_to_set) { |
+ if (!force && (current_layout == layouts_to_set)) { |
DLOG(INFO) << "The requested layout is already set: " << layouts_to_set; |
return true; |
} |
@@ -391,6 +404,10 @@ bool SetCurrentKeyboardLayoutByName(const std::string& layout_name) { |
return XKeyboard::GetInstance()->SetLayout(layout_name); |
} |
+bool ReapplyCurrentKeyboardLayout() { |
+ return XKeyboard::GetInstance()->ReapplyLayout(); |
+} |
+ |
bool RemapModifierKeys(const ModifierMap& modifier_map) { |
return XKeyboard::GetInstance()->RemapModifierKeys(modifier_map); |
} |