1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/views/frame/opaque_browser_frame_view_linux.h"
7 #include "chrome/browser/themes/theme_service.h"
8 #include "chrome/browser/themes/theme_service_factory.h"
9 #include "chrome/browser/ui/views/frame/opaque_browser_frame_view.h"
10 #include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h"
11 #include "ui/views/linux_ui/linux_ui.h"
13 ///////////////////////////////////////////////////////////////////////////////
14 // OpaqueBrowserFrameViewLinux, public:
16 OpaqueBrowserFrameViewLinux::OpaqueBrowserFrameViewLinux(
17 OpaqueBrowserFrameView* view,
18 OpaqueBrowserFrameViewLayout* layout,
22 theme_service_(ThemeServiceFactory::GetForProfile(profile)) {
23 views::LinuxUI* ui = views::LinuxUI::instance();
25 ui->AddWindowButtonOrderObserver(this);
28 OpaqueBrowserFrameViewLinux::~OpaqueBrowserFrameViewLinux() {
29 views::LinuxUI* ui = views::LinuxUI::instance();
31 ui->RemoveWindowButtonOrderObserver(this);
34 bool OpaqueBrowserFrameViewLinux::IsUsingNativeTheme() {
35 // On X11, this does the correct thing. On Windows, UsingNativeTheme() will
36 // return true when using the default blue theme too.
37 return theme_service_->UsingNativeTheme();
40 ///////////////////////////////////////////////////////////////////////////////
41 // OpaqueBrowserFrameViewLinux,
42 // views::WindowButtonOrderObserver implementation:
44 void OpaqueBrowserFrameViewLinux::OnWindowButtonOrderingChange(
45 const std::vector<views::FrameButton>& leading_buttons,
46 const std::vector<views::FrameButton>& trailing_buttons) {
47 layout_->SetButtonOrdering(leading_buttons, trailing_buttons);
49 // We can receive OnWindowButtonOrderingChange events before we've been added
50 // to a Widget. We need a Widget because layout crashes due to dependencies
51 // on a ui::ThemeProvider().
52 if (view_->GetWidget()) {
54 view_->SchedulePaint();
58 ///////////////////////////////////////////////////////////////////////////////
59 // OpaqueBrowserFrameViewObserver:
62 OpaqueBrowserFrameViewPlatformSpecific*
63 OpaqueBrowserFrameViewPlatformSpecific::Create(
64 OpaqueBrowserFrameView* view,
65 OpaqueBrowserFrameViewLayout* layout,
67 return new OpaqueBrowserFrameViewLinux(view, layout, profile);