| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/chrome_views_delegate.h" | 5 #include "chrome/browser/ui/views/chrome_views_delegate.h" |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/prefs/pref_service.h" | 8 #include "base/prefs/pref_service.h" |
| 9 #include "base/prefs/scoped_user_pref_update.h" | 9 #include "base/prefs/scoped_user_pref_update.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 PrefService* GetPrefsForWindow(const views::Widget* window) { | 77 PrefService* GetPrefsForWindow(const views::Widget* window) { |
| 78 Profile* profile = GetProfileForWindow(window); | 78 Profile* profile = GetProfileForWindow(window); |
| 79 if (!profile) { | 79 if (!profile) { |
| 80 // Use local state for windows that have no explicit profile. | 80 // Use local state for windows that have no explicit profile. |
| 81 return g_browser_process->local_state(); | 81 return g_browser_process->local_state(); |
| 82 } | 82 } |
| 83 return profile->GetPrefs(); | 83 return profile->GetPrefs(); |
| 84 } | 84 } |
| 85 | 85 |
| 86 #if defined(OS_WIN) | 86 #if defined(OS_WIN) |
| 87 bool MonitorHasTopmostAutohideTaskbarForEdge(UINT edge, const RECT& rect) { | 87 bool MonitorHasTopmostAutohideTaskbarForEdge(UINT edge, HMONITOR monitor) { |
| 88 APPBARDATA taskbar_data = { sizeof(APPBARDATA), NULL, 0, edge, rect }; | 88 APPBARDATA taskbar_data = { sizeof(APPBARDATA), NULL, 0, edge }; |
| 89 // MSDN documents an ABM_GETAUTOHIDEBAREX, which supposedly takes a monitor |
| 90 // rect and returns autohide bars on that monitor. This sounds like a good |
| 91 // idea for multi-monitor systems. Unfortunately, it appears to not work at |
| 92 // least some of the time (erroneously returning NULL) and there's almost no |
| 93 // online documentation or other sample code using it that suggests ways to |
| 94 // address this problem. So we just use ABM_GETAUTOHIDEBAR and hope the user |
| 95 // only cares about autohide bars on the monitor with the primary taskbar. |
| 96 // |
| 89 // NOTE: This call spins a nested message loop. | 97 // NOTE: This call spins a nested message loop. |
| 90 HWND taskbar = reinterpret_cast<HWND>(SHAppBarMessage(ABM_GETAUTOHIDEBAREX, | 98 HWND taskbar = reinterpret_cast<HWND>(SHAppBarMessage(ABM_GETAUTOHIDEBAR, |
| 91 &taskbar_data)); | 99 &taskbar_data)); |
| 92 return ::IsWindow(taskbar) && | 100 return ::IsWindow(taskbar) && |
| 101 (MonitorFromWindow(taskbar, MONITOR_DEFAULTTONULL) == monitor) && |
| 93 (GetWindowLong(taskbar, GWL_EXSTYLE) & WS_EX_TOPMOST); | 102 (GetWindowLong(taskbar, GWL_EXSTYLE) & WS_EX_TOPMOST); |
| 94 } | 103 } |
| 95 | 104 |
| 96 int GetAppbarAutohideEdgesOnWorkerThread(HMONITOR monitor) { | 105 int GetAppbarAutohideEdgesOnWorkerThread(HMONITOR monitor) { |
| 97 DCHECK(monitor); | 106 DCHECK(monitor); |
| 98 | 107 |
| 99 MONITORINFO mi = { sizeof(MONITORINFO) }; | |
| 100 GetMonitorInfo(monitor, &mi); | |
| 101 | |
| 102 int edges = 0; | 108 int edges = 0; |
| 103 if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_LEFT, mi.rcMonitor)) | 109 if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_LEFT, monitor)) |
| 104 edges |= views::ViewsDelegate::EDGE_LEFT; | 110 edges |= views::ViewsDelegate::EDGE_LEFT; |
| 105 if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_TOP, mi.rcMonitor)) | 111 if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_TOP, monitor)) |
| 106 edges |= views::ViewsDelegate::EDGE_TOP; | 112 edges |= views::ViewsDelegate::EDGE_TOP; |
| 107 if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_RIGHT, mi.rcMonitor)) | 113 if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_RIGHT, monitor)) |
| 108 edges |= views::ViewsDelegate::EDGE_RIGHT; | 114 edges |= views::ViewsDelegate::EDGE_RIGHT; |
| 109 if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_BOTTOM, mi.rcMonitor)) | 115 if (MonitorHasTopmostAutohideTaskbarForEdge(ABE_BOTTOM, monitor)) |
| 110 edges |= views::ViewsDelegate::EDGE_BOTTOM; | 116 edges |= views::ViewsDelegate::EDGE_BOTTOM; |
| 111 return edges; | 117 return edges; |
| 112 } | 118 } |
| 113 #endif | 119 #endif |
| 114 | 120 |
| 115 } // namespace | 121 } // namespace |
| 116 | 122 |
| 117 | 123 |
| 118 // ChromeViewsDelegate -------------------------------------------------------- | 124 // ChromeViewsDelegate -------------------------------------------------------- |
| 119 | 125 |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 } | 425 } |
| 420 #endif | 426 #endif |
| 421 | 427 |
| 422 #if !defined(USE_AURA) && !defined(USE_CHROMEOS) | 428 #if !defined(USE_AURA) && !defined(USE_CHROMEOS) |
| 423 views::Widget::InitParams::WindowOpacity | 429 views::Widget::InitParams::WindowOpacity |
| 424 ChromeViewsDelegate::GetOpacityForInitParams( | 430 ChromeViewsDelegate::GetOpacityForInitParams( |
| 425 const views::Widget::InitParams& params) { | 431 const views::Widget::InitParams& params) { |
| 426 return views::Widget::InitParams::OPAQUE_WINDOW; | 432 return views::Widget::InitParams::OPAQUE_WINDOW; |
| 427 } | 433 } |
| 428 #endif | 434 #endif |
| OLD | NEW |