diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-30 13:07:02 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-30 13:07:02 +0000 |
commit | 60d677dd4521ddde2d8b4e16eee0020e38a21a2f (patch) | |
tree | b7ce93d078e3bb15052fc04fd0c966dceb247e10 /ui/wm | |
parent | 85e57d4d0241a31881536262ead36f0aff90b4fc (diff) | |
download | chromium_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.h | 37 | ||||
-rw-r--r-- | ui/wm/core/accelerator_filter.cc | 85 | ||||
-rw-r--r-- | ui/wm/core/accelerator_filter.h | 34 | ||||
-rw-r--r-- | ui/wm/wm.gyp | 17 |
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', |