opaque_browser_frame_view_linux.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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.
4
5#include "chrome/browser/ui/views/frame/opaque_browser_frame_view_linux.h"
6
7#include "chrome/browser/ui/views/frame/opaque_browser_frame_view.h"
8#include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h"
9#include "ui/views/linux_ui/linux_ui.h"
10
11///////////////////////////////////////////////////////////////////////////////
12// OpaqueBrowserFrameViewLinux, public:
13
14OpaqueBrowserFrameViewLinux::OpaqueBrowserFrameViewLinux(
15    OpaqueBrowserFrameView* view,
16    OpaqueBrowserFrameViewLayout* layout)
17    : view_(view),
18      layout_(layout) {
19  views::LinuxUI* ui = views::LinuxUI::instance();
20  if (ui)
21    ui->AddWindowButtonOrderObserver(this);
22}
23
24OpaqueBrowserFrameViewLinux::~OpaqueBrowserFrameViewLinux() {
25  views::LinuxUI* ui = views::LinuxUI::instance();
26  if (ui)
27    ui->RemoveWindowButtonOrderObserver(this);
28}
29
30///////////////////////////////////////////////////////////////////////////////
31// OpaqueBrowserFrameViewLinux,
32//     OpaqueBrowserFrameViewPlatformSpecific implementation:
33
34bool OpaqueBrowserFrameViewLinux::ShouldShowCaptionButtons() const {
35  // On Ubuntu Unity, if the window is maximized, the system will provide
36  // caption buttons, so Chrome should not add its own.
37  views::LinuxUI* ui = views::LinuxUI::instance();
38  return !(view_->IsMaximized() && ui && ui->UnityIsRunning());
39}
40
41///////////////////////////////////////////////////////////////////////////////
42// OpaqueBrowserFrameViewLinux,
43//     views::WindowButtonOrderObserver implementation:
44
45void OpaqueBrowserFrameViewLinux::OnWindowButtonOrderingChange(
46    const std::vector<views::FrameButton>& leading_buttons,
47    const std::vector<views::FrameButton>& trailing_buttons) {
48  layout_->SetButtonOrdering(leading_buttons, trailing_buttons);
49
50  // We can receive OnWindowButtonOrderingChange events before we've been added
51  // to a Widget. We need a Widget because layout crashes due to dependencies
52  // on a ui::ThemeProvider().
53  if (view_->GetWidget()) {
54    view_->Layout();
55    view_->SchedulePaint();
56  }
57}
58
59///////////////////////////////////////////////////////////////////////////////
60// OpaqueBrowserFrameViewObserver:
61
62// static
63OpaqueBrowserFrameViewPlatformSpecific*
64OpaqueBrowserFrameViewPlatformSpecific::Create(
65      OpaqueBrowserFrameView* view,
66      OpaqueBrowserFrameViewLayout* layout) {
67  return new OpaqueBrowserFrameViewLinux(view, layout);
68}
69