From a396e6af3cd16530202f6cbecbd45c7a3f6ac893 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Thu, 24 Apr 2014 22:34:42 -0500 Subject: hw alarms --- src/main.cpp | 110 ++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 83 insertions(+), 27 deletions(-) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index 238bd02..e35c5da 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,7 +18,7 @@ */ #include -#include +#include #include #include #include @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include // bindtextdomain() #include @@ -42,6 +44,79 @@ using namespace unity::indicator::datetime; +namespace +{ + std::shared_ptr create_engine() + { + std::shared_ptr engine; + + // we don't show appointments in the greeter, + // so no need to connect to EDS there... + if (!g_strcmp0("lightdm", g_get_user_name())) + engine.reset(new MockEngine); + else + engine.reset(new EdsEngine); + + return engine; + } + + std::shared_ptr create_wakeup_timer(const std::shared_ptr& clock) + { + std::shared_ptr wakeup_timer; + + if (UhaWakeupTimer::is_supported()) // prefer to use the platform API + wakeup_timer = std::make_shared(clock); + else + wakeup_timer = std::make_shared(clock); + + return wakeup_timer; + } + + std::shared_ptr create_state(const std::shared_ptr& engine, + const std::shared_ptr& tz) + { + // create the live objects + auto live_settings = std::make_shared(); + auto live_timezones = std::make_shared(live_settings, TIMEZONE_FILE); + auto live_clock = std::make_shared(live_timezones); + + // create a full-month planner currently pointing to the current month + const auto now = live_clock->localtime(); + auto range_planner = std::make_shared(engine, tz); + auto calendar_month = std::make_shared(range_planner, now); + + // create an upcoming-events planner currently pointing to the current date + range_planner = std::make_shared(engine, tz); + auto calendar_upcoming = std::make_shared(range_planner, now); + + // create the state + auto state = std::make_shared(); + state->settings = live_settings; + state->clock = live_clock; + state->locations = std::make_shared(live_settings, live_timezones); + state->calendar_month = calendar_month; + state->calendar_upcoming = calendar_upcoming; + return state; + } + + std::shared_ptr create_simple_alarm_queue(const std::shared_ptr& clock, + const std::shared_ptr& engine, + const std::shared_ptr& tz) + { + // create an upcoming-events planner that =always= tracks the clock's date + auto range_planner = std::make_shared(engine, tz); + auto upcoming_planner = std::make_shared(range_planner, clock->localtime()); + clock->date_changed.connect([clock,upcoming_planner](){ + const auto now = clock->localtime(); + g_debug("refretching appointments due to date change: %s", now.format("%F %T").c_str()); + upcoming_planner->date().set(now); + }); + + auto wakeup_timer = create_wakeup_timer(clock); + return std::make_shared(clock, upcoming_planner, wakeup_timer); + } +} + int main(int /*argc*/, char** /*argv*/) { @@ -54,35 +129,16 @@ main(int /*argc*/, char** /*argv*/) bindtextdomain(GETTEXT_PACKAGE, GNOMELOCALEDIR); textdomain(GETTEXT_PACKAGE); - // we don't show appointments in the greeter, - // so no need to connect to EDS there... - std::shared_ptr engine; - if (!g_strcmp0("lightdm", g_get_user_name())) - engine.reset(new MockEngine); - else - engine.reset(new EdsEngine); - - // build the state, actions, and menufactory - std::shared_ptr state(new State); - std::shared_ptr live_settings(new LiveSettings); - std::shared_ptr live_timezones(new LiveTimezones(live_settings, TIMEZONE_FILE)); - std::shared_ptr live_clock(new LiveClock(live_timezones)); - std::shared_ptr file_timezone(new FileTimezone(TIMEZONE_FILE)); - const auto now = live_clock->localtime(); - state->settings = live_settings; - state->clock = live_clock; - state->locations.reset(new SettingsLocations(live_settings, live_timezones)); - auto calendar_month = new MonthPlanner(std::shared_ptr(new SimpleRangePlanner(engine, file_timezone)), now); - state->calendar_month.reset(calendar_month); - state->calendar_upcoming.reset(new UpcomingPlanner(std::shared_ptr(new SimpleRangePlanner(engine, file_timezone)), now)); - std::shared_ptr actions(new LiveActions(state)); + auto engine = create_engine(); + auto timezone = std::make_shared(TIMEZONE_FILE); + auto state = create_state(engine, timezone); + auto actions = std::make_shared(state); MenuFactory factory(actions, state); - // snap decisions - std::shared_ptr upcoming_planner(new UpcomingPlanner(std::shared_ptr(new SimpleRangePlanner(engine, file_timezone)), now)); - AlarmQueueImpl alarm_queue(live_clock, upcoming_planner); + // set up the snap decisions Snap snap; - alarm_queue.alarm_reached().connect([&snap](const Appointment& appt){ + auto alarm_queue = create_simple_alarm_queue(state->clock, engine, timezone); + alarm_queue->alarm_reached().connect([&snap](const Appointment& appt){ auto snap_show = [](const Appointment& a){ const char* url; if(!a.url.empty()) -- cgit v1.2.3