summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvarunjain@chromium.org <varunjain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-15 23:26:53 +0000
committervarunjain@chromium.org <varunjain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-15 23:26:53 +0000
commit6131a644b12d6359630c118a21c609a15d2f5c21 (patch)
tree5649b7074bcc561c842816109d8a2c7565491f63
parentfad7367a498d80a4c3e9e91342ffdfbaa7a4c3c6 (diff)
downloadchromium_src-6131a644b12d6359630c118a21c609a15d2f5c21.zip
chromium_src-6131a644b12d6359630c118a21c609a15d2f5c21.tar.gz
chromium_src-6131a644b12d6359630c118a21c609a15d2f5c21.tar.bz2
Listen to display settings provider for work area size changes and send those
changes to the renderer. BUG=126586 TEST=manual Review URL: https://chromiumcodereview.appspot.com/10407023 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142519 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/browser/renderer_host/render_view_host_impl.cc15
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.cc23
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.h5
-rw-r--r--content/browser/renderer_host/render_widget_host_view_base.cc17
-rw-r--r--content/browser/renderer_host/render_widget_host_view_base.h7
-rw-r--r--content/browser/renderer_host/render_widget_host_view_gtk.cc1
-rw-r--r--content/browser/renderer_host/render_widget_host_view_mac.mm30
-rw-r--r--content/browser/web_contents/web_contents_view_win.cc79
-rw-r--r--content/browser/web_contents/web_contents_view_win.h9
-rw-r--r--content/common/view_messages.h3
-rw-r--r--content/renderer/render_widget.cc6
-rw-r--r--content/renderer/render_widget.h1
-rw-r--r--ui/gfx/screen_android.cc5
-rw-r--r--ui/gfx/screen_mac.mm14
14 files changed, 195 insertions, 20 deletions
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 9ea4705..7cd2ccd 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -248,19 +248,8 @@ bool RenderViewHostImpl::CreateRenderView(
params.opener_route_id = opener_route_id;
params.swapped_out = is_swapped_out_;
params.next_page_id = next_page_id;
-#if defined(OS_POSIX) || defined(USE_AURA)
- if (GetView()) {
- static_cast<content::RenderWidgetHostViewPort*>(
- GetView())->GetScreenInfo(&params.screen_info);
- } else {
- content::RenderWidgetHostViewPort::GetDefaultScreenInfo(
- &params.screen_info);
- }
-#else
- params.screen_info =
- WebKit::WebScreenInfoFactory::screenInfo(
- gfx::NativeViewFromId(GetNativeViewId()));
-#endif
+ GetWebScreenInfo(&params.screen_info);
+
params.embedder_channel_name = embedder_channel_name;
params.embedder_container_id = embedder_container_id;
params.accessibility_mode =
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 5cc4cf5..069ece8 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -38,6 +38,9 @@
#include "skia/ext/image_operations.h"
#include "skia/ext/platform_canvas.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositionUnderline.h"
+#if defined(OS_WIN)
+#include "third_party/WebKit/Source/WebKit/chromium/public/win/WebScreenInfoFactory.h"
+#endif
#include "ui/base/keycodes/keyboard_codes.h"
#include "ui/gfx/skbitmap_operations.h"
#include "webkit/glue/webcursor.h"
@@ -968,6 +971,12 @@ void RenderWidgetHostImpl::RemoveKeyboardListener(
keyboard_listeners_.remove(listener);
}
+void RenderWidgetHostImpl::NotifyScreenInfoChanged() {
+ WebKit::WebScreenInfo screen_info;
+ GetWebScreenInfo(&screen_info);
+ Send(new ViewMsg_ScreenInfoChanged(GetRoutingID(), screen_info));
+}
+
void RenderWidgetHostImpl::SetDeviceScaleFactor(float scale) {
Send(new ViewMsg_SetDeviceScaleFactor(GetRoutingID(), scale));
}
@@ -1099,6 +1108,20 @@ void RenderWidgetHostImpl::SetShouldAutoResize(bool enable) {
should_auto_resize_ = enable;
}
+void RenderWidgetHostImpl::GetWebScreenInfo(WebKit::WebScreenInfo* result) {
+#if defined(OS_POSIX) || defined(USE_AURA)
+ if (GetView()) {
+ static_cast<content::RenderWidgetHostViewPort*>(
+ GetView())->GetScreenInfo(result);
+ } else {
+ content::RenderWidgetHostViewPort::GetDefaultScreenInfo(result);
+ }
+#else
+ *result = WebKit::WebScreenInfoFactory::screenInfo(
+ gfx::NativeViewFromId(GetNativeViewId()));
+#endif
+}
+
void RenderWidgetHostImpl::Destroy() {
NotificationService::current()->Notify(
NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 4be8960..e0ca4c5 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -122,6 +122,9 @@ class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost,
virtual void RemoveKeyboardListener(KeyboardListener* listener) OVERRIDE;
virtual void SetDeviceScaleFactor(float scale) OVERRIDE;
+ // Notification that the screen info has changed.
+ virtual void NotifyScreenInfoChanged();
+
// Sets the View of this RenderWidgetHost.
void SetView(RenderWidgetHostView* view);
@@ -431,6 +434,8 @@ class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost,
int increment_in_flight_event_count() { return ++in_flight_event_count_; }
int decrement_in_flight_event_count() { return --in_flight_event_count_; }
+ void GetWebScreenInfo(WebKit::WebScreenInfo* result);
+
// The View associated with the RenderViewHost. The lifetime of this object
// is associated with the lifetime of the Render process. If the Renderer
// crashes, its View is destroyed and this pointer becomes NULL, even though
diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc
index 28a45bb..56e70dd 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.cc
+++ b/content/browser/renderer_host/render_widget_host_view_base.cc
@@ -8,6 +8,8 @@
#include "content/browser/accessibility/browser_accessibility_manager.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h"
+#include "ui/gfx/display.h"
+#include "ui/gfx/screen.h"
#if defined(TOOLKIT_GTK)
#include <gdk/gdkx.h>
@@ -95,4 +97,19 @@ void RenderWidgetHostViewBase::SetBrowserAccessibilityManager(
browser_accessibility_manager_.reset(manager);
}
+void RenderWidgetHostViewBase::UpdateScreenInfo() {
+ gfx::Display monitor = gfx::Screen::GetMonitorNearestPoint(
+ GetViewBounds().origin());
+ if (current_display_area_ == monitor.bounds() &&
+ current_device_scale_factor_ == monitor.device_scale_factor())
+ return;
+ current_display_area_ = monitor.bounds();
+ current_device_scale_factor_ = monitor.device_scale_factor();
+ if (GetRenderWidgetHost()) {
+ RenderWidgetHostImpl* impl =
+ RenderWidgetHostImpl::From(GetRenderWidgetHost());
+ impl->NotifyScreenInfoChanged();
+ }
+}
+
} // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h
index ce60078..d6da2e3 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.h
+++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -22,6 +22,7 @@
#include "content/common/content_export.h"
#include "content/port/browser/render_widget_host_view_port.h"
#include "ui/base/range/range.h"
+#include "ui/gfx/rect.h"
namespace content {
@@ -61,6 +62,9 @@ class CONTENT_EXPORT RenderWidgetHostViewBase
void SetBrowserAccessibilityManager(BrowserAccessibilityManager* manager);
+ // Notification that a resize or move session ended on the native widget.
+ void UpdateScreenInfo();
+
protected:
// Interface class only, do not construct.
RenderWidgetHostViewBase();
@@ -97,6 +101,9 @@ class CONTENT_EXPORT RenderWidgetHostViewBase
// Manager of the tree representation of the WebKit render tree.
scoped_ptr<BrowserAccessibilityManager> browser_accessibility_manager_;
+ gfx::Rect current_display_area_;
+ float current_device_scale_factor_;
+
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewBase);
};
diff --git a/content/browser/renderer_host/render_widget_host_view_gtk.cc b/content/browser/renderer_host/render_widget_host_view_gtk.cc
index c6999c2..5292270 100644
--- a/content/browser/renderer_host/render_widget_host_view_gtk.cc
+++ b/content/browser/renderer_host/render_widget_host_view_gtk.cc
@@ -207,6 +207,7 @@ class RenderWidgetHostViewGtkWidget {
GdkEventConfigure* event,
RenderWidgetHostViewGtk* host_view) {
host_view->MarkCachedWidgetCenterStale();
+ host_view->UpdateScreenInfo();
return FALSE;
}
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index d0e675c..469bea3 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -158,6 +158,7 @@ float ScaleFactor(NSView* view) {
- (void)keyEvent:(NSEvent*)theEvent wasKeyEquivalent:(BOOL)equiv;
- (void)cancelChildPopups;
- (void)windowDidChangeBackingProperties:(NSNotification*)notification;
+- (void)windowChangedScreen:(NSNotification*)notification;
- (void)checkForPluginImeCancellation;
- (void)updateTabBackingStoreScaleFactor;
@end
@@ -1328,10 +1329,17 @@ void RenderWidgetHostViewMac::SetTextInputActive(bool active) {
}
handlingGlobalFrameDidChange_ = NO;
[[NSNotificationCenter defaultCenter]
- addObserver:self
- selector:@selector(globalFrameDidChange:)
- name:NSViewGlobalFrameDidChangeNotification
- object:self];
+ addObserver:self
+ selector:@selector(globalFrameDidChange:)
+ name:NSViewGlobalFrameDidChangeNotification
+ object:self];
+ if ([self window]) {
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(windowChangedScreen:)
+ name:NSWindowDidChangeScreenNotification
+ object:[self window]];
+ }
}
return self;
}
@@ -1882,7 +1890,10 @@ void RenderWidgetHostViewMac::SetTextInputActive(bool active) {
removeObserver:self
name:NSWindowDidChangeBackingPropertiesNotification
object:[self window]];
-
+ [[NSNotificationCenter defaultCenter]
+ removeObserver:self
+ name:NSWindowDidChangeScreenNotification
+ object:[self window]];
}
if (newWindow) {
[[NSNotificationCenter defaultCenter]
@@ -1890,6 +1901,11 @@ void RenderWidgetHostViewMac::SetTextInputActive(bool active) {
selector:@selector(windowDidChangeBackingProperties:)
name:NSWindowDidChangeBackingPropertiesNotification
object:newWindow];
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(windowChangedScreen:)
+ name:NSWindowDidChangeScreenNotification
+ object:newWindow];
}
}
@@ -1939,6 +1955,10 @@ void RenderWidgetHostViewMac::SetTextInputActive(bool active) {
handlingGlobalFrameDidChange_ = NO;
}
+- (void)windowChangedScreen:(NSNotification*)notification {
+ renderWidgetHostView_->UpdateScreenInfo();
+}
+
- (void)setFrameSize:(NSSize)newSize {
// NB: -[NSView setFrame:] calls through -setFrameSize:, so overriding
// -setFrame: isn't neccessary.
diff --git a/content/browser/web_contents/web_contents_view_win.cc b/content/browser/web_contents/web_contents_view_win.cc
index 3d7a9a8..12a11cb 100644
--- a/content/browser/web_contents/web_contents_view_win.cc
+++ b/content/browser/web_contents/web_contents_view_win.cc
@@ -5,6 +5,7 @@
#include "content/browser/web_contents/web_contents_view_win.h"
#include "base/bind.h"
+#include "base/memory/scoped_vector.h"
#include "content/browser/renderer_host/render_view_host_factory.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_view_win.h"
@@ -14,6 +15,7 @@
#include "content/browser/web_contents/web_drag_dest_win.h"
#include "content/public/browser/web_contents_delegate.h"
#include "content/public/browser/web_contents_view_delegate.h"
+#include "ui/base/win/hwnd_subclass.h"
#include "ui/gfx/screen.h"
using content::RenderViewHost;
@@ -71,6 +73,60 @@ class TempParent : public ui::WindowImpl {
END_MSG_MAP()
};
+typedef std::map<HWND, WebContentsViewWin*> HwndToWcvMap;
+HwndToWcvMap hwnd_to_wcv_map;
+
+void RemoveHwndToWcvMapEntry(WebContentsViewWin* wcv) {
+ HwndToWcvMap::iterator it;
+ for (it = hwnd_to_wcv_map.begin(); it != hwnd_to_wcv_map.end();) {
+ if (it->second == wcv)
+ hwnd_to_wcv_map.erase(it++);
+ else
+ ++it;
+ }
+}
+
+BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {
+ HwndToWcvMap::iterator it = hwnd_to_wcv_map.find(hwnd);
+ if (it == hwnd_to_wcv_map.end())
+ return TRUE; // must return TRUE to continue enumeration.
+ WebContentsViewWin* wcv = it->second;
+ RenderWidgetHostViewWin* rwhv = static_cast<RenderWidgetHostViewWin*>(
+ wcv->web_contents()->GetRenderWidgetHostView());
+ if (rwhv)
+ rwhv->UpdateScreenInfo();
+
+ return TRUE; // must return TRUE to continue enumeration.
+}
+
+class PositionChangedMessageFilter : public ui::HWNDMessageFilter {
+ public:
+ PositionChangedMessageFilter() {}
+
+ private:
+ // Overridden from ui::HWNDMessageFilter:
+ virtual bool FilterMessage(HWND hwnd,
+ UINT message,
+ WPARAM w_param,
+ LPARAM l_param,
+ LRESULT* l_result) OVERRIDE {
+ if (message == WM_WINDOWPOSCHANGED)
+ EnumChildWindows(hwnd, EnumChildProc, 0);
+
+ return false;
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(PositionChangedMessageFilter);
+};
+
+void AddFilterToParentHwndSubclass(HWND hwnd, ui::HWNDMessageFilter* filter) {
+ HWND parent = ::GetAncestor(hwnd, GA_ROOT);
+ if (parent) {
+ ui::HWNDSubclass::RemoveFilterFromAllTargets(filter);
+ ui::HWNDSubclass::AddFilterToTarget(parent, filter);
+ }
+}
+
} // namespace namespace
WebContentsViewWin::WebContentsViewWin(WebContentsImpl* web_contents,
@@ -78,10 +134,13 @@ WebContentsViewWin::WebContentsViewWin(WebContentsImpl* web_contents,
: web_contents_(web_contents),
view_(NULL),
delegate_(delegate),
- close_tab_after_drag_ends_(false) {
+ close_tab_after_drag_ends_(false),
+ hwnd_message_filter_(new PositionChangedMessageFilter) {
}
WebContentsViewWin::~WebContentsViewWin() {
+ RemoveHwndToWcvMapEntry(this);
+
if (IsWindow(hwnd()))
DestroyWindow(hwnd());
}
@@ -299,6 +358,13 @@ void WebContentsViewWin::CloseTab() {
rvh->GetDelegate()->Close(rvh);
}
+LRESULT WebContentsViewWin::OnCreate(
+ UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) {
+ hwnd_to_wcv_map.insert(std::make_pair(hwnd(), this));
+ AddFilterToParentHwndSubclass(hwnd(), hwnd_message_filter_.get());
+ return 0;
+}
+
LRESULT WebContentsViewWin::OnDestroy(
UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) {
if (drag_dest_.get()) {
@@ -310,6 +376,10 @@ LRESULT WebContentsViewWin::OnDestroy(
LRESULT WebContentsViewWin::OnWindowPosChanged(
UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) {
+
+ // Our parent might have changed. So we re-install our hwnd message filter.
+ AddFilterToParentHwndSubclass(hwnd(), hwnd_message_filter_.get());
+
WINDOWPOS* window_pos = reinterpret_cast<WINDOWPOS*>(lparam);
if (window_pos->flags & SWP_HIDEWINDOW) {
web_contents_->HideContents();
@@ -321,6 +391,12 @@ LRESULT WebContentsViewWin::OnWindowPosChanged(
if (window_pos->flags & SWP_SHOWWINDOW)
web_contents_->ShowContents();
+ RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
+ if (rwhv) {
+ RenderWidgetHostViewWin* view = static_cast<RenderWidgetHostViewWin*>(rwhv);
+ view->UpdateScreenInfo();
+ }
+
// Unless we were specifically told not to size, cause the renderer to be
// sized to the new bounds, which forces a repaint. Not required for the
// simple minimize-restore case described above, for example, since the
@@ -331,7 +407,6 @@ LRESULT WebContentsViewWin::OnWindowPosChanged(
gfx::Size size(window_pos->cx, window_pos->cy);
if (web_contents_->GetInterstitialPage())
web_contents_->GetInterstitialPage()->SetSize(size);
- RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
if (rwhv)
rwhv->SetSize(size);
diff --git a/content/browser/web_contents/web_contents_view_win.h b/content/browser/web_contents/web_contents_view_win.h
index 016e359..2e69f80 100644
--- a/content/browser/web_contents/web_contents_view_win.h
+++ b/content/browser/web_contents/web_contents_view_win.h
@@ -24,6 +24,10 @@ namespace content {
class WebContentsViewDelegate;
}
+namespace ui {
+class HWNDMessageFilter;
+}
+
// An implementation of WebContentsView for Windows.
class CONTENT_EXPORT WebContentsViewWin
: public content::WebContentsView,
@@ -35,6 +39,7 @@ class CONTENT_EXPORT WebContentsViewWin
virtual ~WebContentsViewWin();
BEGIN_MSG_MAP_EX(WebContentsViewWin)
+ MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnMouseDown)
@@ -98,6 +103,8 @@ class CONTENT_EXPORT WebContentsViewWin
void EndDragging();
void CloseTab();
+ LRESULT OnCreate(
+ UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled);
LRESULT OnDestroy(
UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled);
LRESULT OnWindowPosChanged(
@@ -140,6 +147,8 @@ class CONTENT_EXPORT WebContentsViewWin
// Used to close the tab after the stack has unwound.
base::OneShotTimer<WebContentsViewWin> close_tab_timer_;
+ scoped_ptr<ui::HWNDMessageFilter> hwnd_message_filter_;
+
DISALLOW_COPY_AND_ASSIGN(WebContentsViewWin);
};
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index 7d5c48e..49fef05 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -1133,6 +1133,9 @@ IPC_MESSAGE_ROUTED1(ViewMsg_Repaint,
// started.
IPC_MESSAGE_ROUTED0(ViewMsg_MoveOrResizeStarted)
+IPC_MESSAGE_ROUTED1(ViewMsg_ScreenInfoChanged,
+ WebKit::WebScreenInfo /* screen_info */)
+
// Reply to ViewHostMsg_RequestMove, ViewHostMsg_ShowView, and
// ViewHostMsg_ShowWidget to inform the renderer that the browser has
// processed the move. The browser may have ignored the move, but it finished
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 12cad67..3449f3e5 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -238,6 +238,7 @@ bool RenderWidget::OnMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_HANDLER(ViewMsg_SetDeviceScaleFactor, OnSetDeviceScaleFactor)
IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection)
IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck)
+ IPC_MESSAGE_HANDLER(ViewMsg_ScreenInfoChanged, OnScreenInfoChanged)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
@@ -1508,6 +1509,11 @@ void RenderWidget::OnSetTextDirection(WebTextDirection direction) {
webwidget_->setTextDirection(direction);
}
+void RenderWidget::OnScreenInfoChanged(
+ const WebKit::WebScreenInfo& screen_info) {
+ screen_info_ = screen_info;
+}
+
webkit::ppapi::PluginInstance* RenderWidget::GetBitmapForOptimizedPluginPaint(
const gfx::Rect& paint_bounds,
TransportDIB** dib,
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index 6411374..b048558 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -257,6 +257,7 @@ class CONTENT_EXPORT RenderWidget
virtual void OnSetDeviceScaleFactor(float device_scale_factor);
void OnSetTextDirection(WebKit::WebTextDirection direction);
void OnGetFPS();
+ void OnScreenInfoChanged(const WebKit::WebScreenInfo& screen_info);
// Override points to notify derived classes that a paint has happened.
// WillInitiatePaint happens when we're about to generate a new bitmap and
diff --git a/ui/gfx/screen_android.cc b/ui/gfx/screen_android.cc
index fa30aef..576afab 100644
--- a/ui/gfx/screen_android.cc
+++ b/ui/gfx/screen_android.cc
@@ -26,6 +26,11 @@ gfx::Display Screen::GetMonitorNearestWindow(gfx::NativeView view) {
}
// static
+gfx::Display Screen::GetMonitorNearestPoint(const gfx::Point& point) {
+ return GetPrimaryMonitor();
+}
+
+// static
int Screen::GetNumMonitors() {
return 1;
}
diff --git a/ui/gfx/screen_mac.mm b/ui/gfx/screen_mac.mm
index 5c6d3a1..7960447 100644
--- a/ui/gfx/screen_mac.mm
+++ b/ui/gfx/screen_mac.mm
@@ -147,4 +147,18 @@ int Screen::GetNumMonitors() {
return display_count;
}
+// static
+gfx::Display Screen::GetMonitorNearestPoint(const gfx::Point& point) {
+ NSPoint ns_point = NSPointFromCGPoint(point.ToCGPoint());
+
+ NSArray* screens = [NSScreen screens];
+ NSScreen* primary = [screens objectAtIndex:0];
+ for (NSScreen* screen in screens) {
+ if (NSMouseInRect(ns_point, [screen frame], NO))
+ return GetDisplayForScreen(screen, screen == primary);
+ }
+ NOTREACHED();
+ return gfx::Display();
+}
+
} // namespace gfx