1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/wm/core/accelerator_filter.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/events/event.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/wm/core/accelerator_delegate.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace wm {
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Returns true if |key_code| is a key usually handled directly by the shell.
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool IsSystemKey(ui::KeyboardCode key_code) {
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS)
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (key_code) {
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ui::VKEY_MEDIA_LAUNCH_APP2:  // Fullscreen button.
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ui::VKEY_MEDIA_LAUNCH_APP1:  // Overview button.
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ui::VKEY_BRIGHTNESS_DOWN:
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ui::VKEY_BRIGHTNESS_UP:
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ui::VKEY_KBD_BRIGHTNESS_DOWN:
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ui::VKEY_KBD_BRIGHTNESS_UP:
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ui::VKEY_VOLUME_MUTE:
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ui::VKEY_VOLUME_DOWN:
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ui::VKEY_VOLUME_UP:
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return true;
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return false;
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// AcceleratorFilter, public:
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AcceleratorFilter::AcceleratorFilter(scoped_ptr<AcceleratorDelegate> delegate)
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : delegate_(delegate.Pass()) {
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AcceleratorFilter::~AcceleratorFilter() {
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// AcceleratorFilter, EventFilter implementation:
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AcceleratorFilter::OnKeyEvent(ui::KeyEvent* event) {
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const ui::EventType type = event->type();
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(event->target());
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if ((type != ui::ET_KEY_PRESSED && type != ui::ET_KEY_RELEASED) ||
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      event->is_char() || !event->target()) {
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ui::Accelerator accelerator = CreateAcceleratorFromKeyEvent(*event);
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AcceleratorDelegate::KeyType key_type =
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      IsSystemKey(event->key_code()) ? AcceleratorDelegate::KEY_TYPE_SYSTEM
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                     : AcceleratorDelegate::KEY_TYPE_OTHER;
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (delegate_->ProcessAccelerator(*event, accelerator, key_type))
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    event->StopPropagation();
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ui::Accelerator CreateAcceleratorFromKeyEvent(const ui::KeyEvent& key_event) {
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int kModifierFlagMask =
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN);
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ui::Accelerator accelerator(key_event.key_code(),
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                              key_event.flags() & kModifierFlagMask);
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (key_event.type() == ui::ET_KEY_RELEASED)
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    accelerator.set_type(ui::ET_KEY_RELEASED);
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  accelerator.set_is_repeat(key_event.IsRepeat());
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return accelerator;
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace wm
81