| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/power_save_blocker.h" | 5 #include "content/browser/power_save_blocker.h" |
| 6 | 6 |
| 7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
| 8 #include <X11/extensions/dpms.h> | 8 #include <X11/extensions/dpms.h> |
| 9 // Xlib #defines Status, but we can't have that for some of our headers. | 9 // Xlib #defines Status, but we can't have that for some of our headers. |
| 10 #ifdef Status | 10 #ifdef Status |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 // D-Bus interface. It is responsible for obtaining specific object proxies, | 64 // D-Bus interface. It is responsible for obtaining specific object proxies, |
| 65 // making D-Bus method calls and handling D-Bus responses. | 65 // making D-Bus method calls and handling D-Bus responses. |
| 66 // | 66 // |
| 67 // When a new DBusPowerBlocker is created, only a specific implementation of | 67 // When a new DBusPowerBlocker is created, only a specific implementation of |
| 68 // the delegate is instantiated. See the DBusPowerSaveBlocker constructor for | 68 // the delegate is instantiated. See the DBusPowerSaveBlocker constructor for |
| 69 // more details. This is ref_counted to make sure that the callbacks stay | 69 // more details. This is ref_counted to make sure that the callbacks stay |
| 70 // alive even after the DBusPowerSaveBlocker object is deleted. | 70 // alive even after the DBusPowerSaveBlocker object is deleted. |
| 71 class Delegate : public base::RefCountedThreadSafe<Delegate> { | 71 class Delegate : public base::RefCountedThreadSafe<Delegate> { |
| 72 public: | 72 public: |
| 73 Delegate() {} | 73 Delegate() {} |
| 74 virtual void ApplyBlock(PowerSaveBlocker::PowerSaveBlockerType type) = 0; |
| 75 |
| 76 protected: |
| 74 virtual ~Delegate() {} | 77 virtual ~Delegate() {} |
| 75 virtual void ApplyBlock(PowerSaveBlocker::PowerSaveBlockerType type) = 0; | 78 |
| 76 private: | 79 private: |
| 80 friend class base::RefCountedThreadSafe<Delegate>; |
| 81 |
| 77 DISALLOW_COPY_AND_ASSIGN(Delegate); | 82 DISALLOW_COPY_AND_ASSIGN(Delegate); |
| 78 }; | 83 }; |
| 79 | 84 |
| 80 // Returns a pointer to the sole instance of this class | 85 // Returns a pointer to the sole instance of this class |
| 81 static DBusPowerSaveBlocker* GetInstance(); | 86 static DBusPowerSaveBlocker* GetInstance(); |
| 82 | 87 |
| 83 // Forwards a power save block request to the concrete implementation of the | 88 // Forwards a power save block request to the concrete implementation of the |
| 84 // Delegate interface. If |delegate_| is NULL, the application runs under an | 89 // Delegate interface. If |delegate_| is NULL, the application runs under an |
| 85 // unsupported desktop environment. In this case, the method does nothing. | 90 // unsupported desktop environment. In this case, the method does nothing. |
| 86 void ApplyBlock(PowerSaveBlocker::PowerSaveBlockerType type) { | 91 void ApplyBlock(PowerSaveBlocker::PowerSaveBlockerType type) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 113 | 118 |
| 114 // Delegate implementation for KDE4. It uses the | 119 // Delegate implementation for KDE4. It uses the |
| 115 // org.freedesktop.PowerManagement interface. It works on XFCE4, too. | 120 // org.freedesktop.PowerManagement interface. It works on XFCE4, too. |
| 116 class KDEPowerSaveBlocker : public DBusPowerSaveBlocker::Delegate { | 121 class KDEPowerSaveBlocker : public DBusPowerSaveBlocker::Delegate { |
| 117 public: | 122 public: |
| 118 KDEPowerSaveBlocker() | 123 KDEPowerSaveBlocker() |
| 119 : inhibit_cookie_(0), | 124 : inhibit_cookie_(0), |
| 120 pending_inhibit_call_(false), | 125 pending_inhibit_call_(false), |
| 121 postponed_uninhibit_call_(false) { | 126 postponed_uninhibit_call_(false) { |
| 122 } | 127 } |
| 123 ~KDEPowerSaveBlocker() {} | |
| 124 | 128 |
| 125 virtual void ApplyBlock( | 129 virtual void ApplyBlock( |
| 126 PowerSaveBlocker::PowerSaveBlockerType type) OVERRIDE { | 130 PowerSaveBlocker::PowerSaveBlockerType type) OVERRIDE { |
| 127 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 131 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 128 DCHECK(pending_inhibit_call_ || !postponed_uninhibit_call_); | 132 DCHECK(pending_inhibit_call_ || !postponed_uninhibit_call_); |
| 129 | 133 |
| 130 // If we have a pending inhibit call, we add a postponed uninhibit | 134 // If we have a pending inhibit call, we add a postponed uninhibit |
| 131 // request, such that it will be canceled as soon as the response arrives. | 135 // request, such that it will be canceled as soon as the response arrives. |
| 132 // If we have an active inhibit request and receive a new one, | 136 // If we have an active inhibit request and receive a new one, |
| 133 // we ignore it since the 'freedesktop' interface has only one Inhibit level | 137 // we ignore it since the 'freedesktop' interface has only one Inhibit level |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 // This is an invalid argument | 192 // This is an invalid argument |
| 189 NOTREACHED(); | 193 NOTREACHED(); |
| 190 break; | 194 break; |
| 191 } | 195 } |
| 192 | 196 |
| 193 object_proxy->CallMethod(&method_call, | 197 object_proxy->CallMethod(&method_call, |
| 194 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 198 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 195 bus_callback); | 199 bus_callback); |
| 196 } | 200 } |
| 197 | 201 |
| 202 protected: |
| 203 virtual ~KDEPowerSaveBlocker() {} |
| 204 |
| 198 private: | 205 private: |
| 199 // Inhibit() response callback. | 206 // Inhibit() response callback. |
| 200 // Stores the cookie so we can use it later when calling UnInhibit(). | 207 // Stores the cookie so we can use it later when calling UnInhibit(). |
| 201 // If the response from D-Bus is successful and there is a postponed | 208 // If the response from D-Bus is successful and there is a postponed |
| 202 // uninhibit request, we cancel the cookie that we just received. | 209 // uninhibit request, we cancel the cookie that we just received. |
| 203 void OnInhibitResponse(dbus::Response* response) { | 210 void OnInhibitResponse(dbus::Response* response) { |
| 204 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 211 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 205 DCHECK(pending_inhibit_call_); | 212 DCHECK(pending_inhibit_call_); |
| 206 pending_inhibit_call_ = false; | 213 pending_inhibit_call_ = false; |
| 207 if (response) { | 214 if (response) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 kInhibitLogOut = 1, | 258 kInhibitLogOut = 1, |
| 252 kInhibitSwitchUser = 2, | 259 kInhibitSwitchUser = 2, |
| 253 kInhibitSuspendSession = 4, | 260 kInhibitSuspendSession = 4, |
| 254 kInhibitMarkSessionAsIdle = 8 | 261 kInhibitMarkSessionAsIdle = 8 |
| 255 }; | 262 }; |
| 256 | 263 |
| 257 GnomePowerSaveBlocker() | 264 GnomePowerSaveBlocker() |
| 258 : inhibit_cookie_(0), | 265 : inhibit_cookie_(0), |
| 259 pending_inhibit_calls_(0), | 266 pending_inhibit_calls_(0), |
| 260 postponed_uninhibit_calls_(0) {} | 267 postponed_uninhibit_calls_(0) {} |
| 261 ~GnomePowerSaveBlocker() {} | |
| 262 | 268 |
| 263 virtual void ApplyBlock( | 269 virtual void ApplyBlock( |
| 264 PowerSaveBlocker::PowerSaveBlockerType type) OVERRIDE { | 270 PowerSaveBlocker::PowerSaveBlockerType type) OVERRIDE { |
| 265 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 271 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 266 DCHECK(postponed_uninhibit_calls_ <= pending_inhibit_calls_); | 272 DCHECK(postponed_uninhibit_calls_ <= pending_inhibit_calls_); |
| 267 | 273 |
| 268 // If we have a pending inhibit call, we add a postponed uninhibit request, | 274 // If we have a pending inhibit call, we add a postponed uninhibit request, |
| 269 // such that it will be canceled as soon as the response arrives. We want to | 275 // such that it will be canceled as soon as the response arrives. We want to |
| 270 // cancel the current inhibit request whether |type| is | 276 // cancel the current inhibit request whether |type| is |
| 271 // kPowerSaveBlockPreventNone or not. If |type| represents an inhibit | 277 // kPowerSaveBlockPreventNone or not. If |type| represents an inhibit |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 // This is an invalid argument. | 367 // This is an invalid argument. |
| 362 NOTREACHED(); | 368 NOTREACHED(); |
| 363 break; | 369 break; |
| 364 } | 370 } |
| 365 | 371 |
| 366 object_proxy->CallMethod(&method_call, | 372 object_proxy->CallMethod(&method_call, |
| 367 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 373 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 368 bus_callback); | 374 bus_callback); |
| 369 } | 375 } |
| 370 | 376 |
| 377 protected: |
| 378 virtual ~GnomePowerSaveBlocker() {} |
| 379 |
| 371 private: | 380 private: |
| 372 // Inhibit() response callback. | 381 // Inhibit() response callback. |
| 373 // Stores the cookie so we can use it later when calling UnInhibit(). | 382 // Stores the cookie so we can use it later when calling UnInhibit(). |
| 374 // If the response from D-Bus is successful and there is a postponed | 383 // If the response from D-Bus is successful and there is a postponed |
| 375 // uninhibit request, we cancel the cookie that we just received. | 384 // uninhibit request, we cancel the cookie that we just received. |
| 376 void OnInhibitResponse(dbus::Response* response) { | 385 void OnInhibitResponse(dbus::Response* response) { |
| 377 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 386 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 378 DCHECK_GT(pending_inhibit_calls_, 0); | 387 DCHECK_GT(pending_inhibit_calls_, 0); |
| 379 --pending_inhibit_calls_; | 388 --pending_inhibit_calls_; |
| 380 if (response) { | 389 if (response) { |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 } | 501 } |
| 493 | 502 |
| 494 } // namespace | 503 } // namespace |
| 495 | 504 |
| 496 // Called only from UI thread. | 505 // Called only from UI thread. |
| 497 // static | 506 // static |
| 498 void PowerSaveBlocker::ApplyBlock(PowerSaveBlockerType type) { | 507 void PowerSaveBlocker::ApplyBlock(PowerSaveBlockerType type) { |
| 499 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 508 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 500 DBusPowerSaveBlocker::GetInstance()->ApplyBlock(type); | 509 DBusPowerSaveBlocker::GetInstance()->ApplyBlock(type); |
| 501 } | 510 } |
| OLD | NEW |