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