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