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

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

Issue 4098003: Handle volume keys within Chrome (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Backed out caching Singleton instance Created 10 years, 2 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') | no next file » | 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 21f28f2b0a5e697eddbdcc2afab565e396c02b46..f6baaf7593786dd7876fe38acd96ba29024e4e17 100644
--- a/chrome/browser/chromeos/system_key_event_listener.cc
+++ b/chrome/browser/chromeos/system_key_event_listener.cc
@@ -4,9 +4,11 @@
#include "chrome/browser/chromeos/system_key_event_listener.h"
+#include <gdk/gdkx.h>
+#include <X11/XF86keysym.h>
+
#include "chrome/browser/chromeos/audio_handler.h"
#include "chrome/browser/chromeos/volume_bubble.h"
-#include "cros/chromeos_wm_ipc_enums.h"
namespace chromeos {
@@ -23,11 +25,68 @@ SystemKeyEventListener* SystemKeyEventListener::instance() {
SystemKeyEventListener::SystemKeyEventListener()
: audio_handler_(AudioHandler::instance()) {
- WmMessageListener::instance()->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);
+ gdk_window_add_filter(NULL, GdkEventFilter, this);
}
SystemKeyEventListener::~SystemKeyEventListener() {
- WmMessageListener::instance()->RemoveObserver(this);
+ gdk_window_remove_filter(NULL, GdkEventFilter, this);
+}
+
+// static
+GdkFilterReturn SystemKeyEventListener::GdkEventFilter(GdkXEvent* gxevent,
+ GdkEvent* gevent,
+ gpointer data) {
+ SystemKeyEventListener* listener = static_cast<SystemKeyEventListener*>(data);
+ XEvent* xevent = static_cast<XEvent*>(gxevent);
+
+ if (xevent->type == KeyPress) {
+ int32 keycode = xevent->xkey.keycode;
+ if (keycode) {
+ if ((keycode == listener->key_f8_) ||
+ (keycode == listener->key_volume_mute_)) {
+ listener->OnVolumeMute();
+ return GDK_FILTER_REMOVE;
+ } else if ((keycode == listener->key_f9_) ||
+ keycode == listener->key_volume_down_) {
+ listener->OnVolumeDown();
+ return GDK_FILTER_REMOVE;
+ } else if ((keycode == listener->key_f10_) ||
+ (keycode == listener->key_volume_up_)) {
+ listener->OnVolumeUp();
+ return GDK_FILTER_REMOVE;
+ }
+ }
+ }
+ return GDK_FILTER_CONTINUE;
+}
+
+void SystemKeyEventListener::GrabKey(int32 key, uint32 mask) {
+ uint32 num_lock_mask = Mod2Mask;
+ uint32 caps_lock_mask = LockMask;
+ Window root = DefaultRootWindow(GDK_DISPLAY());
+ XGrabKey(GDK_DISPLAY(), key, mask, root, True, GrabModeAsync, GrabModeAsync);
+ XGrabKey(GDK_DISPLAY(), key, mask | caps_lock_mask, root, True,
+ GrabModeAsync, GrabModeAsync);
+ XGrabKey(GDK_DISPLAY(), key, mask | num_lock_mask, root, True,
+ GrabModeAsync, GrabModeAsync);
+ XGrabKey(GDK_DISPLAY(), key, mask | caps_lock_mask | num_lock_mask, root,
+ True, GrabModeAsync, GrabModeAsync);
}
// TODO(davej): Move the ShowVolumeBubble() calls in to AudioHandler so that
@@ -38,40 +97,30 @@ SystemKeyEventListener::~SystemKeyEventListener() {
// to an AdjustVolumeByPercentOrUnmute() function which can do the steps off
// of this thread when ShowVolumeBubble() is moved in to AudioHandler.
-void SystemKeyEventListener::ProcessWmMessage(const WmIpc::Message& message,
- GdkWindow* window) {
- if (message.type() != WM_IPC_MESSAGE_CHROME_NOTIFY_SYSKEY_PRESSED)
- return;
-
- switch (message.param(0)) {
- case WM_IPC_SYSTEM_KEY_VOLUME_MUTE:
- // Always muting (and not toggling) as per final decision on
- // http://crosbug.com/3751
- audio_handler_->SetMute(true);
- VolumeBubble::instance()->ShowVolumeBubble(0);
- break;
- case WM_IPC_SYSTEM_KEY_VOLUME_DOWN:
- if (audio_handler_->IsMute()) {
- VolumeBubble::instance()->ShowVolumeBubble(0);
- } else {
- audio_handler_->AdjustVolumeByPercent(-kStepPercentage);
- VolumeBubble::instance()->ShowVolumeBubble(
- audio_handler_->GetVolumePercent());
- }
- break;
- case WM_IPC_SYSTEM_KEY_VOLUME_UP:
- if (audio_handler_->IsMute())
- audio_handler_->SetMute(false);
- else
- audio_handler_->AdjustVolumeByPercent(kStepPercentage);
- VolumeBubble::instance()->ShowVolumeBubble(
- audio_handler_->GetVolumePercent());
- break;
- default:
- DLOG(ERROR) << "SystemKeyEventListener: Unexpected message "
- << message.param(0)
- << " received";
+void SystemKeyEventListener::OnVolumeMute() {
+ // Always muting (and not toggling) as per final decision on
+ // http://crosbug.com/3751
+ audio_handler_->SetMute(true);
+ VolumeBubble::instance()->ShowVolumeBubble(0);
+}
+
+void SystemKeyEventListener::OnVolumeDown() {
+ if (audio_handler_->IsMute()) {
+ VolumeBubble::instance()->ShowVolumeBubble(0);
+ } else {
+ audio_handler_->AdjustVolumeByPercent(-kStepPercentage);
+ VolumeBubble::instance()->ShowVolumeBubble(
+ audio_handler_->GetVolumePercent());
}
}
+void SystemKeyEventListener::OnVolumeUp() {
+ if (audio_handler_->IsMute())
+ audio_handler_->SetMute(false);
+ else
+ audio_handler_->AdjustVolumeByPercent(kStepPercentage);
+ VolumeBubble::instance()->ShowVolumeBubble(
+ audio_handler_->GetVolumePercent());
+}
+
} // namespace chromeos
« no previous file with comments | « chrome/browser/chromeos/system_key_event_listener.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698