summaryrefslogtreecommitdiffstats
path: root/ui/wm
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-30 13:07:02 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-30 13:07:02 +0000
commit60d677dd4521ddde2d8b4e16eee0020e38a21a2f (patch)
treeb7ce93d078e3bb15052fc04fd0c966dceb247e10 /ui/wm
parent85e57d4d0241a31881536262ead36f0aff90b4fc (diff)
downloadchromium_src-60d677dd4521ddde2d8b4e16eee0020e38a21a2f.zip
chromium_src-60d677dd4521ddde2d8b4e16eee0020e38a21a2f.tar.gz
chromium_src-60d677dd4521ddde2d8b4e16eee0020e38a21a2f.tar.bz2
Move common accelerator code from ash to ui/wm/core
accelerator_filter_unittest stays in ash because it requires ash. BUG=375534 Review URL: https://codereview.chromium.org/307533007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@273811 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/wm')
-rw-r--r--ui/wm/core/accelerator_delegate.h37
-rw-r--r--ui/wm/core/accelerator_filter.cc85
-rw-r--r--ui/wm/core/accelerator_filter.h34
-rw-r--r--ui/wm/wm.gyp17
4 files changed, 166 insertions, 7 deletions
diff --git a/ui/wm/core/accelerator_delegate.h b/ui/wm/core/accelerator_delegate.h
new file mode 100644
index 0000000..dccabda
--- /dev/null
+++ b/ui/wm/core/accelerator_delegate.h
@@ -0,0 +1,37 @@
+// Copyright 2014 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 UI_WM_CORE_ACCELERATOR_DELEGATE_H_
+#define UI_WM_CORE_ACCELERATOR_DELEGATE_H_
+
+namespace ui {
+class Accelerator;
+class KeyEvent;
+}
+
+namespace wm {
+
+class AcceleratorDelegate {
+ public:
+ virtual ~AcceleratorDelegate() {}
+
+ // TODO(oshima): Move the repeat detection to AcceleratorFilter.
+ virtual void PreProcessAccelerator(const ui::Accelerator& accelerator) = 0;
+
+ // Returns true if the window should be allowed a chance to handle
+ // system keys.
+ virtual bool CanConsumeSystemKeys(const ui::KeyEvent& event) = 0;
+
+ // Returns true if the |accelerator| should be processed.
+ virtual bool ShouldProcessAcceleratorNow(
+ const ui::KeyEvent& key_event,
+ const ui::Accelerator& accelerator) = 0;
+
+ // Return true if the |accelerator| has been processed.
+ virtual bool ProcessAccelerator(const ui::Accelerator& accelerator) = 0;
+};
+
+} // namespace wm
+
+#endif // UI_WM_CORE_ACCELERATOR_DELEGATE_H_
diff --git a/ui/wm/core/accelerator_filter.cc b/ui/wm/core/accelerator_filter.cc
new file mode 100644
index 0000000..7993cd7
--- /dev/null
+++ b/ui/wm/core/accelerator_filter.cc
@@ -0,0 +1,85 @@
+// Copyright 2014 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 "ui/wm/core/accelerator_filter.h"
+
+#include "ui/base/accelerators/accelerator.h"
+#include "ui/events/event.h"
+#include "ui/wm/core/accelerator_delegate.h"
+
+namespace wm {
+namespace {
+
+const int kModifierFlagMask =
+ (ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN);
+
+// Returns true if |key_code| is a key usually handled directly by the shell.
+bool IsSystemKey(ui::KeyboardCode key_code) {
+#if defined(OS_CHROMEOS)
+ switch (key_code) {
+ case ui::VKEY_MEDIA_LAUNCH_APP2: // Fullscreen button.
+ case ui::VKEY_MEDIA_LAUNCH_APP1: // Overview button.
+ case ui::VKEY_BRIGHTNESS_DOWN:
+ case ui::VKEY_BRIGHTNESS_UP:
+ case ui::VKEY_KBD_BRIGHTNESS_DOWN:
+ case ui::VKEY_KBD_BRIGHTNESS_UP:
+ case ui::VKEY_VOLUME_MUTE:
+ case ui::VKEY_VOLUME_DOWN:
+ case ui::VKEY_VOLUME_UP:
+ return true;
+ default:
+ return false;
+ }
+#endif // defined(OS_CHROMEOS)
+ return false;
+}
+
+} // namespace
+
+////////////////////////////////////////////////////////////////////////////////
+// AcceleratorFilter, public:
+
+AcceleratorFilter::AcceleratorFilter(scoped_ptr<AcceleratorDelegate> delegate)
+ : delegate_(delegate.Pass()) {
+}
+
+AcceleratorFilter::~AcceleratorFilter() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// AcceleratorFilter, EventFilter implementation:
+
+void AcceleratorFilter::OnKeyEvent(ui::KeyEvent* event) {
+ const ui::EventType type = event->type();
+ if (type != ui::ET_KEY_PRESSED && type != ui::ET_KEY_RELEASED)
+ return;
+ if (event->is_char())
+ return;
+
+ ui::Accelerator accelerator(event->key_code(),
+ event->flags() & kModifierFlagMask);
+ accelerator.set_type(event->type());
+
+ delegate_->PreProcessAccelerator(accelerator);
+
+ // Handle special hardware keys like brightness and volume. However, some
+ // windows can override this behavior (e.g. Chrome v1 apps by default and
+ // Chrome v2 apps with permission) by setting a window property.
+ if (IsSystemKey(event->key_code()) &&
+ !delegate_->CanConsumeSystemKeys(*event)) {
+ delegate_->ProcessAccelerator(accelerator);
+ // These keys are always consumed regardless of whether they trigger an
+ // accelerator to prevent windows from seeing unexpected key up events.
+ event->StopPropagation();
+ return;
+ }
+
+ if (!delegate_->ShouldProcessAcceleratorNow(*event, accelerator))
+ return;
+
+ if (delegate_->ProcessAccelerator(accelerator))
+ event->StopPropagation();
+}
+
+} // namespace wm
diff --git a/ui/wm/core/accelerator_filter.h b/ui/wm/core/accelerator_filter.h
new file mode 100644
index 0000000..d42a6e2
--- /dev/null
+++ b/ui/wm/core/accelerator_filter.h
@@ -0,0 +1,34 @@
+// Copyright 2014 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 UI_WM_CORE_ACCELERATOR_FILTER_H_
+#define UI_WM_CORE_ACCELERATOR_FILTER_H_
+
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "ui/events/event_handler.h"
+#include "ui/wm/wm_export.h"
+
+namespace wm {
+class AcceleratorDelegate;
+
+// AcceleratorFilter filters key events for AcceleratorControler handling global
+// keyboard accelerators.
+class WM_EXPORT AcceleratorFilter : public ui::EventHandler {
+ public:
+ AcceleratorFilter(scoped_ptr<AcceleratorDelegate> delegate);
+ virtual ~AcceleratorFilter();
+
+ // Overridden from ui::EventHandler:
+ virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
+
+ private:
+ scoped_ptr<AcceleratorDelegate> delegate_;
+
+ DISALLOW_COPY_AND_ASSIGN(AcceleratorFilter);
+};
+
+} // namespace wm
+
+#endif // UI_WM_CORE_ACCELERATOR_FILTER_H_
diff --git a/ui/wm/wm.gyp b/ui/wm/wm.gyp
index 1a86102..d3230a1 100644
--- a/ui/wm/wm.gyp
+++ b/ui/wm/wm.gyp
@@ -26,13 +26,9 @@
'WM_IMPLEMENTATION',
],
'sources': [
- 'core/nested_accelerator_dispatcher_linux.cc',
- 'core/nested_accelerator_dispatcher_win.cc',
- 'core/nested_accelerator_dispatcher.cc',
- 'core/nested_accelerator_dispatcher.h',
- 'core/nested_accelerator_delegate.h',
- 'core/nested_accelerator_controller.cc',
- 'core/nested_accelerator_controller.h',
+ 'core/accelerator_delegate.h',
+ 'core/accelerator_filter.cc',
+ 'core/accelerator_filter.h',
'core/base_focus_rules.h',
'core/base_focus_rules.cc',
'core/base_focus_rules.h',
@@ -57,6 +53,13 @@
'core/masked_window_targeter.h',
'core/native_cursor_manager.h',
'core/native_cursor_manager_delegate.h',
+ 'core/nested_accelerator_dispatcher_linux.cc',
+ 'core/nested_accelerator_dispatcher_win.cc',
+ 'core/nested_accelerator_dispatcher.cc',
+ 'core/nested_accelerator_dispatcher.h',
+ 'core/nested_accelerator_delegate.h',
+ 'core/nested_accelerator_controller.cc',
+ 'core/nested_accelerator_controller.h',
'core/shadow.cc',
'core/shadow.h',
'core/shadow_controller.cc',