From 1293e7fe8e13a6cae1798038e2511b0bc652be41 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Mon, 14 Oct 2013 20:04:38 -0500 Subject: use ubuntu mobile's icon name for the alarm clock icon --- src/service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/service.c b/src/service.c index e8d4764..480b4ce 100644 --- a/src/service.c +++ b/src/service.c @@ -505,7 +505,7 @@ create_phone_header_state (IndicatorDatetimeService * self) if ((has_alarms = service_has_alarms (self))) { GIcon * icon; - icon = g_themed_icon_new_with_default_fallbacks ("alarm-symbolic"); + icon = g_themed_icon_new_with_default_fallbacks ("alarm-clock"); g_variant_builder_add (&b, "{sv}", "icon", g_icon_serialize (icon)); g_object_unref (icon); } -- cgit v1.2.3 From b702e8346b7337859f700a935b89046392be4ba9 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Mon, 14 Oct 2013 20:49:53 -0500 Subject: add an icon for alarm appointment menuitems --- src/service.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/service.c b/src/service.c index 480b4ce..6601914 100644 --- a/src/service.c +++ b/src/service.c @@ -36,6 +36,7 @@ #define SKEW_CHECK_INTERVAL_SEC 10 #define SKEW_DIFF_THRESHOLD_USEC ((SKEW_CHECK_INTERVAL_SEC+5) * G_USEC_PER_SEC) +#define ALARM_CLOCK_ICON_NAME "alarm-clock" G_DEFINE_TYPE (IndicatorDatetimeService, indicator_datetime_service, @@ -505,7 +506,7 @@ create_phone_header_state (IndicatorDatetimeService * self) if ((has_alarms = service_has_alarms (self))) { GIcon * icon; - icon = g_themed_icon_new_with_default_fallbacks ("alarm-clock"); + icon = g_themed_icon_new_with_default_fallbacks (ALARM_CLOCK_ICON_NAME); g_variant_builder_add (&b, "{sv}", "icon", g_icon_serialize (icon)); g_object_unref (icon); } @@ -735,7 +736,10 @@ add_appointments (IndicatorDatetimeService * self, GMenu * menu, gboolean terse) menu_item = g_menu_item_new (appt->summary, NULL); - if (appt->color && !appt->has_alarms) + if (appt->has_alarms) + g_menu_item_set_attribute (menu_item, G_MENU_ATTRIBUTE_ICON, + "s", ALARM_CLOCK_ICON_NAME); + else if (appt->color != NULL) g_menu_item_set_attribute (menu_item, "x-canonical-color", "s", appt->color); -- cgit v1.2.3 From 7095c0ea670693393cafd8a4d3c295a32855d54e Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Mon, 14 Oct 2013 23:20:49 -0500 Subject: ccache our internal GTimeZone instead of constantly re-creating it. --- src/service.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/service.c b/src/service.c index e8d4764..34b7408 100644 --- a/src/service.c +++ b/src/service.c @@ -94,6 +94,9 @@ struct _IndicatorDatetimeServicePrivate IndicatorDatetimeTimezone * tz_geoclue; IndicatorDatetimePlanner * planner; + /* cached GTimeZone for use by indicator_datetime_service_get_localtime() */ + GTimeZone * internal_timezone; + guint own_id; guint actions_export_id; GDBusConnection * conn; @@ -376,6 +379,23 @@ start_header_timer (IndicatorDatetimeService * self) g_date_time_unref (now); } +static void +update_internal_timezone (IndicatorDatetimeService * self) +{ + priv_t * p = self->priv; + const char * id; + + /* find the id from tz_file or tz_geoclue if possible; NULL otherwise */ + id = NULL; + if (!id && p->tz_file) + id = indicator_datetime_timezone_get_timezone (p->tz_file); + if (!id && p->tz_geoclue) + id = indicator_datetime_timezone_get_timezone (p->tz_geoclue); + + g_clear_pointer (&p->internal_timezone, g_time_zone_unref); + p->internal_timezone = g_time_zone_new (id); +} + /** * General purpose handler for rebuilding sections and restarting their timers * when time jumps for whatever reason: @@ -394,6 +414,7 @@ on_local_time_jumped (IndicatorDatetimeService * self) 1. rebuild the necessary states / menuitems when time jumps 2. restart the timers so their new wait interval is correct */ + update_internal_timezone (self); on_header_timer (self); on_timezone_timer (self); } @@ -1794,6 +1815,7 @@ my_dispose (GObject * o) for (i=0; imenus[i].menu); + g_clear_pointer (&p->internal_timezone, g_time_zone_unref); g_clear_object (&p->calendar_action); g_clear_object (&p->desktop_header_action); g_clear_object (&p->phone_header_action); @@ -1989,9 +2011,14 @@ indicator_datetime_service_new (void) /* This currently just returns the system time, As we add test coverage, we'll need this to bypass the system time. */ GDateTime * -indicator_datetime_service_get_localtime (IndicatorDatetimeService * self G_GNUC_UNUSED) +indicator_datetime_service_get_localtime (IndicatorDatetimeService * self) { - return g_date_time_new_now_local (); + priv_t * p = self->priv; + + if (p->internal_timezone == NULL) + update_internal_timezone (self); + + return g_date_time_new_now (p->internal_timezone); } void -- cgit v1.2.3 From 3097e2675ece317bc06ae12439e821be774a4ead Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 15 Oct 2013 09:29:49 -0500 Subject: random fiddling: add G_UNLIKELY to the internal_timezone test --- src/service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/service.c b/src/service.c index 34b7408..7bd4f6a 100644 --- a/src/service.c +++ b/src/service.c @@ -2015,7 +2015,7 @@ indicator_datetime_service_get_localtime (IndicatorDatetimeService * self) { priv_t * p = self->priv; - if (p->internal_timezone == NULL) + if (G_UNLIKELY (p->internal_timezone == NULL)) update_internal_timezone (self); return g_date_time_new_now (p->internal_timezone); -- cgit v1.2.3 From 50dbb636dc2078b21a7d981b1d4d3c3a25384648 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 15 Oct 2013 14:14:41 -0500 Subject: use the clock app's icon for the 'Clock' menuitem, and launch the clock app when it's clicked. --- src/service.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/service.c b/src/service.c index 12857bb..2516b2d 100644 --- a/src/service.c +++ b/src/service.c @@ -24,6 +24,7 @@ #include #include +#include #include #include "dbus-shared.h" @@ -783,14 +784,57 @@ add_appointments (IndicatorDatetimeService * self, GMenu * menu, gboolean terse) g_date_time_unref (now); } +static const gchar * +get_clock_app_icon_filename (void) +{ + static gboolean initialized = FALSE; + static gchar * icon_filename = NULL; + + /* try to extract the clock app's filename from click. (/$pkgdir/$icon) */ + if (!initialized) + { + gchar * pkgdir = NULL; + g_spawn_command_line_sync ("click pkgdir com.ubuntu.clock", &pkgdir, NULL, NULL, NULL); + if (pkgdir != NULL) + { + gchar * manifest = NULL; + g_strstrip (pkgdir); + g_spawn_command_line_sync ("click info com.ubuntu.clock", &manifest, NULL, NULL, NULL); + if (manifest != NULL) + { + JsonParser * parser = json_parser_new (); + if (json_parser_load_from_data (parser, manifest, -1, NULL)) + { + JsonNode * root = json_parser_get_root (parser); /* transfer-none */ + if ((root != NULL) && (JSON_NODE_TYPE(root) == JSON_NODE_OBJECT)) + { + JsonObject * o = json_node_get_object (root); /* transfer-none */ + const gchar * icon_name = json_object_get_string_member (o, "icon"); + icon_filename = g_build_filename (pkgdir, icon_name, NULL); + } + } + g_object_unref (parser); + g_free (manifest); + } + g_free (pkgdir); + } + + initialized = TRUE; + } + + return icon_filename; +} + static GMenuModel * create_phone_appointments_section (IndicatorDatetimeService * self) { GMenu * menu = g_menu_new (); GMenuItem * menu_item; + const gchar * icon_filename; - menu_item = g_menu_item_new (_("Clock"), NULL); - g_menu_item_set_attribute (menu_item, G_MENU_ATTRIBUTE_ICON, "s", "clock"); + menu_item = g_menu_item_new (_("Clock"), "indicator.activate-phone-clock-app"); + if ((icon_filename = get_clock_app_icon_filename ())) + g_menu_item_set_attribute (menu_item, G_MENU_ATTRIBUTE_ICON, "s", icon_filename); g_menu_append_item (menu, menu_item); g_object_unref (menu_item); @@ -1311,6 +1355,15 @@ on_phone_settings_activated (GSimpleAction * a G_GNUC_UNUSED, url_dispatch_send ("settings:///system/time-date", NULL, NULL); } +static void +on_phone_clock_activated (GSimpleAction * a G_GNUC_UNUSED, + GVariant * param G_GNUC_UNUSED, + gpointer gself G_GNUC_UNUSED) +{ + const char * url = "appid://com.ubuntu.clock/clock/current-user-version"; + url_dispatch_send (url, NULL, NULL); +} + static void on_activate_planner (GSimpleAction * a G_GNUC_UNUSED, GVariant * param, @@ -1364,6 +1417,7 @@ init_gactions (IndicatorDatetimeService * self) 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-planner", on_activate_planner, "x", NULL }, { "set-location", on_set_location, "s" } }; -- cgit v1.2.3 From 6eb9b44c0596ee601cd631278aee6562f93e0007 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 15 Oct 2013 14:44:23 -0500 Subject: make clock_app_icon_filename a field of IndicatorDatetimeServicePriv --- src/service.c | 69 ++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/service.c b/src/service.c index 2516b2d..a82e310 100644 --- a/src/service.c +++ b/src/service.c @@ -99,6 +99,13 @@ struct _IndicatorDatetimeServicePrivate /* cached GTimeZone for use by indicator_datetime_service_get_localtime() */ GTimeZone * internal_timezone; + /* the clock app's icon filename */ + gchar * clock_app_icon_filename; + + /* Whether or not we've tried to load the clock app's icon. + This way we don't keep trying to reload it on the desktop */ + gboolean clock_app_icon_initialized; + guint own_id; guint actions_export_id; GDBusConnection * conn; @@ -784,42 +791,39 @@ add_appointments (IndicatorDatetimeService * self, GMenu * menu, gboolean terse) g_date_time_unref (now); } -static const gchar * + +/* try to extract the clock app's filename from click. (/$pkgdir/$icon) */ +static gchar * get_clock_app_icon_filename (void) { - static gboolean initialized = FALSE; - static gchar * icon_filename = NULL; + gchar * icon_filename = NULL; + gchar * pkgdir; - /* try to extract the clock app's filename from click. (/$pkgdir/$icon) */ - if (!initialized) + pkgdir = NULL; + g_spawn_command_line_sync ("click pkgdir com.ubuntu.clock", &pkgdir, NULL, NULL, NULL); + if (pkgdir != NULL) { - gchar * pkgdir = NULL; - g_spawn_command_line_sync ("click pkgdir com.ubuntu.clock", &pkgdir, NULL, NULL, NULL); - if (pkgdir != NULL) + gchar * manifest = NULL; + g_strstrip (pkgdir); + g_spawn_command_line_sync ("click info com.ubuntu.clock", &manifest, NULL, NULL, NULL); + if (manifest != NULL) { - gchar * manifest = NULL; - g_strstrip (pkgdir); - g_spawn_command_line_sync ("click info com.ubuntu.clock", &manifest, NULL, NULL, NULL); - if (manifest != NULL) + JsonParser * parser = json_parser_new (); + if (json_parser_load_from_data (parser, manifest, -1, NULL)) { - JsonParser * parser = json_parser_new (); - if (json_parser_load_from_data (parser, manifest, -1, NULL)) + JsonNode * root = json_parser_get_root (parser); /* transfer-none */ + if ((root != NULL) && (JSON_NODE_TYPE(root) == JSON_NODE_OBJECT)) { - JsonNode * root = json_parser_get_root (parser); /* transfer-none */ - if ((root != NULL) && (JSON_NODE_TYPE(root) == JSON_NODE_OBJECT)) - { - JsonObject * o = json_node_get_object (root); /* transfer-none */ - const gchar * icon_name = json_object_get_string_member (o, "icon"); - icon_filename = g_build_filename (pkgdir, icon_name, NULL); - } + JsonObject * o = json_node_get_object (root); /* transfer-none */ + const gchar * icon_name = json_object_get_string_member (o, "icon"); + if (icon_name != NULL) + icon_filename = g_build_filename (pkgdir, icon_name, NULL); } - g_object_unref (parser); - g_free (manifest); } - g_free (pkgdir); + g_object_unref (parser); + g_free (manifest); } - - initialized = TRUE; + g_free (pkgdir); } return icon_filename; @@ -828,13 +832,19 @@ get_clock_app_icon_filename (void) static GMenuModel * create_phone_appointments_section (IndicatorDatetimeService * self) { + priv_t * p = self->priv; GMenu * menu = g_menu_new (); GMenuItem * menu_item; - const gchar * icon_filename; + + if (G_UNLIKELY (!p->clock_app_icon_initialized)) + { + p->clock_app_icon_initialized = TRUE; + p->clock_app_icon_filename = get_clock_app_icon_filename (); + } menu_item = g_menu_item_new (_("Clock"), "indicator.activate-phone-clock-app"); - if ((icon_filename = get_clock_app_icon_filename ())) - g_menu_item_set_attribute (menu_item, G_MENU_ATTRIBUTE_ICON, "s", icon_filename); + if (p->clock_app_icon_filename != NULL) + g_menu_item_set_attribute (menu_item, G_MENU_ATTRIBUTE_ICON, "s", p->clock_app_icon_filename); g_menu_append_item (menu, menu_item); g_object_unref (menu_item); @@ -1888,6 +1898,7 @@ my_finalize (GObject * o) IndicatorDatetimeService * self = INDICATOR_DATETIME_SERVICE(o); priv_t * p = self->priv; + g_free (p->clock_app_icon_filename); g_clear_pointer (&p->skew_time, g_date_time_unref); g_clear_pointer (&p->calendar_date, g_date_time_unref); -- cgit v1.2.3 From 7034036ebfc0c4a9f2e9e47bced53ae61c3719b8 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Wed, 16 Oct 2013 09:50:25 -0500 Subject: don't crash with a g_error() in on_bus_lost(). There's a valid case for this happening when the greeter's bus is force-shutdown --- src/service.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'src') diff --git a/src/service.c b/src/service.c index a82e310..c283cf6 100644 --- a/src/service.c +++ b/src/service.c @@ -1815,9 +1815,6 @@ on_name_lost (GDBusConnection * connection G_GNUC_UNUSED, { IndicatorDatetimeService * self = INDICATOR_DATETIME_SERVICE (gself); - if (connection == NULL) - g_error ("Unable to get bus connection to own name '%s'", name); - g_debug ("%s %s name lost %s", G_STRLOC, G_STRFUNC, name); unexport (self); -- cgit v1.2.3