Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(590)

Unified Diff: chrome/browser/chromeos/system_key_event_listener.cc

Issue 8356040: Reapply Caps Lock and Num Lock to core keyboard whenever new X input device is added (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: move chrome_browser_main_chromeos.cc to an another CL Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698