Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef CHROME_BROWSER_UI_VIEWS_STATUS_ICONS_STATUS_TRAY_STATE_CHANGER_WIN_H_ | |
|
sky
2014/04/04 21:13:25
I'm assuming cpu reviewed all this code.
| |
| 6 #define CHROME_BROWSER_UI_VIEWS_STATUS_ICONS_STATUS_TRAY_STATE_CHANGER_WIN_H_ | |
| 7 | |
| 8 #include "base/memory/scoped_ptr.h" | |
| 9 #include "base/strings/string16.h" | |
| 10 #include "base/threading/non_thread_safe.h" | |
| 11 #include "base/win/iunknown_impl.h" | |
| 12 #include "base/win/scoped_comptr.h" | |
| 13 | |
| 14 // The known values for NOTIFYITEM's dwPreference member. | |
| 15 enum NOTIFYITEM_PREFERENCE { | |
| 16 // In Windows UI: "Only show notifications." | |
| 17 PREFERENCE_SHOW_WHEN_ACTIVE = 0, | |
| 18 // In Windows UI: "Hide icon and notifications." | |
| 19 PREFERENCE_SHOW_NEVER = 1, | |
| 20 // In Windows UI: "Show icon and notifications." | |
| 21 PREFERENCE_SHOW_ALWAYS = 2 | |
| 22 }; | |
| 23 | |
| 24 // NOTIFYITEM describes an entry in Explorer's registry of status icons. | |
| 25 // Explorer keeps entries around for a process even after it exits. | |
| 26 struct NOTIFYITEM { | |
| 27 PWSTR pszExeName; // The file name of the creating executable. | |
|
sky
2014/04/04 21:13:25
Even though I'm assuming cpu reviewed all this, ho
dewittj
2014/04/04 22:35:57
I guess I thought that in windows data structures
| |
| 28 PWSTR pszTip; // The last hover-text value associated with this status item. | |
| 29 HICON hIcon; // The icon associated with this status item. | |
| 30 HWND hWnd; // The HWND associated with the status item. | |
| 31 DWORD dwPreference; // Determines the behavior of the icon with respect to | |
| 32 // the taskbar. Values taken from NOTIFYITEM_PREFERENCE. | |
| 33 UINT uID; // The ID specified by the application. (hWnd, uID) is unique. | |
| 34 GUID guidItem; // The GUID specified by the application, alternative to uID. | |
| 35 }; | |
| 36 | |
| 37 // INotificationCB is an interface that applications can implement in order to | |
| 38 // receive notifications about the state of the notification area manager. | |
| 39 class __declspec(uuid("D782CCBA-AFB0-43F1-94DB-FDA3779EACCB")) INotificationCB | |
| 40 : public IUnknown { | |
| 41 public: | |
| 42 virtual HRESULT STDMETHODCALLTYPE | |
| 43 Notify(ULONG event, NOTIFYITEM* notify_item) = 0; | |
| 44 }; | |
| 45 | |
| 46 // A class that is capable of reading and writing the state of the notification | |
| 47 // area in the Windows taskbar. It is used to promote a tray icon from the | |
| 48 // overflow area to the taskbar, and refuses to do anything if the user has | |
| 49 // explicitly marked an icon to be always hidden. | |
| 50 class StatusTrayStateChangerWin : public INotificationCB, | |
| 51 public base::win::IUnknownImpl, | |
| 52 public base::NonThreadSafe { | |
| 53 public: | |
| 54 StatusTrayStateChangerWin(UINT icon_id, HWND window); | |
| 55 | |
| 56 // Call this method to move the icon matching |icon_id| and |window| to the | |
| 57 // taskbar from the overflow area. This will not make any changes if the | |
| 58 // icon has been set to |PREFERENCE_SHOW_NEVER|, in order to comply with | |
| 59 // the explicit wishes/configuration of the user. | |
| 60 void EnsureTrayIconVisible(); | |
| 61 | |
| 62 // IUnknown. | |
| 63 virtual ULONG STDMETHODCALLTYPE AddRef() OVERRIDE; | |
| 64 virtual ULONG STDMETHODCALLTYPE Release() OVERRIDE; | |
| 65 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, PVOID*) OVERRIDE; | |
| 66 | |
| 67 // INotificationCB. | |
| 68 // Notify is called in response to RegisterCallback for each current | |
| 69 // entry in Explorer's list of notification area icons, and ever time | |
| 70 // one of them changes, until UnregisterCallback is called or |this| | |
| 71 // is destroyed. | |
| 72 virtual HRESULT STDMETHODCALLTYPE Notify(ULONG, NOTIFYITEM*); | |
| 73 | |
| 74 protected: | |
| 75 virtual ~StatusTrayStateChangerWin(); | |
| 76 | |
| 77 private: | |
| 78 friend class StatusTrayStateChangerWinTest; | |
| 79 | |
| 80 enum InterfaceVersion { | |
| 81 INTERFACE_VERSION_LEGACY = 0, | |
| 82 INTERFACE_VERSION_WIN8, | |
| 83 INTERFACE_VERSION_UNKNOWN | |
| 84 }; | |
| 85 | |
| 86 // Creates an instance of TrayNotify, and ensures that it supports either | |
| 87 // ITrayNotify or ITrayNotifyWin8. Returns true on success. | |
| 88 bool CreateTrayNotify(); | |
| 89 | |
| 90 // Returns the NOTIFYITEM that corresponds to this executable and the | |
| 91 // HWND/ID pair that were used to create the StatusTrayStateChangerWin. | |
| 92 // Internally it calls the appropriate RegisterCallback{Win8,Legacy}. | |
| 93 scoped_ptr<NOTIFYITEM> RegisterCallback(); | |
| 94 | |
| 95 // Calls RegisterCallback with the appropriate interface required by | |
| 96 // different versions of Windows. This will result in |notify_item_| being | |
| 97 // updated when a matching item is passed into | |
| 98 // StatusTrayStateChangerWin::Notify. | |
| 99 bool RegisterCallbackWin8(); | |
| 100 bool RegisterCallbackLegacy(); | |
| 101 | |
| 102 // Sends an update to Explorer with the passed NOTIFYITEM. | |
| 103 void SendNotifyItemUpdate(scoped_ptr<NOTIFYITEM> notify_item); | |
| 104 | |
| 105 // Storing IUnknown since we will need to use different interfaces | |
| 106 // for different versions of Windows. | |
| 107 base::win::ScopedComPtr<IUnknown> tray_notify_; | |
| 108 InterfaceVersion interface_version_; | |
| 109 | |
| 110 // The ID assigned to the notification area icon that we want to manipulate. | |
| 111 const UINT icon_id_; | |
| 112 // The HWND associated with the notification area icon that we want to | |
| 113 // manipulate. This is an unretained pointer, do not dereference. | |
| 114 const HWND window_; | |
| 115 // Executable name of the current program. Along with |icon_id_| and | |
| 116 // |window_|, this uniquely identifies a notification area entry to Explorer. | |
| 117 base::string16 file_name_; | |
| 118 | |
| 119 // Temporary storage for the matched NOTIFYITEM. This is necessary because | |
| 120 // Notify doesn't return anything. The call flow looks like this: | |
| 121 // TrayNotify->RegisterCallback() | |
| 122 // ... other COM stack frames .. | |
| 123 // StatusTrayStateChangerWin->Notify(NOTIFYITEM); | |
| 124 // so we can't just return the notifyitem we're looking for. | |
| 125 scoped_ptr<NOTIFYITEM> notify_item_; | |
| 126 | |
| 127 DISALLOW_COPY_AND_ASSIGN(StatusTrayStateChangerWin); | |
| 128 }; | |
| 129 | |
| 130 #endif // CHROME_BROWSER_UI_VIEWS_STATUS_ICONS_STATUS_TRAY_STATE_CHANGER_WIN_H_ | |
| OLD | NEW |