Index: remoting/host/local_input_monitor_mac.mm |
diff --git a/remoting/host/local_input_monitor_mac.mm b/remoting/host/local_input_monitor_mac.mm |
index 99a56be9b6f1fff53324a02694cd518957b7978d..8480c97a1f450df5d832bbd75e5e6cadf9dfd13f 100644 |
--- a/remoting/host/local_input_monitor_mac.mm |
+++ b/remoting/host/local_input_monitor_mac.mm |
@@ -14,24 +14,48 @@ |
#include "base/mac/scoped_cftyperef.h" |
#include "base/memory/ref_counted.h" |
#include "base/synchronization/lock.h" |
-#include "remoting/host/chromoting_host.h" |
+#include "remoting/host/mouse_move_observer.h" |
+#include "third_party/skia/include/core/SkPoint.h" |
#import "third_party/GTM/AppKit/GTMCarbonEvent.h" |
// Esc Key Code is 53. |
// http://boredzo.org/blog/wp-content/uploads/2007/05/IMTx-virtual-keycodes.pdf |
static const NSUInteger kEscKeyCode = 53; |
+namespace remoting { |
+ |
namespace { |
-typedef std::set<scoped_refptr<remoting::ChromotingHost> > Hosts; |
-} |
-@interface LocalInputMonitorImpl : NSObject { |
+class LocalInputMonitorMac : public LocalInputMonitor { |
+ public: |
+ LocalInputMonitorMac() : mouse_move_observer_(NULL) {} |
+ virtual ~LocalInputMonitorMac(); |
+ virtual void Start(MouseMoveObserver* mouse_move_observer, |
+ const base::Closure& disconnect_callback) OVERRIDE; |
+ virtual void Stop() OVERRIDE; |
+ |
+ void OnLocalMouseMoved(const SkIPoint& new_pos); |
+ void OnDisconnectShortcut(); |
+ |
+ private: |
+ MouseMoveObserver* mouse_move_observer_; |
+ base::Closure disconnect_callback_; |
+ DISALLOW_COPY_AND_ASSIGN(LocalInputMonitorMac); |
+}; |
+ |
+typedef std::set<remoting::LocalInputMonitorMac*> LocalInputMonitors; |
+ |
+} // namespace |
+ |
+} // namespace remoting |
+ |
+@interface LocalInputMonitorManager : NSObject { |
@private |
GTMCarbonHotKey* hotKey_; |
CFRunLoopSourceRef mouseRunLoopSource_; |
base::mac::ScopedCFTypeRef<CFMachPortRef> mouseMachPort_; |
- base::Lock hostsLock_; |
- Hosts hosts_; |
+ base::Lock lock_; |
+ remoting::LocalInputMonitors monitors_; |
} |
// Called when the hotKey is hit. |
@@ -40,20 +64,16 @@ typedef std::set<scoped_refptr<remoting::ChromotingHost> > Hosts; |
// Called when the local mouse moves |
- (void)localMouseMoved:(const SkIPoint&)mousePos; |
-// Must be called when the LocalInputMonitorImpl is no longer to be used. |
+// Must be called when the LocalInputMonitorManager is no longer to be used. |
// Similar to NSTimer in that more than a simple release is required. |
- (void)invalidate; |
-// Called to add a host to the list of those to be Shutdown() when the hotkey |
-// is pressed. |
-- (void)addHost:(remoting::ChromotingHost*)host; |
- |
-// Called to remove a host. Returns true if it was the last host being |
-// monitored, in which case the object should be destroyed. |
-- (bool)removeHost:(remoting::ChromotingHost*)host; |
+// Called to add a monitor. |
+- (void)addMonitor:(remoting::LocalInputMonitorMac*)monitor; |
-// Disabled disconnection keyboard shortcut. |
-- (void)disableShortcut; |
+// Called to remove a monitor. Returns true if it was the last |
+// monitor, in which case the object should be destroyed. |
+- (bool)removeMonitor:(remoting::LocalInputMonitorMac*)monitor; |
@end |
@@ -63,12 +83,12 @@ static CGEventRef LocalMouseMoved(CGEventTapProxy proxy, CGEventType type, |
if (pid == 0) { |
CGPoint cgMousePos = CGEventGetLocation(event); |
SkIPoint mousePos = SkIPoint::Make(cgMousePos.x, cgMousePos.y); |
- [static_cast<LocalInputMonitorImpl*>(context) localMouseMoved:mousePos]; |
+ [static_cast<LocalInputMonitorManager*>(context) localMouseMoved:mousePos]; |
} |
return NULL; |
} |
-@implementation LocalInputMonitorImpl |
+@implementation LocalInputMonitorManager |
- (id)init { |
if ((self = [super init])) { |
@@ -103,16 +123,18 @@ static CGEventRef LocalMouseMoved(CGEventTapProxy proxy, CGEventType type, |
} |
- (void)hotKeyHit:(GTMCarbonHotKey*)hotKey { |
- base::AutoLock lock(hostsLock_); |
- for (Hosts::const_iterator i = hosts_.begin(); i != hosts_.end(); ++i) { |
- (*i)->Shutdown(base::Closure()); |
+ base::AutoLock lock(lock_); |
+ for (remoting::LocalInputMonitors::const_iterator i = monitors_.begin(); |
+ i != monitors_.end(); ++i) { |
+ (*i)->OnDisconnectShortcut(); |
} |
} |
- (void)localMouseMoved:(const SkIPoint&)mousePos { |
- base::AutoLock lock(hostsLock_); |
- for (Hosts::const_iterator i = hosts_.begin(); i != hosts_.end(); ++i) { |
- (*i)->LocalMouseMoved(mousePos); |
+ base::AutoLock lock(lock_); |
+ for (remoting::LocalInputMonitors::const_iterator i = monitors_.begin(); |
+ i != monitors_.end(); ++i) { |
+ (*i)->OnLocalMouseMoved(mousePos); |
} |
} |
@@ -133,24 +155,15 @@ static CGEventRef LocalMouseMoved(CGEventTapProxy proxy, CGEventType type, |
} |
} |
-- (void)addHost:(remoting::ChromotingHost*)host { |
- base::AutoLock lock(hostsLock_); |
- hosts_.insert(host); |
-} |
- |
-- (bool)removeHost:(remoting::ChromotingHost*)host { |
- base::AutoLock lock(hostsLock_); |
- hosts_.erase(host); |
- return hosts_.empty(); |
+- (void)addMonitor:(remoting::LocalInputMonitorMac*)monitor { |
+ base::AutoLock lock(lock_); |
+ monitors_.insert(monitor); |
} |
-- (void)disableShortcut { |
- if (hotKey_) { |
- GTMCarbonEventDispatcherHandler* handler = |
- [GTMCarbonEventDispatcherHandler sharedEventDispatcherHandler]; |
- [handler unregisterHotKey:hotKey_]; |
- hotKey_ = NULL; |
- } |
+- (bool)removeMonitor:(remoting::LocalInputMonitorMac*)monitor { |
+ base::AutoLock lock(lock_); |
+ monitors_.erase(monitor); |
+ return monitors_.empty(); |
} |
@end |
@@ -159,50 +172,44 @@ namespace remoting { |
namespace { |
-class LocalInputMonitorMac : public LocalInputMonitor { |
- public: |
- LocalInputMonitorMac() : host_(NULL) {} |
- virtual ~LocalInputMonitorMac(); |
- virtual void Start(ChromotingHost* host) OVERRIDE; |
- virtual void Stop() OVERRIDE; |
- virtual void DisableShortcutOnMac() OVERRIDE; |
- |
- private: |
- ChromotingHost* host_; |
- DISALLOW_COPY_AND_ASSIGN(LocalInputMonitorMac); |
-}; |
- |
-base::LazyInstance<base::Lock>::Leaky monitor_lock = LAZY_INSTANCE_INITIALIZER; |
-LocalInputMonitorImpl* local_input_monitor = NULL; |
- |
-} // namespace |
+base::LazyInstance<base::Lock>::Leaky g_monitor_lock = |
+ LAZY_INSTANCE_INITIALIZER; |
+LocalInputMonitorManager* g_local_input_monitor_manager = NULL; |
LocalInputMonitorMac::~LocalInputMonitorMac() { |
Stop(); |
} |
-void LocalInputMonitorMac::Start(ChromotingHost* host) { |
- base::AutoLock lock(monitor_lock.Get()); |
- if (!local_input_monitor) |
- local_input_monitor = [[LocalInputMonitorImpl alloc] init]; |
- CHECK(local_input_monitor); |
- [local_input_monitor addHost:host]; |
- host_ = host; |
+void LocalInputMonitorMac::Start(MouseMoveObserver* mouse_move_observer, |
+ const base::Closure& disconnect_callback) { |
+ base::AutoLock lock(g_monitor_lock.Get()); |
+ if (!g_local_input_monitor_manager) |
+ g_local_input_monitor_manager = [[LocalInputMonitorManager alloc] init]; |
+ CHECK(g_local_input_monitor_manager); |
+ mouse_move_observer_ = mouse_move_observer; |
+ disconnect_callback_ = disconnect_callback; |
+ [g_local_input_monitor_manager addMonitor:this]; |
} |
void LocalInputMonitorMac::Stop() { |
- base::AutoLock lock(monitor_lock.Get()); |
- if ([local_input_monitor removeHost:host_]) { |
- [local_input_monitor invalidate]; |
- [local_input_monitor release]; |
- local_input_monitor = nil; |
+ base::AutoLock lock(g_monitor_lock.Get()); |
+ if ([g_local_input_monitor_manager removeMonitor:this]) { |
+ [g_local_input_monitor_manager invalidate]; |
+ [g_local_input_monitor_manager release]; |
+ g_local_input_monitor_manager = nil; |
} |
} |
-void LocalInputMonitorMac::DisableShortcutOnMac() { |
- [local_input_monitor disableShortcut]; |
+void LocalInputMonitorMac::OnLocalMouseMoved(const SkIPoint& new_pos) { |
+ mouse_move_observer_->OnLocalMouseMoved(new_pos); |
+} |
+ |
+void LocalInputMonitorMac::OnDisconnectShortcut() { |
+ disconnect_callback_.Run(); |
} |
+} // namespace |
+ |
scoped_ptr<LocalInputMonitor> LocalInputMonitor::Create() { |
return scoped_ptr<LocalInputMonitor>(new LocalInputMonitorMac()); |
} |