1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
// 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/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<LPARAM>(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_);
}
|