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 d07dd190ee316b4f0ef2c93aa6b0512f1d0bff82..fd9338511ee80b054cfe45c170a0a79d8c4f692c 100644 |
--- a/chrome/browser/chromeos/input_method/xkeyboard.cc |
+++ b/chrome/browser/chromeos/input_method/xkeyboard.cc |
@@ -17,7 +17,6 @@ |
#include "base/string_util.h" |
#include "base/stringprintf.h" |
#include "chrome/browser/chromeos/input_method/input_method_util.h" |
-#include "chrome/browser/chromeos/input_method/xkeyboard_data.h" |
#include "content/public/browser/browser_thread.h" |
#include "ui/base/x/x11_util.h" |
@@ -39,13 +38,6 @@ const char kDefaultLayoutName[] = "us"; |
// TODO(yusukes): Use libxkbfile.so instead of the command (crosbug.com/13105) |
const char kSetxkbmapCommand[] = "/usr/bin/setxkbmap"; |
-// See the comment at ModifierKey in the .h file. |
-ModifierKey kCustomizableKeys[] = { |
- kSearchKey, |
- kControlKey, |
- kAltKey |
-}; |
- |
// A string for obtaining a mask value for Num Lock. |
const char kNumLockVirtualModifierString[] = "NumLock"; |
@@ -57,7 +49,6 @@ class XKeyboardImpl : public XKeyboard { |
// Overridden from XKeyboard: |
virtual bool SetCurrentKeyboardLayoutByName( |
const std::string& layout_name) OVERRIDE; |
- virtual bool RemapModifierKeys(const ModifierMap& modifier_map) OVERRIDE; |
virtual bool ReapplyCurrentKeyboardLayout() OVERRIDE; |
virtual void ReapplyCurrentModifierLockStatus() OVERRIDE; |
virtual void SetLockedModifiers( |
@@ -71,38 +62,22 @@ class XKeyboardImpl : public XKeyboard { |
virtual void GetLockedModifiers(bool* out_caps_lock_enabled, |
bool* out_num_lock_enabled) OVERRIDE; |
virtual std::string CreateFullXkbLayoutName( |
- const std::string& layout_name, |
- const ModifierMap& modifire_map) OVERRIDE; |
+ const std::string& layout_name) OVERRIDE; |
private: |
// 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, |
- bool force); |
+ bool SetLayoutInternal(const std::string& layout_name, bool force); |
// Executes 'setxkbmap -layout ...' command asynchronously using a layout name |
// in the |execute_queue_|. Do nothing if the queue is empty. |
// TODO(yusukes): Use libxkbfile.so instead of the command (crosbug.com/13105) |
void MaybeExecuteSetLayoutCommand(); |
- // Returns true if the XKB layout uses the right Alt key for special purposes |
- // like AltGr. |
- bool KeepRightAlt(const std::string& xkb_layout_name) const; |
- |
- // Returns true if the XKB layout uses the CapsLock key for special purposes. |
- // For example, since US Colemak layout uses the key as back space, |
- // KeepCapsLock("us(colemak)") would return true. |
- bool KeepCapsLock(const std::string& xkb_layout_name) const; |
- |
// Returns true if the current thread is the UI thread, or the process is |
// running on Linux. |
bool CurrentlyOnUIThread() const; |
- // Converts |key| to a modifier key name which is used in |
- // /usr/share/X11/xkb/symbols/chromeos. |
- static std::string ModifierKeyToString(ModifierKey key); |
- |
// Called when execve'd setxkbmap process exits. |
static void OnSetLayoutFinish(pid_t pid, int status, XKeyboardImpl* self); |
@@ -114,15 +89,10 @@ class XKeyboardImpl : public XKeyboard { |
bool current_caps_lock_status_; |
// The XKB layout name which we set last time like "us" and "us(dvorak)". |
std::string current_layout_name_; |
- // The mapping of modifier keys we set last time. |
- ModifierMap current_modifier_map_; |
// A queue for executing setxkbmap one by one. |
std::queue<std::string> execute_queue_; |
- std::set<std::string> keep_right_alt_xkb_layout_names_; |
- std::set<std::string> caps_lock_remapped_xkb_layout_names_; |
- |
DISALLOW_COPY_AND_ASSIGN(XKeyboardImpl); |
}; |
@@ -136,25 +106,9 @@ XKeyboardImpl::XKeyboardImpl(const InputMethodUtil& util) |
// code, and then remove the CHECK below. |
CHECK(!is_running_on_chrome_os_ || (num_lock_mask_ == Mod2Mask)); |
GetLockedModifiers(¤t_caps_lock_status_, ¤t_num_lock_status_); |
- |
- for (size_t i = 0; i < arraysize(kCustomizableKeys); ++i) { |
- ModifierKey key = kCustomizableKeys[i]; |
- current_modifier_map_.push_back(ModifierKeyPair(key, key)); |
- } |
- |
- std::string layout; |
- for (size_t i = 0; i < arraysize(kKeepRightAltInputMethods); ++i) { |
- layout = util.GetKeyboardLayoutName(kKeepRightAltInputMethods[i]); |
- keep_right_alt_xkb_layout_names_.insert(layout); |
- } |
- for (size_t i = 0; i < arraysize(kCapsLockRemapped); ++i) { |
- layout = util.GetKeyboardLayoutName(kCapsLockRemapped[i]); |
- caps_lock_remapped_xkb_layout_names_.insert(layout); |
- } |
} |
bool XKeyboardImpl::SetLayoutInternal(const std::string& layout_name, |
- const ModifierMap& modifier_map, |
bool force) { |
if (!is_running_on_chrome_os_) { |
// We should not try to change a layout on Linux or inside ui_tests. Just |
@@ -162,26 +116,19 @@ bool XKeyboardImpl::SetLayoutInternal(const std::string& layout_name, |
return true; |
} |
- const std::string layout_to_set = CreateFullXkbLayoutName( |
- layout_name, modifier_map); |
- if (layout_to_set.empty()) { |
+ const std::string layout_to_set = CreateFullXkbLayoutName(layout_name); |
+ if (layout_to_set.empty()) |
return false; |
- } |
if (!current_layout_name_.empty()) { |
const std::string current_layout = CreateFullXkbLayoutName( |
- current_layout_name_, current_modifier_map_); |
+ current_layout_name_); |
if (!force && (current_layout == layout_to_set)) { |
DVLOG(1) << "The requested layout is already set: " << layout_to_set; |
return true; |
} |
} |
- // Turn off caps lock if there is no kCapsLockKey in the remapped keys. |
- if (!ContainsModifierKeyAsReplacement(modifier_map, kCapsLockKey)) { |
- SetCapsLockEnabled(false); |
- } |
- |
DVLOG(1) << (force ? "Reapply" : "Set") << " layout: " << layout_to_set; |
const bool start_execution = execute_queue_.empty(); |
@@ -191,9 +138,9 @@ bool XKeyboardImpl::SetLayoutInternal(const std::string& layout_name, |
// layout name to the queue. setxkbmap command for the layout will be called |
// via OnSetLayoutFinish() callback later. |
execute_queue_.push(layout_to_set); |
- if (start_execution) { |
+ if (start_execution) |
MaybeExecuteSetLayoutCommand(); |
- } |
+ |
return true; |
} |
@@ -201,9 +148,8 @@ bool XKeyboardImpl::SetLayoutInternal(const std::string& layout_name, |
// in the |execute_queue_|. Do nothing if the queue is empty. |
// TODO(yusukes): Use libxkbfile.so instead of the command (crosbug.com/13105) |
void XKeyboardImpl::MaybeExecuteSetLayoutCommand() { |
- if (execute_queue_.empty()) { |
+ if (execute_queue_.empty()) |
return; |
- } |
const std::string layout_to_set = execute_queue_.front(); |
std::vector<std::string> argv; |
@@ -248,9 +194,8 @@ unsigned int XKeyboardImpl::GetNumLockMask() { |
unsigned int real_mask = kBadMask; |
XkbDescPtr xkb_desc = |
XkbGetKeyboard(ui::GetXDisplay(), XkbAllComponentsMask, XkbUseCoreKbd); |
- if (!xkb_desc) { |
+ if (!xkb_desc) |
return kBadMask; |
- } |
if (xkb_desc->dpy && xkb_desc->names && xkb_desc->names->vmods) { |
const std::string string_to_find(kNumLockVirtualModifierString); |
@@ -279,28 +224,23 @@ void XKeyboardImpl::GetLockedModifiers(bool* out_caps_lock_enabled, |
if (out_num_lock_enabled && !num_lock_mask_) { |
DVLOG(1) << "Cannot get locked modifiers. Num Lock mask unknown."; |
- if (out_caps_lock_enabled) { |
+ if (out_caps_lock_enabled) |
*out_caps_lock_enabled = false; |
- } |
- if (out_num_lock_enabled) { |
+ if (out_num_lock_enabled) |
*out_num_lock_enabled = false; |
- } |
return; |
} |
XkbStateRec status; |
XkbGetState(ui::GetXDisplay(), XkbUseCoreKbd, &status); |
- if (out_caps_lock_enabled) { |
+ if (out_caps_lock_enabled) |
*out_caps_lock_enabled = status.locked_mods & LockMask; |
- } |
- if (out_num_lock_enabled) { |
+ if (out_num_lock_enabled) |
*out_num_lock_enabled = status.locked_mods & num_lock_mask_; |
- } |
} |
std::string XKeyboardImpl::CreateFullXkbLayoutName( |
- const std::string& layout_name, |
- const ModifierMap& modifier_map) { |
+ const std::string& layout_name) { |
static const char kValidLayoutNameCharacters[] = |
"abcdefghijklmnopqrstuvwxyz0123456789()-_"; |
@@ -315,56 +255,10 @@ std::string XKeyboardImpl::CreateFullXkbLayoutName( |
return ""; |
} |
- std::string use_search_key_as_str; |
- std::string use_left_control_key_as_str; |
- std::string use_left_alt_key_as_str; |
- |
- for (size_t i = 0; i < modifier_map.size(); ++i) { |
- std::string* target = NULL; |
- switch (modifier_map[i].original) { |
- case kSearchKey: |
- target = &use_search_key_as_str; |
- break; |
- case kControlKey: |
- target = &use_left_control_key_as_str; |
- break; |
- case kAltKey: |
- target = &use_left_alt_key_as_str; |
- break; |
- default: |
- break; |
- } |
- if (!target) { |
- DVLOG(1) << "We don't support remaping " |
- << ModifierKeyToString(modifier_map[i].original); |
- return ""; |
- } |
- if (!(target->empty())) { |
- DVLOG(1) << ModifierKeyToString(modifier_map[i].original) |
- << " appeared twice"; |
- return ""; |
- } |
- *target = ModifierKeyToString(modifier_map[i].replacement); |
- } |
- |
- if (use_search_key_as_str.empty() || |
- use_left_control_key_as_str.empty() || |
- use_left_alt_key_as_str.empty()) { |
- DVLOG(1) << "Incomplete ModifierMap: size=" << modifier_map.size(); |
- return ""; |
- } |
- |
- if (KeepCapsLock(layout_name)) { |
- use_search_key_as_str = ModifierKeyToString(kSearchKey); |
- } |
- |
+ // TODO(yusukes): Remove "+chromeos(...)". |
std::string full_xkb_layout_name = |
- base::StringPrintf("%s+chromeos(%s_%s_%s%s)", |
- layout_name.c_str(), |
- use_search_key_as_str.c_str(), |
- use_left_control_key_as_str.c_str(), |
- use_left_alt_key_as_str.c_str(), |
- (KeepRightAlt(layout_name) ? "_keepralt" : "")); |
+ base::StringPrintf("%s+chromeos(search_leftcontrol_leftalt_keepralt)", |
+ layout_name.c_str()); |
return full_xkb_layout_name; |
} |
@@ -390,9 +284,8 @@ void XKeyboardImpl::SetLockedModifiers(ModifierLockStatus new_caps_lock_status, |
current_num_lock_status_ = (new_num_lock_status == kEnableLock); |
} |
- if (affect_mask) { |
+ if (affect_mask) |
XkbLockModifiers(ui::GetXDisplay(), XkbUseCoreKbd, affect_mask, value_mask); |
- } |
} |
void XKeyboardImpl::SetNumLockEnabled(bool enable_num_lock) { |
@@ -407,7 +300,7 @@ void XKeyboardImpl::SetCapsLockEnabled(bool enable_caps_lock) { |
bool XKeyboardImpl::SetCurrentKeyboardLayoutByName( |
const std::string& layout_name) { |
- if (SetLayoutInternal(layout_name, current_modifier_map_, false)) { |
+ if (SetLayoutInternal(layout_name, false)) { |
current_layout_name_ = layout_name; |
return true; |
} |
@@ -419,8 +312,7 @@ bool XKeyboardImpl::ReapplyCurrentKeyboardLayout() { |
DVLOG(1) << "Can't reapply XKB layout: layout unknown"; |
return false; |
} |
- return SetLayoutInternal( |
- current_layout_name_, current_modifier_map_, true /* force */); |
+ return SetLayoutInternal(current_layout_name_, true /* force */); |
} |
void XKeyboardImpl::ReapplyCurrentModifierLockStatus() { |
@@ -428,25 +320,6 @@ void XKeyboardImpl::ReapplyCurrentModifierLockStatus() { |
current_num_lock_status_ ? kEnableLock : kDisableLock); |
} |
-bool XKeyboardImpl::RemapModifierKeys(const ModifierMap& modifier_map) { |
- const std::string layout_name = current_layout_name_.empty() ? |
- kDefaultLayoutName : current_layout_name_; |
- if (SetLayoutInternal(layout_name, modifier_map, false)) { |
- current_layout_name_ = layout_name; |
- current_modifier_map_ = modifier_map; |
- return true; |
- } |
- return false; |
-} |
- |
-bool XKeyboardImpl::KeepRightAlt(const std::string& xkb_layout_name) const { |
- return keep_right_alt_xkb_layout_names_.count(xkb_layout_name) > 0; |
-} |
- |
-bool XKeyboardImpl::KeepCapsLock(const std::string& xkb_layout_name) const { |
- return caps_lock_remapped_xkb_layout_names_.count(xkb_layout_name) > 0; |
-} |
- |
bool XKeyboardImpl::CurrentlyOnUIThread() const { |
// It seems that the tot Chrome (as of Mar 7 2012) does not allow browser |
// tests to call BrowserThread::CurrentlyOn(). It ends up a CHECK failure: |
@@ -454,32 +327,12 @@ bool XKeyboardImpl::CurrentlyOnUIThread() const { |
// Check failed: constructor_message_loop_.get(). |
// For now, just allow unit/browser tests to call any functions in this class. |
// TODO(yusukes): Stop special-casing browser_tests and remove this function. |
- if (!is_running_on_chrome_os_) { |
+ if (!is_running_on_chrome_os_) |
return true; |
- } |
return BrowserThread::CurrentlyOn(BrowserThread::UI); |
} |
// static |
-std::string XKeyboardImpl::ModifierKeyToString(ModifierKey key) { |
- switch (key) { |
- case kSearchKey: |
- return "search"; |
- case kControlKey: |
- return "leftcontrol"; |
- case kAltKey: |
- return "leftalt"; |
- case kVoidKey: |
- return "disabled"; |
- case kCapsLockKey: |
- return "capslock"; |
- case kNumModifierKeys: |
- break; |
- } |
- return ""; |
-} |
- |
-// static |
void XKeyboardImpl::OnSetLayoutFinish(pid_t pid, |
int status, |
XKeyboardImpl* self) { |
@@ -499,11 +352,10 @@ void XKeyboardImpl::OnSetLayoutFinish(pid_t pid, |
// static |
bool XKeyboard::SetAutoRepeatEnabled(bool enabled) { |
CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (enabled) { |
+ if (enabled) |
XAutoRepeatOn(ui::GetXDisplay()); |
- } else { |
+ else |
XAutoRepeatOff(ui::GetXDisplay()); |
- } |
DVLOG(1) << "Set auto-repeat mode to: " << (enabled ? "on" : "off"); |
return true; |
} |
@@ -538,18 +390,6 @@ bool XKeyboard::GetAutoRepeatRateForTesting(AutoRepeatRate* out_rate) { |
} |
// static |
-bool XKeyboard::ContainsModifierKeyAsReplacement( |
- const ModifierMap& modifier_map, |
- ModifierKey key) { |
- for (size_t i = 0; i < modifier_map.size(); ++i) { |
- if (modifier_map[i].replacement == key) { |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-// static |
XKeyboard* XKeyboard::Create(const InputMethodUtil& util) { |
return new XKeyboardImpl(util); |
} |