summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authoryusukes@google.com <yusukes@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-27 00:57:57 +0000
committeryusukes@google.com <yusukes@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-27 00:57:57 +0000
commit42f06f9ca2fe07018a88994569f87373a7c6c578 (patch)
tree526028affef80bcaa4a9b0771f27ac969e0b8c47 /ash
parent706cfde8e0b70a58ecb60d3f6eb918295b188234 (diff)
downloadchromium_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.gyp3
-rw-r--r--ash/key_rewriter_delegate.h33
-rw-r--r--ash/shell.cc12
-rw-r--r--ash/shell.h11
-rw-r--r--ash/wm/key_rewriter_event_filter.cc61
-rw-r--r--ash/wm/key_rewriter_event_filter.h50
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_