aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/datetime/timezone-timedated.h4
-rw-r--r--src/main.cpp14
-rw-r--r--src/timezone-timedated.cpp71
3 files changed, 42 insertions, 47 deletions
diff --git a/include/datetime/timezone-timedated.h b/include/datetime/timezone-timedated.h
index 0857706..e0af184 100644
--- a/include/datetime/timezone-timedated.h
+++ b/include/datetime/timezone-timedated.h
@@ -22,6 +22,8 @@
#include <datetime/timezone.h> // base class
+#include <gio/gio.h> // GDBusConnection*
+
#include <string> // std::string
namespace ayatana {
@@ -34,7 +36,7 @@ namespace datetime {
class TimedatedTimezone: public Timezone
{
public:
- TimedatedTimezone();
+ TimedatedTimezone(GDBusConnection* connection);
~TimedatedTimezone();
private:
diff --git a/src/main.cpp b/src/main.cpp
index 0da55a2..bb77c0e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -71,7 +71,7 @@ namespace
{
// create the live objects
auto live_settings = std::make_shared<LiveSettings>();
- auto live_timezones = std::make_shared<LiveTimezones>(live_settings);
+ auto live_timezones = std::make_shared<LiveTimezones>(live_settings, timezone_);
auto live_clock = std::make_shared<LiveClock>(timezone_);
// create a full-month planner currently pointing to the current month
@@ -132,8 +132,17 @@ main(int /*argc*/, char** /*argv*/)
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
textdomain(GETTEXT_PACKAGE);
+ // get the system bus
+ GError* error {};
+ auto system_bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, &error);
+ if (error != nullptr) {
+ g_critical("Unable to get system bus: %s", error->message);
+ g_clear_error(&error);
+ return 0;
+ }
+
auto engine = create_engine();
- auto timezone_ = std::make_shared<TimedatedTimezone>();
+ auto timezone_ = std::make_shared<TimedatedTimezone>(system_bus);
auto state = create_state(engine, timezone_);
auto actions = std::make_shared<LiveActions>(state);
MenuFactory factory(actions, state);
@@ -171,5 +180,6 @@ main(int /*argc*/, char** /*argv*/)
g_main_loop_run(loop);
g_main_loop_unref(loop);
+ g_clear_object(&system_bus);
return 0;
}
diff --git a/src/timezone-timedated.cpp b/src/timezone-timedated.cpp
index e123531..1b6497e 100644
--- a/src/timezone-timedated.cpp
+++ b/src/timezone-timedated.cpp
@@ -37,22 +37,36 @@ class TimedatedTimezone::Impl
{
public:
- Impl(TimedatedTimezone& owner):
+ Impl(TimedatedTimezone& owner, GDBusConnection* connection):
m_owner{owner},
+ m_connection{G_DBUS_CONNECTION(g_object_ref(G_OBJECT(connection)))},
m_cancellable{g_cancellable_new()}
{
// set the fallback value
m_owner.timezone.set("Etc/Utc");
// watch for timedate1 on the bus
- m_watcher_id = g_bus_watch_name(
- G_BUS_TYPE_SYSTEM,
+ m_watcher_id = g_bus_watch_name_on_connection(
+ m_connection,
Bus::Timedate1::BUSNAME,
G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
on_timedate1_appeared,
on_timedate1_vanished,
this,
nullptr);
+
+ // listen for changed properties
+ m_signal_subscription_id = g_dbus_connection_signal_subscribe(
+ m_connection,
+ Bus::Timedate1::IFACE,
+ Bus::Properties::IFACE,
+ Bus::Properties::Signals::PROPERTIES_CHANGED,
+ Bus::Timedate1::ADDR,
+ nullptr,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ on_properties_changed,
+ this,
+ nullptr);
}
~Impl()
@@ -62,57 +76,28 @@ public:
g_bus_unwatch_name(m_watcher_id);
- if (m_connection != nullptr)
- {
- if (m_signal_subscription_id)
- g_dbus_connection_signal_unsubscribe(m_connection, m_signal_subscription_id);
+ g_dbus_connection_signal_unsubscribe(m_connection, m_signal_subscription_id);
- g_clear_object(&m_connection);
- }
+ g_clear_object(&m_connection);
}
private:
- static void on_timedate1_appeared(GDBusConnection * connection,
- const gchar * /*name*/,
+ static void on_timedate1_appeared(GDBusConnection * /*connection*/,
+ const gchar * name,
const gchar * /*name_owner*/,
gpointer gself)
{
- static_cast<Impl*>(gself)->timedate1_appeared(connection);
- }
- void timedate1_appeared(GDBusConnection* connection)
- {
- // cache m_connection for later...
- g_clear_object(&m_connection);
- m_connection = G_DBUS_CONNECTION(g_object_ref(G_OBJECT(connection)));
+ g_debug("%s appeared on bus", name);
- ensure_propchange_subscription();
- ask_for_timezone();
- }
-
- void ensure_propchange_subscription()
- {
- if (m_signal_subscription_id == 0)
- {
- m_signal_subscription_id = g_dbus_connection_signal_subscribe(
- m_connection,
- Bus::Timedate1::IFACE,
- Bus::Properties::IFACE,
- Bus::Properties::Signals::PROPERTIES_CHANGED,
- Bus::Timedate1::ADDR,
- nullptr,
- G_DBUS_SIGNAL_FLAGS_NONE,
- on_properties_changed,
- this,
- nullptr);
- }
+ static_cast<Impl*>(gself)->ask_for_timezone();
}
static void on_timedate1_vanished(GDBusConnection * /*connection*/,
const gchar * name,
gpointer /*gself*/)
{
- g_debug("%s not present on system bus", name);
+ g_debug("%s not present on bus", name);
}
static void on_properties_changed(GDBusConnection * /*connection*/,
@@ -148,8 +133,6 @@ private:
void ask_for_timezone()
{
- g_return_if_fail(m_connection != nullptr);
-
g_dbus_connection_call(
m_connection,
Bus::Timedate1::BUSNAME,
@@ -205,8 +188,8 @@ private:
***/
TimedatedTimezone& m_owner;
- GCancellable* m_cancellable {};
GDBusConnection* m_connection {};
+ GCancellable* m_cancellable {};
unsigned long m_signal_subscription_id {};
unsigned int m_watcher_id {};
};
@@ -215,8 +198,8 @@ private:
****
***/
-TimedatedTimezone::TimedatedTimezone():
- impl{new Impl{*this}}
+TimedatedTimezone::TimedatedTimezone(GDBusConnection* connection):
+ impl{new Impl{*this, connection}}
{
}