Merge pull request #2328 from atom/tray-settings-propagate
Propagate User App Model ID to Tray Icon
This commit is contained in:
commit
b9cf0f2126
2 changed files with 35 additions and 5 deletions
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
#include "atom/browser/ui/win/notify_icon.h"
|
#include "atom/browser/ui/win/notify_icon.h"
|
||||||
|
|
||||||
|
#include <shobjidl.h>
|
||||||
|
|
||||||
#include "atom/browser/ui/win/notify_icon_host.h"
|
#include "atom/browser/ui/win/notify_icon_host.h"
|
||||||
|
#include "base/md5.h"
|
||||||
#include "base/strings/string_number_conversions.h"
|
#include "base/strings/string_number_conversions.h"
|
||||||
#include "base/strings/utf_string_conversions.h"
|
#include "base/strings/utf_string_conversions.h"
|
||||||
#include "base/win/windows_version.h"
|
#include "base/win/windows_version.h"
|
||||||
|
@ -26,9 +29,25 @@ NotifyIcon::NotifyIcon(NotifyIconHost* host,
|
||||||
window_(window),
|
window_(window),
|
||||||
message_id_(message),
|
message_id_(message),
|
||||||
menu_model_(NULL) {
|
menu_model_(NULL) {
|
||||||
|
|
||||||
|
// NB: If we have an App Model ID, we should propagate that to the tray.
|
||||||
|
// Doing this prevents duplicate items from showing up in the notification
|
||||||
|
// preferences (i.e. "Always Show / Show notifications only / etc")
|
||||||
|
PWSTR explicit_app_id;
|
||||||
|
|
||||||
|
if (SUCCEEDED(GetCurrentProcessExplicitAppUserModelID(&explicit_app_id))) {
|
||||||
|
// GUIDs and MD5 hashes are the same length. So convenient!
|
||||||
|
base::MD5Sum(explicit_app_id,
|
||||||
|
sizeof(wchar_t) * wcslen(explicit_app_id),
|
||||||
|
(base::MD5Digest*)&tray_app_id_hash_);
|
||||||
|
has_tray_app_id_hash_ = true;
|
||||||
|
|
||||||
|
CoTaskMemFree(explicit_app_id);
|
||||||
|
}
|
||||||
|
|
||||||
NOTIFYICONDATA icon_data;
|
NOTIFYICONDATA icon_data;
|
||||||
InitIconData(&icon_data);
|
InitIconData(&icon_data);
|
||||||
icon_data.uFlags = NIF_MESSAGE;
|
icon_data.uFlags |= NIF_MESSAGE;
|
||||||
icon_data.uCallbackMessage = message_id_;
|
icon_data.uCallbackMessage = message_id_;
|
||||||
BOOL result = Shell_NotifyIcon(NIM_ADD, &icon_data);
|
BOOL result = Shell_NotifyIcon(NIM_ADD, &icon_data);
|
||||||
// This can happen if the explorer process isn't running when we try to
|
// This can happen if the explorer process isn't running when we try to
|
||||||
|
@ -71,7 +90,7 @@ void NotifyIcon::ResetIcon() {
|
||||||
// Delete any previously existing icon.
|
// Delete any previously existing icon.
|
||||||
Shell_NotifyIcon(NIM_DELETE, &icon_data);
|
Shell_NotifyIcon(NIM_DELETE, &icon_data);
|
||||||
InitIconData(&icon_data);
|
InitIconData(&icon_data);
|
||||||
icon_data.uFlags = NIF_MESSAGE;
|
icon_data.uFlags |= NIF_MESSAGE;
|
||||||
icon_data.uCallbackMessage = message_id_;
|
icon_data.uCallbackMessage = message_id_;
|
||||||
icon_data.hIcon = icon_.Get();
|
icon_data.hIcon = icon_.Get();
|
||||||
// If we have an image, then set the NIF_ICON flag, which tells
|
// If we have an image, then set the NIF_ICON flag, which tells
|
||||||
|
@ -88,7 +107,7 @@ void NotifyIcon::SetImage(const gfx::Image& image) {
|
||||||
// Create the icon.
|
// Create the icon.
|
||||||
NOTIFYICONDATA icon_data;
|
NOTIFYICONDATA icon_data;
|
||||||
InitIconData(&icon_data);
|
InitIconData(&icon_data);
|
||||||
icon_data.uFlags = NIF_ICON;
|
icon_data.uFlags |= NIF_ICON;
|
||||||
icon_.Set(IconUtil::CreateHICONFromSkBitmap(image.AsBitmap()));
|
icon_.Set(IconUtil::CreateHICONFromSkBitmap(image.AsBitmap()));
|
||||||
icon_data.hIcon = icon_.Get();
|
icon_data.hIcon = icon_.Get();
|
||||||
BOOL result = Shell_NotifyIcon(NIM_MODIFY, &icon_data);
|
BOOL result = Shell_NotifyIcon(NIM_MODIFY, &icon_data);
|
||||||
|
@ -105,7 +124,7 @@ void NotifyIcon::SetToolTip(const std::string& tool_tip) {
|
||||||
// Create the icon.
|
// Create the icon.
|
||||||
NOTIFYICONDATA icon_data;
|
NOTIFYICONDATA icon_data;
|
||||||
InitIconData(&icon_data);
|
InitIconData(&icon_data);
|
||||||
icon_data.uFlags = NIF_TIP;
|
icon_data.uFlags |= NIF_TIP;
|
||||||
wcscpy_s(icon_data.szTip, base::UTF8ToUTF16(tool_tip).c_str());
|
wcscpy_s(icon_data.szTip, base::UTF8ToUTF16(tool_tip).c_str());
|
||||||
BOOL result = Shell_NotifyIcon(NIM_MODIFY, &icon_data);
|
BOOL result = Shell_NotifyIcon(NIM_MODIFY, &icon_data);
|
||||||
if (!result)
|
if (!result)
|
||||||
|
@ -117,7 +136,7 @@ void NotifyIcon::DisplayBalloon(const gfx::Image& icon,
|
||||||
const base::string16& contents) {
|
const base::string16& contents) {
|
||||||
NOTIFYICONDATA icon_data;
|
NOTIFYICONDATA icon_data;
|
||||||
InitIconData(&icon_data);
|
InitIconData(&icon_data);
|
||||||
icon_data.uFlags = NIF_INFO;
|
icon_data.uFlags |= NIF_INFO;
|
||||||
icon_data.dwInfoFlags = NIIF_INFO;
|
icon_data.dwInfoFlags = NIIF_INFO;
|
||||||
wcscpy_s(icon_data.szInfoTitle, title.c_str());
|
wcscpy_s(icon_data.szInfoTitle, title.c_str());
|
||||||
wcscpy_s(icon_data.szInfo, contents.c_str());
|
wcscpy_s(icon_data.szInfo, contents.c_str());
|
||||||
|
@ -161,6 +180,13 @@ void NotifyIcon::InitIconData(NOTIFYICONDATA* icon_data) {
|
||||||
icon_data->cbSize = sizeof(NOTIFYICONDATA);
|
icon_data->cbSize = sizeof(NOTIFYICONDATA);
|
||||||
icon_data->hWnd = window_;
|
icon_data->hWnd = window_;
|
||||||
icon_data->uID = icon_id_;
|
icon_data->uID = icon_id_;
|
||||||
|
|
||||||
|
if (has_tray_app_id_hash_) {
|
||||||
|
icon_data->uFlags |= NIF_GUID;
|
||||||
|
memcpy(reinterpret_cast<void*>(&icon_data->guidItem),
|
||||||
|
&tray_app_id_hash_,
|
||||||
|
sizeof(GUID));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace atom
|
} // namespace atom
|
||||||
|
|
|
@ -76,6 +76,10 @@ class NotifyIcon : public TrayIcon {
|
||||||
// The context menu.
|
// The context menu.
|
||||||
ui::SimpleMenuModel* menu_model_;
|
ui::SimpleMenuModel* menu_model_;
|
||||||
|
|
||||||
|
// A hash of the app model ID
|
||||||
|
GUID tray_app_id_hash_;
|
||||||
|
bool has_tray_app_id_hash_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(NotifyIcon);
|
DISALLOW_COPY_AND_ASSIGN(NotifyIcon);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue