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

Side by Side Diff: chrome/browser/ui/views/frame/minimize_button_metrics_win.cc

Issue 2833363002: Add GetCaptionButtonHeightInDIPs() method (Closed)
Patch Set: GetCaptionButtonHeightInDIPs now returns (SM_CYSIZE+SM_CYSIZEFRAME)/primary_device_scale Created 3 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 unified diff | Download patch
OLDNEW
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/frame/minimize_button_metrics_win.h" 5 #include "chrome/browser/ui/views/frame/minimize_button_metrics_win.h"
6 6
7 #include "base/i18n/rtl.h"
7 #include "base/logging.h" 8 #include "base/logging.h"
8 #include "base/i18n/rtl.h"
9 #include "base/win/windows_version.h" 9 #include "base/win/windows_version.h"
10 #include "dwmapi.h" 10 #include "dwmapi.h"
11 #include "ui/base/win/shell.h" 11 #include "ui/base/win/shell.h"
12 #include "ui/display/display.h"
12 #include "ui/display/win/dpi.h" 13 #include "ui/display/win/dpi.h"
13 #include "ui/display/win/screen_win.h" 14 #include "ui/display/win/screen_win.h"
14 #include "ui/gfx/geometry/point.h" 15 #include "ui/gfx/geometry/point.h"
15 16
16 namespace { 17 namespace {
17 18
18 // These constants were determined by manually adding various offsets 19 // These constants were determined by manually adding various offsets
19 // until the identity switcher was placed at the same location as before. 20 // until the identity switcher was placed at the same location as before.
20 // When a new or updated OS version is released, a new constant may need 21 // When a new or updated OS version is released, a new constant may need
21 // to be added to this list and GetDefaultButtonBoundsOffset() is updated. 22 // to be added to this list and GetDefaultButtonBoundsOffset() is updated.
(...skipping 23 matching lines...) Expand all
45 46
46 MinimizeButtonMetrics::MinimizeButtonMetrics() 47 MinimizeButtonMetrics::MinimizeButtonMetrics()
47 : hwnd_(nullptr), 48 : hwnd_(nullptr),
48 cached_minimize_button_x_delta_(last_cached_minimize_button_x_delta_), 49 cached_minimize_button_x_delta_(last_cached_minimize_button_x_delta_),
49 was_activated_(false) { 50 was_activated_(false) {
50 } 51 }
51 52
52 MinimizeButtonMetrics::~MinimizeButtonMetrics() { 53 MinimizeButtonMetrics::~MinimizeButtonMetrics() {
53 } 54 }
54 55
56 // static
57 int MinimizeButtonMetrics::GetCaptionButtonHeightInDIPs() {
58 // At DPI scaling settings other than 100% the result won't be exactly right.
59 // TODO: return a more accurate approximation [http://crbug.com/716365]
60
61 // SM_CYSIZE returns the caption button height, but to get the full height
62 // from the top of the window we add SM_CYSIZEFRAME.
63 int cysize = GetSystemMetrics(SM_CYSIZE);
64 int cysizeframe = GetSystemMetrics(SM_CYSIZEFRAME);
Peter Kasting 2017/05/05 22:41:01 Nit: Dunno if this would be clearer if these were
emx 2017/05/09 09:37:58 Done.
65
66 // The result of GetSystemMetrics depends on the scale factor of the primary
67 // display. Divide the sum by that to convert to DIPs. (Converting SM_CYSIZE
68 // and SM_CYSIZEFRAME to DIPs individually adds a bigger rounding error.)
69 float primary_device_scale_factor =
70 display::Screen::GetScreen()->GetPrimaryDisplay().device_scale_factor();
71 float height_dips = (cysize + cysizeframe) / primary_device_scale_factor;
72
73 // Testing shows that floor() gives a more accurate approximation than
74 // round() here.
75 return std::floor(height_dips);
76 }
77
55 void MinimizeButtonMetrics::Init(HWND hwnd) { 78 void MinimizeButtonMetrics::Init(HWND hwnd) {
56 DCHECK(!hwnd_); 79 DCHECK(!hwnd_);
57 hwnd_ = hwnd; 80 hwnd_ = hwnd;
58 } 81 }
59 82
60 void MinimizeButtonMetrics::OnHWNDActivated() { 83 void MinimizeButtonMetrics::OnHWNDActivated() {
61 was_activated_ = true; 84 was_activated_ = true;
62 // NOTE: we don't cache here as it seems only after the activate is the value 85 // NOTE: we don't cache here as it seems only after the activate is the value
63 // correct. 86 // correct.
64 } 87 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 if (!dwm_button_pos) { 139 if (!dwm_button_pos) {
117 // Fallback to using the message for the titlebar info only if the above 140 // Fallback to using the message for the titlebar info only if the above
118 // code fails. It can fail if DWM is disabled globally or only for the 141 // code fails. It can fail if DWM is disabled globally or only for the
119 // given HWND. The WM_GETTITLEBARINFOEX message can fail if we are not 142 // given HWND. The WM_GETTITLEBARINFOEX message can fail if we are not
120 // active/visible. By fail we get a location of 0; the return status 143 // active/visible. By fail we get a location of 0; the return status
121 // code is always the same and similarly the state never seems to change 144 // code is always the same and similarly the state never seems to change
122 // (titlebar_info.rgstate). 145 // (titlebar_info.rgstate).
123 TITLEBARINFOEX titlebar_info = {0}; 146 TITLEBARINFOEX titlebar_info = {0};
124 titlebar_info.cbSize = sizeof(TITLEBARINFOEX); 147 titlebar_info.cbSize = sizeof(TITLEBARINFOEX);
125 SendMessage(hwnd_, WM_GETTITLEBARINFOEX, 0, 148 SendMessage(hwnd_, WM_GETTITLEBARINFOEX, 0,
126 reinterpret_cast<WPARAM>(&titlebar_info)); 149 reinterpret_cast<LPARAM>(&titlebar_info));
127 150
128 // Under DWM WM_GETTITLEBARINFOEX won't return the right thing until after 151 // Under DWM WM_GETTITLEBARINFOEX won't return the right thing until after
129 // WM_NCACTIVATE (maybe it returns classic values?). In an attempt to 152 // WM_NCACTIVATE (maybe it returns classic values?). In an attempt to
130 // return a consistant value we cache the last value across instances and 153 // return a consistant value we cache the last value across instances and
131 // use it until we get the activate. 154 // use it until we get the activate.
132 if (titlebar_info.rgrect[2].left == titlebar_info.rgrect[2].right || 155 if (titlebar_info.rgrect[2].left == titlebar_info.rgrect[2].right ||
133 (titlebar_info.rgstate[2] & 156 (titlebar_info.rgstate[2] &
134 (STATE_SYSTEM_INVISIBLE | STATE_SYSTEM_OFFSCREEN | 157 (STATE_SYSTEM_INVISIBLE | STATE_SYSTEM_OFFSCREEN |
135 STATE_SYSTEM_UNAVAILABLE))) 158 STATE_SYSTEM_UNAVAILABLE)))
136 return 0; 159 return 0;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 cached_minimize_button_x_delta_ = minimize_button_offset; 205 cached_minimize_button_x_delta_ = minimize_button_offset;
183 } else { 206 } else {
184 RECT client_rect = {0}; 207 RECT client_rect = {0};
185 GetClientRect(hwnd_, &client_rect); 208 GetClientRect(hwnd_, &client_rect);
186 cached_minimize_button_x_delta_ = 209 cached_minimize_button_x_delta_ =
187 client_rect.right - minimize_button_offset; 210 client_rect.right - minimize_button_offset;
188 } 211 }
189 last_cached_minimize_button_x_delta_ = cached_minimize_button_x_delta_; 212 last_cached_minimize_button_x_delta_ = cached_minimize_button_x_delta_;
190 return minimize_button_offset; 213 return minimize_button_offset;
191 } 214 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698