// 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 "ash/accelerators/accelerator_dispatcher.h" #include "base/memory/scoped_ptr.h" #include "base/message_loop/message_pump_dispatcher.h" #include "base/run_loop.h" #include "ui/events/event.h" using base::MessagePumpDispatcher; namespace ash { namespace { bool IsKeyEvent(const MSG& msg) { return msg.message == WM_KEYDOWN || msg.message == WM_SYSKEYDOWN || msg.message == WM_KEYUP || msg.message == WM_SYSKEYUP; } } // namespace class AcceleratorDispatcherWin : public AcceleratorDispatcher, public MessagePumpDispatcher { public: explicit AcceleratorDispatcherWin(MessagePumpDispatcher* nested) : nested_dispatcher_(nested) {} virtual ~AcceleratorDispatcherWin() {} private: // AcceleratorDispatcher: virtual scoped_ptr CreateRunLoop() OVERRIDE { return scoped_ptr(new base::RunLoop(this)); } // MessagePumpDispatcher: virtual uint32_t Dispatch(const MSG& event) OVERRIDE { if (IsKeyEvent(event)) { ui::KeyEvent key_event(event, false); if (MenuClosedForPossibleAccelerator(key_event)) return POST_DISPATCH_QUIT_LOOP; if (AcceleratorProcessedForKeyEvent(key_event)) return POST_DISPATCH_NONE; } return nested_dispatcher_ ? nested_dispatcher_->Dispatch(event) : POST_DISPATCH_PERFORM_DEFAULT; } MessagePumpDispatcher* nested_dispatcher_; DISALLOW_COPY_AND_ASSIGN(AcceleratorDispatcherWin); }; scoped_ptr AcceleratorDispatcher::Create( MessagePumpDispatcher* nested_dispatcher) { return scoped_ptr( new AcceleratorDispatcherWin(nested_dispatcher)); } } // namespace ash