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 13namespace { 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. 21class 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 67BrowserDesktopWindowTreeHostX11::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 81BrowserDesktopWindowTreeHostX11::~BrowserDesktopWindowTreeHostX11() { 82} 83 84//////////////////////////////////////////////////////////////////////////////// 85// BrowserDesktopWindowTreeHostX11, 86// BrowserDesktopWindowTreeHost implementation: 87 88views::DesktopWindowTreeHost* 89 BrowserDesktopWindowTreeHostX11::AsDesktopWindowTreeHost() { 90 return this; 91} 92 93int BrowserDesktopWindowTreeHostX11::GetMinimizeButtonOffset() const { 94 return 0; 95} 96 97bool BrowserDesktopWindowTreeHostX11::UsesNativeSystemMenu() const { 98 return false; 99} 100 101//////////////////////////////////////////////////////////////////////////////// 102// BrowserDesktopWindowTreeHostX11, 103// views::DesktopWindowTreeHostX11 implementation: 104 105void 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 115void BrowserDesktopWindowTreeHostX11::CloseNow() { 116 global_menu_bar_x11_.reset(); 117 DesktopWindowTreeHostX11::CloseNow(); 118} 119 120//////////////////////////////////////////////////////////////////////////////// 121// BrowserDesktopWindowTreeHost, public: 122 123// static 124BrowserDesktopWindowTreeHost* 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