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

Unified Diff: chrome/browser/ui/views/message_center/web_notification_tray_win.cc

Issue 110693004: Moves the notification icon out of the status area overflow. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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/message_center/web_notification_tray_win.cc
diff --git a/chrome/browser/ui/views/message_center/web_notification_tray_win.cc b/chrome/browser/ui/views/message_center/web_notification_tray_win.cc
index 8df1becd7227e6fdbbb736bbe79ecd2ce9d19855..937143b1f8c1f23e089b07c99fa008878de4fe6a 100644
--- a/chrome/browser/ui/views/message_center/web_notification_tray_win.cc
+++ b/chrome/browser/ui/views/message_center/web_notification_tray_win.cc
@@ -5,7 +5,11 @@
#include "chrome/browser/ui/views/message_center/web_notification_tray.h"
#include <windows.h>
+#include <objbase.h>
+#include "base/memory/ref_counted.h"
+#include "base/threading/worker_pool.h"
+#include "base/win/scoped_com_initializer.h"
#include "base/win/windows_version.h"
#include "chrome/browser/app_icon_win.h"
#include "chrome/browser/profiles/profile_manager.h"
@@ -14,6 +18,8 @@
#include "chrome/browser/ui/host_desktop.h"
#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
#include "chrome/browser/ui/singleton_tabs.h"
+#include "chrome/browser/ui/views/message_center/tray_watcher_win.h"
+#include "chrome/browser/ui/views/status_icons/status_icon_win.h"
#include "chrome/common/url_constants.h"
#include "grit/chromium_strings.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -21,6 +27,21 @@
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/image/image_skia.h"
+namespace {
+
+// This method is called on a worker pool thread.
+void PromoteMatchingTrayIcon(UINT icon_id, HWND window) {
+ // It appears that IUnknowns are coincidentally compatible with
+ // scoped_refptr. Normally I wouldn't depend on that but it seems that
+ // base::win::IUnknownImpl itself depends on that coincidence so it's
+ // already being assumed elsewhere.
+ scoped_refptr<message_center::TrayWatcherWin> tray_watcher(
+ new message_center::TrayWatcherWin(icon_id, window));
+ tray_watcher->EnsureTrayIconVisible();
+}
+
+} // namespace
+
namespace message_center {
void WebNotificationTray::OnBalloonClicked() {
chrome::ScopedTabbedBrowserDisplayer displayer(
@@ -56,4 +77,31 @@ void WebNotificationTray::DisplayFirstRunBalloon() {
l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_BALLOON_TITLE),
l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_BALLOON_TEXT));
}
+
+void WebNotificationTray::EnforceStatusIconVisible() {
+ DCHECK(status_icon_);
+ StatusIconWin* status_icon_win = status_icon_->AsStatusIconWin();
+ // If we are in single-window metro mode, can't really do anything
+ // here.
+ if (status_icon_win == NULL)
+ return;
+
+ worker_thread_.reset(new base::Thread("COMWorkerThread"));
+ worker_thread_->init_com_with_mta(false);
+ worker_thread_->Start();
+ worker_thread_->message_loop_proxy()->PostTaskAndReply(
+ FROM_HERE,
+ base::Bind(PromoteMatchingTrayIcon,
+ status_icon_win->icon_id(),
+ status_icon_win->hwnd()),
+ base::Bind(&WebNotificationTray::JoinWorkerThread, AsWeakPtr()));
+}
+
+void WebNotificationTray::JoinWorkerThread() {
+ if (worker_thread_) {
+ worker_thread_->Stop();
+ worker_thread_.reset();
+ }
+}
+
} // namespace message_center

Powered by Google App Engine
This is Rietveld 408576698