static GDateTime* gnc_g_date_time_to_local (GDateTime* gdt) { #ifndef G_OS_WIN32 return g_date_time_to_local (gdt); #else GTimeZone *tz = gnc_g_time_zone_new_local (); return gnc_g_date_time_adjust_for_dst (g_date_time_to_utc (gdt), tz); #endif }
static gchar * uint64_secs_to_iso8601 (guint64 secs) { g_autoptr(GDateTime) dt = g_date_time_new_from_unix_utc (secs); g_autoptr(GDateTime) local = (dt != NULL) ? g_date_time_to_local (dt) : NULL; if (local != NULL) return g_date_time_format (local, "%FT%T%:::z"); else return g_strdup ("invalid"); }
static gchar* get_hour_label (GcalEventWidget *self) { g_autoptr (GDateTime) local_start_time; local_start_time = g_date_time_to_local (gcal_event_get_date_start (self->event)); if (self->clock_format_24h) return g_date_time_format (local_start_time, "%R"); else return g_date_time_format (local_start_time, "%I:%M %P"); }
static gboolean get_result_metas_cb (GcalShellSearchProvider *search_provider, GDBusMethodInvocation *invocation, gchar **results, GcalShellSearchProvider2 *skel) { GcalShellSearchProviderPrivate *priv; GDateTime *local_datetime; GVariantBuilder abuilder, builder; GVariant *icon_variant; GcalEvent *event; GdkPixbuf *gicon; gchar *uuid, *desc; gchar *start_date; gint i; priv = search_provider->priv; g_variant_builder_init (&abuilder, G_VARIANT_TYPE ("aa{sv}")); for (i = 0; i < g_strv_length (results); i++) { uuid = results[i]; event = g_hash_table_lookup (priv->events, uuid); g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); g_variant_builder_add (&builder, "{sv}", "id", g_variant_new_string (uuid)); g_variant_builder_add (&builder, "{sv}", "name", g_variant_new_string (gcal_event_get_summary (event))); gicon = get_circle_pixbuf_from_color (gcal_event_get_color (event), 128); icon_variant = g_icon_serialize (G_ICON (gicon)); g_variant_builder_add (&builder, "{sv}", "icon", icon_variant); g_object_unref (gicon); g_variant_unref (icon_variant); local_datetime = g_date_time_to_local (gcal_event_get_date_start (event)); /* FIXME: respect 24h time format */ start_date = g_date_time_format (local_datetime, gcal_event_get_all_day (event) ? "%x" : "%c"); if (gcal_event_get_location (event)) desc = g_strconcat (start_date, ". ", gcal_event_get_location (event), NULL); else desc = g_strdup (start_date); g_variant_builder_add (&builder, "{sv}", "description", g_variant_new_string (desc)); g_variant_builder_add_value (&abuilder, g_variant_builder_end (&builder)); } g_dbus_method_invocation_return_value (invocation, g_variant_new ("(aa{sv})", &abuilder)); return TRUE; }
/* Converts the UTC timestamp to a string, in local time. * Returns NULL on failure. */ gchar * empathy_time_to_string_local (gint64 t, const gchar *format) { GDateTime *d, *local; gchar *result; g_return_val_if_fail (format != NULL, NULL); d = g_date_time_new_from_unix_utc (t); local = g_date_time_to_local (d); g_date_time_unref (d); result = g_date_time_format (local, format); g_date_time_unref (local); return result; }
/** * gl_util_timestamp_to_display: * @microsecs: number of microseconds since the Unix epoch in UTC * @now: the time to compare with * @format: clock format (12 or 24 hour) * * Return a human readable time, corresponding to @microsecs, using an * appropriate @format after comparing it to @now and discarding unnecessary * elements (for example, return only time if the date is today). * * Returns: a newly-allocated human readable string which represents @microsecs */ gchar * gl_util_timestamp_to_display (guint64 microsecs, GDateTime *now, GlUtilClockFormat format, gboolean show_second) { GDateTime *datetime; GDateTime *local; gchar *time = NULL; datetime = g_date_time_new_from_unix_utc (microsecs / G_TIME_SPAN_SECOND); if (datetime == NULL) { g_warning ("Error converting timestamp to time value"); goto out; } local = g_date_time_to_local (datetime); switch (format) { case GL_UTIL_CLOCK_FORMAT_12HR: switch (compare_timestamps (local, now)) { case GL_UTIL_TIMESTAMPS_SAME_DAY: if (show_second) { /* Translators: timestamp format for events on the * current day, showing the time with seconds in * 12-hour format. */ time = g_date_time_format (local, _("%l:%M:%S %p")); } else { /* Translators: timestamp format for events on the * current day, showing the time without seconds in * 12-hour format. */ time = g_date_time_format (local, _("%l:%M %p")); } break; case GL_UTIL_TIMESTAMPS_SAME_YEAR: if (show_second) { time = g_date_time_format (local, /* Translators: timestamp format for events in * the current year, showing the abbreviated * month name, day of the month and the time * with seconds in 12-hour format. */ _("%b %e %l:%M:%S %p")); } else { /* Translators: timestamp format for events in the * current year, showing the abbreviated month name, * day of the month and the time without seconds in * 12-hour format. */ time = g_date_time_format (local, _("%b %e %l:%M %p")); } break; case GL_UTIL_TIMESTAMPS_DIFFERENT_YEAR: if (show_second) { time = g_date_time_format (local, /* Translators: timestamp format for events in * a different year, showing the abbreviated * month name, day of the month, year and the * time with seconds in 12-hour format. */ _("%b %e %Y %l:%M:%S %p")); } else { time = g_date_time_format (local, /* Translators: timestamp format for events in * a different year, showing the abbreviated * month name day of the month, year and the * time without seconds in 12-hour format. */ _("%b %e %Y %l:%M %p")); } break; default: g_assert_not_reached (); } break; case GL_UTIL_CLOCK_FORMAT_24HR: switch (compare_timestamps (local, now)) { case GL_UTIL_TIMESTAMPS_SAME_DAY: if (show_second) { /* Translators: timestamp format for events on the * current day, showing the time with seconds in * 24-hour format. */ time = g_date_time_format (local, _("%H:%M:%S")); } else { /* Translators: timestamp format for events on the * current day, showing the time without seconds in * 24-hour format. */ time = g_date_time_format (local, _("%H:%M")); } break; case GL_UTIL_TIMESTAMPS_SAME_YEAR: if (show_second) { /* Translators: timestamp format for events in the * current year, showing the abbreviated month name, * day of the month and the time with seconds in * 24-hour format. */ time = g_date_time_format (local, _("%b %e %H:%M:%S")); } else { /* Translators: timestamp format for events in the * current year, showing the abbreviated month name, * day of the month and the time without seconds in * 24-hour format. */ time = g_date_time_format (local, _("%b %e %H:%M")); } break; case GL_UTIL_TIMESTAMPS_DIFFERENT_YEAR: if (show_second) { time = g_date_time_format (local, /* Translators: timestamp format for events in * a different year, showing the abbreviated * month name, day of the month, year and the * time with seconds in 24-hour format. */ _("%b %e %Y %H:%M:%S")); } else { /* Translators: timestamp format for events in a * different year, showing the abbreviated month name, * day of the month, year and the time without seconds * in 24-hour format. */ time = g_date_time_format (local, _("%b %e %Y %H:%M")); } break; default: g_assert_not_reached (); } break; default: g_assert_not_reached (); } g_date_time_unref (datetime); g_date_time_unref (local); if (time == NULL) { g_warning ("Error converting datetime to string"); } out: return time; }
static gboolean get_result_metas_cb (GcalShellSearchProvider *search_provider, GDBusMethodInvocation *invocation, gchar **results, GcalShellSearchProvider2 *skel) { GcalShellSearchProviderPrivate *priv; gint i; gchar *uuid, *desc; const gchar* location; g_autoptr(GTimeZone) tz; g_autoptr (GDateTime) datetime; g_autoptr (GDateTime) local_datetime; ECalComponentDateTime dtstart; gchar *start_date; ECalComponentText summary; GdkRGBA color; GVariantBuilder abuilder, builder; GVariant *icon_variant; GcalEventData *data; GdkPixbuf *gicon; priv = search_provider->priv; g_variant_builder_init (&abuilder, G_VARIANT_TYPE ("aa{sv}")); for (i = 0; i < g_strv_length (results); i++) { uuid = results[i]; data = g_hash_table_lookup (priv->events, uuid); g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); g_variant_builder_add (&builder, "{sv}", "id", g_variant_new_string (uuid)); e_cal_component_get_summary (data->event_component, &summary); g_variant_builder_add (&builder, "{sv}", "name", g_variant_new_string (summary.value)); get_color_name_from_source (data->source, &color); gicon = get_circle_pixbuf_from_color (&color, 128); icon_variant = g_icon_serialize (G_ICON (gicon)); g_variant_builder_add (&builder, "{sv}", "icon", icon_variant); g_object_unref (gicon); g_variant_unref (icon_variant); e_cal_component_get_dtstart (data->event_component, &dtstart); if (dtstart.tzid != NULL) tz = g_time_zone_new (dtstart.tzid); else if (dtstart.value->zone != NULL) tz = g_time_zone_new (icaltimezone_get_tzid ((icaltimezone*) dtstart.value->zone)); else tz = g_time_zone_new_local (); datetime = g_date_time_new (tz, dtstart.value->year, dtstart.value->month, dtstart.value->day, dtstart.value->hour, dtstart.value->minute, dtstart.value->second); local_datetime = g_date_time_to_local (datetime); /* FIXME: respect 24h time format */ start_date = g_date_time_format (local_datetime, (dtstart.value->is_date == 1) ? "%x" : "%c"); e_cal_component_free_datetime (&dtstart); e_cal_component_get_location (data->event_component, &location); if (location != NULL) desc = g_strconcat (start_date, ". ", location, NULL); else desc = g_strdup (start_date); g_variant_builder_add (&builder, "{sv}", "description", g_variant_new_string (desc)); g_free (start_date); g_free (desc); g_variant_builder_add_value (&abuilder, g_variant_builder_end (&builder)); } g_dbus_method_invocation_return_value (invocation, g_variant_new ("(aa{sv})", &abuilder)); return TRUE; }
static void gcal_event_widget_set_event_tooltip (GcalEventWidget *self, GcalEvent *event) { g_autoptr (GDateTime) tooltip_start, tooltip_end; g_autofree gchar *start, *end, *escaped_summary; GString *tooltip_mesg; gboolean allday, multiday, is_ltr; guint description_len; tooltip_mesg = g_string_new (NULL); escaped_summary = g_markup_escape_text (gcal_event_get_summary (event), -1); g_string_append_printf (tooltip_mesg, "<b>%s</b>", escaped_summary); allday = gcal_event_get_all_day (event); multiday = gcal_event_is_multiday (event); is_ltr = gtk_widget_get_direction (GTK_WIDGET (self)) != GTK_TEXT_DIR_RTL; if (allday) { /* All day events span from [ start, end - 1 day ] */ tooltip_start = g_date_time_ref (gcal_event_get_date_start (event)); tooltip_end = g_date_time_add_days (gcal_event_get_date_end (event), -1); if (multiday) { start = g_date_time_format (tooltip_start, "%x"); end = g_date_time_format (tooltip_end, "%x"); } else { start = g_date_time_format (tooltip_start, "%x"); end = NULL; } } else { tooltip_start = g_date_time_to_local (gcal_event_get_date_start (event)); tooltip_end = g_date_time_to_local (gcal_event_get_date_end (event)); if (multiday) { if (self->clock_format_24h) { if (is_ltr) { start = g_date_time_format (tooltip_start, "%x %R"); end = g_date_time_format (tooltip_end, "%x %R"); } else { start = g_date_time_format (tooltip_start, "%R %x"); end = g_date_time_format (tooltip_end, "%R %x"); } } else { if (is_ltr) { start = g_date_time_format (tooltip_start, "%x %I:%M %P"); end = g_date_time_format (tooltip_end, "%x %I:%M %P"); } else { start = g_date_time_format (tooltip_start, "%P %M:%I %x"); end = g_date_time_format (tooltip_end, "%P %M:%I %x"); } } } else { if (self->clock_format_24h) { if (is_ltr) { start = g_date_time_format (tooltip_start, "%x, %R"); end = g_date_time_format (tooltip_end, "%R"); } else { start = g_date_time_format (tooltip_start, "%R ,%x"); end = g_date_time_format (tooltip_end, "%R"); } } else { if (is_ltr) { start = g_date_time_format (tooltip_start, "%x, %I:%M %P"); end = g_date_time_format (tooltip_end, "%I:%M %P"); } else { start = g_date_time_format (tooltip_start, "%P %M:%I ,%x"); end = g_date_time_format (tooltip_end, "%P %M:%I"); } } } } if (allday && !multiday) { g_string_append_printf (tooltip_mesg, "\n%s", start); } else { g_string_append_printf (tooltip_mesg, "\n%s - %s", is_ltr ? start : end, is_ltr ? end : start); } /* Append event location */ if (g_utf8_strlen (gcal_event_get_location (event), -1) > 0) { g_autofree gchar *escaped_location; escaped_location = g_markup_escape_text (gcal_event_get_location (event), -1); g_string_append (tooltip_mesg, "\n\n"); /* Translators: %s is the location of the event (e.g. "Downtown, 3rd Avenue") */ g_string_append_printf (tooltip_mesg, _("At %s"), escaped_location); } description_len = g_utf8_strlen (gcal_event_get_description (event), -1); /* Truncate long descriptions at a white space and ellipsize */ if (description_len > 0) { g_autofree gchar *escaped_description; GString *tooltip_desc; tooltip_desc = g_string_new (gcal_event_get_description (event)); /* If the description is larger than DESC_MAX_CHAR, ellipsize it */ if (description_len > DESC_MAX_CHAR) { g_string_truncate (tooltip_desc, DESC_MAX_CHAR - 1); g_string_append (tooltip_desc, "…"); } escaped_description = g_markup_escape_text (tooltip_desc->str, -1); g_string_append_printf (tooltip_mesg, "\n\n%s", escaped_description); g_string_free (tooltip_desc, TRUE); } gtk_widget_set_tooltip_markup (GTK_WIDGET (self), tooltip_mesg->str); g_string_free (tooltip_mesg, TRUE); }