1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/themes/theme_service_aurax11.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/prefs/pref_service.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profiles/profile.h" 10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/themes/custom_theme_supplier.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/pref_names.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/image/image.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/native_theme/native_theme_aura.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/linux_ui/linux_ui.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace { 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class SystemThemeX11 : public CustomThemeSupplier { 19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public: 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) explicit SystemThemeX11(PrefService* pref_service); 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Overridden from CustomThemeSupplier: 23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void StartUsingTheme() OVERRIDE; 24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void StopUsingTheme() OVERRIDE; 25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual bool GetColor(int id, SkColor* color) const OVERRIDE; 26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual gfx::Image GetImageNamed(int id) OVERRIDE; 27558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual bool HasCustomImage(int id) const OVERRIDE; 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch private: 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~SystemThemeX11(); 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // These pointers are not owned by us. 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) views::LinuxUI* const linux_ui_; 34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PrefService* const pref_service_; 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SystemThemeX11); 37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}; 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)SystemThemeX11::SystemThemeX11(PrefService* pref_service) 40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch : CustomThemeSupplier(NATIVE_X11), 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) linux_ui_(views::LinuxUI::instance()), 42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch pref_service_(pref_service) {} 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SystemThemeX11::StartUsingTheme() { 45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch pref_service_->SetBoolean(prefs::kUsesSystemTheme, true); 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Have the former theme notify its observers of change. 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::NativeThemeAura::instance()->NotifyObservers(); 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SystemThemeX11::StopUsingTheme() { 51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch pref_service_->SetBoolean(prefs::kUsesSystemTheme, false); 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Have the former theme notify its observers of change. 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (linux_ui_) 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) linux_ui_->GetNativeTheme(NULL)->NotifyObservers(); 55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool SystemThemeX11::GetColor(int id, SkColor* color) const { 58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return linux_ui_ && linux_ui_->GetColor(id, color); 59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Image SystemThemeX11::GetImageNamed(int id) { 62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return linux_ui_ ? linux_ui_->GetThemeImageNamed(id) : gfx::Image(); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool SystemThemeX11::HasCustomImage(int id) const { 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return linux_ui_ && linux_ui_->HasCustomImage(id); 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)SystemThemeX11::~SystemThemeX11() {} 70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} // namespace 72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuThemeServiceAuraX11::ThemeServiceAuraX11() {} 74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuThemeServiceAuraX11::~ThemeServiceAuraX11() {} 76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ThemeServiceAuraX11::ShouldInitWithSystemTheme() const { 78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return profile()->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme); 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ThemeServiceAuraX11::UseSystemTheme() { 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetCustomDefaultTheme(new SystemThemeX11(profile()->GetPrefs())); 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ThemeServiceAuraX11::IsSystemThemeDistinctFromDefaultTheme() const { 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool ThemeServiceAuraX11::UsingDefaultTheme() const { 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ThemeService::UsingDefaultTheme() && !UsingSystemTheme(); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ThemeServiceAuraX11::UsingSystemTheme() const { 94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const CustomThemeSupplier* theme_supplier = get_theme_supplier(); 95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return theme_supplier && 96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch theme_supplier->get_theme_type() == CustomThemeSupplier::NATIVE_X11; 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 98