| Index: chrome/browser/ui/views/chrome_views_delegate.cc
|
| diff --git a/chrome/browser/ui/views/chrome_views_delegate.cc b/chrome/browser/ui/views/chrome_views_delegate.cc
|
| index 2d846924018069daeeb5679c19a57bbb08c3b253..7b01822118f1f011db423ba35f3c51aa59784830 100644
|
| --- a/chrome/browser/ui/views/chrome_views_delegate.cc
|
| +++ b/chrome/browser/ui/views/chrome_views_delegate.cc
|
| @@ -84,29 +84,35 @@ PrefService* GetPrefsForWindow(const views::Widget* window) {
|
| }
|
|
|
| #if defined(OS_WIN)
|
| -bool MonitorHasTopmostAutohideTaskbarForEdge(UINT edge, const RECT& rect) {
|
| - APPBARDATA taskbar_data = { sizeof(APPBARDATA), NULL, 0, edge, rect };
|
| +bool MonitorHasTopmostAutohideTaskbarForEdge(UINT edge, HMONITOR monitor) {
|
| + APPBARDATA taskbar_data = { sizeof(APPBARDATA), NULL, 0, edge };
|
| + // MSDN documents an ABM_GETAUTOHIDEBAREX, which supposedly takes a monitor
|
| + // rect and returns autohide bars on that monitor. This sounds like a good
|
| + // idea for multi-monitor systems. Unfortunately, it appears to not work at
|
| + // least some of the time (erroneously returning NULL) and there's almost no
|
| + // online documentation or other sample code using it that suggests ways to
|
| + // address this problem. So we just use ABM_GETAUTOHIDEBAR and hope the user
|
| + // only cares about autohide bars on the monitor with the primary taskbar.
|
| + //
|
| // NOTE: This call spins a nested message loop.
|
| - HWND taskbar = reinterpret_cast<HWND>(SHAppBarMessage(ABM_GETAUTOHIDEBAREX,
|
| + HWND taskbar = reinterpret_cast<HWND>(SHAppBarMessage(ABM_GETAUTOHIDEBAR,
|
| &taskbar_data));
|
| return ::IsWindow(taskbar) &&
|
| + (MonitorFromWindow(taskbar, MONITOR_DEFAULTTONULL) == monitor) &&
|
| (GetWindowLong(taskbar, GWL_EXSTYLE) & WS_EX_TOPMOST);
|
| }
|
|
|
| int GetAppbarAutohideEdgesOnWorkerThread(HMONITOR monitor) {
|
| DCHECK(monitor);
|
|
|
| - MONITORINFO mi = { sizeof(MONITORINFO) };
|
| - GetMonitorInfo(monitor, &mi);
|
| -
|
| int edges = 0;
|
| - if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_LEFT, mi.rcMonitor))
|
| + if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_LEFT, monitor))
|
| edges |= views::ViewsDelegate::EDGE_LEFT;
|
| - if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_TOP, mi.rcMonitor))
|
| + if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_TOP, monitor))
|
| edges |= views::ViewsDelegate::EDGE_TOP;
|
| - if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_RIGHT, mi.rcMonitor))
|
| + if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_RIGHT, monitor))
|
| edges |= views::ViewsDelegate::EDGE_RIGHT;
|
| - if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_BOTTOM, mi.rcMonitor))
|
| + if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_BOTTOM, monitor))
|
| edges |= views::ViewsDelegate::EDGE_BOTTOM;
|
| return edges;
|
| }
|
|
|