| Index: ui/wm/core/accelerator_filter.cc
|
| diff --git a/ui/wm/core/accelerator_filter.cc b/ui/wm/core/accelerator_filter.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b55147bebf7dfee3a20b78c29a6f1b0ee4dfb3e4
|
| --- /dev/null
|
| +++ b/ui/wm/core/accelerator_filter.cc
|
| @@ -0,0 +1,85 @@
|
| +// 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 "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
|
|
|