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

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

Issue 111723012: Linux Aura: Added --use-system-title-bar flag. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Created 6 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/opaque_browser_frame_view_layout.h" 5 #include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h"
6 6
7 #include "base/command_line.h"
7 #include "chrome/browser/profiles/profiles_state.h" 8 #include "chrome/browser/profiles/profiles_state.h"
8 #include "chrome/browser/ui/views/avatar_label.h" 9 #include "chrome/browser/ui/views/avatar_label.h"
9 #include "chrome/browser/ui/views/avatar_menu_button.h" 10 #include "chrome/browser/ui/views/avatar_menu_button.h"
11 #include "chrome/common/chrome_switches.h"
10 #include "chrome/common/profile_management_switches.h" 12 #include "chrome/common/profile_management_switches.h"
11 #include "ui/gfx/font.h" 13 #include "ui/gfx/font.h"
12 #include "ui/views/controls/button/image_button.h" 14 #include "ui/views/controls/button/image_button.h"
13 #include "ui/views/controls/label.h" 15 #include "ui/views/controls/label.h"
14 16
15 #if defined(OS_WIN) 17 #if defined(OS_WIN)
16 #include "win8/util/win8_util.h" 18 #include "win8/util/win8_util.h"
17 #endif // OS_WIN 19 #endif // OS_WIN
18 20
19 namespace { 21 namespace {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 54
53 // Space between the edge of the avatar and the tabstrip. 55 // Space between the edge of the avatar and the tabstrip.
54 const int kAvatarInnerSpacing = 4; 56 const int kAvatarInnerSpacing = 4;
55 57
56 // Space between the trailing edge of the avatar label and the tabstrip. 58 // Space between the trailing edge of the avatar label and the tabstrip.
57 const int kAvatarLabelInnerSpacing = 10; 59 const int kAvatarLabelInnerSpacing = 10;
58 60
59 // How far the new avatar button is from the closest caption button. 61 // How far the new avatar button is from the closest caption button.
60 const int kNewAvatarButtonOffset = 5; 62 const int kNewAvatarButtonOffset = 5;
61 63
62 // In restored mode, the New Tab button isn't at the same height as the caption 64 // When the title bar is in its normal two row mode (usually the case for
65 // restored windows), the New Tab button isn't at the same height as the caption
63 // buttons, but the space will look cluttered if it actually slides under them, 66 // buttons, but the space will look cluttered if it actually slides under them,
64 // so we stop it when the gap between the two is down to 5 px. 67 // so we stop it when the gap between the two is down to 5 px.
65 const int kNewTabCaptionRestoredSpacing = 5; 68 const int kNewTabCaptionNormalSpacing = 5;
66 69
67 // In maximized mode, where the New Tab button and the caption buttons are at 70 // When the title bar is condensed to one row (as when maximized), the New Tab
68 // similar vertical coordinates, we need to reserve a larger, 16 px gap to avoid 71 // button and the caption buttons are at similar vertical coordinates, so we
69 // looking too cluttered. 72 // need to reserve a larger, 16 px gap to avoid looking too cluttered.
70 const int kNewTabCaptionMaximizedSpacing = 16; 73 const int kNewTabCaptionCondensedSpacing = 16;
71 74
72 // If there are no caption buttons to the right of the New Tab button, we 75 // If there are no caption buttons to the right of the New Tab button, we
73 // reserve a small 5px gap, regardless of whether the window is maximized. This 76 // reserve a small 5px gap, regardless of whether the window is maximized. This
74 // overrides the two previous constants. 77 // overrides the two previous constants.
75 const int kNewTabNoCaptionButtonsSpacing = 5; 78 const int kNewTabNoCaptionButtonsSpacing = 5;
76 79
77 // The top 3 px of the tabstrip is shadow; in maximized mode we push this off 80 // The top 3 px of the tabstrip is shadow; in maximized mode we push this off
78 // the top of the screen so the tabs appear flush against the screen edge. 81 // the top of the screen so the tabs appear flush against the screen edge.
79 const int kTabstripTopShadowThickness = 3; 82 const int kTabstripTopShadowThickness = 3;
80 83
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 const gfx::Rect& client_bounds) const { 195 const gfx::Rect& client_bounds) const {
193 int top_height = NonClientTopBorderHeight(false); 196 int top_height = NonClientTopBorderHeight(false);
194 int border_thickness = NonClientBorderThickness(); 197 int border_thickness = NonClientBorderThickness();
195 return gfx::Rect(std::max(0, client_bounds.x() - border_thickness), 198 return gfx::Rect(std::max(0, client_bounds.x() - border_thickness),
196 std::max(0, client_bounds.y() - top_height), 199 std::max(0, client_bounds.y() - top_height),
197 client_bounds.width() + (2 * border_thickness), 200 client_bounds.width() + (2 * border_thickness),
198 client_bounds.height() + top_height + border_thickness); 201 client_bounds.height() + top_height + border_thickness);
199 } 202 }
200 203
201 int OpaqueBrowserFrameViewLayout::FrameBorderThickness(bool restored) const { 204 int OpaqueBrowserFrameViewLayout::FrameBorderThickness(bool restored) const {
202 return (!restored && (delegate_->IsMaximized() || 205 return (!restored && (IsTitleBarCondensed() ||
203 delegate_->IsFullscreen())) ? 206 delegate_->IsFullscreen())) ?
204 0 : kFrameBorderThickness; 207 0 : kFrameBorderThickness;
205 } 208 }
206 209
207 int OpaqueBrowserFrameViewLayout::NonClientBorderThickness() const { 210 int OpaqueBrowserFrameViewLayout::NonClientBorderThickness() const {
208 // When we fill the screen, we don't show a client edge. 211 // When we fill the screen, we don't show a client edge.
209 return FrameBorderThickness(false) + 212 return FrameBorderThickness(false) +
210 ((delegate_->IsMaximized() || delegate_->IsFullscreen()) ? 213 ((IsTitleBarCondensed() || delegate_->IsFullscreen()) ?
211 0 : views::NonClientFrameView::kClientEdgeThickness); 214 0 : views::NonClientFrameView::kClientEdgeThickness);
212 } 215 }
213 216
214 int OpaqueBrowserFrameViewLayout::NonClientTopBorderHeight( 217 int OpaqueBrowserFrameViewLayout::NonClientTopBorderHeight(
215 bool restored) const { 218 bool restored) const {
216 if (delegate_->ShouldShowWindowTitle()) { 219 if (delegate_->ShouldShowWindowTitle()) {
217 return std::max(FrameBorderThickness(restored) + delegate_->GetIconSize(), 220 return std::max(FrameBorderThickness(restored) + delegate_->GetIconSize(),
218 CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) + 221 CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) +
219 TitlebarBottomThickness(restored); 222 TitlebarBottomThickness(restored);
220 } 223 }
221 224
222 return FrameBorderThickness(restored) - 225 int thickness = FrameBorderThickness(restored);
223 ((delegate_->IsTabStripVisible() && 226 if (!restored && delegate_->IsTabStripVisible() &&
224 !restored && !delegate_->ShouldLeaveOffsetNearTopBorder()) 227 (!delegate_->ShouldLeaveOffsetNearTopBorder() || IsTitleBarCondensed())) {
225 ? kTabstripTopShadowThickness : 0); 228 thickness -= kTabstripTopShadowThickness;
229 }
230 return thickness;
226 } 231 }
227 232
228 int OpaqueBrowserFrameViewLayout::GetTabStripInsetsTop(bool restored) const { 233 int OpaqueBrowserFrameViewLayout::GetTabStripInsetsTop(bool restored) const {
229 return NonClientTopBorderHeight(restored) + ((!restored && 234 return NonClientTopBorderHeight(restored) + ((!restored &&
230 (!delegate_->ShouldLeaveOffsetNearTopBorder() || 235 (!delegate_->ShouldLeaveOffsetNearTopBorder() ||
236 IsTitleBarCondensed() ||
231 delegate_->IsFullscreen())) ? 237 delegate_->IsFullscreen())) ?
232 0 : kNonClientRestoredExtraThickness); 238 0 : kNonClientRestoredExtraThickness);
233 } 239 }
234 240
235 int OpaqueBrowserFrameViewLayout::TitlebarBottomThickness(bool restored) const { 241 int OpaqueBrowserFrameViewLayout::TitlebarBottomThickness(bool restored) const {
236 return kTitlebarTopAndBottomEdgeThickness + 242 return kTitlebarTopAndBottomEdgeThickness +
237 ((!restored && delegate_->IsMaximized()) ? 0 : 243 ((!restored && IsTitleBarCondensed()) ? 0 :
238 views::NonClientFrameView::kClientEdgeThickness); 244 views::NonClientFrameView::kClientEdgeThickness);
239 } 245 }
240 246
241 int OpaqueBrowserFrameViewLayout::CaptionButtonY(bool restored) const { 247 int OpaqueBrowserFrameViewLayout::CaptionButtonY(bool restored) const {
242 // Maximized buttons start at window top, since the window has no border. This 248 // Maximized buttons start at window top, since the window has no border. This
243 // offset is for the image (the actual clickable bounds extend all the way to 249 // offset is for the image (the actual clickable bounds extend all the way to
244 // the top to take Fitts' Law into account). 250 // the top to take Fitts' Law into account).
245 return ((!restored && delegate_->IsMaximized()) ? 251 return ((!restored && IsTitleBarCondensed()) ?
246 FrameBorderThickness(false) : 252 FrameBorderThickness(false) :
247 views::NonClientFrameView::kFrameShadowThickness) + extra_caption_y_; 253 views::NonClientFrameView::kFrameShadowThickness) + extra_caption_y_;
248 } 254 }
249 255
250 gfx::Rect OpaqueBrowserFrameViewLayout::IconBounds() const { 256 gfx::Rect OpaqueBrowserFrameViewLayout::IconBounds() const {
251 return window_icon_bounds_; 257 return window_icon_bounds_;
252 } 258 }
253 259
254 gfx::Rect OpaqueBrowserFrameViewLayout::CalculateClientAreaBounds( 260 gfx::Rect OpaqueBrowserFrameViewLayout::CalculateClientAreaBounds(
255 int width, 261 int width,
256 int height) const { 262 int height) const {
257 int top_height = NonClientTopBorderHeight(false); 263 int top_height = NonClientTopBorderHeight(false);
258 int border_thickness = NonClientBorderThickness(); 264 int border_thickness = NonClientBorderThickness();
259 return gfx::Rect(border_thickness, top_height, 265 return gfx::Rect(border_thickness, top_height,
260 std::max(0, width - (2 * border_thickness)), 266 std::max(0, width - (2 * border_thickness)),
261 std::max(0, height - top_height - border_thickness)); 267 std::max(0, height - top_height - border_thickness));
262 } 268 }
263 269
270 bool OpaqueBrowserFrameViewLayout::IsTitleBarCondensed() const {
271 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
272 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseSystemTitleBar))
273 return true;
274 #endif
275
276 return delegate_->IsMaximized();
277 }
278
264 /////////////////////////////////////////////////////////////////////////////// 279 ///////////////////////////////////////////////////////////////////////////////
265 // OpaqueBrowserFrameView, private: 280 // OpaqueBrowserFrameView, private:
266 281
267 bool OpaqueBrowserFrameViewLayout::ShouldAvatarBeOnRight() const { 282 bool OpaqueBrowserFrameViewLayout::ShouldAvatarBeOnRight() const {
268 // The avatar should be shown either on the end of the left or the beginning 283 // The avatar should be shown either on the end of the left or the beginning
269 // of the right depending on which side has fewer buttons. 284 // of the right depending on which side has fewer buttons.
270 return trailing_buttons_.size() < leading_buttons_.size(); 285 return trailing_buttons_.size() < leading_buttons_.size();
271 } 286 }
272 287
273 int OpaqueBrowserFrameViewLayout::NewTabCaptionSpacing() const { 288 int OpaqueBrowserFrameViewLayout::NewTabCaptionSpacing() const {
274 return has_trailing_buttons_ 289 return has_trailing_buttons_
275 ? (delegate_->IsMaximized() ? kNewTabCaptionMaximizedSpacing 290 ? (IsTitleBarCondensed() ? kNewTabCaptionCondensedSpacing
276 : kNewTabCaptionRestoredSpacing) 291 : kNewTabCaptionNormalSpacing)
277 : kNewTabNoCaptionButtonsSpacing; 292 : kNewTabNoCaptionButtonsSpacing;
278 } 293 }
279 294
280 void OpaqueBrowserFrameViewLayout::LayoutWindowControls(views::View* host) { 295 void OpaqueBrowserFrameViewLayout::LayoutWindowControls(views::View* host) {
281 if (!ShouldAddDefaultCaptionButtons()) 296 if (!ShouldAddDefaultCaptionButtons())
282 return; 297 return;
283 298
284 int caption_y = CaptionButtonY(false); 299 int caption_y = CaptionButtonY(false);
285 300
286 // Keep a list of all buttons that we don't show. 301 // Keep a list of all buttons that we don't show.
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 use_hidden_icon_location = false; 340 use_hidden_icon_location = false;
326 341
327 // Our frame border has a different "3D look" than Windows'. Theirs has 342 // Our frame border has a different "3D look" than Windows'. Theirs has
328 // a more complex gradient on the top that they push their icon/title 343 // a more complex gradient on the top that they push their icon/title
329 // below; then the maximized window cuts this off and the icon/title are 344 // below; then the maximized window cuts this off and the icon/title are
330 // centered in the remaining space. Because the apparent shape of our 345 // centered in the remaining space. Because the apparent shape of our
331 // border is simpler, using the same positioning makes things look 346 // border is simpler, using the same positioning makes things look
332 // slightly uncentered with restored windows, so when the window is 347 // slightly uncentered with restored windows, so when the window is
333 // restored, instead of calculating the remaining space from below the 348 // restored, instead of calculating the remaining space from below the
334 // frame border, we calculate from below the 3D edge. 349 // frame border, we calculate from below the 3D edge.
335 int unavailable_px_at_top = delegate_->IsMaximized() ? 350 int unavailable_px_at_top = IsTitleBarCondensed() ?
336 frame_thickness : kTitlebarTopAndBottomEdgeThickness; 351 frame_thickness : kTitlebarTopAndBottomEdgeThickness;
337 // When the icon is shorter than the minimum space we reserve for the 352 // When the icon is shorter than the minimum space we reserve for the
338 // caption button, we vertically center it. We want to bias rounding to 353 // caption button, we vertically center it. We want to bias rounding to
339 // put extra space above the icon, since the 3D edge (+ client edge, for 354 // put extra space above the icon, since the 3D edge (+ client edge, for
340 // restored windows) below looks (to the eye) more like additional space 355 // restored windows) below looks (to the eye) more like additional space
341 // than does the 3D edge (or nothing at all, for maximized windows) 356 // than does the 3D edge (or nothing at all, for maximized windows)
342 // above; hence the +1. 357 // above; hence the +1.
343 int y = unavailable_px_at_top + (NonClientTopBorderHeight(false) - 358 int y = unavailable_px_at_top + (NonClientTopBorderHeight(false) -
344 unavailable_px_at_top - size - 359 unavailable_px_at_top - size -
345 TitlebarBottomThickness(false) + 1) / 2; 360 TitlebarBottomThickness(false) + 1) / 2;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 gfx::ImageSkia incognito_icon = delegate_->GetOTRAvatarIcon(); 426 gfx::ImageSkia incognito_icon = delegate_->GetOTRAvatarIcon();
412 427
413 bool avatar_on_right = ShouldAvatarBeOnRight(); 428 bool avatar_on_right = ShouldAvatarBeOnRight();
414 int avatar_bottom = GetTabStripInsetsTop(false) + 429 int avatar_bottom = GetTabStripInsetsTop(false) +
415 delegate_->GetTabStripHeight() - kAvatarBottomSpacing; 430 delegate_->GetTabStripHeight() - kAvatarBottomSpacing;
416 int avatar_restored_y = avatar_bottom - incognito_icon.height(); 431 int avatar_restored_y = avatar_bottom - incognito_icon.height();
417 int avatar_x = avatar_on_right ? 432 int avatar_x = avatar_on_right ?
418 host->width() - trailing_button_start_ - kAvatarOuterSpacing - 433 host->width() - trailing_button_start_ - kAvatarOuterSpacing -
419 incognito_icon.width() : 434 incognito_icon.width() :
420 leading_button_start_ + kAvatarOuterSpacing; 435 leading_button_start_ + kAvatarOuterSpacing;
421 int avatar_y = delegate_->IsMaximized() ? 436 int avatar_y = IsTitleBarCondensed() ?
422 (NonClientTopBorderHeight(false) + kTabstripTopShadowThickness) : 437 (NonClientTopBorderHeight(false) + kTabstripTopShadowThickness) :
423 avatar_restored_y; 438 avatar_restored_y;
424 avatar_bounds_.SetRect( 439 avatar_bounds_.SetRect(
425 avatar_x, 440 avatar_x,
426 avatar_y, 441 avatar_y,
427 incognito_icon.width(), 442 incognito_icon.width(),
428 delegate_->ShouldShowAvatar() ? (avatar_bottom - avatar_y) : 0); 443 delegate_->ShouldShowAvatar() ? (avatar_bottom - avatar_y) : 0);
429 if (avatar_button_) { 444 if (avatar_button_) {
430 avatar_button_->set_button_on_right(avatar_on_right); 445 avatar_button_->set_button_on_right(avatar_on_right);
431 avatar_button_->SetBoundsRect(avatar_bounds_); 446 avatar_button_->SetBoundsRect(avatar_bounds_);
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 535
521 button->SetImageAlignment( 536 button->SetImageAlignment(
522 (alignment == ALIGN_LEADING) ? 537 (alignment == ALIGN_LEADING) ?
523 views::ImageButton::ALIGN_RIGHT : views::ImageButton::ALIGN_LEFT, 538 views::ImageButton::ALIGN_RIGHT : views::ImageButton::ALIGN_LEFT,
524 views::ImageButton::ALIGN_BOTTOM); 539 views::ImageButton::ALIGN_BOTTOM);
525 540
526 // There should always be the same number of non-shadow pixels visible to the 541 // There should always be the same number of non-shadow pixels visible to the
527 // side of the caption buttons. In maximized mode we extend buttons to the 542 // side of the caption buttons. In maximized mode we extend buttons to the
528 // screen top and the rightmost button to the screen right (or leftmost button 543 // screen top and the rightmost button to the screen right (or leftmost button
529 // to the screen left, for left-aligned buttons) to obey Fitts' Law. 544 // to the screen left, for left-aligned buttons) to obey Fitts' Law.
530 bool is_maximized = delegate_->IsMaximized(); 545 bool title_bar_condensed = IsTitleBarCondensed();
531 546
532 // When we are the first button on the leading side and are the close 547 // When we are the first button on the leading side and are the close
533 // button, we must flip ourselves, because the close button assets have 548 // button, we must flip ourselves, because the close button assets have
534 // a little notch to fit in the rounded frame. 549 // a little notch to fit in the rounded frame.
535 button->SetDrawImageMirrored(alignment == ALIGN_LEADING && 550 button->SetDrawImageMirrored(alignment == ALIGN_LEADING &&
536 !has_leading_buttons_ && 551 !has_leading_buttons_ &&
537 button == close_button_); 552 button == close_button_);
538 // If the window is maximized, align the buttons to its upper edge. 553 // If the window is maximized, align the buttons to its upper edge.
539 int extra_height = is_maximized ? extra_caption_y_ : 0; 554 int extra_height = title_bar_condensed ? extra_caption_y_ : 0;
540 555
541 switch (alignment) { 556 switch (alignment) {
542 case ALIGN_LEADING: { 557 case ALIGN_LEADING: {
543 if (has_leading_buttons_) 558 if (has_leading_buttons_)
544 leading_button_start_ += window_caption_spacing_; 559 leading_button_start_ += window_caption_spacing_;
545 560
546 // If we're the first button on the left and maximized, add width to the 561 // If we're the first button on the left and maximized, add width to the
547 // right hand side of the screen. 562 // right hand side of the screen.
548 int extra_width = (is_maximized && !has_leading_buttons_) ? 563 int extra_width = (title_bar_condensed && !has_leading_buttons_) ?
549 (kFrameBorderThickness - 564 (kFrameBorderThickness -
550 views::NonClientFrameView::kFrameShadowThickness) : 0; 565 views::NonClientFrameView::kFrameShadowThickness) : 0;
551 566
552 button->SetBounds( 567 button->SetBounds(
553 leading_button_start_, 568 leading_button_start_,
554 caption_y - extra_height, 569 caption_y - extra_height,
555 button_size.width() + extra_width, 570 button_size.width() + extra_width,
556 button_size.height() + extra_height); 571 button_size.height() + extra_height);
557 572
558 leading_button_start_ += extra_width + button_size.width(); 573 leading_button_start_ += extra_width + button_size.width();
559 minimum_size_for_buttons_ += extra_width + button_size.width(); 574 minimum_size_for_buttons_ += extra_width + button_size.width();
560 has_leading_buttons_ = true; 575 has_leading_buttons_ = true;
561 break; 576 break;
562 } 577 }
563 case ALIGN_TRAILING: { 578 case ALIGN_TRAILING: {
564 if (has_trailing_buttons_) 579 if (has_trailing_buttons_)
565 trailing_button_start_ += window_caption_spacing_; 580 trailing_button_start_ += window_caption_spacing_;
566 581
567 // If we're the first button on the right and maximized, add width to the 582 // If we're the first button on the right and maximized, add width to the
568 // right hand side of the screen. 583 // right hand side of the screen.
569 int extra_width = (is_maximized && !has_trailing_buttons_) ? 584 int extra_width = (title_bar_condensed && !has_trailing_buttons_) ?
570 (kFrameBorderThickness - 585 (kFrameBorderThickness -
571 views::NonClientFrameView::kFrameShadowThickness) : 0; 586 views::NonClientFrameView::kFrameShadowThickness) : 0;
572 587
573 button->SetBounds( 588 button->SetBounds(
574 host->width() - trailing_button_start_ - extra_width - 589 host->width() - trailing_button_start_ - extra_width -
575 button_size.width(), 590 button_size.width(),
576 caption_y - extra_height, 591 caption_y - extra_height,
577 button_size.width() + extra_width, 592 button_size.width() + extra_width,
578 button_size.height() + extra_height); 593 button_size.height() + extra_height);
579 594
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 702
688 void OpaqueBrowserFrameViewLayout::ViewAdded(views::View* host, 703 void OpaqueBrowserFrameViewLayout::ViewAdded(views::View* host,
689 views::View* view) { 704 views::View* view) {
690 SetView(view->id(), view); 705 SetView(view->id(), view);
691 } 706 }
692 707
693 void OpaqueBrowserFrameViewLayout::ViewRemoved(views::View* host, 708 void OpaqueBrowserFrameViewLayout::ViewRemoved(views::View* host,
694 views::View* view) { 709 views::View* view) {
695 SetView(view->id(), NULL); 710 SetView(view->id(), NULL);
696 } 711 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698