Index: chromeos/ime/xkeyboard.cc |
diff --git a/chromeos/ime/xkeyboard.cc b/chromeos/ime/xkeyboard.cc |
index a34413862bfa3ae535251437fb69ff9df42ee4dc..7714e20b241ed9dc6480628dcc211be8c0552e6f 100644 |
--- a/chromeos/ime/xkeyboard.cc |
+++ b/chromeos/ime/xkeyboard.cc |
@@ -74,20 +74,20 @@ class XKeyboardImpl : public XKeyboard { |
const std::string& layout_name) OVERRIDE; |
virtual bool ReapplyCurrentKeyboardLayout() OVERRIDE; |
virtual void ReapplyCurrentModifierLockStatus() OVERRIDE; |
- virtual void SetLockedModifiers( |
- ModifierLockStatus new_caps_lock_status, |
- ModifierLockStatus new_num_lock_status) OVERRIDE; |
- virtual void SetNumLockEnabled(bool enable_num_lock) OVERRIDE; |
+ virtual void DisableNumLock() OVERRIDE; |
virtual void SetCapsLockEnabled(bool enable_caps_lock) OVERRIDE; |
- virtual bool NumLockIsEnabled() OVERRIDE; |
virtual bool CapsLockIsEnabled() OVERRIDE; |
- virtual unsigned int GetNumLockMask() OVERRIDE; |
- virtual void GetLockedModifiers(bool* out_caps_lock_enabled, |
- bool* out_num_lock_enabled) OVERRIDE; |
virtual bool SetAutoRepeatEnabled(bool enabled) OVERRIDE; |
virtual bool SetAutoRepeatRate(const AutoRepeatRate& rate) OVERRIDE; |
private: |
+ // Returns a mask for Num Lock (e.g. 1U << 4). Returns 0 on error. |
+ unsigned int GetNumLockMask(); |
+ |
+ // Sets the caps-lock status. Note that calling this function always disables |
+ // the num-lock. |
+ void SetLockedModifiers(bool caps_lock_enabled); |
+ |
// 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, bool force); |
@@ -106,9 +106,9 @@ class XKeyboardImpl : public XKeyboard { |
const bool is_running_on_chrome_os_; |
unsigned int num_lock_mask_; |
- // The current Num Lock and Caps Lock status. If true, enabled. |
- bool current_num_lock_status_; |
+ // The current Caps Lock status. If true, enabled. |
bool current_caps_lock_status_; |
+ |
// The XKB layout name which we set last time like "us" and "us(dvorak)". |
std::string current_layout_name_; |
@@ -139,7 +139,56 @@ XKeyboardImpl::XKeyboardImpl() |
LOG_IF(ERROR, num_lock_mask_ != Mod2Mask) |
<< "NumLock is not assigned to Mod2Mask. : " << num_lock_mask_; |
} |
- GetLockedModifiers(¤t_caps_lock_status_, ¤t_num_lock_status_); |
+ |
+ current_caps_lock_status_ = CapsLockIsEnabled(); |
+} |
+ |
+unsigned int XKeyboardImpl::GetNumLockMask() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ static const unsigned int kBadMask = 0; |
+ |
+ unsigned int real_mask = kBadMask; |
+ XkbDescPtr xkb_desc = |
+ XkbGetKeyboard(GetXDisplay(), XkbAllComponentsMask, XkbUseCoreKbd); |
+ if (!xkb_desc) |
+ return kBadMask; |
+ |
+ if (xkb_desc->dpy && xkb_desc->names && xkb_desc->names->vmods) { |
Nico
2014/03/14 07:31:01
A recent clang remarks:
../../chromeos/ime/xkeybo
|
+ const std::string string_to_find(kNumLockVirtualModifierString); |
+ for (size_t i = 0; i < XkbNumVirtualMods; ++i) { |
+ const unsigned int virtual_mod_mask = 1U << i; |
+ char* virtual_mod_str_raw_ptr = |
+ XGetAtomName(xkb_desc->dpy, xkb_desc->names->vmods[i]); |
+ if (!virtual_mod_str_raw_ptr) |
+ continue; |
+ const std::string virtual_mod_str = virtual_mod_str_raw_ptr; |
+ XFree(virtual_mod_str_raw_ptr); |
+ |
+ if (string_to_find == virtual_mod_str) { |
+ if (!XkbVirtualModsToReal(xkb_desc, virtual_mod_mask, &real_mask)) { |
+ DVLOG(1) << "XkbVirtualModsToReal failed"; |
+ real_mask = kBadMask; // reset the return value, just in case. |
+ } |
+ break; |
+ } |
+ } |
+ } |
+ XkbFreeKeyboard(xkb_desc, 0, True /* free all components */); |
+ return real_mask; |
+} |
+ |
+void XKeyboardImpl::SetLockedModifiers(bool caps_lock_enabled) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ // Always turn off num lock. |
+ unsigned int affect_mask = num_lock_mask_; |
+ unsigned int value_mask = 0; |
+ |
+ affect_mask |= LockMask; |
+ value_mask |= (caps_lock_enabled ? LockMask : 0); |
+ current_caps_lock_status_ = caps_lock_enabled; |
+ |
+ XkbLockModifiers(GetXDisplay(), XkbUseCoreKbd, affect_mask, value_mask); |
} |
bool XKeyboardImpl::SetLayoutInternal(const std::string& layout_name, |
@@ -232,71 +281,11 @@ void XKeyboardImpl::PollUntilChildFinish(const base::ProcessHandle handle) { |
} |
} |
-bool XKeyboardImpl::NumLockIsEnabled() { |
- bool num_lock_enabled = false; |
- GetLockedModifiers(NULL /* Caps Lock */, &num_lock_enabled); |
- return num_lock_enabled; |
-} |
- |
bool XKeyboardImpl::CapsLockIsEnabled() { |
- bool caps_lock_enabled = false; |
- GetLockedModifiers(&caps_lock_enabled, NULL /* Num Lock */); |
- return caps_lock_enabled; |
-} |
- |
-unsigned int XKeyboardImpl::GetNumLockMask() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- static const unsigned int kBadMask = 0; |
- |
- unsigned int real_mask = kBadMask; |
- XkbDescPtr xkb_desc = |
- XkbGetKeyboard(GetXDisplay(), XkbAllComponentsMask, XkbUseCoreKbd); |
- if (!xkb_desc) |
- return kBadMask; |
- |
- if (xkb_desc->dpy && xkb_desc->names && xkb_desc->names->vmods) { |
- const std::string string_to_find(kNumLockVirtualModifierString); |
- for (size_t i = 0; i < XkbNumVirtualMods; ++i) { |
- const unsigned int virtual_mod_mask = 1U << i; |
- char* virtual_mod_str_raw_ptr = |
- XGetAtomName(xkb_desc->dpy, xkb_desc->names->vmods[i]); |
- if (!virtual_mod_str_raw_ptr) |
- continue; |
- const std::string virtual_mod_str = virtual_mod_str_raw_ptr; |
- XFree(virtual_mod_str_raw_ptr); |
- |
- if (string_to_find == virtual_mod_str) { |
- if (!XkbVirtualModsToReal(xkb_desc, virtual_mod_mask, &real_mask)) { |
- DVLOG(1) << "XkbVirtualModsToReal failed"; |
- real_mask = kBadMask; // reset the return value, just in case. |
- } |
- break; |
- } |
- } |
- } |
- XkbFreeKeyboard(xkb_desc, 0, True /* free all components */); |
- return real_mask; |
-} |
- |
-void XKeyboardImpl::GetLockedModifiers(bool* out_caps_lock_enabled, |
- bool* out_num_lock_enabled) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- |
- if (out_num_lock_enabled && !num_lock_mask_) { |
- DVLOG(1) << "Cannot get locked modifiers. Num Lock mask unknown."; |
- if (out_caps_lock_enabled) |
- *out_caps_lock_enabled = false; |
- if (out_num_lock_enabled) |
- *out_num_lock_enabled = false; |
- return; |
- } |
- |
XkbStateRec status; |
XkbGetState(GetXDisplay(), XkbUseCoreKbd, &status); |
- if (out_caps_lock_enabled) |
- *out_caps_lock_enabled = status.locked_mods & LockMask; |
- if (out_num_lock_enabled) |
- *out_num_lock_enabled = status.locked_mods & num_lock_mask_; |
+ return (status.locked_mods & LockMask); |
} |
bool XKeyboardImpl::SetAutoRepeatEnabled(bool enabled) { |
@@ -321,39 +310,8 @@ bool XKeyboardImpl::SetAutoRepeatRate(const AutoRepeatRate& rate) { |
return true; |
} |
-void XKeyboardImpl::SetLockedModifiers(ModifierLockStatus new_caps_lock_status, |
- ModifierLockStatus new_num_lock_status) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (!num_lock_mask_) { |
- DVLOG(1) << "Cannot set locked modifiers. Num Lock mask unknown."; |
- return; |
- } |
- |
- unsigned int affect_mask = 0; |
- unsigned int value_mask = 0; |
- if (new_caps_lock_status != kDontChange) { |
- affect_mask |= LockMask; |
- value_mask |= ((new_caps_lock_status == kEnableLock) ? LockMask : 0); |
- current_caps_lock_status_ = (new_caps_lock_status == kEnableLock); |
- } |
- if (new_num_lock_status != kDontChange) { |
- affect_mask |= num_lock_mask_; |
- value_mask |= ((new_num_lock_status == kEnableLock) ? num_lock_mask_ : 0); |
- current_num_lock_status_ = (new_num_lock_status == kEnableLock); |
- } |
- |
- if (affect_mask) |
- XkbLockModifiers(GetXDisplay(), XkbUseCoreKbd, affect_mask, value_mask); |
-} |
- |
-void XKeyboardImpl::SetNumLockEnabled(bool enable_num_lock) { |
- SetLockedModifiers( |
- kDontChange, enable_num_lock ? kEnableLock : kDisableLock); |
-} |
- |
void XKeyboardImpl::SetCapsLockEnabled(bool enable_caps_lock) { |
- SetLockedModifiers( |
- enable_caps_lock ? kEnableLock : kDisableLock, kDontChange); |
+ SetLockedModifiers(enable_caps_lock); |
} |
bool XKeyboardImpl::SetCurrentKeyboardLayoutByName( |
@@ -374,8 +332,11 @@ bool XKeyboardImpl::ReapplyCurrentKeyboardLayout() { |
} |
void XKeyboardImpl::ReapplyCurrentModifierLockStatus() { |
- SetLockedModifiers(current_caps_lock_status_ ? kEnableLock : kDisableLock, |
- current_num_lock_status_ ? kEnableLock : kDisableLock); |
+ SetLockedModifiers(current_caps_lock_status_); |
+} |
+ |
+void XKeyboardImpl::DisableNumLock() { |
+ SetCapsLockEnabled(current_caps_lock_status_); |
} |
void XKeyboardImpl::OnSetLayoutFinish() { |