aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/clock-live.cpp31
-rw-r--r--src/clock.cpp82
-rw-r--r--src/main.cpp14
-rw-r--r--src/planner-range.cpp7
-rw-r--r--src/snap.cpp11
5 files changed, 94 insertions, 51 deletions
diff --git a/src/clock-live.cpp b/src/clock-live.cpp
index 21a18a3..68a8a8b 100644
--- a/src/clock-live.cpp
+++ b/src/clock-live.cpp
@@ -18,7 +18,7 @@
*/
#include <datetime/clock.h>
-#include <datetime/timezones.h>
+#include <datetime/timezone.h>
namespace unity {
namespace indicator {
@@ -59,14 +59,15 @@ class LiveClock::Impl
{
public:
- Impl(LiveClock& owner, const std::shared_ptr<const Timezones>& tzd):
+ Impl(LiveClock& owner, const std::shared_ptr<const Timezone>& timezone_):
m_owner(owner),
- m_timezones(tzd)
+ m_timezone(timezone_)
{
- if (m_timezones)
+ if (m_timezone)
{
- m_timezones->timezone.changed().connect([this](const std::string& z) {setTimezone(z);});
- setTimezone(m_timezones->timezone.get());
+ auto setter = [this](const std::string& z){setTimezone(z);};
+ m_timezone->timezone.changed().connect(setter);
+ setter(m_timezone->timezone.get());
}
restart_minute_timer();
@@ -76,14 +77,14 @@ public:
{
clearTimer(m_timer);
- g_clear_pointer(&m_timezone, g_time_zone_unref);
+ g_clear_pointer(&m_gtimezone, g_time_zone_unref);
}
DateTime localtime() const
{
- g_assert(m_timezone != nullptr);
+ g_assert(m_gtimezone != nullptr);
- auto gdt = g_date_time_new_now(m_timezone);
+ auto gdt = g_date_time_new_now(m_gtimezone);
DateTime ret(gdt);
g_date_time_unref(gdt);
return ret;
@@ -93,8 +94,8 @@ private:
void setTimezone(const std::string& str)
{
- g_clear_pointer(&m_timezone, g_time_zone_unref);
- m_timezone = g_time_zone_new(str.c_str());
+ g_clear_pointer(&m_gtimezone, g_time_zone_unref);
+ m_gtimezone = g_time_zone_new(str.c_str());
m_owner.minute_changed();
}
@@ -134,15 +135,15 @@ private:
protected:
LiveClock& m_owner;
- GTimeZone* m_timezone = nullptr;
- std::shared_ptr<const Timezones> m_timezones;
+ GTimeZone* m_gtimezone = nullptr;
+ std::shared_ptr<const Timezone> m_timezone;
DateTime m_prev_datetime;
unsigned int m_timer = 0;
};
-LiveClock::LiveClock(const std::shared_ptr<const Timezones>& tzd):
- p(new Impl(*this, tzd))
+LiveClock::LiveClock(const std::shared_ptr<const Timezone>& timezone_):
+ p(new Impl(*this, timezone_))
{
}
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;
};
diff --git a/src/main.cpp b/src/main.cpp
index 54517c9..aa8f829 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -63,20 +63,20 @@ namespace
}
std::shared_ptr<State> create_state(const std::shared_ptr<Engine>& engine,
- const std::shared_ptr<Timezone>& tz)
+ const std::shared_ptr<Timezone>& timezone_)
{
// create the live objects
auto live_settings = std::make_shared<LiveSettings>();
auto live_timezones = std::make_shared<LiveTimezones>(live_settings, TIMEZONE_FILE);
- auto live_clock = std::make_shared<LiveClock>(live_timezones);
+ auto live_clock = std::make_shared<LiveClock>(timezone_);
// create a full-month planner currently pointing to the current month
const auto now = live_clock->localtime();
- auto range_planner = std::make_shared<SimpleRangePlanner>(engine, tz);
+ auto range_planner = std::make_shared<SimpleRangePlanner>(engine, timezone_);
auto calendar_month = std::make_shared<MonthPlanner>(range_planner, now);
// create an upcoming-events planner currently pointing to the current date
- range_planner = std::make_shared<SimpleRangePlanner>(engine, tz);
+ range_planner = std::make_shared<SimpleRangePlanner>(engine, timezone_);
auto calendar_upcoming = std::make_shared<UpcomingPlanner>(range_planner, now);
// create the state
@@ -127,8 +127,8 @@ main(int /*argc*/, char** /*argv*/)
textdomain(GETTEXT_PACKAGE);
auto engine = create_engine();
- auto timezone = std::make_shared<FileTimezone>(TIMEZONE_FILE);
- auto state = create_state(engine, timezone);
+ auto timezone_ = std::make_shared<FileTimezone>(TIMEZONE_FILE);
+ auto state = create_state(engine, timezone_);
auto actions = std::make_shared<LiveActions>(state);
MenuFactory factory(actions, state);
@@ -136,7 +136,7 @@ main(int /*argc*/, char** /*argv*/)
auto snooze_planner = std::make_shared<SnoozePlanner>(state->settings, state->clock);
auto notification_engine = std::make_shared<uin::Engine>("indicator-datetime-service");
std::unique_ptr<Snap> snap (new Snap(notification_engine, state->settings));
- auto alarm_queue = create_simple_alarm_queue(state->clock, snooze_planner, engine, timezone);
+ auto alarm_queue = create_simple_alarm_queue(state->clock, snooze_planner, engine, timezone_);
auto on_snooze = [snooze_planner](const Appointment& a) {snooze_planner->add(a);};
auto on_ok = [](const Appointment&){};
auto on_alarm_reached = [&snap, &on_snooze, &on_ok](const Appointment& a) {(*snap)(a, on_snooze, on_ok);};
diff --git a/src/planner-range.cpp b/src/planner-range.cpp
index 41b0f56..c223665 100644
--- a/src/planner-range.cpp
+++ b/src/planner-range.cpp
@@ -28,7 +28,7 @@ namespace datetime {
***/
SimpleRangePlanner::SimpleRangePlanner(const std::shared_ptr<Engine>& engine,
- const std::shared_ptr<Timezone>& timezone):
+ const std::shared_ptr<Timezone>& timezone):
m_engine(engine),
m_timezone(timezone),
m_range(std::pair<DateTime,DateTime>(DateTime::NowLocal(), DateTime::NowLocal()))
@@ -38,6 +38,11 @@ SimpleRangePlanner::SimpleRangePlanner(const std::shared_ptr<Engine>& engine,
rebuild_soon();
});
+ m_timezone->timezone.changed().connect([this](const std::string& s){
+ g_debug("RangePlanner %p rebuilding soon because the timezone changed to '%s'", this, s.c_str());
+ rebuild_soon();
+ });
+
range().changed().connect([this](const std::pair<DateTime,DateTime>&){
g_debug("rebuilding because the date range changed");
rebuild_soon();
diff --git a/src/snap.cpp b/src/snap.cpp
index b3368a1..c2cbc0a 100644
--- a/src/snap.cpp
+++ b/src/snap.cpp
@@ -94,7 +94,16 @@ public:
b.add_hint (uin::Builder::HINT_TINT);
b.add_hint (uin::Builder::HINT_NONSHAPEDICON);
- const auto timefmt = is_locale_12h() ? _("%a, %l:%M %p") : _("%a, %H:%M");
+ const char * timefmt;
+ if (is_locale_12h()) {
+ /** strftime(3) format for abbreviated weekday,
+ hours, minutes in a 12h locale; e.g. Wed, 2:00 PM */
+ timefmt = _("%a, %l:%M %p");
+ } else {
+ /** A strftime(3) format for abbreviated weekday,
+ hours, minutes in a 24h locale; e.g. Wed, 14:00 */
+ timefmt = _("%a, %H:%M");
+ }
const auto timestr = appointment.begin.format(timefmt);
auto title = g_strdup_printf(_("Alarm %s"), timestr.c_str());
b.set_title (title);