15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_desktop_window_tree_host_x11.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/themes/theme_service.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/themes/theme_service_factory.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_frame.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/views/theme_image_mapper.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// DesktopThemeProvider maps resource ids using MapThemeImage(). This is
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// necessary for BrowserDesktopWindowTreeHostWin so that it uses the windows
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// theme images rather than the ash theme images.
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This differs from the version in browser_desktop_window_tree_host_win.cc
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// because we need to also look up whether we're using the native theme.
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DesktopThemeProvider : public ui::ThemeProvider {
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit DesktopThemeProvider(ThemeService* delegate)
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : delegate_(delegate) {
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool UsingSystemTheme() const OVERRIDE {
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return delegate_->UsingSystemTheme();
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::ImageSkia* GetImageSkiaNamed(int id) const OVERRIDE {
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (delegate_->UsingSystemTheme())
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return delegate_->GetImageSkiaNamed(id);
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return delegate_->GetImageSkiaNamed(
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        chrome::MapThemeImage(chrome::HOST_DESKTOP_TYPE_NATIVE, id));
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual SkColor GetColor(int id) const OVERRIDE {
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return delegate_->GetColor(id);
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual int GetDisplayProperty(int id) const OVERRIDE {
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return delegate_->GetDisplayProperty(id);
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool ShouldUseNativeFrame() const OVERRIDE {
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return delegate_->ShouldUseNativeFrame();
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool HasCustomImage(int id) const OVERRIDE {
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return delegate_->HasCustomImage(
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        chrome::MapThemeImage(chrome::HOST_DESKTOP_TYPE_NATIVE, id));
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual base::RefCountedMemory* GetRawData(
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      int id,
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ui::ScaleFactor scale_factor) const OVERRIDE {
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return delegate_->GetRawData(id, scale_factor);
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ThemeService* delegate_;
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DesktopThemeProvider);
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// BrowserDesktopWindowTreeHostX11, public:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserDesktopWindowTreeHostX11::BrowserDesktopWindowTreeHostX11(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::internal::NativeWidgetDelegate* native_widget_delegate,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::DesktopNativeWidgetAura* desktop_native_widget_aura,
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    BrowserView* browser_view,
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    BrowserFrame* browser_frame)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : DesktopWindowTreeHostX11(native_widget_delegate,
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               desktop_native_widget_aura),
743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      browser_view_(browser_view) {
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<ui::ThemeProvider> theme_provider(
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new DesktopThemeProvider(ThemeServiceFactory::GetForProfile(
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                   browser_view->browser()->profile())));
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  browser_frame->SetThemeProvider(theme_provider.Pass());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserDesktopWindowTreeHostX11::~BrowserDesktopWindowTreeHostX11() {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// BrowserDesktopWindowTreeHostX11,
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//     BrowserDesktopWindowTreeHost implementation:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)views::DesktopWindowTreeHost*
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    BrowserDesktopWindowTreeHostX11::AsDesktopWindowTreeHost() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int BrowserDesktopWindowTreeHostX11::GetMinimizeButtonOffset() const {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BrowserDesktopWindowTreeHostX11::UsesNativeSystemMenu() const {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// BrowserDesktopWindowTreeHostX11,
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//     views::DesktopWindowTreeHostX11 implementation:
1043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserDesktopWindowTreeHostX11::Init(
1063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    aura::Window* content_window,
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const views::Widget::InitParams& params) {
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  views::DesktopWindowTreeHostX11::Init(content_window, params);
1093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
1103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // We have now created our backing X11 window. We now need to (possibly)
1113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // alert Unity that there's a menu bar attached to it.
1123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  global_menu_bar_x11_.reset(new GlobalMenuBarX11(browser_view_, this));
1133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
1143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserDesktopWindowTreeHostX11::CloseNow() {
1163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  global_menu_bar_x11_.reset();
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DesktopWindowTreeHostX11::CloseNow();
1183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
1193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
1203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch////////////////////////////////////////////////////////////////////////////////
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// BrowserDesktopWindowTreeHost, public:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserDesktopWindowTreeHost*
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    BrowserDesktopWindowTreeHost::CreateBrowserDesktopWindowTreeHost(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        views::internal::NativeWidgetDelegate* native_widget_delegate,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        views::DesktopNativeWidgetAura* desktop_native_widget_aura,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserView* browser_view,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserFrame* browser_frame) {
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return new BrowserDesktopWindowTreeHostX11(native_widget_delegate,
1313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                             desktop_native_widget_aura,
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             browser_view,
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             browser_frame);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
135