diff options
author | yusukes@google.com <yusukes@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-27 00:57:57 +0000 |
---|---|---|
committer | yusukes@google.com <yusukes@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-27 00:57:57 +0000 |
commit | 42f06f9ca2fe07018a88994569f87373a7c6c578 (patch) | |
tree | 526028affef80bcaa4a9b0771f27ac969e0b8c47 /ash | |
parent | 706cfde8e0b70a58ecb60d3f6eb918295b188234 (diff) | |
download | chromium_src-42f06f9ca2fe07018a88994569f87373a7c6c578.zip chromium_src-42f06f9ca2fe07018a88994569f87373a7c6c578.tar.gz chromium_src-42f06f9ca2fe07018a88994569f87373a7c6c578.tar.bz2 |
Automatically remap Command key on an Apple keyboard to Control [part 1 of 2 - Ash part]
Add key_rewriter_event_filter.h which allows its delegate to rewrite or delete an aura::KeyEvent. The new interface will be used for implementing the following three features:
* crosbug.com/25097: Remap keys on external keyboards (R19)
* crosbug.com/27167: Consider adding a way to send function keys to web pages (R20)
* crbug.com/115112: Move modifier remapping code from X to Chrome (M20)
Part 2 of 2: http://codereview.chromium.org/9854025/
BUG=chromium-os:25097
BUG=chromium-os:27167
BUG=115112
TEST=try
Review URL: https://chromiumcodereview.appspot.com/9838010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@129076 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r-- | ash/ash.gyp | 3 | ||||
-rw-r--r-- | ash/key_rewriter_delegate.h | 33 | ||||
-rw-r--r-- | ash/shell.cc | 12 | ||||
-rw-r--r-- | ash/shell.h | 11 | ||||
-rw-r--r-- | ash/wm/key_rewriter_event_filter.cc | 61 | ||||
-rw-r--r-- | ash/wm/key_rewriter_event_filter.h | 50 |
6 files changed, 165 insertions, 5 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp index 615ddd2..f3ee74b 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp @@ -83,6 +83,7 @@ 'ime/event.h', 'ime/input_method_event_filter.cc', 'ime/input_method_event_filter.h', + 'key_rewriter_delegate.h', 'launcher/background_animator.cc', 'launcher/background_animator.h', 'launcher/launcher.cc', @@ -192,6 +193,8 @@ 'wm/frame_painter.h', 'wm/image_grid.cc', 'wm/image_grid.h', + 'wm/key_rewriter_event_filter.cc', + 'wm/key_rewriter_event_filter.h', 'wm/panel_frame_view.cc', 'wm/panel_frame_view.h', 'wm/panel_layout_manager.cc', diff --git a/ash/key_rewriter_delegate.h b/ash/key_rewriter_delegate.h new file mode 100644 index 0000000..16fcad9 --- /dev/null +++ b/ash/key_rewriter_delegate.h @@ -0,0 +1,33 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_KEY_REWRITER_DELEGATE_H_ +#define ASH_KEY_REWRITER_DELEGATE_H_ +#pragma once + +namespace aura { +class KeyEvent; +} // namespace aura + +namespace ash { + +// Delegate for rewriting or filtering a key event. +class KeyRewriterDelegate { + public: + enum Action { + ACTION_REWRITE_EVENT, + ACTION_DROP_EVENT, + }; + + virtual ~KeyRewriterDelegate() {} + + // A derived class can do either of the following: + // 1) Just return ACTION_DROP_EVENT to drop the |event|. + // 2) Rewrite the |event| and return ACTION_REWRITE_EVENT. + virtual Action RewriteOrFilterKeyEvent(aura::KeyEvent* event) = 0; +}; + +} // namespace ash + +#endif // ASH_KEY_REWRITER_DELEGATE_H_ diff --git a/ash/shell.cc b/ash/shell.cc index 87021be..fb24006 100644 --- a/ash/shell.cc +++ b/ash/shell.cc @@ -43,6 +43,7 @@ #include "ash/wm/custom_frame_view_ash.h" #include "ash/wm/dialog_frame_view.h" #include "ash/wm/event_client_impl.h" +#include "ash/wm/key_rewriter_event_filter.h" #include "ash/wm/panel_window_event_filter.h" #include "ash/wm/panel_layout_manager.h" #include "ash/wm/partial_screenshot_event_filter.h" @@ -523,6 +524,7 @@ Shell::Shell(ShellDelegate* delegate) } Shell::~Shell() { + RemoveRootWindowEventFilter(key_rewriter_filter_.get()); RemoveRootWindowEventFilter(partial_screenshot_filter_.get()); RemoveRootWindowEventFilter(input_method_filter_.get()); RemoveRootWindowEventFilter(window_modality_controller_.get()); @@ -620,20 +622,24 @@ void Shell::Init() { // Pass ownership of the filter to the root window. GetRootWindow()->SetEventFilter(root_filter_); + // KeyRewriterEventFilter must be the first one. DCHECK(!GetRootWindowEventFilterCount()); + key_rewriter_filter_.reset(new internal::KeyRewriterEventFilter); + AddRootWindowEventFilter(key_rewriter_filter_.get()); - // PartialScreenshotEventFilter must be the first one to capture key + // PartialScreenshotEventFilter must be the second one to capture key // events when the taking partial screenshot UI is there. + DCHECK_EQ(1U, GetRootWindowEventFilterCount()); partial_screenshot_filter_.reset(new internal::PartialScreenshotEventFilter); AddRootWindowEventFilter(partial_screenshot_filter_.get()); // Then AcceleratorFilter and InputMethodEventFilter must be added (in this // order) since they have the second highest priority. - DCHECK_EQ(1U, GetRootWindowEventFilterCount()); + DCHECK_EQ(2U, GetRootWindowEventFilterCount()); #if !defined(OS_MACOSX) accelerator_filter_.reset(new internal::AcceleratorFilter); AddRootWindowEventFilter(accelerator_filter_.get()); - DCHECK_EQ(2U, GetRootWindowEventFilterCount()); + DCHECK_EQ(3U, GetRootWindowEventFilterCount()); #endif input_method_filter_.reset(new internal::InputMethodEventFilter); AddRootWindowEventFilter(input_method_filter_.get()); diff --git a/ash/shell.h b/ash/shell.h index 10f972a..2c864ad 100644 --- a/ash/shell.h +++ b/ash/shell.h @@ -64,6 +64,7 @@ class DragDropController; class EventClientImpl; class FocusCycler; class InputMethodEventFilter; +class KeyRewriterEventFilter; class MonitorController; class PartialScreenshotEventFilter; class ResizeShadowController; @@ -178,6 +179,9 @@ class ASH_EXPORT Shell { internal::TooltipController* tooltip_controller() { return tooltip_controller_.get(); } + internal::KeyRewriterEventFilter* key_rewriter_filter() { + return key_rewriter_filter_.get(); + } internal::PartialScreenshotEventFilter* partial_screenshot_filter() { return partial_screenshot_filter_.get(); } @@ -296,8 +300,8 @@ class ASH_EXPORT Shell { scoped_ptr<internal::EventClientImpl> event_client_; scoped_ptr<internal::MonitorController> monitor_controller_; - // An event filter that pre-handles all key events to send them to an IME. - scoped_ptr<internal::InputMethodEventFilter> input_method_filter_; + // An event filter that rewrites or drops a key event. + scoped_ptr<internal::KeyRewriterEventFilter> key_rewriter_filter_; // An event filter that pre-handles key events while the partial // screenshot UI is active. @@ -308,6 +312,9 @@ class ASH_EXPORT Shell { scoped_ptr<internal::AcceleratorFilter> accelerator_filter_; #endif + // An event filter that pre-handles all key events to send them to an IME. + scoped_ptr<internal::InputMethodEventFilter> input_method_filter_; + // The shelf for managing the launcher and the status widget in non-compact // mode. Shell does not own the shelf. Instead, it is owned by container of // the status area. diff --git a/ash/wm/key_rewriter_event_filter.cc b/ash/wm/key_rewriter_event_filter.cc new file mode 100644 index 0000000..30ba84d --- /dev/null +++ b/ash/wm/key_rewriter_event_filter.cc @@ -0,0 +1,61 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/wm/key_rewriter_event_filter.h" + +#include "base/logging.h" +#include "ash/key_rewriter_delegate.h" +#include "ui/aura/event.h" + +namespace ash { +namespace internal { + +KeyRewriterEventFilter::KeyRewriterEventFilter() {} + +KeyRewriterEventFilter::~KeyRewriterEventFilter() {} + +void KeyRewriterEventFilter::SetKeyRewriterDelegate( + scoped_ptr<KeyRewriterDelegate> delegate) { + delegate_.swap(delegate); +} + +bool KeyRewriterEventFilter::PreHandleKeyEvent( + aura::Window* target, aura::KeyEvent* event) { + if (!delegate_.get()) + return false; + + // Do not consume a translated key event which is generated by an IME. + if (event->type() == ui::ET_TRANSLATED_KEY_PRESS || + event->type() == ui::ET_TRANSLATED_KEY_RELEASE) { + return false; + } + + switch (delegate_->RewriteOrFilterKeyEvent(event)) { + case KeyRewriterDelegate::ACTION_REWRITE_EVENT: + return false; + case KeyRewriterDelegate::ACTION_DROP_EVENT: + return true; + } + + NOTREACHED(); + return false; +} + +bool KeyRewriterEventFilter::PreHandleMouseEvent( + aura::Window* target, aura::MouseEvent* event) { + return false; // Not handled. +} + +ui::TouchStatus KeyRewriterEventFilter::PreHandleTouchEvent( + aura::Window* target, aura::TouchEvent* event) { + return ui::TOUCH_STATUS_UNKNOWN; // Not handled. +} + +ui::GestureStatus KeyRewriterEventFilter::PreHandleGestureEvent( + aura::Window* target, aura::GestureEvent* event) { + return ui::GESTURE_STATUS_UNKNOWN; // Not handled. +} + +} // namespace internal +} // namespace ash diff --git a/ash/wm/key_rewriter_event_filter.h b/ash/wm/key_rewriter_event_filter.h new file mode 100644 index 0000000..55aeeb3 --- /dev/null +++ b/ash/wm/key_rewriter_event_filter.h @@ -0,0 +1,50 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_WM_KEY_REWRITER_EVENT_FILTER_ +#define ASH_WM_KEY_REWRITER_EVENT_FILTER_ +#pragma once + +#include "ash/ash_export.h" +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "base/memory/scoped_ptr.h" +#include "ui/aura/event_filter.h" + +namespace ash { + +class KeyRewriterDelegate; + +namespace internal { + +// An event filter that rewrites or drops a key event. +class ASH_EXPORT KeyRewriterEventFilter : public aura::EventFilter { + public: + KeyRewriterEventFilter(); + virtual ~KeyRewriterEventFilter(); + + void SetKeyRewriterDelegate(scoped_ptr<KeyRewriterDelegate> delegate); + + private: + // Overridden from aura::EventFilter: + virtual bool PreHandleKeyEvent(aura::Window* target, + aura::KeyEvent* event) OVERRIDE; + virtual bool PreHandleMouseEvent(aura::Window* target, + aura::MouseEvent* event) OVERRIDE; + virtual ui::TouchStatus PreHandleTouchEvent( + aura::Window* target, + aura::TouchEvent* event) OVERRIDE; + virtual ui::GestureStatus PreHandleGestureEvent( + aura::Window* target, + aura::GestureEvent* event) OVERRIDE; + + scoped_ptr<KeyRewriterDelegate> delegate_; + + DISALLOW_COPY_AND_ASSIGN(KeyRewriterEventFilter); +}; + +} // namespace internal +} // namespace ash + +#endif // ASH_WM_KEY_REWRITER_EVENT_FILTER_ |