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 66f6cdc35f87198c4ef2c99346322c8baa22ce65..7997d857e0f8298f5a59acb1ed3dbdf241bd292b 100644 |
--- a/chrome/browser/chromeos/system_key_event_listener.cc |
+++ b/chrome/browser/chromeos/system_key_event_listener.cc |
@@ -184,6 +184,40 @@ bool SystemKeyEventListener::WillProcessXEvent(XEvent* xevent) { |
} |
} |
} |
+ } else if (xevent->type == MappingNotify) { |
+ XMappingEvent* xmap = &xevent->xmapping; |
+ if (xmap->request == MappingKeyboard) { |
+ XRefreshKeyboardMapping(xmap); |
+ Display* display = xmap->display; |
+ Window root = DefaultRootWindow(display); |
+ |
+ struct { |
Daniel Erat
2011/05/17 18:33:17
Mind unifying this with the code in the c'tor that
sadrul
2011/05/17 19:39:55
Done.
|
+ int32* keycode; |
+ KeySym keysym; |
+ } *key, keys[] = { |
+ { &key_f8_, XK_F8 }, |
+ { &key_f9_, XK_F9 }, |
+ { &key_f10_, XK_F10 }, |
+ { &key_volume_mute_, XF86XK_AudioMute }, |
+ { &key_volume_down_, XF86XK_AudioLowerVolume }, |
+ { &key_volume_up_, XF86XK_AudioRaiseVolume }, |
+ { NULL, NoSymbol } |
+ }; |
+ // It is necessary to ungrab the keys first. |
+ for (key = keys; key->keycode; key++) |
+ XUngrabKey(display, *key->keycode, AnyModifier, root); |
+ |
+ bool handled = false; |
+ for (key = keys; key->keycode; key++) { |
+ int32 old_keycode = *key->keycode; |
+ *key->keycode = XKeysymToKeycode(display, key->keysym); |
+ if (*key->keycode) |
+ GrabKey(*key->keycode, 0); |
+ handled = (old_keycode != *key->keycode) || handled; |
+ } |
+ |
+ return handled; |
+ } |
} |
return false; |
} |