// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/web_app_icon_manager.h" #include "chrome/app/chrome_dll_resource.h" #include "chrome/app/theme/theme_resources.h" #include "chrome/browser/tab_contents/web_contents.h" #include "chrome/common/gfx/icon_util.h" #include "skia/include/SkBitmap.h" // Returns the default icon for the window. static HICON GetDefaultIcon() { HMODULE chrome_dll = GetModuleHandle(L"chrome.dll"); return ::LoadIcon(chrome_dll, MAKEINTRESOURCE(IDR_MAINFRAME)); } // Updates the icon of the window from the specified SkBitmap. If the image // is empty, the default icon is used. If icon is non-null it is updated to // reflect the new icon (unless the default is used). static void UpdateIcon(HWND hwnd, const SkBitmap& image, int icon_type, HICON* icon) { if (icon) { if (*icon) DestroyIcon(*icon); *icon = NULL; } HICON icon_to_set; if (image.width() > 0) { icon_to_set = IconUtil::CreateHICONFromSkBitmap(image); if (icon) *icon = icon_to_set; } else { icon_to_set = GetDefaultIcon(); } ::SendMessage(hwnd, WM_SETICON, icon_type, reinterpret_cast(icon_to_set)); } WebAppIconManager::WebAppIconManager(HWND parent) : hwnd_(parent), small_icon_(NULL), big_icon_(NULL), enabled_(true) { } WebAppIconManager::~WebAppIconManager() { if (small_icon_) DestroyIcon(small_icon_); if (big_icon_) DestroyIcon(big_icon_); if (app_.get()) app_->RemoveObserver(this); } void WebAppIconManager::SetContents(TabContents* contents) { WebApp* new_app = NULL; if (contents && contents->AsWebContents()) new_app = contents->AsWebContents()->web_app(); if (new_app == app_.get()) return; if (app_.get()) app_->RemoveObserver(this); app_ = new_app; if (app_.get()) { app_->AddObserver(this); UpdateIconsFromApp(); } else if (enabled_) { UpdateIcon(hwnd_, SkBitmap(), ICON_SMALL, NULL); UpdateIcon(hwnd_, SkBitmap(), ICON_BIG, NULL); } } void WebAppIconManager::SetUpdatesEnabled(bool enabled) { if (enabled == enabled_) return; enabled_ = enabled; if (enabled_) UpdateIconsFromApp(); } void WebAppIconManager::WebAppImagesChanged(WebApp* web_app) { UpdateIconsFromApp(); } void WebAppIconManager::UpdateIconsFromApp() { if (!enabled_) return; SkBitmap small_image; SkBitmap big_image; if (app_.get() && !app_->GetImages().empty()) { const WebApp::Images& images = app_->GetImages(); WebApp::Images::const_iterator smallest = images.begin(); WebApp::Images::const_iterator biggest = images.begin(); for (WebApp::Images::const_iterator i = images.begin() + 1; i != images.end(); ++i) { if (i->width() > biggest->width()) biggest = i; else if (i->width() > 0 && i->width() < smallest->width()) smallest = i; } small_image = *smallest; big_image = *biggest; } UpdateIcon(hwnd_, small_image, ICON_SMALL, &small_icon_); UpdateIcon(hwnd_, big_image, ICON_BIG, &big_icon_); }