21 #include <core/dbus/macros.h>
22 #include <core/dbus/object.h>
28 namespace com {
namespace canonical {
33 static const std::string&
name()
35 static std::string s =
"com.canonical.Unity.Screen";
39 static const core::dbus::types::ObjectPath&
path()
41 static core::dbus::types::ObjectPath p{
"/com/canonical/Unity/Screen"};
45 DBUS_CPP_METHOD_DEF(keepDisplayOn,
Screen)
46 DBUS_CPP_METHOD_DEF(removeDisplayOnRequest,
Screen)
54 static std::string s =
"com.canonical.powerd";
58 static const core::dbus::types::ObjectPath&
path()
60 static core::dbus::types::ObjectPath p{
"/com/canonical/powerd"};
65 DBUS_CPP_METHOD_DEF(clearSysState,
com::canonical::powerd::
Interface)
73 struct DisplayStateLock :
public media::power::StateController::Lock<media::power::DisplayState>,
74 public std::enable_shared_from_this<DisplayStateLock>
77 typedef std::shared_ptr<DisplayStateLock> Ptr;
80 static boost::posix_time::seconds timeout_for_release()
82 return boost::posix_time::seconds{4};
86 static constexpr
const std::int32_t the_invalid_cookie{-1};
88 DisplayStateLock(
const media::power::StateController::Ptr& parent,
89 boost::asio::io_service& io_service,
90 const core::dbus::Object::Ptr&
object)
94 cookie{the_invalid_cookie}
101 if (state == media::power::DisplayState::off)
104 std::weak_ptr<DisplayStateLock> wp{shared_from_this()};
106 object->invoke_method_asynchronously_with_callback<com::canonical::Unity::Screen::keepDisplayOn, std::int32_t>(
107 [wp, state](
const core::dbus::Result<std::int32_t>& result)
109 if (result.is_error())
111 std::cerr << result.error().print() << std::endl;
115 if (
auto sp = wp.lock())
117 sp->cookie = result.value();
118 sp->signals.acquired(state);
125 if (state == media::power::DisplayState::off)
128 if (cookie == the_invalid_cookie)
133 auto sp = shared_from_this();
135 auto current_cookie(cookie);
137 timeout.expires_from_now(timeout_for_release());
138 timeout.async_wait([sp, state, current_cookie](
const boost::system::error_code& ec)
142 if (ec == boost::asio::error::operation_aborted)
145 sp->object->invoke_method_asynchronously_with_callback<com::canonical::Unity::Screen::removeDisplayOnRequest,
void>(
146 [sp, state, current_cookie](
const core::dbus::Result<void>& result)
148 if (result.is_error())
150 std::cerr << result.error().print() << std::endl;
154 sp->signals.released(state);
159 if (sp->cookie == current_cookie)
160 sp->cookie = the_invalid_cookie;
167 const core::Signal<media::power::DisplayState>& acquired()
const override
169 return signals.acquired;
173 const core::Signal<media::power::DisplayState>& released()
const override
175 return signals.released;
178 media::power::StateController::Ptr parent;
179 boost::asio::deadline_timer timeout;
180 core::dbus::Object::Ptr object;
185 core::Signal<media::power::DisplayState> acquired;
186 core::Signal<media::power::DisplayState> released;
190 struct SystemStateLock :
public media::power::StateController::Lock<media::power::SystemState>,
191 public std::enable_shared_from_this<SystemStateLock>
193 static constexpr
const char* wake_lock_name
195 "media-hub-playback_lock"
198 SystemStateLock(
const media::power::StateController::Ptr& parent,
const core::dbus::Object::Ptr&
object)
208 if (state == media::power::SystemState::suspend)
214 std::lock_guard<std::mutex> lg{system_state_cookie_store_guard};
215 if (system_state_cookie_store.count(state) > 0)
219 std::weak_ptr<SystemStateLock> wp{shared_from_this()};
221 object->invoke_method_asynchronously_with_callback<com::canonical::powerd::Interface::requestSysState, std::string>([wp, state](
const core::dbus::Result<std::string>& result)
223 if (result.is_error())
226 if (
auto sp = wp.lock())
228 std::lock_guard<std::mutex> lg{sp->system_state_cookie_store_guard};
230 sp->system_state_cookie_store[state] = result.value();
231 sp->signals.acquired(state);
233 }, std::string{wake_lock_name},
static_cast<std::int32_t
>(state));
240 if (state == media::power::SystemState::suspend)
243 std::lock_guard<std::mutex> lg{system_state_cookie_store_guard};
245 if (system_state_cookie_store.count(state) == 0)
248 std::weak_ptr<SystemStateLock> wp{shared_from_this()};
250 object->invoke_method_asynchronously_with_callback<com::canonical::powerd::Interface::clearSysState,
void>([wp, state](
const core::dbus::Result<void>& result)
252 if (result.is_error())
253 std::cerr << result.error().print() << std::endl;
255 if (
auto sp = wp.lock())
257 std::lock_guard<std::mutex> lg{sp->system_state_cookie_store_guard};
259 sp->system_state_cookie_store.erase(state);
260 sp->signals.released(state);
262 }, system_state_cookie_store.at(state));
266 const core::Signal<media::power::SystemState>& acquired()
const override
268 return signals.acquired;
272 const core::Signal<media::power::SystemState>& released()
const override
274 return signals.released;
278 std::mutex system_state_cookie_store_guard;
282 std::map<media::power::SystemState, std::string> system_state_cookie_store;
283 media::power::StateController::Ptr parent;
284 core::dbus::Object::Ptr object;
287 core::Signal<media::power::SystemState> acquired;
288 core::Signal<media::power::SystemState> released;
292 struct StateController :
public media::power::StateController,
293 public std::enable_shared_from_this<impl::StateController>
295 StateController(media::helper::ExternalServices& es)
296 : external_services{es},
299 core::dbus::Service::use_service<com::canonical::powerd::Interface>(external_services.system)
304 core::dbus::Service::use_service<com::canonical::Unity::Screen>(external_services.system)
310 media::power::StateController::Lock<media::power::SystemState>::Ptr system_state_lock()
override
312 return std::make_shared<impl::SystemStateLock>(shared_from_this(), powerd);
315 media::power::StateController::Lock<media::power::DisplayState>::Ptr display_state_lock()
override
317 return std::make_shared<impl::DisplayStateLock>(shared_from_this(), external_services.io_service, unity_screen);
320 media::helper::ExternalServices& external_services;
321 core::dbus::Object::Ptr powerd;
322 core::dbus::Object::Ptr unity_screen;
329 return std::make_shared<impl::StateController>(external_services);
337 case media::power::DisplayState::off:
338 return out <<
"DisplayState::off";
339 case media::power::DisplayState::on:
340 return out <<
"DisplayState::on";
351 case media::power::SystemState::active:
352 return out <<
"SystemState::active";
353 case media::power::SystemState::blank_on_proximity:
354 return out <<
"SystemState::blank_on_proximity";
355 case media::power::SystemState::suspend:
356 return out <<
"SystemState::suspend";
static const std::string & name()
static const core::dbus::types::ObjectPath & path()
static const core::dbus::types::ObjectPath & path()
static std::string & name()