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..2e8887ee205dfefb060bacd79fa6eb9ec3f8f5f0 100644 |
--- a/chrome/browser/chromeos/system_key_event_listener.cc |
+++ b/chrome/browser/chromeos/system_key_event_listener.cc |
@@ -74,6 +74,9 @@ SystemKeyEventListener* SystemKeyEventListener::GetInstance() { |
SystemKeyEventListener::SystemKeyEventListener() |
: stopped_(false), |
caps_lock_is_on_(input_method::XKeyboard::CapsLockIsEnabled()), |
+ num_lock_mask_(input_method::XKeyboard::GetNumLockMask()), |
+ num_lock_is_on_( |
+ input_method::XKeyboard::NumLockIsEnabled(num_lock_mask_)), |
xkb_event_base_(0) { |
Display* display = ui::GetXDisplay(); |
key_brightness_down_ = XKeysymToKeycode(display, |
@@ -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,25 @@ 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; |
+ const bool new_caps_lock_state = |
Daniel Kurtz
2011/11/04 11:49:18
Do this in one pass: First extract the two states
Yusuke Sato
2011/11/07 04:31:28
Done.
|
+ (xkey_event->state.locked_mods) & LockMask; |
+ if (caps_lock_is_on_ != new_caps_lock_state) { |
+ caps_lock_is_on_ = new_caps_lock_state; |
OnCapsLock(caps_lock_is_on_); |
+ // Propagate the keyboard LED change to _ALL_ keyboards |
+ input_method_manager->GetXKeyboard()->SetCapsLockEnabled( |
+ caps_lock_is_on_); |
+ } |
+ |
+ const bool new_num_lock_state = |
+ (xkey_event->state.locked_mods) & num_lock_mask_; |
+ if (num_lock_is_on_ != new_num_lock_state) { |
+ num_lock_is_on_ = new_num_lock_state; |
+ // The same as above. Propagate the keyboard LED change to all keyboards |
+ input_method_manager->GetXKeyboard()->SetNumLockEnabled( |
+ num_lock_is_on_); |
} |
+ |
return true; |
} |
} else if (xevent->type == KeyPress) { |
@@ -305,7 +324,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 |