| 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
|
|
|