Home | History | Annotate | Download | only in frame
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/views/frame/browser_desktop_window_tree_host_x11.h"
      6 
      7 #include "chrome/browser/themes/theme_service.h"
      8 #include "chrome/browser/themes/theme_service_factory.h"
      9 #include "chrome/browser/ui/views/frame/browser_frame.h"
     10 #include "chrome/browser/ui/views/frame/browser_view.h"
     11 #include "chrome/browser/ui/views/theme_image_mapper.h"
     12 
     13 namespace {
     14 
     15 // DesktopThemeProvider maps resource ids using MapThemeImage(). This is
     16 // necessary for BrowserDesktopWindowTreeHostWin so that it uses the windows
     17 // theme images rather than the ash theme images.
     18 //
     19 // This differs from the version in browser_desktop_window_tree_host_win.cc
     20 // because we need to also look up whether we're using the native theme.
     21 class DesktopThemeProvider : public ui::ThemeProvider {
     22  public:
     23   explicit DesktopThemeProvider(ThemeService* delegate)
     24       : delegate_(delegate) {
     25   }
     26 
     27   virtual bool UsingSystemTheme() const OVERRIDE {
     28     return delegate_->UsingSystemTheme();
     29   }
     30   virtual gfx::ImageSkia* GetImageSkiaNamed(int id) const OVERRIDE {
     31     if (delegate_->UsingSystemTheme())
     32       return delegate_->GetImageSkiaNamed(id);
     33 
     34     return delegate_->GetImageSkiaNamed(
     35         chrome::MapThemeImage(chrome::HOST_DESKTOP_TYPE_NATIVE, id));
     36   }
     37   virtual SkColor GetColor(int id) const OVERRIDE {
     38     return delegate_->GetColor(id);
     39   }
     40   virtual int GetDisplayProperty(int id) const OVERRIDE {
     41     return delegate_->GetDisplayProperty(id);
     42   }
     43   virtual bool ShouldUseNativeFrame() const OVERRIDE {
     44     return delegate_->ShouldUseNativeFrame();
     45   }
     46   virtual bool HasCustomImage(int id) const OVERRIDE {
     47     return delegate_->HasCustomImage(
     48         chrome::MapThemeImage(chrome::HOST_DESKTOP_TYPE_NATIVE, id));
     49   }
     50   virtual base::RefCountedMemory* GetRawData(
     51       int id,
     52       ui::ScaleFactor scale_factor) const OVERRIDE {
     53     return delegate_->GetRawData(id, scale_factor);
     54   }
     55 
     56  private:
     57   ThemeService* delegate_;
     58 
     59   DISALLOW_COPY_AND_ASSIGN(DesktopThemeProvider);
     60 };
     61 
     62 } // namespace
     63 
     64 ////////////////////////////////////////////////////////////////////////////////
     65 // BrowserDesktopWindowTreeHostX11, public:
     66 
     67 BrowserDesktopWindowTreeHostX11::BrowserDesktopWindowTreeHostX11(
     68     views::internal::NativeWidgetDelegate* native_widget_delegate,
     69     views::DesktopNativeWidgetAura* desktop_native_widget_aura,
     70     BrowserView* browser_view,
     71     BrowserFrame* browser_frame)
     72     : DesktopWindowTreeHostX11(native_widget_delegate,
     73                                desktop_native_widget_aura),
     74       browser_view_(browser_view) {
     75   scoped_ptr<ui::ThemeProvider> theme_provider(
     76       new DesktopThemeProvider(ThemeServiceFactory::GetForProfile(
     77                                    browser_view->browser()->profile())));
     78   browser_frame->SetThemeProvider(theme_provider.Pass());
     79 }
     80 
     81 BrowserDesktopWindowTreeHostX11::~BrowserDesktopWindowTreeHostX11() {
     82 }
     83 
     84 ////////////////////////////////////////////////////////////////////////////////
     85 // BrowserDesktopWindowTreeHostX11,
     86 //     BrowserDesktopWindowTreeHost implementation:
     87 
     88 views::DesktopWindowTreeHost*
     89     BrowserDesktopWindowTreeHostX11::AsDesktopWindowTreeHost() {
     90   return this;
     91 }
     92 
     93 int BrowserDesktopWindowTreeHostX11::GetMinimizeButtonOffset() const {
     94   return 0;
     95 }
     96 
     97 bool BrowserDesktopWindowTreeHostX11::UsesNativeSystemMenu() const {
     98   return false;
     99 }
    100 
    101 ////////////////////////////////////////////////////////////////////////////////
    102 // BrowserDesktopWindowTreeHostX11,
    103 //     views::DesktopWindowTreeHostX11 implementation:
    104 
    105 void BrowserDesktopWindowTreeHostX11::Init(
    106     aura::Window* content_window,
    107     const views::Widget::InitParams& params) {
    108   views::DesktopWindowTreeHostX11::Init(content_window, params);
    109 
    110   // We have now created our backing X11 window. We now need to (possibly)
    111   // alert Unity that there's a menu bar attached to it.
    112   global_menu_bar_x11_.reset(new GlobalMenuBarX11(browser_view_, this));
    113 }
    114 
    115 void BrowserDesktopWindowTreeHostX11::CloseNow() {
    116   global_menu_bar_x11_.reset();
    117   DesktopWindowTreeHostX11::CloseNow();
    118 }
    119 
    120 ////////////////////////////////////////////////////////////////////////////////
    121 // BrowserDesktopWindowTreeHost, public:
    122 
    123 // static
    124 BrowserDesktopWindowTreeHost*
    125     BrowserDesktopWindowTreeHost::CreateBrowserDesktopWindowTreeHost(
    126         views::internal::NativeWidgetDelegate* native_widget_delegate,
    127         views::DesktopNativeWidgetAura* desktop_native_widget_aura,
    128         BrowserView* browser_view,
    129         BrowserFrame* browser_frame) {
    130   return new BrowserDesktopWindowTreeHostX11(native_widget_delegate,
    131                                              desktop_native_widget_aura,
    132                                              browser_view,
    133                                              browser_frame);
    134 }
    135