aboutsummaryrefslogtreecommitdiff
path: root/src/clock.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/clock.cpp')
-rw-r--r--src/clock.cpp82
1 files changed, 55 insertions, 27 deletions
diff --git a/src/clock.cpp b/src/clock.cpp
index 6831732..a04e074 100644
--- a/src/clock.cpp
+++ b/src/clock.cpp
@@ -41,34 +41,61 @@ class Clock::Impl
public:
Impl(Clock& owner):
- m_owner(owner)
+ m_owner(owner),
+ m_cancellable(g_cancellable_new())
{
- auto tag = g_bus_watch_name(G_BUS_TYPE_SYSTEM,
- "org.freedesktop.login1",
- G_BUS_NAME_WATCHER_FLAGS_NONE,
- on_login1_appeared,
- on_login1_vanished,
- this, nullptr);
- m_watched_names.insert(tag);
-
- tag = g_bus_watch_name(G_BUS_TYPE_SYSTEM,
- BUS_POWERD_NAME,
- G_BUS_NAME_WATCHER_FLAGS_NONE,
- on_powerd_appeared,
- on_powerd_vanished,
- this, nullptr);
- m_watched_names.insert(tag);
+ g_bus_get(G_BUS_TYPE_SYSTEM, m_cancellable, on_bus_ready, this);
}
-
~Impl()
{
+ g_cancellable_cancel(m_cancellable);
+ g_object_unref(m_cancellable);
+
for(const auto& tag : m_watched_names)
g_bus_unwatch_name(tag);
}
private:
+ static void on_bus_ready(GObject * /*source_object*/,
+ GAsyncResult * res,
+ gpointer gself)
+ {
+ GError * error = NULL;
+ GDBusConnection * bus;
+
+ if ((bus = g_bus_get_finish(res, &error)))
+ {
+ auto self = static_cast<Impl*>(gself);
+
+ auto tag = g_bus_watch_name_on_connection(bus,
+ "org.freedesktop.login1",
+ G_BUS_NAME_WATCHER_FLAGS_NONE,
+ on_login1_appeared,
+ on_login1_vanished,
+ gself, nullptr);
+ self->m_watched_names.insert(tag);
+
+ tag = g_bus_watch_name_on_connection(bus,
+ BUS_POWERD_NAME,
+ G_BUS_NAME_WATCHER_FLAGS_NONE,
+ on_powerd_appeared,
+ on_powerd_vanished,
+ gself, nullptr);
+ self->m_watched_names.insert(tag);
+
+ g_object_unref(bus);
+ }
+ else if (error != nullptr)
+ {
+ if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning("%s Couldn't get system bus: %s", G_STRLOC, error->message);
+
+ g_error_free(error);
+ }
+ }
+
void remember_subscription(const std::string & name,
GDBusConnection * bus,
guint tag)
@@ -142,11 +169,11 @@ private:
auto tag = g_dbus_connection_signal_subscribe(bus,
name_owner,
BUS_POWERD_INTERFACE,
- "Wakeup", // signal name
+ "SysPowerStateChange",
BUS_POWERD_PATH,
nullptr, // arg0
G_DBUS_SIGNAL_FLAGS_NONE,
- on_wakeup,
+ on_sys_power_state_change,
gself, // user_data
nullptr); // user_data closure
@@ -161,15 +188,15 @@ private:
static_cast<Impl*>(gself)->m_subscriptions[name].clear();
}
- static void on_wakeup(GDBusConnection* /*connection*/,
- const gchar* /*sender_name*/,
- const gchar* /*object_path*/,
- const gchar* /*interface_name*/,
- const gchar* /*signal_name*/,
- GVariant* /*parameters*/,
- gpointer gself)
+ static void on_sys_power_state_change(GDBusConnection* /*connection*/,
+ const gchar* /*sender_name*/,
+ const gchar* /*object_path*/,
+ const gchar* /*interface_name*/,
+ const gchar* /*signal_name*/,
+ GVariant* /*parameters*/,
+ gpointer gself)
{
- g_debug("firing clock.minute_changed() due to powerd.Wakeup");
+ g_debug("firing clock.minute_changed() due to state change");
static_cast<Impl*>(gself)->m_owner.minute_changed();
}
@@ -178,6 +205,7 @@ private:
***/
Clock& m_owner;
+ GCancellable * m_cancellable = nullptr;
std::set<guint> m_watched_names;
std::map<std::string,std::vector<std::shared_ptr<GDBusConnection>>> m_subscriptions;
};