From 7c7a7b96de198b1dff7d35334079d229ea372c6e Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 3 Nov 2015 14:55:43 +0800 Subject: [PATCH] win: Do not set app user model id by default When user drags exe file into taskbar directly the pinned icon will not has an app user model id, so if we set app user model id in the application two icons will show in the taskbar. For apps installed with a installer it is not a problem since the shortcut icon will be created with app user model id, but we should also keep the ability to make portable apps work out of box. Fix #3303. --- atom/browser/browser.cc | 4 ---- atom/browser/browser.h | 9 +++++++-- atom/browser/browser_win.cc | 18 ++++++++++++------ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index 739921f..e80cb4e 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -89,10 +89,6 @@ std::string Browser::GetName() const { void Browser::SetName(const std::string& name) { name_override_ = name; - -#if defined(OS_WIN) - SetAppUserModelID(name); -#endif } bool Browser::OpenFile(const std::string& file_path) { diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 8719e18..0500e31 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -100,8 +100,13 @@ class Browser : public WindowListObserver { // Add a custom task to jump list. void SetUserTasks(const std::vector& tasks); - // Set the application user model ID, called when "SetName" is called. - void SetAppUserModelID(const std::string& name); + // Set the application user model ID. + void SetAppUserModelID(const base::string16& name); + + // Returns the application user model ID, if there isn't one, then create + // one from app's name. + // The returned string managed by Browser, and should not be modified. + PCWSTR GetAppUserModelID(); #endif // Tell the application to open a file. diff --git a/atom/browser/browser_win.cc b/atom/browser/browser_win.cc index b861af9..0e5ce8e 100644 --- a/atom/browser/browser_win.cc +++ b/atom/browser/browser_win.cc @@ -56,7 +56,7 @@ void Browser::AddRecentDocument(const base::FilePath& path) { if (SUCCEEDED(hr)) { SHARDAPPIDINFO info; info.psi = item; - info.pszAppID = app_user_model_id_.c_str(); + info.pszAppID = GetAppUserModelID(); SHAddToRecentDocs(SHARD_APPIDINFO, &info); } } @@ -66,7 +66,7 @@ void Browser::ClearRecentDocuments() { if (FAILED(destinations.CoCreateInstance(CLSID_ApplicationDestinations, NULL, CLSCTX_INPROC_SERVER))) return; - if (FAILED(destinations->SetAppID(app_user_model_id_.c_str()))) + if (FAILED(destinations->SetAppID(GetAppUserModelID()))) return; destinations->RemoveAllDestinations(); } @@ -75,7 +75,7 @@ void Browser::SetUserTasks(const std::vector& tasks) { CComPtr destinations; if (FAILED(destinations.CoCreateInstance(CLSID_DestinationList))) return; - if (FAILED(destinations->SetAppID(app_user_model_id_.c_str()))) + if (FAILED(destinations->SetAppID(GetAppUserModelID()))) return; // Start a transaction that updates the JumpList of this application. @@ -117,12 +117,18 @@ void Browser::SetUserTasks(const std::vector& tasks) { destinations->CommitList(); } -void Browser::SetAppUserModelID(const std::string& name) { - app_user_model_id_ = base::string16(L"electron.app."); - app_user_model_id_ += base::UTF8ToUTF16(name); +void Browser::SetAppUserModelID(const base::string16& name) { + app_user_model_id_ = name; SetCurrentProcessExplicitAppUserModelID(app_user_model_id_.c_str()); } +PCWSTR Browser::GetAppUserModelID() { + if (app_user_model_id_.empty()) + SetAppUserModelID(base::UTF8ToUTF16(GetName())); + + return app_user_model_id_.c_str(); +} + std::string Browser::GetExecutableFileVersion() const { base::FilePath path; if (PathService::Get(base::FILE_EXE, &path)) { -- 2.7.4