| 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/frame/glass_browser_frame_view.h" | 5 #include "chrome/browser/ui/views/frame/glass_browser_frame_view.h" |
| 6 | 6 |
| 7 #include "base/prefs/pref_service.h" | 7 #include "base/prefs/pref_service.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "base/win/windows_version.h" |
| 9 #include "chrome/app/chrome_command_ids.h" | 10 #include "chrome/app/chrome_command_ids.h" |
| 10 #include "chrome/app/chrome_dll_resource.h" | 11 #include "chrome/app/chrome_dll_resource.h" |
| 11 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
| 12 #include "chrome/browser/signin/signin_header_helper.h" | 13 #include "chrome/browser/signin/signin_header_helper.h" |
| 13 #include "chrome/browser/themes/theme_properties.h" | 14 #include "chrome/browser/themes/theme_properties.h" |
| 14 #include "chrome/browser/ui/views/frame/browser_view.h" | 15 #include "chrome/browser/ui/views/frame/browser_view.h" |
| 15 #include "chrome/browser/ui/views/profiles/avatar_menu_button.h" | 16 #include "chrome/browser/ui/views/profiles/avatar_menu_button.h" |
| 16 #include "chrome/browser/ui/views/profiles/new_avatar_button.h" | 17 #include "chrome/browser/ui/views/profiles/new_avatar_button.h" |
| 17 #include "chrome/browser/ui/views/tabs/tab.h" | 18 #include "chrome/browser/ui/views/tabs/tab.h" |
| 18 #include "chrome/browser/ui/views/tabs/tab_strip.h" | 19 #include "chrome/browser/ui/views/tabs/tab_strip.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 30 #include "ui/views/controls/label.h" | 31 #include "ui/views/controls/label.h" |
| 31 #include "ui/views/layout/layout_constants.h" | 32 #include "ui/views/layout/layout_constants.h" |
| 32 #include "ui/views/resources/grit/views_resources.h" | 33 #include "ui/views/resources/grit/views_resources.h" |
| 33 #include "ui/views/win/hwnd_util.h" | 34 #include "ui/views/win/hwnd_util.h" |
| 34 #include "ui/views/window/client_view.h" | 35 #include "ui/views/window/client_view.h" |
| 35 | 36 |
| 36 HICON GlassBrowserFrameView::throbber_icons_[ | 37 HICON GlassBrowserFrameView::throbber_icons_[ |
| 37 GlassBrowserFrameView::kThrobberIconCount]; | 38 GlassBrowserFrameView::kThrobberIconCount]; |
| 38 | 39 |
| 39 namespace { | 40 namespace { |
| 40 // There are 3 px of client edge drawn inside the outer frame borders. | 41 // Size of client edge drawn inside the outer frame borders. |
| 41 const int kNonClientBorderThickness = 3; | 42 const int kNonClientBorderThicknessPreWin10 = 3; |
| 43 const int kNonClientBorderThicknessWin10 = 1; |
| 42 // Besides the frame border, there's another 9 px of empty space atop the | 44 // Besides the frame border, there's another 9 px of empty space atop the |
| 43 // window in restored mode, to use to drag the window around. | 45 // window in restored mode, to use to drag the window around. |
| 44 const int kNonClientRestoredExtraThickness = 9; | 46 const int kNonClientRestoredExtraThickness = 9; |
| 45 // In the window corners, the resize areas don't actually expand bigger, but the | 47 // In the window corners, the resize areas don't actually expand bigger, but the |
| 46 // 16 px at the end of the top and bottom edges triggers diagonal resizing. | 48 // 16 px at the end of the top and bottom edges triggers diagonal resizing. |
| 47 const int kResizeAreaCornerSize = 16; | 49 const int kResizeAreaCornerSize = 16; |
| 48 // The avatar ends 2 px above the bottom of the tabstrip (which, given the | 50 // The avatar ends 2 px above the bottom of the tabstrip (which, given the |
| 49 // way the tabstrip draws its bottom edge, will appear like a 1 px gap to the | 51 // way the tabstrip draws its bottom edge, will appear like a 1 px gap to the |
| 50 // user). | 52 // user). |
| 51 const int kAvatarBottomSpacing = 2; | 53 const int kAvatarBottomSpacing = 2; |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 | 324 |
| 323 int GlassBrowserFrameView::FrameBorderThickness() const { | 325 int GlassBrowserFrameView::FrameBorderThickness() const { |
| 324 return (frame()->IsMaximized() || frame()->IsFullscreen()) ? | 326 return (frame()->IsMaximized() || frame()->IsFullscreen()) ? |
| 325 0 : gfx::win::GetSystemMetricsInDIP(SM_CXSIZEFRAME); | 327 0 : gfx::win::GetSystemMetricsInDIP(SM_CXSIZEFRAME); |
| 326 } | 328 } |
| 327 | 329 |
| 328 int GlassBrowserFrameView::NonClientBorderThickness() const { | 330 int GlassBrowserFrameView::NonClientBorderThickness() const { |
| 329 if (frame()->IsMaximized() || frame()->IsFullscreen()) | 331 if (frame()->IsMaximized() || frame()->IsFullscreen()) |
| 330 return 0; | 332 return 0; |
| 331 | 333 |
| 332 return kNonClientBorderThickness; | 334 return (base::win::GetVersion() <= base::win::VERSION_WIN8_1) |
| 335 ? kNonClientBorderThicknessPreWin10 |
| 336 : kNonClientBorderThicknessWin10; |
| 333 } | 337 } |
| 334 | 338 |
| 335 int GlassBrowserFrameView::NonClientTopBorderHeight() const { | 339 int GlassBrowserFrameView::NonClientTopBorderHeight() const { |
| 336 if (frame()->IsFullscreen()) | 340 if (frame()->IsFullscreen()) |
| 337 return 0; | 341 return 0; |
| 338 | 342 |
| 339 // We'd like to use FrameBorderThickness() here, but the maximized Aero glass | 343 // We'd like to use FrameBorderThickness() here, but the maximized Aero glass |
| 340 // frame has a 0 frame border around most edges and a CYSIZEFRAME-thick border | 344 // frame has a 0 frame border around most edges and a CYSIZEFRAME-thick border |
| 341 // at the top (see AeroGlassFrame::OnGetMinMaxInfo()). | 345 // at the top (see AeroGlassFrame::OnGetMinMaxInfo()). |
| 342 return gfx::win::GetSystemMetricsInDIP(SM_CYSIZEFRAME) + | 346 return gfx::win::GetSystemMetricsInDIP(SM_CYSIZEFRAME) + |
| 343 (!frame()->ShouldLeaveOffsetNearTopBorder() ? | 347 (!frame()->ShouldLeaveOffsetNearTopBorder() ? |
| 344 -kTabstripTopShadowThickness : kNonClientRestoredExtraThickness); | 348 -kTabstripTopShadowThickness : kNonClientRestoredExtraThickness); |
| 345 } | 349 } |
| 346 | 350 |
| 347 void GlassBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { | 351 void GlassBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { |
| 348 ui::ThemeProvider* tp = GetThemeProvider(); | 352 ui::ThemeProvider* tp = GetThemeProvider(); |
| 349 | 353 |
| 350 gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds()); | 354 gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds()); |
| 351 gfx::Point toolbar_origin(toolbar_bounds.origin()); | 355 gfx::Point toolbar_origin(toolbar_bounds.origin()); |
| 352 View::ConvertPointToTarget(browser_view(), this, &toolbar_origin); | 356 View::ConvertPointToTarget(browser_view(), this, &toolbar_origin); |
| 353 toolbar_bounds.set_origin(toolbar_origin); | 357 toolbar_bounds.set_origin(toolbar_origin); |
| 354 int x = toolbar_bounds.x(); | 358 int x = toolbar_bounds.x(); |
| 355 int w = toolbar_bounds.width(); | 359 int w = toolbar_bounds.width(); |
| 356 int left_x = x - kContentEdgeShadowThickness; | |
| 357 | 360 |
| 358 gfx::ImageSkia* theme_toolbar = tp->GetImageSkiaNamed(IDR_THEME_TOOLBAR); | 361 gfx::ImageSkia* theme_toolbar = tp->GetImageSkiaNamed(IDR_THEME_TOOLBAR); |
| 359 gfx::ImageSkia* toolbar_left = tp->GetImageSkiaNamed( | |
| 360 IDR_CONTENT_TOP_LEFT_CORNER); | |
| 361 gfx::ImageSkia* toolbar_center = tp->GetImageSkiaNamed( | 362 gfx::ImageSkia* toolbar_center = tp->GetImageSkiaNamed( |
| 362 IDR_CONTENT_TOP_CENTER); | 363 IDR_CONTENT_TOP_CENTER); |
| 363 | 364 |
| 364 // Tile the toolbar image starting at the frame edge on the left and where | 365 // Tile the toolbar image starting at the frame edge on the left and where |
| 365 // the tabstrip is on the top. | 366 // the tabstrip is on the top. |
| 366 int y = toolbar_bounds.y(); | 367 int y = toolbar_bounds.y(); |
| 367 int dest_y = browser_view()->IsTabStripVisible() | 368 int dest_y = browser_view()->IsTabStripVisible() |
| 368 ? y + (kFrameShadowThickness * 2) | 369 ? y + (kFrameShadowThickness * 2) |
| 369 : y; | 370 : y; |
| 370 canvas->TileImageInt(*theme_toolbar, | 371 canvas->TileImageInt(*theme_toolbar, |
| 371 x + GetThemeBackgroundXInset(), | 372 x + GetThemeBackgroundXInset(), |
| 372 dest_y - GetTopInset(), x, | 373 dest_y - GetTopInset(), x, |
| 373 dest_y, w, theme_toolbar->height()); | 374 dest_y, w, theme_toolbar->height()); |
| 374 | 375 |
| 375 if (browser_view()->IsTabStripVisible()) { | 376 if (browser_view()->IsTabStripVisible()) { |
| 376 // Draw rounded corners for the tab. | 377 // On Windows 10, we don't draw our own window border but rather go right to |
| 377 gfx::ImageSkia* toolbar_left_mask = | 378 // the system border, so we don't need to draw the toolbar edges. |
| 378 tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK); | 379 if (base::win::GetVersion() < base::win::VERSION_WIN10) { |
| 379 gfx::ImageSkia* toolbar_right_mask = | 380 int left_x = x - kContentEdgeShadowThickness; |
| 380 tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK); | 381 // Draw rounded corners for the tab. |
| 382 gfx::ImageSkia* toolbar_left_mask = |
| 383 tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK); |
| 384 gfx::ImageSkia* toolbar_right_mask = |
| 385 tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK); |
| 381 | 386 |
| 382 // We mask out the corners by using the DestinationIn transfer mode, | 387 // We mask out the corners by using the DestinationIn transfer mode, |
| 383 // which keeps the RGB pixels from the destination and the alpha from | 388 // which keeps the RGB pixels from the destination and the alpha from |
| 384 // the source. | 389 // the source. |
| 385 SkPaint paint; | 390 SkPaint paint; |
| 386 paint.setXfermodeMode(SkXfermode::kDstIn_Mode); | 391 paint.setXfermodeMode(SkXfermode::kDstIn_Mode); |
| 387 | 392 |
| 388 // Mask out the top left corner. | 393 // Mask out the top left corner. |
| 389 canvas->DrawImageInt(*toolbar_left_mask, left_x, y, paint); | 394 canvas->DrawImageInt(*toolbar_left_mask, left_x, y, paint); |
| 390 | 395 |
| 391 // Mask out the top right corner. | 396 // Mask out the top right corner. |
| 392 int right_x = | 397 int right_x = |
| 393 x + w + kContentEdgeShadowThickness - toolbar_right_mask->width(); | 398 x + w + kContentEdgeShadowThickness - toolbar_right_mask->width(); |
| 394 canvas->DrawImageInt(*toolbar_right_mask, right_x, y, paint); | 399 canvas->DrawImageInt(*toolbar_right_mask, right_x, y, paint); |
| 395 | 400 |
| 396 // Draw left edge. | 401 // Draw left edge. |
| 397 canvas->DrawImageInt(*toolbar_left, left_x, y); | 402 gfx::ImageSkia* toolbar_left = |
| 403 tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER); |
| 404 canvas->DrawImageInt(*toolbar_left, left_x, y); |
| 398 | 405 |
| 399 // Draw center edge. | 406 // Draw center edge. |
| 400 canvas->TileImageInt(*toolbar_center, left_x + toolbar_left->width(), y, | 407 canvas->TileImageInt(*toolbar_center, left_x + toolbar_left->width(), y, |
| 401 right_x - (left_x + toolbar_left->width()), toolbar_center->height()); | 408 right_x - (left_x + toolbar_left->width()), |
| 409 toolbar_center->height()); |
| 402 | 410 |
| 403 // Right edge. | 411 // Right edge. |
| 404 canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER), | 412 canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER), |
| 405 right_x, y); | 413 right_x, y); |
| 414 } else { |
| 415 canvas->TileImageInt(*toolbar_center, x, y, w, toolbar_center->height()); |
| 416 } |
| 406 } | 417 } |
| 407 | 418 |
| 408 // Draw the content/toolbar separator. | 419 // Draw the content/toolbar separator. |
| 409 canvas->FillRect( | 420 canvas->FillRect( |
| 410 gfx::Rect(x + kClientEdgeThickness, | 421 gfx::Rect(x + kClientEdgeThickness, |
| 411 toolbar_bounds.bottom() - kClientEdgeThickness, | 422 toolbar_bounds.bottom() - kClientEdgeThickness, |
| 412 w - (2 * kClientEdgeThickness), | 423 w - (2 * kClientEdgeThickness), |
| 413 kClientEdgeThickness), | 424 kClientEdgeThickness), |
| 414 ThemeProperties::GetDefaultColor( | 425 ThemeProperties::GetDefaultColor( |
| 415 ThemeProperties::COLOR_TOOLBAR_SEPARATOR)); | 426 ThemeProperties::COLOR_TOOLBAR_SEPARATOR)); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 static bool initialized = false; | 623 static bool initialized = false; |
| 613 if (!initialized) { | 624 if (!initialized) { |
| 614 for (int i = 0; i < kThrobberIconCount; ++i) { | 625 for (int i = 0; i < kThrobberIconCount; ++i) { |
| 615 throbber_icons_[i] = | 626 throbber_icons_[i] = |
| 616 ui::LoadThemeIconFromResourcesDataDLL(IDI_THROBBER_01 + i); | 627 ui::LoadThemeIconFromResourcesDataDLL(IDI_THROBBER_01 + i); |
| 617 DCHECK(throbber_icons_[i]); | 628 DCHECK(throbber_icons_[i]); |
| 618 } | 629 } |
| 619 initialized = true; | 630 initialized = true; |
| 620 } | 631 } |
| 621 } | 632 } |
| OLD | NEW |