1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/wm/core/nested_accelerator_dispatcher.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/message_loop/message_pump_dispatcher.h"
9 #include "base/run_loop.h"
10 #include "ui/base/accelerators/accelerator.h"
11 #include "ui/events/event.h"
12 #include "ui/wm/core/accelerator_filter.h"
13 #include "ui/wm/core/nested_accelerator_delegate.h"
15 using base::MessagePumpDispatcher
;
21 bool IsKeyEvent(const MSG
& msg
) {
22 return msg
.message
== WM_KEYDOWN
|| msg
.message
== WM_SYSKEYDOWN
||
23 msg
.message
== WM_KEYUP
|| msg
.message
== WM_SYSKEYUP
;
28 class NestedAcceleratorDispatcherWin
: public NestedAcceleratorDispatcher
,
29 public MessagePumpDispatcher
{
31 NestedAcceleratorDispatcherWin(NestedAcceleratorDelegate
* delegate
,
32 MessagePumpDispatcher
* nested
)
33 : NestedAcceleratorDispatcher(delegate
), nested_dispatcher_(nested
) {}
34 virtual ~NestedAcceleratorDispatcherWin() {}
37 // NestedAcceleratorDispatcher:
38 virtual scoped_ptr
<base::RunLoop
> CreateRunLoop() override
{
39 return make_scoped_ptr(new base::RunLoop(this));
42 // MessagePumpDispatcher:
43 virtual uint32_t Dispatch(const MSG
& event
) override
{
44 if (IsKeyEvent(event
)) {
45 ui::KeyEvent
key_event(event
);
46 ui::Accelerator accelerator
= CreateAcceleratorFromKeyEvent(key_event
);
48 switch (delegate_
->ProcessAccelerator(accelerator
)) {
49 case NestedAcceleratorDelegate::RESULT_PROCESS_LATER
:
50 return POST_DISPATCH_QUIT_LOOP
;
51 case NestedAcceleratorDelegate::RESULT_PROCESSED
:
52 return POST_DISPATCH_NONE
;
53 case NestedAcceleratorDelegate::RESULT_NOT_PROCESSED
:
58 return nested_dispatcher_
? nested_dispatcher_
->Dispatch(event
)
59 : POST_DISPATCH_PERFORM_DEFAULT
;
62 MessagePumpDispatcher
* nested_dispatcher_
;
64 DISALLOW_COPY_AND_ASSIGN(NestedAcceleratorDispatcherWin
);
67 scoped_ptr
<NestedAcceleratorDispatcher
> NestedAcceleratorDispatcher::Create(
68 NestedAcceleratorDelegate
* delegate
,
69 MessagePumpDispatcher
* nested_dispatcher
) {
70 return make_scoped_ptr(
71 new NestedAcceleratorDispatcherWin(delegate
, nested_dispatcher
));