Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: remoting/host/local_input_monitor_mac.mm

Issue 12594009: Converted LocalInputMonitor into a SessionController instance. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/host/local_input_monitor.h" 5 #include "remoting/host/local_input_monitor.h"
6 6
7 #import <AppKit/AppKit.h> 7 #import <AppKit/AppKit.h>
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/compiler_specific.h" 11 #include "base/compiler_specific.h"
12 #include "base/location.h" 12 #include "base/location.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/mac/scoped_cftyperef.h" 14 #include "base/mac/scoped_cftyperef.h"
15 #include "base/memory/ref_counted.h" 15 #include "base/memory/ref_counted.h"
16 #include "base/single_thread_task_runner.h" 16 #include "base/single_thread_task_runner.h"
17 #include "base/synchronization/lock.h" 17 #include "base/synchronization/lock.h"
18 #include "remoting/host/mouse_move_observer.h" 18 #include "base/threading/non_thread_safe.h"
19 #include "remoting/host/client_session_control.h"
19 #include "third_party/skia/include/core/SkPoint.h" 20 #include "third_party/skia/include/core/SkPoint.h"
20 #import "third_party/GTM/AppKit/GTMCarbonEvent.h" 21 #import "third_party/GTM/AppKit/GTMCarbonEvent.h"
21 22
22 // Esc Key Code is 53. 23 // Esc Key Code is 53.
23 // http://boredzo.org/blog/wp-content/uploads/2007/05/IMTx-virtual-keycodes.pdf 24 // http://boredzo.org/blog/wp-content/uploads/2007/05/IMTx-virtual-keycodes.pdf
24 static const NSUInteger kEscKeyCode = 53; 25 static const NSUInteger kEscKeyCode = 53;
25 26
26 namespace remoting { 27 namespace remoting {
27 namespace { 28 namespace {
28 29
29 class LocalInputMonitorMac : public LocalInputMonitor { 30 class LocalInputMonitorMac : public base::NonThreadSafe,
31 public LocalInputMonitor {
30 public: 32 public:
31 // Invoked by LocalInputMonitorManager. 33 // Invoked by LocalInputMonitorManager.
32 class EventHandler { 34 class EventHandler {
33 public: 35 public:
34 virtual ~EventHandler() {} 36 virtual ~EventHandler() {}
35 37
36 virtual void OnLocalMouseMoved(const SkIPoint& position) = 0; 38 virtual void OnLocalMouseMoved(const SkIPoint& position) = 0;
37 virtual void OnDisconnectShortcut() = 0; 39 virtual void OnDisconnectShortcut() = 0;
38 }; 40 };
39 41
40 LocalInputMonitorMac( 42 LocalInputMonitorMac(
41 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 43 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
42 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); 44 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
45 base::WeakPtr<ClientSessionControl> client_session_control);
43 virtual ~LocalInputMonitorMac(); 46 virtual ~LocalInputMonitorMac();
44 47
45 virtual void Start(MouseMoveObserver* mouse_move_observer,
46 const base::Closure& disconnect_callback) OVERRIDE;
47 virtual void Stop() OVERRIDE;
48
49 private: 48 private:
50 // The actual implementation resides in LocalInputMonitorMac::Core class. 49 // The actual implementation resides in LocalInputMonitorMac::Core class.
51 class Core; 50 class Core;
52 scoped_refptr<Core> core_; 51 scoped_refptr<Core> core_;
53 52
54 DISALLOW_COPY_AND_ASSIGN(LocalInputMonitorMac); 53 DISALLOW_COPY_AND_ASSIGN(LocalInputMonitorMac);
55 }; 54 };
56 55
57 } // namespace 56 } // namespace
58 } // namespace remoting 57 } // namespace remoting
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 @end 153 @end
155 154
156 namespace remoting { 155 namespace remoting {
157 namespace { 156 namespace {
158 157
159 class LocalInputMonitorMac::Core 158 class LocalInputMonitorMac::Core
160 : public base::RefCountedThreadSafe<Core>, 159 : public base::RefCountedThreadSafe<Core>,
161 public EventHandler { 160 public EventHandler {
162 public: 161 public:
163 Core(scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 162 Core(scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
164 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); 163 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
164 base::WeakPtr<ClientSessionControl> client_session_control);
165 165
166 void Start(MouseMoveObserver* mouse_move_observer, 166 void Start();
167 const base::Closure& disconnect_callback);
168 void Stop(); 167 void Stop();
169 168
170 private: 169 private:
171 friend class base::RefCountedThreadSafe<Core>; 170 friend class base::RefCountedThreadSafe<Core>;
172 virtual ~Core(); 171 virtual ~Core();
173 172
174 void StartOnUiThread(); 173 void StartOnUiThread();
175 void StopOnUiThread(); 174 void StopOnUiThread();
176 175
177 // EventHandler interface. 176 // EventHandler interface.
178 virtual void OnLocalMouseMoved(const SkIPoint& position) OVERRIDE; 177 virtual void OnLocalMouseMoved(const SkIPoint& position) OVERRIDE;
179 virtual void OnDisconnectShortcut() OVERRIDE; 178 virtual void OnDisconnectShortcut() OVERRIDE;
180 179
181 // Task runner on which public methods of this class must be called. 180 // Task runner on which public methods of this class must be called.
182 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; 181 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
183 182
184 // Task runner on which |window_| is created. 183 // Task runner on which |window_| is created.
185 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; 184 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
186 185
187 LocalInputMonitorManager* manager_; 186 LocalInputMonitorManager* manager_;
188 187
189 // Invoked in the |caller_task_runner_| thread to report local mouse events. 188 // Invoked in the |caller_task_runner_| thread to report local mouse events
190 MouseMoveObserver* mouse_move_observer_; 189 // and session disconnect requests.
191 190 base::WeakPtr<ClientSessionControl> client_session_control_;
192 // Posted to the |caller_task_runner_| thread every time the disconnect key
193 // combination is pressed.
194 base::Closure disconnect_callback_;
195 191
196 DISALLOW_COPY_AND_ASSIGN(Core); 192 DISALLOW_COPY_AND_ASSIGN(Core);
197 }; 193 };
198 194
199 LocalInputMonitorMac::LocalInputMonitorMac( 195 LocalInputMonitorMac::LocalInputMonitorMac(
200 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 196 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
201 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) 197 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
202 : core_(new Core(caller_task_runner, ui_task_runner)) { 198 base::WeakPtr<ClientSessionControl> client_session_control)
199 : core_(new Core(caller_task_runner,
200 ui_task_runner,
201 client_session_control)) {
202 core_->Start();
203 } 203 }
204 204
205 LocalInputMonitorMac::~LocalInputMonitorMac() { 205 LocalInputMonitorMac::~LocalInputMonitorMac() {
206 }
207
208 void LocalInputMonitorMac::Start(MouseMoveObserver* mouse_move_observer,
209 const base::Closure& disconnect_callback) {
210 core_->Start(mouse_move_observer, disconnect_callback);
211 }
212
213 void LocalInputMonitorMac::Stop() {
214 core_->Stop(); 206 core_->Stop();
215 } 207 }
216 208
217 LocalInputMonitorMac::Core::Core( 209 LocalInputMonitorMac::Core::Core(
218 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 210 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
219 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) 211 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
212 base::WeakPtr<ClientSessionControl> client_session_control)
220 : caller_task_runner_(caller_task_runner), 213 : caller_task_runner_(caller_task_runner),
221 ui_task_runner_(ui_task_runner), 214 ui_task_runner_(ui_task_runner),
222 manager_(nil), 215 manager_(nil),
223 mouse_move_observer_(NULL) { 216 client_session_control_(client_session_control) {
217 DCHECK(client_session_control_);
224 } 218 }
225 219
226 void LocalInputMonitorMac::Core::Start( 220 void LocalInputMonitorMac::Core::Start() {
227 MouseMoveObserver* mouse_move_observer,
228 const base::Closure& disconnect_callback) {
229 DCHECK(caller_task_runner_->BelongsToCurrentThread()); 221 DCHECK(caller_task_runner_->BelongsToCurrentThread());
230 DCHECK(disconnect_callback_.is_null());
231 DCHECK(!disconnect_callback.is_null());
232 DCHECK(!mouse_move_observer_);
233 DCHECK(mouse_move_observer);
234 222
235 disconnect_callback_ = disconnect_callback;
236 mouse_move_observer_ = mouse_move_observer;
237 ui_task_runner_->PostTask(FROM_HERE, 223 ui_task_runner_->PostTask(FROM_HERE,
238 base::Bind(&Core::StartOnUiThread, this)); 224 base::Bind(&Core::StartOnUiThread, this));
239 } 225 }
240 226
241 void LocalInputMonitorMac::Core::Stop() { 227 void LocalInputMonitorMac::Core::Stop() {
242 DCHECK(caller_task_runner_->BelongsToCurrentThread()); 228 DCHECK(caller_task_runner_->BelongsToCurrentThread());
243 229
244 mouse_move_observer_ = NULL;
245 disconnect_callback_.Reset();
246 ui_task_runner_->PostTask(FROM_HERE, base::Bind(&Core::StopOnUiThread, this)); 230 ui_task_runner_->PostTask(FROM_HERE, base::Bind(&Core::StopOnUiThread, this));
247 } 231 }
248 232
249 LocalInputMonitorMac::Core::~Core() { 233 LocalInputMonitorMac::Core::~Core() {
250 DCHECK(manager_ == nil); 234 DCHECK(manager_ == nil);
251 DCHECK(disconnect_callback_.is_null());
252 DCHECK(!mouse_move_observer_);
253 } 235 }
254 236
255 void LocalInputMonitorMac::Core::StartOnUiThread() { 237 void LocalInputMonitorMac::Core::StartOnUiThread() {
256 DCHECK(ui_task_runner_->BelongsToCurrentThread()); 238 DCHECK(ui_task_runner_->BelongsToCurrentThread());
257 239
258 manager_ = [[LocalInputMonitorManager alloc] initWithMonitor:this]; 240 manager_ = [[LocalInputMonitorManager alloc] initWithMonitor:this];
259 } 241 }
260 242
261 void LocalInputMonitorMac::Core::StopOnUiThread() { 243 void LocalInputMonitorMac::Core::StopOnUiThread() {
262 DCHECK(ui_task_runner_->BelongsToCurrentThread()); 244 DCHECK(ui_task_runner_->BelongsToCurrentThread());
263 245
264 [manager_ invalidate]; 246 [manager_ invalidate];
265 [manager_ release]; 247 [manager_ release];
266 manager_ = nil; 248 manager_ = nil;
267 } 249 }
268 250
269 void LocalInputMonitorMac::Core::OnLocalMouseMoved(const SkIPoint& position) { 251 void LocalInputMonitorMac::Core::OnLocalMouseMoved(const SkIPoint& position) {
270 if (!caller_task_runner_->BelongsToCurrentThread()) { 252 caller_task_runner_->PostTask(
271 caller_task_runner_->PostTask( 253 FROM_HERE, base::Bind(&ClientSessionControl::OnLocalMouseMoved,
272 FROM_HERE, base::Bind(&Core::OnLocalMouseMoved, this, position)); 254 client_session_control_,
273 return; 255 position));
274 }
275
276 if (mouse_move_observer_)
277 mouse_move_observer_->OnLocalMouseMoved(position);
278 } 256 }
279 257
280 void LocalInputMonitorMac::Core::OnDisconnectShortcut() { 258 void LocalInputMonitorMac::Core::OnDisconnectShortcut() {
281 if (!caller_task_runner_->BelongsToCurrentThread()) { 259 caller_task_runner_->PostTask(
282 caller_task_runner_->PostTask( 260 FROM_HERE, base::Bind(&ClientSessionControl::DisconnectSession,
283 FROM_HERE, base::Bind(&Core::OnDisconnectShortcut, this)); 261 client_session_control_));
284 return;
285 }
286
287 if (!disconnect_callback_.is_null())
288 disconnect_callback_.Run();
289 } 262 }
290 263
291 } // namespace 264 } // namespace
292 265
293 scoped_ptr<LocalInputMonitor> LocalInputMonitor::Create( 266 scoped_ptr<LocalInputMonitor> LocalInputMonitor::Create(
294 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 267 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
295 scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, 268 scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
296 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { 269 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
270 base::WeakPtr<ClientSessionControl> client_session_control) {
297 return scoped_ptr<LocalInputMonitor>( 271 return scoped_ptr<LocalInputMonitor>(
298 new LocalInputMonitorMac(caller_task_runner, ui_task_runner)); 272 new LocalInputMonitorMac(caller_task_runner,
273 ui_task_runner,
274 client_session_control));
299 } 275 }
300 276
301 } // namespace remoting 277 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/host/local_input_monitor_linux.cc ('k') | remoting/host/local_input_monitor_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698