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

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

Issue 7019007: Update the X11 keycodes when keys are remapped. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: unify Created 9 years, 7 months 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
« no previous file with comments | « chrome/browser/chromeos/system_key_event_listener.h ('k') | views/focus/accelerator_handler_touch.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 00991b819494c2590276f0539953536063883d2d..5b5477eba36b1095c41ceb5e1e50369c25e25942 100644
--- a/chrome/browser/chromeos/system_key_event_listener.cc
+++ b/chrome/browser/chromeos/system_key_event_listener.cc
@@ -12,6 +12,7 @@
#include "chrome/browser/chromeos/volume_bubble.h"
#include "content/browser/user_metrics.h"
#include "third_party/cros/chromeos_wm_ipc_enums.h"
+#include "ui/base/x/x11_util.h"
#if defined(TOUCH_UI)
#include "base/message_pump_glib_x_dispatch.h"
@@ -31,27 +32,16 @@ SystemKeyEventListener* SystemKeyEventListener::GetInstance() {
}
SystemKeyEventListener::SystemKeyEventListener()
- : stopped_(false),
+ : key_volume_mute_(0),
+ key_volume_down_(0),
+ key_volume_up_(0),
+ key_f8_(0),
+ key_f9_(0),
+ key_f10_(0),
+ stopped_(false),
audio_handler_(AudioHandler::GetInstance()) {
WmMessageListener::GetInstance()->AddObserver(this);
-
- key_volume_mute_ = XKeysymToKeycode(GDK_DISPLAY(), XF86XK_AudioMute);
- key_volume_down_ = XKeysymToKeycode(GDK_DISPLAY(), XF86XK_AudioLowerVolume);
- key_volume_up_ = XKeysymToKeycode(GDK_DISPLAY(), XF86XK_AudioRaiseVolume);
- key_f8_ = XKeysymToKeycode(GDK_DISPLAY(), XK_F8);
- key_f9_ = XKeysymToKeycode(GDK_DISPLAY(), XK_F9);
- key_f10_ = XKeysymToKeycode(GDK_DISPLAY(), XK_F10);
-
- if (key_volume_mute_)
- GrabKey(key_volume_mute_, 0);
- if (key_volume_down_)
- GrabKey(key_volume_down_, 0);
- if (key_volume_up_)
- GrabKey(key_volume_up_, 0);
- GrabKey(key_f8_, 0);
- GrabKey(key_f9_, 0);
- GrabKey(key_f10_, 0);
-
+ SetupKeycodes();
#if defined(TOUCH_UI)
MessageLoopForUI::current()->AddObserver(this);
#else
@@ -110,6 +100,41 @@ GdkFilterReturn SystemKeyEventListener::GdkEventFilter(GdkXEvent* gxevent,
: GDK_FILTER_CONTINUE;
}
+bool SystemKeyEventListener::SetupKeycodes() {
+ Display* display = ui::GetXDisplay();
+ Window root = DefaultRootWindow(display);
+
+ struct {
+ 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 }
+ };
+
+ // Ungrab any existing grabs on the keys first.
+ for (key = keys; key->keycode; key++) {
+ if (*key->keycode)
+ 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;
+}
+
void SystemKeyEventListener::GrabKey(int32 key, uint32 mask) {
uint32 num_lock_mask = Mod2Mask;
uint32 caps_lock_mask = LockMask;
@@ -187,6 +212,12 @@ bool SystemKeyEventListener::WillProcessXEvent(XEvent* xevent) {
}
}
}
+ } else if (xevent->type == MappingNotify) {
+ XMappingEvent* xmap = &xevent->xmapping;
+ if (xmap->request == MappingKeyboard) {
+ XRefreshKeyboardMapping(xmap);
+ return SetupKeycodes();
+ }
}
return false;
}
« no previous file with comments | « chrome/browser/chromeos/system_key_event_listener.h ('k') | views/focus/accelerator_handler_touch.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698