1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/wm/core/nested_accelerator_dispatcher.h" 6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/memory/scoped_ptr.h" 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/message_loop/message_pump_dispatcher.h" 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/run_loop.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/base/accelerators/accelerator.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/event.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/wm/core/accelerator_filter.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/wm/core/nested_accelerator_delegate.h" 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing base::MessagePumpDispatcher; 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace wm { 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace { 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool IsKeyEvent(const MSG& msg) { 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return msg.message == WM_KEYDOWN || msg.message == WM_SYSKEYDOWN || 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch msg.message == WM_KEYUP || msg.message == WM_SYSKEYUP; 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class NestedAcceleratorDispatcherWin : public NestedAcceleratorDispatcher, 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public MessagePumpDispatcher { 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NestedAcceleratorDispatcherWin(NestedAcceleratorDelegate* delegate, 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MessagePumpDispatcher* nested) 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : NestedAcceleratorDispatcher(delegate), nested_dispatcher_(nested) {} 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~NestedAcceleratorDispatcherWin() {} 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // NestedAcceleratorDispatcher: 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual scoped_ptr<base::RunLoop> CreateRunLoop() OVERRIDE { 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return scoped_ptr<base::RunLoop>(new base::RunLoop(this)); 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // MessagePumpDispatcher: 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual uint32_t Dispatch(const MSG& event) OVERRIDE { 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (IsKeyEvent(event)) { 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent key_event(event); 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::Accelerator accelerator = CreateAcceleratorFromKeyEvent(key_event); 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) switch (delegate_->ProcessAccelerator(accelerator)) { 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case NestedAcceleratorDelegate::RESULT_PROCESS_LATER: 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return POST_DISPATCH_QUIT_LOOP; 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case NestedAcceleratorDelegate::RESULT_PROCESSED: 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return POST_DISPATCH_NONE; 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case NestedAcceleratorDelegate::RESULT_NOT_PROCESSED: 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) break; 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return nested_dispatcher_ ? nested_dispatcher_->Dispatch(event) 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : POST_DISPATCH_PERFORM_DEFAULT; 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MessagePumpDispatcher* nested_dispatcher_; 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NestedAcceleratorDispatcherWin); 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<NestedAcceleratorDispatcher> NestedAcceleratorDispatcher::Create( 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NestedAcceleratorDelegate* delegate, 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MessagePumpDispatcher* nested_dispatcher) { 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scoped_ptr<NestedAcceleratorDispatcher>( 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new NestedAcceleratorDispatcherWin(delegate, nested_dispatcher)); 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace wm 75