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_impl.h" | 5 #include "content/browser/power_save_blocker_impl.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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 "/org/freedesktop/PowerManagement/Inhibit"; | 60 "/org/freedesktop/PowerManagement/Inhibit"; |
61 | 61 |
62 } // namespace | 62 } // namespace |
63 | 63 |
64 namespace content { | 64 namespace content { |
65 | 65 |
66 class PowerSaveBlockerImpl::Delegate | 66 class PowerSaveBlockerImpl::Delegate |
67 : public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> { | 67 : public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> { |
68 public: | 68 public: |
69 // Picks an appropriate D-Bus API to use based on the desktop environment. | 69 // Picks an appropriate D-Bus API to use based on the desktop environment. |
70 Delegate(PowerSaveBlockerType type, const std::string& reason); | 70 Delegate(PowerSaveBlockerType type, const std::string& description); |
71 | 71 |
72 // Post a task to initialize the delegate on the UI thread, which will itself | 72 // Post a task to initialize the delegate on the UI thread, which will itself |
73 // then post a task to apply the power save block on the FILE thread. | 73 // then post a task to apply the power save block on the FILE thread. |
74 void Init(); | 74 void Init(); |
75 | 75 |
76 // Post a task to remove the power save block on the FILE thread, unless it | 76 // Post a task to remove the power save block on the FILE thread, unless it |
77 // hasn't yet been applied, in which case we just prevent it from applying. | 77 // hasn't yet been applied, in which case we just prevent it from applying. |
78 void CleanUp(); | 78 void CleanUp(); |
79 | 79 |
80 private: | 80 private: |
(...skipping 16 matching lines...) Expand all Loading... |
97 // to try to disable power saving, since on some desktop environments that may | 97 // to try to disable power saving, since on some desktop environments that may |
98 // enable DPMS with very poor default settings (e.g. turning off the display | 98 // enable DPMS with very poor default settings (e.g. turning off the display |
99 // after only 1 second). Must be called on the UI thread. | 99 // after only 1 second). Must be called on the UI thread. |
100 static bool DPMSEnabled(); | 100 static bool DPMSEnabled(); |
101 | 101 |
102 // Returns an appropriate D-Bus API to use based on the desktop environment. | 102 // Returns an appropriate D-Bus API to use based on the desktop environment. |
103 // Must be called on the UI thread, as it may call DPMSEnabled() above. | 103 // Must be called on the UI thread, as it may call DPMSEnabled() above. |
104 static DBusAPI SelectAPI(); | 104 static DBusAPI SelectAPI(); |
105 | 105 |
106 const PowerSaveBlockerType type_; | 106 const PowerSaveBlockerType type_; |
107 const std::string reason_; | 107 const std::string description_; |
108 | 108 |
109 // Initially, we post a message to the UI thread to select an API. When it | 109 // Initially, we post a message to the UI thread to select an API. When it |
110 // finishes, it will post a message to the FILE thread to perform the actual | 110 // finishes, it will post a message to the FILE thread to perform the actual |
111 // application of the block, unless enqueue_apply_ is false. We set it to | 111 // application of the block, unless enqueue_apply_ is false. We set it to |
112 // false when we post that message, or when RemoveBlock() is called before | 112 // false when we post that message, or when RemoveBlock() is called before |
113 // ApplyBlock() has run. Both api_ and enqueue_apply_ are guarded by lock_. | 113 // ApplyBlock() has run. Both api_ and enqueue_apply_ are guarded by lock_. |
114 DBusAPI api_; | 114 DBusAPI api_; |
115 bool enqueue_apply_; | 115 bool enqueue_apply_; |
116 base::Lock lock_; | 116 base::Lock lock_; |
117 | 117 |
118 scoped_refptr<dbus::Bus> bus_; | 118 scoped_refptr<dbus::Bus> bus_; |
119 | 119 |
120 // The cookie that identifies our inhibit request, | 120 // The cookie that identifies our inhibit request, |
121 // or 0 if there is no active inhibit request. | 121 // or 0 if there is no active inhibit request. |
122 uint32 inhibit_cookie_; | 122 uint32 inhibit_cookie_; |
123 | 123 |
124 DISALLOW_COPY_AND_ASSIGN(Delegate); | 124 DISALLOW_COPY_AND_ASSIGN(Delegate); |
125 }; | 125 }; |
126 | 126 |
127 PowerSaveBlockerImpl::Delegate::Delegate(PowerSaveBlockerType type, | 127 PowerSaveBlockerImpl::Delegate::Delegate(PowerSaveBlockerType type, |
128 const std::string& reason) | 128 const std::string& description) |
129 : type_(type), | 129 : type_(type), |
130 reason_(reason), | 130 description_(description), |
131 api_(NO_API), | 131 api_(NO_API), |
132 enqueue_apply_(false), | 132 enqueue_apply_(false), |
133 inhibit_cookie_(0) { | 133 inhibit_cookie_(0) { |
134 // We're on the client's thread here, so we don't allocate the dbus::Bus | 134 // We're on the client's thread here, so we don't allocate the dbus::Bus |
135 // object yet. We'll do it later in ApplyBlock(), on the FILE thread. | 135 // object yet. We'll do it later in ApplyBlock(), on the FILE thread. |
136 } | 136 } |
137 | 137 |
138 void PowerSaveBlockerImpl::Delegate::Init() { | 138 void PowerSaveBlockerImpl::Delegate::Init() { |
139 base::AutoLock lock(lock_); | 139 base::AutoLock lock(lock_); |
140 DCHECK(!enqueue_apply_); | 140 DCHECK(!enqueue_apply_); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 new dbus::MethodCall(kGnomeAPIInterfaceName, "Inhibit")); | 195 new dbus::MethodCall(kGnomeAPIInterfaceName, "Inhibit")); |
196 message_writer.reset(new dbus::MessageWriter(method_call.get())); | 196 message_writer.reset(new dbus::MessageWriter(method_call.get())); |
197 // The arguments of the method are: | 197 // The arguments of the method are: |
198 // app_id: The application identifier | 198 // app_id: The application identifier |
199 // toplevel_xid: The toplevel X window identifier | 199 // toplevel_xid: The toplevel X window identifier |
200 // reason: The reason for the inhibit | 200 // reason: The reason for the inhibit |
201 // flags: Flags that spefify what should be inhibited | 201 // flags: Flags that spefify what should be inhibited |
202 message_writer->AppendString( | 202 message_writer->AppendString( |
203 base::CommandLine::ForCurrentProcess()->GetProgram().value()); | 203 base::CommandLine::ForCurrentProcess()->GetProgram().value()); |
204 message_writer->AppendUint32(0); // should be toplevel_xid | 204 message_writer->AppendUint32(0); // should be toplevel_xid |
205 message_writer->AppendString(reason_); | 205 message_writer->AppendString(description_); |
206 { | 206 { |
207 uint32 flags = 0; | 207 uint32 flags = 0; |
208 switch (type_) { | 208 switch (type_) { |
209 case kPowerSaveBlockPreventDisplaySleep: | 209 case kPowerSaveBlockPreventDisplaySleep: |
210 flags |= INHIBIT_MARK_SESSION_IDLE; | 210 flags |= INHIBIT_MARK_SESSION_IDLE; |
211 flags |= INHIBIT_SUSPEND_SESSION; | 211 flags |= INHIBIT_SUSPEND_SESSION; |
212 break; | 212 break; |
213 case kPowerSaveBlockPreventAppSuspension: | 213 case kPowerSaveBlockPreventAppSuspension: |
214 flags |= INHIBIT_SUSPEND_SESSION; | 214 flags |= INHIBIT_SUSPEND_SESSION; |
215 break; | 215 break; |
216 } | 216 } |
217 message_writer->AppendUint32(flags); | 217 message_writer->AppendUint32(flags); |
218 } | 218 } |
219 break; | 219 break; |
220 case FREEDESKTOP_API: | 220 case FREEDESKTOP_API: |
221 object_proxy = bus_->GetObjectProxy( | 221 object_proxy = bus_->GetObjectProxy( |
222 kFreeDesktopAPIServiceName, | 222 kFreeDesktopAPIServiceName, |
223 dbus::ObjectPath(kFreeDesktopAPIObjectPath)); | 223 dbus::ObjectPath(kFreeDesktopAPIObjectPath)); |
224 method_call.reset( | 224 method_call.reset( |
225 new dbus::MethodCall(kFreeDesktopAPIInterfaceName, "Inhibit")); | 225 new dbus::MethodCall(kFreeDesktopAPIInterfaceName, "Inhibit")); |
226 message_writer.reset(new dbus::MessageWriter(method_call.get())); | 226 message_writer.reset(new dbus::MessageWriter(method_call.get())); |
227 // The arguments of the method are: | 227 // The arguments of the method are: |
228 // app_id: The application identifier | 228 // app_id: The application identifier |
229 // reason: The reason for the inhibit | 229 // reason: The reason for the inhibit |
230 message_writer->AppendString( | 230 message_writer->AppendString( |
231 base::CommandLine::ForCurrentProcess()->GetProgram().value()); | 231 base::CommandLine::ForCurrentProcess()->GetProgram().value()); |
232 message_writer->AppendString(reason_); | 232 message_writer->AppendString(description_); |
233 break; | 233 break; |
234 } | 234 } |
235 | 235 |
236 // We could do this method call asynchronously, but if we did, we'd need to | 236 // We could do this method call asynchronously, but if we did, we'd need to |
237 // handle the case where we want to cancel the block before we get a reply. | 237 // handle the case where we want to cancel the block before we get a reply. |
238 // We're on the FILE thread so it should be OK to block briefly here. | 238 // We're on the FILE thread so it should be OK to block briefly here. |
239 scoped_ptr<dbus::Response> response(object_proxy->CallMethodAndBlock( | 239 scoped_ptr<dbus::Response> response(object_proxy->CallMethodAndBlock( |
240 method_call.get(), dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 240 method_call.get(), dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
241 if (response) { | 241 if (response) { |
242 // The method returns an inhibit_cookie, used to uniquely identify | 242 // The method returns an inhibit_cookie, used to uniquely identify |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 return FREEDESKTOP_API; | 318 return FREEDESKTOP_API; |
319 break; | 319 break; |
320 case base::nix::DESKTOP_ENVIRONMENT_KDE3: | 320 case base::nix::DESKTOP_ENVIRONMENT_KDE3: |
321 case base::nix::DESKTOP_ENVIRONMENT_OTHER: | 321 case base::nix::DESKTOP_ENVIRONMENT_OTHER: |
322 // Not supported. | 322 // Not supported. |
323 break; | 323 break; |
324 } | 324 } |
325 return NO_API; | 325 return NO_API; |
326 } | 326 } |
327 | 327 |
328 PowerSaveBlockerImpl::PowerSaveBlockerImpl( | 328 PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type, |
329 PowerSaveBlockerType type, const std::string& reason) | 329 Reason reason, |
330 : delegate_(new Delegate(type, reason)) { | 330 const std::string& description) |
| 331 : delegate_(new Delegate(type, description)) { |
331 delegate_->Init(); | 332 delegate_->Init(); |
332 } | 333 } |
333 | 334 |
334 PowerSaveBlockerImpl::~PowerSaveBlockerImpl() { | 335 PowerSaveBlockerImpl::~PowerSaveBlockerImpl() { |
335 delegate_->CleanUp(); | 336 delegate_->CleanUp(); |
336 } | 337 } |
337 | 338 |
338 } // namespace content | 339 } // namespace content |
OLD | NEW |