| 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);
|
| }
|
|
|