| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/status_icons/status_tray_state_changer_win.h" | 5 #include "chrome/browser/ui/views/status_icons/status_tray_state_changer_win.h" |
| 6 | 6 |
| 7 namespace { | 7 namespace { |
| 8 | 8 |
| 9 //////////////////////////////////////////////////////////////////////////////// | 9 //////////////////////////////////////////////////////////////////////////////// |
| 10 // Status Tray API | 10 // Status Tray API |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 DCHECK(CalledOnValidThread()); | 124 DCHECK(CalledOnValidThread()); |
| 125 | 125 |
| 126 tray_notify_.Release(); // Release so this method can be called more than | 126 tray_notify_.Release(); // Release so this method can be called more than |
| 127 // once. | 127 // once. |
| 128 | 128 |
| 129 HRESULT hr = tray_notify_.CreateInstance(CLSID_TrayNotify); | 129 HRESULT hr = tray_notify_.CreateInstance(CLSID_TrayNotify); |
| 130 if (FAILED(hr)) | 130 if (FAILED(hr)) |
| 131 return false; | 131 return false; |
| 132 | 132 |
| 133 base::win::ScopedComPtr<ITrayNotifyWin8> tray_notify_win8; | 133 base::win::ScopedComPtr<ITrayNotifyWin8> tray_notify_win8; |
| 134 hr = tray_notify_win8.QueryFrom(tray_notify_); | 134 hr = tray_notify_win8.QueryFrom(tray_notify_.get()); |
| 135 if (SUCCEEDED(hr)) { | 135 if (SUCCEEDED(hr)) { |
| 136 interface_version_ = INTERFACE_VERSION_WIN8; | 136 interface_version_ = INTERFACE_VERSION_WIN8; |
| 137 return true; | 137 return true; |
| 138 } | 138 } |
| 139 | 139 |
| 140 base::win::ScopedComPtr<ITrayNotify> tray_notify_legacy; | 140 base::win::ScopedComPtr<ITrayNotify> tray_notify_legacy; |
| 141 hr = tray_notify_legacy.QueryFrom(tray_notify_); | 141 hr = tray_notify_legacy.QueryFrom(tray_notify_.get()); |
| 142 if (SUCCEEDED(hr)) { | 142 if (SUCCEEDED(hr)) { |
| 143 interface_version_ = INTERFACE_VERSION_LEGACY; | 143 interface_version_ = INTERFACE_VERSION_LEGACY; |
| 144 return true; | 144 return true; |
| 145 } | 145 } |
| 146 | 146 |
| 147 return false; | 147 return false; |
| 148 } | 148 } |
| 149 | 149 |
| 150 scoped_ptr<NOTIFYITEM> StatusTrayStateChangerWin::RegisterCallback() { | 150 scoped_ptr<NOTIFYITEM> StatusTrayStateChangerWin::RegisterCallback() { |
| 151 // |notify_item_| is used to store the result of the callback from | 151 // |notify_item_| is used to store the result of the callback from |
| (...skipping 17 matching lines...) Expand all Loading... |
| 169 } | 169 } |
| 170 | 170 |
| 171 // Adding an intermediate scoped pointer here so that |notify_item_| is reset | 171 // Adding an intermediate scoped pointer here so that |notify_item_| is reset |
| 172 // to NULL. | 172 // to NULL. |
| 173 scoped_ptr<NOTIFYITEM> rv(notify_item_.release()); | 173 scoped_ptr<NOTIFYITEM> rv(notify_item_.release()); |
| 174 return rv.Pass(); | 174 return rv.Pass(); |
| 175 } | 175 } |
| 176 | 176 |
| 177 bool StatusTrayStateChangerWin::RegisterCallbackWin8() { | 177 bool StatusTrayStateChangerWin::RegisterCallbackWin8() { |
| 178 base::win::ScopedComPtr<ITrayNotifyWin8> tray_notify_win8; | 178 base::win::ScopedComPtr<ITrayNotifyWin8> tray_notify_win8; |
| 179 HRESULT hr = tray_notify_win8.QueryFrom(tray_notify_); | 179 HRESULT hr = tray_notify_win8.QueryFrom(tray_notify_.get()); |
| 180 if (FAILED(hr)) | 180 if (FAILED(hr)) |
| 181 return false; | 181 return false; |
| 182 | 182 |
| 183 // The following two lines cause Windows Explorer to call us back with all the | 183 // The following two lines cause Windows Explorer to call us back with all the |
| 184 // existing tray icons and their preference. It would also presumably notify | 184 // existing tray icons and their preference. It would also presumably notify |
| 185 // us if changes were made in realtime while we registered as a callback, but | 185 // us if changes were made in realtime while we registered as a callback, but |
| 186 // we just want to modify our own entry so we immediately unregister. | 186 // we just want to modify our own entry so we immediately unregister. |
| 187 unsigned long callback_id = 0; | 187 unsigned long callback_id = 0; |
| 188 hr = tray_notify_win8->RegisterCallback(this, &callback_id); | 188 hr = tray_notify_win8->RegisterCallback(this, &callback_id); |
| 189 tray_notify_win8->UnregisterCallback(&callback_id); | 189 tray_notify_win8->UnregisterCallback(&callback_id); |
| 190 if (FAILED(hr)) { | 190 if (FAILED(hr)) { |
| 191 return false; | 191 return false; |
| 192 } | 192 } |
| 193 | 193 |
| 194 return true; | 194 return true; |
| 195 } | 195 } |
| 196 | 196 |
| 197 bool StatusTrayStateChangerWin::RegisterCallbackLegacy() { | 197 bool StatusTrayStateChangerWin::RegisterCallbackLegacy() { |
| 198 base::win::ScopedComPtr<ITrayNotify> tray_notify; | 198 base::win::ScopedComPtr<ITrayNotify> tray_notify; |
| 199 HRESULT hr = tray_notify.QueryFrom(tray_notify_); | 199 HRESULT hr = tray_notify.QueryFrom(tray_notify_.get()); |
| 200 if (FAILED(hr)) { | 200 if (FAILED(hr)) { |
| 201 return false; | 201 return false; |
| 202 } | 202 } |
| 203 | 203 |
| 204 // The following two lines cause Windows Explorer to call us back with all the | 204 // The following two lines cause Windows Explorer to call us back with all the |
| 205 // existing tray icons and their preference. It would also presumably notify | 205 // existing tray icons and their preference. It would also presumably notify |
| 206 // us if changes were made in realtime while we registered as a callback. In | 206 // us if changes were made in realtime while we registered as a callback. In |
| 207 // this version of the API, there can be only one registered callback so it is | 207 // this version of the API, there can be only one registered callback so it is |
| 208 // better to unregister as soon as possible. | 208 // better to unregister as soon as possible. |
| 209 // TODO(dewittj): Try to notice if the notification area icon customization | 209 // TODO(dewittj): Try to notice if the notification area icon customization |
| 210 // window is open and postpone this call until the user closes it; | 210 // window is open and postpone this call until the user closes it; |
| 211 // registering the callback while the window is open can cause stale data to | 211 // registering the callback while the window is open can cause stale data to |
| 212 // be displayed to the user. | 212 // be displayed to the user. |
| 213 hr = tray_notify->RegisterCallback(this); | 213 hr = tray_notify->RegisterCallback(this); |
| 214 tray_notify->RegisterCallback(NULL); | 214 tray_notify->RegisterCallback(NULL); |
| 215 if (FAILED(hr)) { | 215 if (FAILED(hr)) { |
| 216 return false; | 216 return false; |
| 217 } | 217 } |
| 218 | 218 |
| 219 return true; | 219 return true; |
| 220 } | 220 } |
| 221 | 221 |
| 222 void StatusTrayStateChangerWin::SendNotifyItemUpdate( | 222 void StatusTrayStateChangerWin::SendNotifyItemUpdate( |
| 223 scoped_ptr<NOTIFYITEM> notify_item) { | 223 scoped_ptr<NOTIFYITEM> notify_item) { |
| 224 if (interface_version_ == INTERFACE_VERSION_LEGACY) { | 224 if (interface_version_ == INTERFACE_VERSION_LEGACY) { |
| 225 base::win::ScopedComPtr<ITrayNotify> tray_notify; | 225 base::win::ScopedComPtr<ITrayNotify> tray_notify; |
| 226 HRESULT hr = tray_notify.QueryFrom(tray_notify_); | 226 HRESULT hr = tray_notify.QueryFrom(tray_notify_.get()); |
| 227 if (SUCCEEDED(hr)) | 227 if (SUCCEEDED(hr)) |
| 228 tray_notify->SetPreference(notify_item.get()); | 228 tray_notify->SetPreference(notify_item.get()); |
| 229 } else if (interface_version_ == INTERFACE_VERSION_WIN8) { | 229 } else if (interface_version_ == INTERFACE_VERSION_WIN8) { |
| 230 base::win::ScopedComPtr<ITrayNotifyWin8> tray_notify; | 230 base::win::ScopedComPtr<ITrayNotifyWin8> tray_notify; |
| 231 HRESULT hr = tray_notify.QueryFrom(tray_notify_); | 231 HRESULT hr = tray_notify.QueryFrom(tray_notify_.get()); |
| 232 if (SUCCEEDED(hr)) | 232 if (SUCCEEDED(hr)) |
| 233 tray_notify->SetPreference(notify_item.get()); | 233 tray_notify->SetPreference(notify_item.get()); |
| 234 } | 234 } |
| 235 } | 235 } |
| OLD | NEW |