From bda5fa77af79524e55ec5d5da402bb9511fc3ecf Mon Sep 17 00:00:00 2001 From: "jiayl@webrtc.org" Date: Thu, 30 Jan 2014 23:27:35 +0000 Subject: [PATCH] Fix the mouse cursor offset issue on Mac. The problem is that MouseCursorMonitor returns coordinates in DIPs, while DisplayAndMouseComposer assumes that they are in physical pixels. The fix is to convert the position to physical pixels in MouseCursorMonitorMac. R=sergeyu@chromium.org Review URL: https://webrtc-codereview.appspot.com/7739006 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5463 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../mouse_cursor_monitor_mac.mm | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/webrtc/modules/desktop_capture/mouse_cursor_monitor_mac.mm b/webrtc/modules/desktop_capture/mouse_cursor_monitor_mac.mm index 3007599d81..25d7e7aaa6 100644 --- a/webrtc/modules/desktop_capture/mouse_cursor_monitor_mac.mm +++ b/webrtc/modules/desktop_capture/mouse_cursor_monitor_mac.mm @@ -15,15 +15,19 @@ #include #include +#include "webrtc/modules/desktop_capture/desktop_capture_options.h" #include "webrtc/modules/desktop_capture/desktop_frame.h" +#include "webrtc/modules/desktop_capture/mac/desktop_configuration_monitor.h" #include "webrtc/modules/desktop_capture/mouse_cursor.h" #include "webrtc/system_wrappers/interface/scoped_ptr.h" +#include "webrtc/system_wrappers/interface/scoped_refptr.h" namespace webrtc { class MouseCursorMonitorMac : public MouseCursorMonitor { public: - MouseCursorMonitorMac(CGWindowID window_id); + MouseCursorMonitorMac(const DesktopCaptureOptions& options, + CGWindowID window_id); virtual ~MouseCursorMonitorMac(); virtual void Init(Callback* callback, Mode mode) OVERRIDE; @@ -32,6 +36,7 @@ class MouseCursorMonitorMac : public MouseCursorMonitor { private: void CaptureImage(); + scoped_refptr configuration_monitor_; CGWindowID window_id_; Callback* callback_; @@ -40,8 +45,11 @@ class MouseCursorMonitorMac : public MouseCursorMonitor { scoped_ptr last_cursor_; }; -MouseCursorMonitorMac::MouseCursorMonitorMac(CGWindowID window_id) - : window_id_(window_id), +MouseCursorMonitorMac::MouseCursorMonitorMac( + const DesktopCaptureOptions& options, + CGWindowID window_id) + : configuration_monitor_(options.configuration_monitor()), + window_id_(window_id), callback_(NULL), mode_(SHAPE_AND_POSITION) { } @@ -147,6 +155,15 @@ void MouseCursorMonitorMac::Capture() { } } + // Convert Density Independent Pixel to physical pixel. + configuration_monitor_->Lock(); + float scale = + configuration_monitor_->desktop_configuration().dip_to_pixel_scale; + configuration_monitor_->Unlock(); + + position = DesktopVector(round(position.x() * scale), + round(position.y() * scale)); + callback_->OnMouseCursorPosition(state, position); } @@ -207,13 +224,13 @@ void MouseCursorMonitorMac::CaptureImage() { MouseCursorMonitor* MouseCursorMonitor::CreateForWindow( const DesktopCaptureOptions& options, WindowId window) { - return new MouseCursorMonitorMac(window); + return new MouseCursorMonitorMac(options, window); } MouseCursorMonitor* MouseCursorMonitor::CreateForScreen( const DesktopCaptureOptions& options, ScreenId screen) { - return new MouseCursorMonitorMac(kCGNullWindowID); + return new MouseCursorMonitorMac(options, kCGNullWindowID); } } // namespace webrtc