Index: chrome/browser/chromeos/system_key_event_listener.cc |
diff --git a/chrome/browser/chromeos/system_key_event_listener.cc b/chrome/browser/chromeos/system_key_event_listener.cc |
index 2965f4c06dd7c313ffbfdde9ca634c993a0daae1..23b20f6ca7fd29a017f461e1ea8d418d375b75ae 100644 |
--- a/chrome/browser/chromeos/system_key_event_listener.cc |
+++ b/chrome/browser/chromeos/system_key_event_listener.cc |
@@ -73,8 +73,11 @@ SystemKeyEventListener* SystemKeyEventListener::GetInstance() { |
SystemKeyEventListener::SystemKeyEventListener() |
: stopped_(false), |
- caps_lock_is_on_(input_method::XKeyboard::CapsLockIsEnabled()), |
+ num_lock_mask_(input_method::XKeyboard::GetNumLockMask()), |
xkb_event_base_(0) { |
+ input_method::XKeyboard::GetLockedModifiers( |
+ num_lock_mask_, &caps_lock_is_on_, &num_lock_is_on_); |
+ |
Display* display = ui::GetXDisplay(); |
key_brightness_down_ = XKeysymToKeycode(display, |
XF86XK_MonBrightnessDown); |
@@ -183,16 +186,15 @@ GdkFilterReturn SystemKeyEventListener::GdkEventFilter(GdkXEvent* gxevent, |
#endif // defined(TOUCH_UI) || !defined(TOOLKIT_USES_GTK) |
void SystemKeyEventListener::GrabKey(int32 key, uint32 mask) { |
- uint32 num_lock_mask = Mod2Mask; |
uint32 caps_lock_mask = LockMask; |
Display* display = ui::GetXDisplay(); |
Window root = DefaultRootWindow(display); |
XGrabKey(display, key, mask, root, True, GrabModeAsync, GrabModeAsync); |
XGrabKey(display, key, mask | caps_lock_mask, root, True, |
GrabModeAsync, GrabModeAsync); |
- XGrabKey(display, key, mask | num_lock_mask, root, True, |
+ XGrabKey(display, key, mask | num_lock_mask_, root, True, |
GrabModeAsync, GrabModeAsync); |
- XGrabKey(display, key, mask | caps_lock_mask | num_lock_mask, root, |
+ XGrabKey(display, key, mask | caps_lock_mask | num_lock_mask_, root, |
True, GrabModeAsync, GrabModeAsync); |
} |
@@ -275,11 +277,14 @@ void SystemKeyEventListener::ShowVolumeBubble() { |
} |
bool SystemKeyEventListener::ProcessedXEvent(XEvent* xevent) { |
+ input_method::InputMethodManager* input_method_manager = |
+ input_method::InputMethodManager::GetInstance(); |
+ |
if (xevent->type == KeyPress || xevent->type == KeyRelease) { |
// Change the current keyboard layout (or input method) if xevent is one of |
// the input method hotkeys. |
input_method::HotkeyManager* hotkey_manager = |
- input_method::InputMethodManager::GetInstance()->GetHotkeyManager(); |
+ input_method_manager->GetHotkeyManager(); |
if (hotkey_manager->FilterKeyEvent(*xevent)) { |
return true; |
} |
@@ -288,11 +293,30 @@ bool SystemKeyEventListener::ProcessedXEvent(XEvent* xevent) { |
if (xevent->type == xkb_event_base_) { |
XkbEvent* xkey_event = reinterpret_cast<XkbEvent*>(xevent); |
if (xkey_event->any.xkb_type == XkbStateNotify) { |
- const bool new_lock_state = (xkey_event->state.locked_mods) & LockMask; |
- if (caps_lock_is_on_ != new_lock_state) { |
- caps_lock_is_on_ = new_lock_state; |
+ input_method::ModifierLockStatus new_caps_lock_state = |
+ input_method::kDontChange; |
+ input_method::ModifierLockStatus new_num_lock_state = |
+ input_method::kDontChange; |
+ |
+ bool enabled = (xkey_event->state.locked_mods) & LockMask; |
+ if (caps_lock_is_on_ != enabled) { |
+ caps_lock_is_on_ = enabled; |
+ new_caps_lock_state = |
+ enabled ? input_method::kEnableLock : input_method::kDisableLock; |
OnCapsLock(caps_lock_is_on_); |
} |
+ |
+ enabled = (xkey_event->state.locked_mods) & num_lock_mask_; |
+ if (num_lock_is_on_ != enabled) { |
+ num_lock_is_on_ = enabled; |
+ new_num_lock_state = |
+ enabled ? input_method::kEnableLock : input_method::kDisableLock; |
+ } |
+ |
+ // Propagate the keyboard LED change to _ALL_ keyboards |
+ input_method_manager->GetXKeyboard()->SetLockedModifiers( |
+ new_caps_lock_state, new_num_lock_state); |
+ |
return true; |
} |
} else if (xevent->type == KeyPress) { |
@@ -305,7 +329,8 @@ bool SystemKeyEventListener::ProcessedXEvent(XEvent* xevent) { |
const bool other_shift_is_held = (state & ShiftMask); |
const bool other_mods_are_held = (state & ~(ShiftMask | LockMask)); |
if (other_shift_is_held && !other_mods_are_held) |
- input_method::XKeyboard::SetCapsLockEnabled(!caps_lock_is_on_); |
+ input_method_manager->GetXKeyboard()->SetCapsLockEnabled( |
+ !caps_lock_is_on_); |
} |
// Only doing non-Alt/Shift/Ctrl modified keys |