aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/actions-live.cpp53
-rw-r--r--src/actions.cpp116
-rw-r--r--src/menu.cpp66
3 files changed, 139 insertions, 96 deletions
diff --git a/src/actions-live.cpp b/src/actions-live.cpp
index 97b12db..068abe7 100644
--- a/src/actions-live.cpp
+++ b/src/actions-live.cpp
@@ -51,6 +51,7 @@ void LiveActions::execute_command(const std::string& cmdstr)
void LiveActions::dispatch_url(const std::string& url)
{
+ g_debug("Dispatching url '%s'", url.c_str());
url_dispatch_send(url.c_str(), nullptr, nullptr);
}
@@ -58,7 +59,7 @@ void LiveActions::dispatch_url(const std::string& url)
****
***/
-void LiveActions::open_desktop_settings()
+void LiveActions::desktop_open_settings_app()
{
auto path = g_find_program_in_path("unity-control-center");
@@ -74,7 +75,7 @@ void LiveActions::open_desktop_settings()
g_free (path);
}
-bool LiveActions::can_open_planner() const
+bool LiveActions::desktop_has_calendar_app() const
{
static bool inited = false;
static bool have_calendar = false;
@@ -98,22 +99,17 @@ bool LiveActions::can_open_planner() const
return have_calendar;
}
-void LiveActions::open_planner()
+void LiveActions::desktop_open_alarm_app()
{
execute_command("evolution -c calendar");
}
-void LiveActions::open_phone_settings()
+void LiveActions::desktop_open_appointment(const Appointment& appt)
{
- dispatch_url("settings:///system/time-date");
-}
-
-void LiveActions::open_phone_clock_app()
-{
- dispatch_url("appid://com.ubuntu.clock/clock/current-user-version");
+ desktop_open_calendar_app(appt.begin);
}
-void LiveActions::open_planner_at(const DateTime& dt)
+void LiveActions::desktop_open_calendar_app(const DateTime& dt)
{
const auto day_begins = dt.add_full(0, 0, 0, -dt.hour(), -dt.minute(), -dt.seconds());
const auto gmt = day_begins.to_timezone("UTC");
@@ -121,17 +117,34 @@ void LiveActions::open_planner_at(const DateTime& dt)
execute_command(cmd.c_str());
}
-void LiveActions::open_appointment(const std::string& uid)
+/***
+****
+***/
+
+void LiveActions::phone_open_alarm_app()
{
- for(const auto& appt : state()->calendar_upcoming->appointments().get())
- {
- if(appt.uid != uid)
- continue;
+ dispatch_url("appid://com.ubuntu.clock/clock/current-user-version");
+}
- if (!appt.url.empty())
- dispatch_url(appt.url);
- break;
- }
+void LiveActions::phone_open_appointment(const Appointment& appt)
+{
+ if (!appt.url.empty())
+ dispatch_url(appt.url);
+ else if (appt.has_alarms)
+ phone_open_alarm_app();
+ else
+ phone_open_calendar_app(DateTime::NowLocal());
+}
+
+void LiveActions::phone_open_calendar_app(const DateTime&)
+{
+ // does calendar app have a mechanism for specifying dates?
+ dispatch_url("appid://com.ubuntu.calendar/calendar/current-user-version");
+}
+
+void LiveActions::phone_open_settings_app()
+{
+ dispatch_url("settings:///system/time-date");
}
/***
diff --git a/src/actions.cpp b/src/actions.cpp
index 87adb96..1b665cc 100644
--- a/src/actions.cpp
+++ b/src/actions.cpp
@@ -34,67 +34,81 @@ namespace datetime {
namespace
{
-void on_desktop_settings_activated(GSimpleAction * /*action*/,
- GVariant * /*param*/,
- gpointer gself)
+DateTime datetime_from_timet_variant(GVariant* v)
{
- static_cast<Actions*>(gself)->open_desktop_settings();
-}
+ int64_t t = 0;
-void on_phone_settings_activated(GSimpleAction * /*action*/,
- GVariant * /*param*/,
- gpointer gself)
-{
- static_cast<Actions*>(gself)->open_phone_settings();
-}
+ if (v != nullptr)
+ if (g_variant_type_equal(G_VARIANT_TYPE_INT64,g_variant_get_type(v)))
+ t = g_variant_get_int64(v);
-void on_phone_clock_activated(GSimpleAction * /*action*/,
- GVariant * /*param*/,
- gpointer gself)
-{
- static_cast<Actions*>(gself)->open_phone_clock_app();
+ if (t != 0)
+ return DateTime(t);
+ else
+ return DateTime::NowLocal();
}
-void on_activate_appointment(GSimpleAction * /*action*/,
- GVariant * param,
- gpointer gself)
+bool lookup_appointment_by_uid_variant(const std::shared_ptr<State>& state, GVariant* vuid, Appointment& setme)
{
- const auto uid = g_variant_get_string(param, nullptr);
- auto self = static_cast<Actions*>(gself);
-
- g_return_if_fail(uid && *uid);
+ g_return_val_if_fail(vuid != nullptr, false);
+ g_return_val_if_fail(g_variant_type_equal(G_VARIANT_TYPE_STRING,g_variant_get_type(vuid)), false);
+ const auto uid = g_variant_get_string(vuid, nullptr);
+ g_return_val_if_fail(uid && *uid, false);
- // find url of the upcoming appointment with this uid
- for (const auto& appt : self->state()->calendar_upcoming->appointments().get())
+ for(const auto& appt : state->calendar_upcoming->appointments().get())
{
if (appt.uid == uid)
{
- const auto url = appt.url;
- g_debug("%s: uid[%s] -> url[%s]", G_STRFUNC, uid, url.c_str());
- self->open_appointment(url);
- break;
+ setme = appt;
+ return true;
}
}
+
+ return false;
}
-void on_activate_planner(GSimpleAction * /*action*/,
- GVariant * param,
- gpointer gself)
+void on_desktop_appointment_activated (GSimpleAction*, GVariant *vuid, gpointer gself)
{
- const auto at = g_variant_get_int64(param);
auto self = static_cast<Actions*>(gself);
+ Appointment appt;
+ if (lookup_appointment_by_uid_variant(self->state(), vuid, appt))
+ self->desktop_open_appointment(appt);
+}
+void on_desktop_alarm_activated (GSimpleAction*, GVariant*, gpointer gself)
+{
+ static_cast<Actions*>(gself)->desktop_open_alarm_app();
+}
+void on_desktop_calendar_activated (GSimpleAction*, GVariant* vt, gpointer gself)
+{
+ const auto dt = datetime_from_timet_variant(vt);
+ static_cast<Actions*>(gself)->desktop_open_calendar_app(dt);
+}
+void on_desktop_settings_activated (GSimpleAction*, GVariant*, gpointer gself)
+{
+ static_cast<Actions*>(gself)->desktop_open_settings_app();
+}
- if (at)
- {
- auto gdt = g_date_time_new_from_unix_local(at);
- self->open_planner_at(DateTime(gdt));
- g_date_time_unref(gdt);
- }
- else // no time specified...
- {
- self->open_planner();
- }
+void on_phone_appointment_activated (GSimpleAction*, GVariant *vuid, gpointer gself)
+{
+ auto self = static_cast<Actions*>(gself);
+ Appointment appt;
+ if (lookup_appointment_by_uid_variant(self->state(), vuid, appt))
+ self->phone_open_appointment(appt);
+}
+void on_phone_alarm_activated (GSimpleAction*, GVariant*, gpointer gself)
+{
+ static_cast<Actions*>(gself)->phone_open_alarm_app();
}
+void on_phone_calendar_activated (GSimpleAction*, GVariant* vt, gpointer gself)
+{
+ const auto dt = datetime_from_timet_variant(vt);
+ static_cast<Actions*>(gself)->phone_open_calendar_app(dt);
+}
+void on_phone_settings_activated (GSimpleAction*, GVariant*, gpointer gself)
+{
+ static_cast<Actions*>(gself)->phone_open_settings_app();
+}
+
void on_set_location(GSimpleAction * /*action*/,
GVariant * param,
@@ -186,11 +200,17 @@ Actions::Actions(const std::shared_ptr<State>& state):
m_actions(g_simple_action_group_new())
{
GActionEntry entries[] = {
- { "activate-desktop-settings", on_desktop_settings_activated },
- { "activate-phone-settings", on_phone_settings_activated },
- { "activate-phone-clock-app", on_phone_clock_activated },
- { "activate-appointment", on_activate_appointment, "s", nullptr },
- { "activate-planner", on_activate_planner, "x", nullptr },
+
+ { "desktop.open-appointment", on_desktop_appointment_activated, "s", nullptr },
+ { "desktop.open-alarm-app", on_desktop_alarm_activated },
+ { "desktop.open-calendar-app", on_desktop_calendar_activated, "x", nullptr },
+ { "desktop.open-settings-app", on_desktop_settings_activated },
+
+ { "phone.open-appointment", on_phone_appointment_activated, "s", nullptr },
+ { "phone.open-alarm-app", on_phone_alarm_activated },
+ { "phone.open-calendar-app", on_phone_calendar_activated, "x", nullptr },
+ { "phone.open-settings-app", on_phone_settings_activated },
+
{ "calendar-active", nullptr, nullptr, "false", on_calendar_active_changed },
{ "set-location", on_set_location, "s" }
};
diff --git a/src/menu.cpp b/src/menu.cpp
index 2bfc4aa..6cd1585 100644
--- a/src/menu.cpp
+++ b/src/menu.cpp
@@ -234,22 +234,28 @@ private:
GMenuModel* create_calendar_section(Profile profile)
{
- const bool allow_activation = (profile == Desktop)
- || (profile == Phone);
const bool show_calendar = m_state->settings->show_calendar.get() &&
((profile == Desktop) || (profile == DesktopGreeter));
auto menu = g_menu_new();
+ const char * action_name;
+
+ if (profile == Phone)
+ action_name = "indicator.phone.open-calendar-app";
+ else if (profile == Desktop)
+ action_name = "indicator.desktop.open-calendar-app";
+ else
+ action_name = nullptr;
+
// add a menuitem that shows the current date
auto label = m_state->clock->localtime().format(_("%A, %e %B %Y"));
auto item = g_menu_item_new (label.c_str(), nullptr);
auto v = get_serialized_calendar_icon();
g_menu_item_set_attribute_value (item, G_MENU_ATTRIBUTE_ICON, v);
- if (allow_activation)
+ if (action_name != nullptr)
{
v = g_variant_new_int64(0);
- const char* action = "indicator.activate-planner";
- g_menu_item_set_action_and_target_value (item, action, v);
+ g_menu_item_set_action_and_target_value (item, action_name, v);
}
g_menu_append_item(menu, item);
g_object_unref(item);
@@ -262,11 +268,8 @@ private:
g_menu_item_set_action_and_target_value (item, "indicator.calendar", v);
g_menu_item_set_attribute (item, "x-canonical-type",
"s", "com.canonical.indicator.calendar");
- if (allow_activation)
- {
- g_menu_item_set_attribute (item, "activation-action",
- "s", "indicator.activate-planner");
- }
+ if (action_name != nullptr)
+ g_menu_item_set_attribute (item, "activation-action", "s", action_name);
g_menu_append_item (menu, item);
g_object_unref (item);
}
@@ -279,6 +282,15 @@ private:
const int MAX_APPTS = 5;
std::set<std::string> added;
+ const char * action_name;
+
+ if (profile == Phone)
+ action_name = "indicator.phone.open-appointment";
+ else if ((profile == Desktop) && m_actions->desktop_has_calendar_app())
+ action_name = "indicator.desktop.open-appointment";
+ else
+ action_name = nullptr;
+
for (const auto& appt : m_upcoming)
{
// don't show duplicates
@@ -312,15 +324,11 @@ private:
if (!appt.color.empty())
g_menu_item_set_attribute (menu_item, "x-canonical-color", "s", appt.color.c_str());
-
- if (profile == Phone)
- g_menu_item_set_action_and_target_value (menu_item,
- "indicator.activate-appointment",
- g_variant_new_string (appt.uid.c_str()));
- else if (m_actions->can_open_planner())
- g_menu_item_set_action_and_target_value (menu_item,
- "indicator.activate-planner",
- g_variant_new_int64 (unix_time));
+
+ if (action_name != nullptr)
+ g_menu_item_set_action_and_target_value (menu_item, action_name,
+ g_variant_new_string (appt.uid.c_str()));
+
g_menu_append_item (menu, menu_item);
g_object_unref (menu_item);
}
@@ -334,11 +342,11 @@ private:
{
add_appointments (menu, profile);
- if (m_actions->can_open_planner())
+ if (m_actions->desktop_has_calendar_app())
{
// add the 'Add Event…' menuitem
auto menu_item = g_menu_item_new(_("Add Event…"), nullptr);
- const gchar* action_name = "indicator.activate-planner";
+ const gchar* action_name = "indicator.desktop.open-calendar-app";
auto v = g_variant_new_int64(0);
g_menu_item_set_action_and_target_value(menu_item, action_name, v);
g_menu_append_item(menu, menu_item);
@@ -347,7 +355,7 @@ private:
}
else if (profile==Phone)
{
- auto menu_item = g_menu_item_new (_("Clock"), "indicator.activate-phone-clock-app");
+ auto menu_item = g_menu_item_new (_("Clock"), "indicator.phone.open-alarm-app");
g_menu_item_set_attribute_value (menu_item, G_MENU_ATTRIBUTE_ICON, get_serialized_alarm_icon());
g_menu_append_item (menu, menu_item);
g_object_unref (menu_item);
@@ -389,15 +397,17 @@ private:
GMenuModel* create_settings_section(Profile profile)
{
auto menu = g_menu_new();
+ const char * action_name;
if (profile == Desktop)
- {
- g_menu_append (menu, _("Date & Time Settings…"), "indicator.activate-desktop-settings");
- }
+ action_name = "indicator.desktop.open-settings-app";
else if (profile == Phone)
- {
- g_menu_append (menu, _("Time & Date settings…"), "indicator.activate-phone-settings");
- }
+ action_name = "indicator.phone.open-settings-app";
+ else
+ action_name = nullptr;
+
+ if (action_name != nullptr)
+ g_menu_append (menu, _("Time & Date settings…"), action_name);
return G_MENU_MODEL (menu);
}