Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(393)

Unified Diff: chrome/browser/ui/views/status_icons/status_icon_win.cc

Issue 8379003: Implementing custom notification icons for the DisplayBalloon method on Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixing DisplayBalloon argument order. Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/status_icons/status_icon_win.cc
diff --git a/chrome/browser/ui/views/status_icons/status_icon_win.cc b/chrome/browser/ui/views/status_icons/status_icon_win.cc
index 9e16e0fdf69a25f4e3b4d6fb598daf0a67195998..1d1026c43f7588eedb3845234874202a2c848eb6 100644
--- a/chrome/browser/ui/views/status_icons/status_icon_win.cc
+++ b/chrome/browser/ui/views/status_icons/status_icon_win.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/ui/views/status_icons/status_icon_win.h"
#include "base/sys_string_conversions.h"
+#include "base/win/windows_version.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/icon_util.h"
#include "ui/gfx/point.h"
@@ -28,6 +29,10 @@ StatusIconWin::StatusIconWin(UINT id, HWND window, UINT message)
}
StatusIconWin::~StatusIconWin() {
+ // Force to hide the balloon if any. Otherwise it might keep the icon in
+ // the tray until the balloon goes away.
+ HideBalloon();
+
// Remove our icon.
NOTIFYICONDATA icon_data;
InitIconData(&icon_data);
@@ -84,8 +89,6 @@ void StatusIconWin::SetToolTip(const string16& tool_tip) {
void StatusIconWin::DisplayBalloon(const SkBitmap& icon,
const string16& title,
const string16& contents) {
- // TODO(leandrogracia): implement custom icons for notification balloons.
-
NOTIFYICONDATA icon_data;
InitIconData(&icon_data);
icon_data.uFlags = NIF_INFO;
@@ -93,11 +96,34 @@ void StatusIconWin::DisplayBalloon(const SkBitmap& icon,
wcscpy_s(icon_data.szInfoTitle, title.c_str());
wcscpy_s(icon_data.szInfo, contents.c_str());
icon_data.uTimeout = 0;
+
+ base::win::Version win_version = base::win::OSInfo::GetInstance()->version();
+ if (!icon.empty() && win_version != base::win::VERSION_PRE_XP) {
+ balloon_icon_.Set(IconUtil::CreateHICONFromSkBitmap(icon));
+ if (win_version >= base::win::VERSION_VISTA) {
+ icon_data.hBalloonIcon = balloon_icon_.Get();
+ icon_data.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON;
+ } else {
+ icon_data.hIcon = balloon_icon_.Get();
+ icon_data.uFlags |= NIF_ICON;
+ icon_data.dwInfoFlags = NIIF_USER;
+ }
+ }
+
BOOL result = Shell_NotifyIcon(NIM_MODIFY, &icon_data);
if (!result)
LOG(WARNING) << "Unable to create status tray balloon.";
}
+void StatusIconWin::HideBalloon() {
+ NOTIFYICONDATA icon_data;
+ InitIconData(&icon_data);
+ icon_data.szInfo[0] = '\0';
+ BOOL result = Shell_NotifyIcon(NIM_MODIFY, &icon_data);
+ if (!result)
+ LOG(WARNING) << "Unable to hide status tray balloon.";
+}
+
void StatusIconWin::UpdatePlatformContextMenu(ui::MenuModel* menu) {
#if defined(USE_AURA)
// crbug.com/99489.
@@ -134,7 +160,11 @@ void StatusIconWin::HandleClickEvent(int x, int y, bool left_mouse_click) {
}
void StatusIconWin::InitIconData(NOTIFYICONDATA* icon_data) {
- icon_data->cbSize = sizeof(NOTIFYICONDATA);
+ if (base::win::OSInfo::GetInstance()->version() >= base::win::VERSION_VISTA)
+ icon_data->cbSize = sizeof(NOTIFYICONDATA);
+ else
+ icon_data->cbSize = NOTIFYICONDATA_V3_SIZE;
+
icon_data->hWnd = window_;
icon_data->uID = icon_id_;
}

Powered by Google App Engine
This is Rietveld 408576698