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

Unified Diff: remoting/host/local_input_monitor_mac.mm

Issue 10447041: Fix Ctrl+Alt+Esc keyboard shortcut in Me2Me host. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/host/local_input_monitor_linux.cc ('k') | remoting/host/local_input_monitor_thread_linux.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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());
}
« no previous file with comments | « remoting/host/local_input_monitor_linux.cc ('k') | remoting/host/local_input_monitor_thread_linux.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698