OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "remoting/host/local_input_monitor.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/callback.h" | |
9 #include "base/location.h" | |
10 #include "base/single_thread_task_runner.h" | |
11 #include "base/threading/non_thread_safe.h" | |
12 #include "remoting/host/client_session_control.h" | |
13 #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" | |
14 #include "ui/events/event.h" | |
15 #include "ui/events/event_utils.h" | |
16 #include "ui/events/keycodes/keyboard_codes.h" | |
17 #include "ui/events/platform/platform_event_observer.h" | |
18 #include "ui/events/platform/platform_event_source.h" | |
19 | |
20 namespace remoting { | |
21 | |
22 namespace { | |
23 | |
24 class LocalInputMonitorChromeos : public LocalInputMonitor { | |
25 public: | |
26 LocalInputMonitorChromeos( | |
27 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | |
28 scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, | |
29 base::WeakPtr<ClientSessionControl> client_session_control); | |
30 virtual ~LocalInputMonitorChromeos(); | |
31 | |
32 private: | |
33 class Core : ui::PlatformEventObserver { | |
34 public: | |
35 Core(scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | |
36 base::WeakPtr<ClientSessionControl> client_session_control); | |
37 ~Core(); | |
38 | |
39 void Start(); | |
40 | |
41 // ui::PlatformEventObserver interface. | |
42 void WillProcessEvent(const ui::PlatformEvent& event) override; | |
43 void DidProcessEvent(const ui::PlatformEvent& event) override; | |
44 | |
45 private: | |
46 void HandleMouseMove(const ui::PlatformEvent& event); | |
47 void HandleKeyPressed(const ui::PlatformEvent& event); | |
48 | |
49 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; | |
50 | |
51 // Points to the object receiving mouse event notifications and session | |
52 // disconnect requests. Must be called on the |caller_task_runner_|. | |
53 base::WeakPtr<ClientSessionControl> client_session_control_; | |
54 | |
55 DISALLOW_COPY_AND_ASSIGN(Core); | |
56 }; | |
57 | |
58 // Task runner on which ui::events are received. | |
59 scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_; | |
60 scoped_ptr<Core> core_; | |
61 | |
62 DISALLOW_COPY_AND_ASSIGN(LocalInputMonitorChromeos); | |
63 }; | |
64 | |
65 LocalInputMonitorChromeos::LocalInputMonitorChromeos( | |
66 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | |
67 scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, | |
68 base::WeakPtr<ClientSessionControl> client_session_control) | |
69 : input_task_runner_(input_task_runner), | |
70 core_(new Core(caller_task_runner, client_session_control)) { | |
71 input_task_runner_->PostTask( | |
72 FROM_HERE, base::Bind(&Core::Start, base::Unretained(core_.get()))); | |
73 } | |
74 | |
75 LocalInputMonitorChromeos::~LocalInputMonitorChromeos() { | |
76 input_task_runner_->DeleteSoon(FROM_HERE, core_.release()); | |
77 } | |
78 | |
79 LocalInputMonitorChromeos::Core::Core( | |
80 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | |
81 base::WeakPtr<ClientSessionControl> client_session_control) | |
82 : caller_task_runner_(caller_task_runner), | |
83 client_session_control_(client_session_control) { | |
84 DCHECK(client_session_control_.get()); | |
85 } | |
86 | |
87 void LocalInputMonitorChromeos::Core::Start() { | |
88 ui::PlatformEventSource::GetInstance()->AddPlatformEventObserver(this); | |
89 } | |
90 | |
91 LocalInputMonitorChromeos::Core::~Core() { | |
92 ui::PlatformEventSource::GetInstance()->RemovePlatformEventObserver(this); | |
93 } | |
94 | |
95 void LocalInputMonitorChromeos::Core::WillProcessEvent( | |
96 const ui::PlatformEvent& event) { | |
97 // No need to handle this callback. | |
98 } | |
99 | |
100 void LocalInputMonitorChromeos::Core::DidProcessEvent( | |
101 const ui::PlatformEvent& event) { | |
102 ui::EventType type = ui::EventTypeFromNative(event); | |
103 if (type == ui::ET_MOUSE_MOVED) { | |
104 HandleMouseMove(event); | |
105 } else if (type == ui::ET_KEY_PRESSED) { | |
106 HandleKeyPressed(event); | |
107 } | |
108 } | |
109 | |
110 void LocalInputMonitorChromeos::Core::HandleMouseMove( | |
111 const ui::PlatformEvent& event) { | |
112 gfx::Point mouse_position = ui::EventLocationFromNative(event); | |
113 caller_task_runner_->PostTask( | |
114 FROM_HERE, | |
115 base::Bind( | |
116 &ClientSessionControl::OnLocalMouseMoved, client_session_control_, | |
117 webrtc::DesktopVector(mouse_position.x(), mouse_position.y()))); | |
118 } | |
119 | |
120 void LocalInputMonitorChromeos::Core::HandleKeyPressed( | |
121 const ui::PlatformEvent& event) { | |
122 ui::KeyEvent key_event(event); | |
123 DCHECK(key_event.is_char()); | |
124 if (key_event.IsControlDown() && key_event.IsAltDown() && | |
125 key_event.key_code() == ui::VKEY_ESCAPE) { | |
126 caller_task_runner_->PostTask( | |
127 FROM_HERE, base::Bind(&ClientSessionControl::DisconnectSession, | |
128 client_session_control_)); | |
129 } | |
130 } | |
131 | |
132 } // namespace | |
133 | |
134 scoped_ptr<LocalInputMonitor> LocalInputMonitor::Create( | |
135 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | |
136 scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, | |
137 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, | |
138 base::WeakPtr<ClientSessionControl> client_session_control) { | |
139 return make_scoped_ptr(new LocalInputMonitorChromeos( | |
140 caller_task_runner, input_task_runner, client_session_control)); | |
141 } | |
142 | |
143 } // namespace remoting | |
OLD | NEW |