diff options
-rw-r--r-- | include/datetime/dbus-shared.h | 5 | ||||
-rw-r--r-- | src/clock.cpp | 79 |
2 files changed, 72 insertions, 12 deletions
diff --git a/include/datetime/dbus-shared.h b/include/datetime/dbus-shared.h index db10c1d..c09caa2 100644 --- a/include/datetime/dbus-shared.h +++ b/include/datetime/dbus-shared.h @@ -24,4 +24,9 @@ #define BUS_DATETIME_NAME "com.canonical.indicator.datetime" #define BUS_DATETIME_PATH "/com/canonical/indicator/datetime" +#define BUS_POWERD_NAME "com.canonical.powerd" +#define BUS_POWERD_PATH "/com/canonical/powerd" +#define BUS_POWERD_INTERFACE "com.canonical.powerd" + + #endif /* _INDICATOR_DATETIME_DBUS_SHARED_H_ */ diff --git a/src/clock.cpp b/src/clock.cpp index 748174b..6831732 100644 --- a/src/clock.cpp +++ b/src/clock.cpp @@ -18,6 +18,7 @@ */ #include <datetime/clock.h> +#include <datetime/dbus-shared.h> #include <glib.h> #include <gio/gio.h> @@ -49,6 +50,14 @@ public: 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); } @@ -60,19 +69,18 @@ public: private: - void remember_subscription(const std::string& name, - GDBusConnection* bus, - guint tag) + void remember_subscription(const std::string & name, + GDBusConnection * bus, + guint tag) { - auto subscription = std::shared_ptr<GDBusConnection>( - G_DBUS_CONNECTION(g_object_ref(bus)), - [tag](GDBusConnection* bus){ - g_dbus_connection_signal_unsubscribe(bus, tag); - g_object_unref(G_OBJECT(bus)); - } - ); - - m_subscriptions[name].push_back(subscription); + g_object_ref(bus); + + auto deleter = [tag](GDBusConnection* bus){ + g_dbus_connection_signal_unsubscribe(bus, tag); + g_object_unref(G_OBJECT(bus)); + }; + + m_subscriptions[name].push_back(std::shared_ptr<GDBusConnection>(bus, deleter)); } /** @@ -115,6 +123,53 @@ private: GVariant* /*parameters*/, gpointer gself) { + g_debug("firing clock.minute_changed() due to PrepareForSleep"); + static_cast<Impl*>(gself)->m_owner.minute_changed(); + } + + /** + *** DBus Chatter: com.canonical.powerd + *** + *** Fire Clock::minute_changed() signal when powerd says the system's + *** has awoken from sleep -- the old timestamp is likely out-of-date + **/ + + static void on_powerd_appeared(GDBusConnection * bus, + const gchar * name, + const gchar * name_owner, + gpointer gself) + { + auto tag = g_dbus_connection_signal_subscribe(bus, + name_owner, + BUS_POWERD_INTERFACE, + "Wakeup", // signal name + BUS_POWERD_PATH, + nullptr, // arg0 + G_DBUS_SIGNAL_FLAGS_NONE, + on_wakeup, + gself, // user_data + nullptr); // user_data closure + + + static_cast<Impl*>(gself)->remember_subscription(name, bus, tag); + } + + static void on_powerd_vanished(GDBusConnection * /*bus*/, + const gchar * name, + gpointer gself) + { + 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) + { + g_debug("firing clock.minute_changed() due to powerd.Wakeup"); static_cast<Impl*>(gself)->m_owner.minute_changed(); } |