diff --git a/src/gcal-application.c b/src/gcal-application.c
index f099498a..559b2a85 100644
--- a/src/gcal-application.c
+++ b/src/gcal-application.c
@@ -44,7 +44,7 @@ struct _GcalApplication
GtkCssProvider *colors_provider;
gchar *uuid;
- icaltimetype *initial_date;
+ GDateTime *initial_date;
GcalShellSearchProvider *search_provider;
@@ -196,7 +196,7 @@ gcal_application_finalize (GObject *object)
GCAL_ENTRY;
- g_clear_pointer (&self->initial_date, g_free);
+ gcal_clear_datetime (&self->initial_date);
g_clear_pointer (&self->uuid, g_free);
g_clear_object (&self->context);
g_clear_object (&self->colors_provider);
@@ -257,12 +257,7 @@ gcal_application_activate (GApplication *application)
if (!self->window)
{
if (!self->initial_date)
- {
- g_autoptr (GDateTime) now = NULL;
-
- now = g_date_time_new_now_local ();
- self->initial_date = datetime_to_icaltime (now);
- }
+ self->initial_date = g_date_time_new_now (gcal_context_get_timezone (self->context));
self->window = g_object_new (GCAL_TYPE_WINDOW,
"application", self,
@@ -279,7 +274,7 @@ gcal_application_activate (GApplication *application)
if (self->initial_date)
g_object_set (self->window, "active-date", self->initial_date, NULL);
- g_clear_pointer (&self->initial_date, g_free);
+ gcal_clear_datetime (&self->initial_date);
if (self->uuid != NULL)
{
@@ -369,10 +364,7 @@ gcal_application_command_line (GApplication *app,
result.tm_min,
0);
- g_clear_pointer (&self->initial_date, g_free);
-
- if (initial_date)
- self->initial_date = datetime_to_icaltime (initial_date);
+ gcal_set_date_time (&self->initial_date, initial_date);
}
else
{
@@ -663,6 +655,5 @@ gcal_application_set_initial_date (GcalApplication *self,
{
g_return_if_fail (GCAL_IS_APPLICATION (self));
- g_clear_pointer (&self->initial_date, g_free);
- self->initial_date = datetime_to_icaltime (initial_date);
+ gcal_set_date_time (&self->initial_date, initial_date);
}
diff --git a/src/gcal-utils.c b/src/gcal-utils.c
deleted file mode 100644
index c7646565..00000000
--- a/src/gcal-utils.c
+++ /dev/null
@@ -1,1369 +0,0 @@
-/* gcal-utils.c
- *
- * Copyright (C) 2012 - Erick Pérez Castellanos
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-#include "config.h"
-
-#define G_LOG_DOMAIN "Utils"
-
-/* langinfo.h in glibc 2.27 defines ALTMON_* only if _GNU_SOURCE is defined. */
-#define _GNU_SOURCE
-
-#include "gcal-enums.h"
-#include "gcal-utils.h"
-#include "gcal-event-widget.h"
-#include "gcal-view.h"
-
-#include
-#include
-
-#include
-
-#include
-
-#include
-#include
-#include
-
-/**
- * SECTION:gcal-utils
- * @short_description: Utility functions
- * @title:Utility functions
- */
-
-static const gint
-ab_day[7] =
-{
- ABDAY_1,
- ABDAY_2,
- ABDAY_3,
- ABDAY_4,
- ABDAY_5,
- ABDAY_6,
- ABDAY_7,
-};
-
-static const gint
-month_item[12] =
-{
- /* ALTMON_* constants have been introduced in glibc 2.27 (Feb 1, 2018), also
- * have been supported in *BSD family (but not in OS X) since 1990s.
- * If they exist they are the correct way to obtain the month names in
- * nominative case, standalone, without the day number, as used in the
- * calendar header. This is obligatory in some languages (Slavic, Baltic,
- * Greek, etc.) but also recommended to use in all languages because for
- * other languages there is no difference between ALTMON_* and MON_*.
- * If ALTMON_* is not supported then we must use MON_*.
- */
-#ifdef HAVE_ALTMON
- ALTMON_1,
- ALTMON_2,
- ALTMON_3,
- ALTMON_4,
- ALTMON_5,
- ALTMON_6,
- ALTMON_7,
- ALTMON_8,
- ALTMON_9,
- ALTMON_10,
- ALTMON_11,
- ALTMON_12
-#else
- MON_1,
- MON_2,
- MON_3,
- MON_4,
- MON_5,
- MON_6,
- MON_7,
- MON_8,
- MON_9,
- MON_10,
- MON_11,
- MON_12
-#endif
-};
-
-#define SCROLL_HARDNESS 10.0
-
-G_DEFINE_BOXED_TYPE (icaltimetype, icaltime, gcal_dup_icaltime, g_free)
-
-/**
- * datetime_compare_date:
- * @dt1: (nullable): a #GDateTime
- * @dt2: (nullable): a #GDateTime
- *
- * Compares the dates of @dt1 and @dt2. The times are
- * ignored.
- *
- * Returns: negative, 0 or positive
- */
-gint
-datetime_compare_date (GDateTime *dt1,
- GDateTime *dt2)
-{
- if (!dt1 && !dt2)
- return 0;
- else if (!dt1)
- return -1;
- else if (!dt2)
- return 1;
-
- if (g_date_time_get_year (dt1) != g_date_time_get_year (dt2))
- return (g_date_time_get_year (dt1) - g_date_time_get_year (dt2)) * 360;
-
- if (g_date_time_get_month (dt1) != g_date_time_get_month (dt2))
- return (g_date_time_get_month (dt1) - g_date_time_get_month (dt2)) * 30;
-
- if (g_date_time_get_day_of_month (dt1) != g_date_time_get_day_of_month (dt2))
- return g_date_time_get_day_of_month (dt1) - g_date_time_get_day_of_month (dt2);
-
- return 0;
-}
-
-/**
- * datetime_to_icaltime:
- * @dt: a #GDateTime
- *
- * Converts the #GDateTime's @dt to an #icaltimetype.
- *
- * Returns: (transfer full): a #icaltimetype.
- */
-icaltimetype*
-datetime_to_icaltime (GDateTime *dt)
-{
- icaltimetype *idt;
-
- if (!dt)
- return NULL;
-
- idt = g_new0 (icaltimetype, 1);
-
- idt->year = g_date_time_get_year (dt);
- idt->month = g_date_time_get_month (dt);
- idt->day = g_date_time_get_day_of_month (dt);
- idt->hour = g_date_time_get_hour (dt);
- idt->minute = g_date_time_get_minute (dt);
- idt->second = g_date_time_get_seconds (dt);
- idt->is_date = (idt->hour == 0 &&
- idt->minute == 0 &&
- idt->second == 0);
-
- return idt;
-}
-
-/**
- * icaltime_to_datetime:
- * @date: an #icaltimetype
- *
- * Converts the #icaltimetype's @date to a #GDateTime. The
- * timezone is preserved.
- *
- * Returns: (transfer full): a #GDateTime.
- */
-GDateTime*
-icaltime_to_datetime (const icaltimetype *date)
-{
- GDateTime *dt;
- GTimeZone *tz;
-
- tz = date->zone ? g_time_zone_new (icaltime_get_tzid (*date)) : g_time_zone_new_utc ();
- dt = g_date_time_new (tz,
- date->year,
- date->month,
- date->day,
- date->is_date ? 0 : date->hour,
- date->is_date ? 0 : date->minute,
- date->is_date ? 0 : date->second);
-
- g_clear_pointer (&tz, g_time_zone_unref);
-
- return dt;
-}
-
-/**
- * datetime_is_date:
- * @dt: a #GDateTime
- *
- * Checks if @dt represents a date. A pure date
- * has the values of hour, minutes and seconds set
- * to 0.
- *
- * Returns: %TRUE if @dt is a date, %FALSE if it's a
- * timed datetime.
- */
-gboolean
-datetime_is_date (GDateTime *dt)
-{
- return g_date_time_get_hour (dt) == 0 &&
- g_date_time_get_minute (dt) == 0 &&
- g_date_time_get_seconds (dt) == 0;
-}
-
-/**
- * gcal_dup_icaltime:
- * @date: an #icaltimetype
- *
- * Creates an exact copy of @date.
- *
- * Returns: (transfer full): an #icaltimetype
- */
-icaltimetype*
-gcal_dup_icaltime (const icaltimetype *date)
-{
- return g_memdup (date, sizeof (icaltimetype));
-}
-
-/**
- * gcal_get_weekday:
- * @i: the weekday index
- *
- * Retrieves the weekday name.
- *
- * Returns: (transfer full): the weekday name
- */
-gchar*
-gcal_get_weekday (gint i)
-{
- return nl_langinfo (ab_day[i]);
-}
-
-/**
- * gcal_get_month_name:
- * @i: the month index
- *
- * Retrieves the month name.
- *
- * Returns: (transfer full): the month name
- */
-gchar*
-gcal_get_month_name (gint i)
-{
- return nl_langinfo (month_item[i]);
-}
-
-/**
- * gcal_get_surface_from_color:
- * @color: a #GdkRGBA
- * @size: the size of the surface
- *
- * Creates a squared surface filled with @color. The
- * surface is always @size x @size.
- *
- * Returns: (transfer full): a #cairo_surface_t
- */
-cairo_surface_t*
-gcal_get_surface_from_color (GdkRGBA *color,
- gint size)
-{
- cairo_surface_t *surface;
- cairo_t *cr;
-
- surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, size, size);
- cr = cairo_create (surface);
-
- cairo_set_source_rgba (cr,
- color->red,
- color->green,
- color->blue,
- color->alpha);
- cairo_rectangle (cr, 0, 0, size, size);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- return surface;
-}
-
-/**
- * get_circle_surface_from_color:
- * @color: a #GdkRGBA
- * @size: the size of the surface
- *
- * Creates a circular surface filled with @color. The
- * surface is always @size x @size.
- *
- * Returns: (transfer full): a #cairo_surface_t
- */
-cairo_surface_t*
-get_circle_surface_from_color (GdkRGBA *color,
- gint size)
-{
- cairo_surface_t *surface;
- cairo_t *cr;
-
- surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, size, size);
- cr = cairo_create (surface);
-
- cairo_set_source_rgba (cr,
- color->red,
- color->green,
- color->blue,
- color->alpha);
- cairo_arc (cr, size / 2.0, size / 2.0, size / 2.0, 0., 2 * M_PI);
- cairo_fill (cr);
- cairo_destroy (cr);
-
- return surface;
-}
-
-/**
- * get_color_name_from_source:
- * @source: an #ESource
- * @out_color: return value for the color
- *
- * Utility function to retrieve the color from @source.
- */
-void
-get_color_name_from_source (ESource *source,
- GdkRGBA *out_color)
-{
- ESourceSelectable *extension = E_SOURCE_SELECTABLE (e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR));
-
- /* FIXME: We should handle calendars colours better */
- if (!gdk_rgba_parse (out_color, e_source_selectable_get_color (extension)))
- gdk_rgba_parse (out_color, "#becedd"); /* calendar default colour */
-}
-
-/**
- * get_desc_from_component:
- * @component: an #ECalComponent
- * @joint_char: the character to use when merging event comments
- *
- * Utility method to handle the extraction of the description from an
- * #ECalComponent. This cycle through the list of #ECalComponentText
- * and concatenate each string into one.
- *
- * Returns: (nullable)(transfer full) a new allocated string with the
- * description
- **/
-gchar*
-get_desc_from_component (ECalComponent *component,
- const gchar *joint_char)
-{
- GSList *text_list;
- GSList *l;
-
- gchar *desc = NULL;
- e_cal_component_get_description_list (component, &text_list);
-
- for (l = text_list; l != NULL; l = l->next)
- {
- if (l->data != NULL)
- {
- ECalComponentText *text;
- gchar *carrier;
- text = l->data;
-
- if (desc != NULL)
- {
- carrier = g_strconcat (desc, joint_char, text->value, NULL);
- g_free (desc);
- desc = carrier;
- }
- else
- {
- desc = g_strdup (text->value);
- }
- }
- }
-
- e_cal_component_free_text_list (text_list);
- return desc != NULL ? g_strstrip (desc) : NULL;
-}
-
-/**
- * get_uuid_from_component:
- * @source: an {@link ESource}
- * @component: an {@link ECalComponent}
- *
- * Obtains the uuid from a component in the form
- * "source_uid:event_uid:event_rid" or "source:uid:event_uid" if the
- * component doesn't hold a recurrence event
- *
- * Returns: (Transfer full) a new allocated string with the description
- **/
-gchar*
-get_uuid_from_component (ESource *source,
- ECalComponent *component)
-{
- gchar *uuid;
- ECalComponentId *id;
-
- id = e_cal_component_get_id (component);
- if (id->rid != NULL)
- {
- uuid = g_strdup_printf ("%s:%s:%s",
- e_source_get_uid (source),
- id->uid,
- id->rid);
- }
- else
- {
- uuid = g_strdup_printf ("%s:%s",
- e_source_get_uid (source),
- id->uid);
- }
- e_cal_component_free_id (id);
-
- return uuid;
-}
-
-/**
- * get_first_weekday:
- *
- * Copied from Clocks, which by itself is
- * copied from GtkCalendar.
- *
- * Returns: the first weekday, from 0 to 6
- */
-gint
-get_first_weekday (void)
-{
- int week_start;
-
-#ifdef HAVE__NL_TIME_FIRST_WEEKDAY
-
- union { unsigned int word; char *string; } langinfo;
- gint week_1stday = 0;
- gint first_weekday = 1;
- guint week_origin;
-
- langinfo.string = nl_langinfo (_NL_TIME_FIRST_WEEKDAY);
- first_weekday = langinfo.string[0];
- langinfo.string = nl_langinfo (_NL_TIME_WEEK_1STDAY);
- week_origin = langinfo.word;
- if (week_origin == 19971130) /* Sunday */
- week_1stday = 0;
- else if (week_origin == 19971201) /* Monday */
- week_1stday = 1;
- else
- g_warning ("Unknown value of _NL_TIME_WEEK_1STDAY.\n");
-
- week_start = (week_1stday + first_weekday - 1) % 7;
-
-#else
-
- gchar *gtk_week_start;
-
-
- /* Use a define to hide the string from xgettext */
-# define GTK_WEEK_START "calendar:week_start:0"
- gtk_week_start = dgettext ("gtk30", GTK_WEEK_START);
-
- if (strncmp (gtk_week_start, "calendar:week_start:", 20) == 0)
- week_start = *(gtk_week_start + 20) - '0';
- else
- week_start = -1;
-
- if (week_start < 0 || week_start > 6)
- {
- g_warning ("Whoever translated calendar:week_start:0 for GTK+ "
- "did so wrongly.\n");
- week_start = 0;
- }
-
-#endif
-
- return week_start;
-}
-
-/**
- * build_component_from_details:
- * @summary:
- * @initial_date:
- * @final_date:
- *
- * Create a component with the provided details
- *
- * Returns: (transfer full): an {@link ECalComponent} object
- **/
-ECalComponent*
-build_component_from_details (const gchar *summary,
- GDateTime *initial_date,
- GDateTime *final_date)
-{
- ECalComponent *event;
- ECalComponentDateTime dt;
- ECalComponentText summ;
- icaltimezone *zone;
- gboolean all_day;
-
- event = e_cal_component_new ();
- e_cal_component_set_new_vtype (event, E_CAL_COMPONENT_EVENT);
-
- /*
- * Check if the event is all day. Notice that it can be all day even
- * without the final date.
- */
- all_day = datetime_is_date (initial_date) && (final_date ? datetime_is_date (final_date) : TRUE);
-
- /*
- * When the event is all day, we consider UTC timezone by default. Otherwise,
- * we always use the system timezone to create new events
- */
- if (all_day)
- {
- zone = icaltimezone_get_utc_timezone ();
- }
- else
- {
- gchar *system_tz = e_cal_system_timezone_get_location ();
-
- zone = icaltimezone_get_builtin_timezone (system_tz);
-
- g_free (system_tz);
- }
-
- /* Start date */
- dt.value = datetime_to_icaltime (initial_date);
- icaltime_set_timezone (dt.value, zone);
- dt.value->is_date = all_day;
- dt.tzid = icaltimezone_get_tzid (zone);
- e_cal_component_set_dtstart (event, &dt);
-
- g_free (dt.value);
-
- /* End date */
- if (!final_date)
- final_date = g_date_time_add_days (initial_date, 1);
-
- dt.value = datetime_to_icaltime (final_date);
- icaltime_set_timezone (dt.value, zone);
- dt.value->is_date = all_day;
- dt.tzid = icaltimezone_get_tzid (zone);
- e_cal_component_set_dtend (event, &dt);
-
- g_free (dt.value);
-
- /* Summary */
- summ.altrep = NULL;
- summ.value = summary;
- e_cal_component_set_summary (event, &summ);
-
- e_cal_component_commit_sequence (event);
-
- return event;
-}
-
-/**
- * icaltime_compare_date:
- * @date1: an #icaltimetype
- * @date2: an #icaltimetype
- *
- * Compare date parts of #icaltimetype objects. Returns negative value,
- * 0 or positive value accordingly if @date1 is before, same day of
- * after date2.
- *
- * As a bonus it returns the amount of days passed between two days on the
- * same year.
- *
- * Returns: negative, 0 or positive
- **/
-gint
-icaltime_compare_date (const icaltimetype *date1,
- const icaltimetype *date2)
-{
- if (date2 == NULL)
- return 0;
-
- if (date1->year < date2->year)
- return -1;
- else if (date1->year > date2->year)
- return 1;
- else
- return time_day_of_year (date1->day, date1->month - 1, date1->year) -
- time_day_of_year (date2->day, date2->month - 1, date2->year);
-}
-
-/**
- * icaltime_compare_with_current:
- * @date1: an #icaltimetype
- * @date2: an #icaltimetype
- * @current_time_t: the current time
- *
- * Compares @date1 and @date2 against the current time. Dates
- * closer to the current date are sorted before.
- *
- * Returns: negative if @date1 comes after @date2, 0 if they're
- * equal, positive otherwise
- */
-gint
-icaltime_compare_with_current (const icaltimetype *date1,
- const icaltimetype *date2,
- time_t *current_time_t)
-{
- gint result = 0;
-
- time_t start1, start2, diff1, diff2;
- start1 = icaltime_as_timet_with_zone (*date1, date1->zone != NULL ? date1->zone : e_cal_util_get_system_timezone ());
- start2 = icaltime_as_timet_with_zone (*date2, date2->zone != NULL ? date2->zone : e_cal_util_get_system_timezone ());
- diff1 = start1 - *current_time_t;
- diff2 = start2 - *current_time_t;
-
- if (diff1 != diff2)
- {
- if (diff1 == 0)
- result = -1;
- else if (diff2 == 0)
- result = 1;
-
- if (diff1 > 0 && diff2 < 0)
- result = -1;
- else if (diff2 > 0 && diff1 < 0)
- result = 1;
- else if (diff1 < 0 && diff2 < 0)
- result = ABS (diff1) - ABS (diff2);
- else if (diff1 > 0 && diff2 > 0)
- result = diff1 - diff2;
- }
-
- return result;
-}
-
-/**
- * get_start_of_week:
- * @date: an #icaltimetype
- *
- * Retrieves the start of the week that @date
- * falls in. This function already takes the
- * first weekday into account.
- *
- * Returns: (transfer full): a #GDateTime with
- * the start of the week.
- */
-GDateTime*
-get_start_of_week (icaltimetype *date)
-{
- icaltimetype *new_date;
- GDateTime *dt;
-
- new_date = g_new0 (icaltimetype, 1);
- *new_date = icaltime_from_day_of_year (icaltime_start_doy_week (*date, get_first_weekday () + 1),
- date->year);
- new_date->is_date = 0;
- new_date->hour = 0;
- new_date->minute = 0;
- new_date->second = 0;
-
- dt = g_date_time_new_local (new_date->year,
- new_date->month,
- new_date->day,
- 0, 0, 0);
-
- g_clear_pointer (&new_date, g_free);
-
- return dt;
-}
-
-/**
- * get_end_of_week:
- * @date: an #icaltimetype
- *
- * Retrieves the end of the week that @date
- * falls in. This function already takes the
- * first weekday into account.
- *
- * Returns: (transfer full): a #GDateTime with
- * the end of the week.
- */
-GDateTime*
-get_end_of_week (icaltimetype *date)
-{
- GDateTime *week_start, *week_end;
-
- week_start = get_start_of_week (date);
- week_end = g_date_time_add_days (week_start, 7);
-
- g_clear_pointer (&week_start, g_date_time_unref);
-
- return week_end;
-}
-
-/**
- * is_clock_format_24h:
- *
- * Retrieves whether the current clock format is
- * 12h or 24h based.
- *
- * Returns: %TRUE if the clock format is 24h, %FALSE
- * otherwise.
- */
-gboolean
-is_clock_format_24h (void)
-{
- static GSettings *settings = NULL;
- g_autofree gchar *clock_format = NULL;
-
- if (!settings)
- settings = g_settings_new ("org.gnome.desktop.interface");
-
- clock_format = g_settings_get_string (settings, "clock-format");
-
- return g_strcmp0 (clock_format, "24h") == 0;
-}
-
-/**
- * e_strftime_fix_am_pm:
- *
- * Function to do a last minute fixup of the AM/PM stuff if the locale
- * and gettext haven't done it right. Most English speaking countries
- * except the USA use the 24 hour clock (UK, Australia etc). However
- * since they are English nobody bothers to write a language
- * translation (gettext) file. So the locale turns off the AM/PM, but
- * gettext does not turn on the 24 hour clock. Leaving a mess.
- *
- * This routine checks if AM/PM are defined in the locale, if not it
- * forces the use of the 24 hour clock.
- *
- * The function itself is a front end on strftime and takes exactly
- * the same arguments.
- *
- * TODO: Actually remove the '%p' from the fixed up string so that
- * there isn't a stray space.
- */
-gsize
-e_strftime_fix_am_pm (gchar *str,
- gsize max,
- const gchar *fmt,
- const struct tm *tm)
-{
- gchar buf[10];
- gchar *sp;
- gchar *ffmt;
- gsize ret;
-
- if (strstr(fmt, "%p")==NULL && strstr(fmt, "%P")==NULL) {
- /* No AM/PM involved - can use the fmt string directly */
- ret = e_strftime (str, max, fmt, tm);
- } else {
- /* Get the AM/PM symbol from the locale */
- e_strftime (buf, 10, "%p", tm);
-
- if (buf[0]) {
- /* AM/PM have been defined in the locale
- * so we can use the fmt string directly. */
- ret = e_strftime (str, max, fmt, tm);
- } else {
- /* No AM/PM defined by locale
- * must change to 24 hour clock. */
- ffmt = g_strdup (fmt);
- for (sp=ffmt; (sp=strstr(sp, "%l")); sp++) {
- /* Maybe this should be 'k', but I have never
- * seen a 24 clock actually use that format. */
- sp[1]='H';
- }
- for (sp=ffmt; (sp=strstr(sp, "%I")); sp++) {
- sp[1]='H';
- }
- ret = e_strftime (str, max, ffmt, tm);
- g_free (ffmt);
- }
- }
-
- return (ret);
-}
-
-/**
- * e_utf8_strftime_fix_am_pm:
- *
- * Stolen from Evolution codebase. Selects the
- * correct time format.
- *
- * Returns: the size of the string
- */
-gsize
-e_utf8_strftime_fix_am_pm (gchar *str,
- gsize max,
- const gchar *fmt,
- const struct tm *tm)
-{
- gsize sz, ret;
- gchar *locale_fmt, *buf;
-
- locale_fmt = g_locale_from_utf8 (fmt, -1, NULL, &sz, NULL);
- if (!locale_fmt)
- return 0;
-
- ret = e_strftime_fix_am_pm (str, max, locale_fmt, tm);
- if (!ret) {
- g_free (locale_fmt);
- return 0;
- }
-
- buf = g_locale_to_utf8 (str, ret, NULL, &sz, NULL);
- if (!buf) {
- g_free (locale_fmt);
- return 0;
- }
-
- if (sz >= max) {
- gchar *tmp = buf + max - 1;
- tmp = g_utf8_find_prev_char (buf, tmp);
- if (tmp)
- sz = tmp - buf;
- else
- sz = 0;
- }
- memcpy (str, buf, sz);
- str[sz] = '\0';
- g_free (locale_fmt);
- g_free (buf);
- return sz;
-}
-
-
-/**
- * fix_popover_menu_icons:
- * @window: a #GtkPopover
- *
- * Hackish code that inspects the popover's children,
- * retrieve the hidden GtkImage buried under lots of
- * widgets, and make it visible again.
- *
- * Hopefully, we'll find a better way to do this in
- * the long run.
- *
- */
-void
-fix_popover_menu_icons (GtkPopover *popover)
-{
- GtkWidget *popover_stack;
- GtkWidget *menu_section;
- GtkWidget *menu_section_box;
- GList *stack_children;
- GList *menu_section_children;
- GList *menu_section_box_children, *aux;
-
- popover_stack = gtk_bin_get_child (GTK_BIN (popover));
- stack_children = gtk_container_get_children (GTK_CONTAINER (popover_stack));
-
- /**
- * At the moment, the popover stack surely contains only
- * one child of type GtkMenuSectionBox, which contains
- * a single GtkBox.
- */
- menu_section = stack_children->data;
- menu_section_children = gtk_container_get_children (GTK_CONTAINER (menu_section));
-
- /**
- * Get the unique box's children.
- */
- menu_section_box = menu_section_children->data;
- menu_section_box_children = gtk_container_get_children (GTK_CONTAINER (menu_section_box));
-
- gtk_style_context_add_class (gtk_widget_get_style_context (menu_section_box), "calendars-list");
-
- /**
- * Iterate through the GtkModelButtons inside the menu section box.
- */
- for (aux = menu_section_box_children; aux != NULL; aux = aux->next)
- {
- GtkWidget *button_box;
- GList *button_box_children, *aux2;
-
- button_box = gtk_bin_get_child (GTK_BIN (aux->data));
- button_box_children = gtk_container_get_children (GTK_CONTAINER (button_box));
-
- /**
- * Since there is no guarantee that the first child is
- * the GtkImage we're looking for, we have to iterate
- * through the children and check if the types match.
- */
- for (aux2 = button_box_children; aux2 != NULL; aux2 = aux2->next)
- {
- GtkWidget *button_box_child;
- button_box_child = aux2->data;
-
- if (g_type_is_a (G_OBJECT_TYPE (button_box_child), GTK_TYPE_IMAGE))
- {
- gtk_style_context_add_class (gtk_widget_get_style_context (button_box_child), "calendar-color-image");
- gtk_widget_show (button_box_child);
- break;
- }
- }
-
- g_list_free (button_box_children);
- }
-
- g_list_free (stack_children);
- g_list_free (menu_section_children);
- g_list_free (menu_section_box_children);
-}
-
-/**
- * get_source_parent_name_color:
- * @manager: a #GcalManager
- * @source: an #ESource
- * @name: (nullable): return location for the name
- * @color: (nullable): return location for the color
- *
- * Retrieves the name and the color of the #ESource that is
- * parent of @source.
- */
-void
-get_source_parent_name_color (GcalManager *manager,
- ESource *source,
- gchar **name,
- gchar **color)
-{
- ESource *parent_source;
-
- g_assert (source && E_IS_SOURCE (source));
-
- parent_source = gcal_manager_get_source (manager, e_source_get_parent (source));
-
- if (name != NULL)
- *name = e_source_dup_display_name (parent_source);
-
- if (color != NULL)
- {
- GdkRGBA c;
-
- get_color_name_from_source (parent_source, &c);
-
- *color = gdk_rgba_to_string (&c);
- }
-}
-
-/**
- * format_utc_offset:
- * @offset: an UTC offset
- *
- * Formats the UTC offset to a string that GTimeZone can
- * parse. E.g. "-0300" or "+0530".
- *
- * Returns: (transfer full): a string representing the
- * offset
- */
-gchar*
-format_utc_offset (gint64 offset)
-{
- const char *sign = "+";
- gint hours, minutes, seconds;
-
- if (offset < 0) {
- offset = -offset;
- sign = "-";
- }
-
- /* offset can be seconds or microseconds */
- if (offset >= 1000000)
- offset = offset / 1000000;
-
- hours = offset / 3600;
- minutes = (offset % 3600) / 60;
- seconds = offset % 60;
-
- if (seconds > 0)
- return g_strdup_printf ("%s%02i%02i%02i", sign, hours, minutes, seconds);
- else
- return g_strdup_printf ("%s%02i%02i", sign, hours, minutes);
-}
-
-/**
- * get_alarm_trigger_minutes:
- * @event: a #GcalEvent
- * @alarm: a #ECalComponentAlarm
- *
- * Calculates the number of minutes before @event's
- * start time that the alarm should be triggered.
- *
- * Returns: the number of minutes before the event
- * start that @alarm will be triggered.
- */
-gint
-get_alarm_trigger_minutes (GcalEvent *event,
- ECalComponentAlarm *alarm)
-{
- ECalComponentAlarmTrigger trigger;
- GDateTime *alarm_dt;
- gint diff;
-
- e_cal_component_alarm_get_trigger (alarm, &trigger);
-
- /*
- * We only support alarms relative to the start date, and solely
- * ignore whetever different it may be.
- */
- if (trigger.type != E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START)
- return -1;
-
- alarm_dt = g_date_time_add_full (gcal_event_get_date_start (event),
- 0,
- 0,
- - (trigger.u.rel_duration.days + trigger.u.rel_duration.weeks * 7),
- - trigger.u.rel_duration.hours,
- - trigger.u.rel_duration.minutes,
- - trigger.u.rel_duration.seconds);
-
- diff = g_date_time_difference (gcal_event_get_date_start (event), alarm_dt) / G_TIME_SPAN_MINUTE;
-
- g_clear_pointer (&alarm_dt, g_date_time_unref);
-
- return diff;
-}
-
-/**
- * should_change_date_for_scroll:
- * @scroll_value: the current scroll value
- * @scroll_event: the #GdkEventScroll that is being parsed
- *
- * Utility function to check if the date should change based
- * on the scroll. The date is changed when the user scrolls
- * too much on touchpad, or performs a rotation of the scroll
- * button in a mouse.
- *
- * Returns: %TRUE if the date should change, %FALSE otherwise.
- */
-gboolean
-should_change_date_for_scroll (gdouble *scroll_value,
- GdkEventScroll *scroll_event)
-{
- gdouble delta_y;
-
- switch (scroll_event->direction)
- {
- case GDK_SCROLL_DOWN:
- *scroll_value = SCROLL_HARDNESS;
- break;
-
- case GDK_SCROLL_UP:
- *scroll_value = -SCROLL_HARDNESS;
- break;
-
- case GDK_SCROLL_SMOOTH:
- gdk_event_get_scroll_deltas ((GdkEvent*) scroll_event, NULL, &delta_y);
- *scroll_value += delta_y;
- break;
-
- /* Ignore horizontal scrolling for now */
- case GDK_SCROLL_LEFT:
- case GDK_SCROLL_RIGHT:
- default:
- break;
- }
-
- if (*scroll_value <= -SCROLL_HARDNESS || *scroll_value >= SCROLL_HARDNESS)
- return TRUE;
-
- return FALSE;
-}
-
-/**
- * is_source_enabled:
- * @source: an #ESource
- *
- * Retrieves whether the @source is enabled or not.
- * Disabled sources don't show their events.
- *
- * Returns: %TRUE if @source is enabled, %FALSE otherwise.
- */
-gboolean
-is_source_enabled (ESource *source)
-{
- ESourceSelectable *selectable;
-
- g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
-
- selectable = e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR);
-
- return e_source_selectable_get_selected (selectable);
-}
-
-/**
- * ask_recurrence_modification_type:
- * @parent: a #GtkWidget
- * @modtype: an #ECalObjModType
- * @source: an #ESource
- *
- * Assigns the appropriate modtype while modifying an event
- * based on user's choice in the GtkMessageDialog that pops up.
- * The modtype helps the user choose the part of recurrent events
- * to modify. Such as Only This Event, Subsequent events
- * or All events.
- *
- * Returns: %TRUE if user chooses appropriate option and
- * @modtype is assigned, %FALSE otherwise.
- */
-gboolean
-ask_recurrence_modification_type (GtkWidget *parent,
- GcalRecurrenceModType *modtype,
- ESource *source)
-{
- GtkWidget *dialog;
- GtkDialogFlags flags;
- gint result;
- gboolean is_set;
- EClient *client;
-
- flags = GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT;
- *modtype = GCAL_RECURRENCE_MOD_THIS_ONLY;
-
- dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (parent)),
- flags,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- _("The event you are trying to modify is recurring. The changes you have selected should be applied to:"));
-
- gtk_dialog_add_buttons (GTK_DIALOG (dialog),
- _("_Cancel"),
- GTK_RESPONSE_CANCEL,
- _("_Only This Event"),
- GTK_RESPONSE_ACCEPT,
- NULL);
-
- client = g_object_get_data (G_OBJECT (source), "client");
-
- if (!e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_NO_THISANDFUTURE))
- gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Subsequent events"), GTK_RESPONSE_OK);
-
- gtk_dialog_add_button (GTK_DIALOG (dialog), _("_All events"), GTK_RESPONSE_YES);
-
- gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (gtk_widget_get_toplevel (parent)));
-
- result = gtk_dialog_run (GTK_DIALOG (dialog));
-
- switch (result)
- {
- case GTK_RESPONSE_CANCEL:
- is_set = FALSE;
- break;
- case GTK_RESPONSE_ACCEPT:
- *modtype = GCAL_RECURRENCE_MOD_THIS_ONLY;
- is_set = TRUE;
- break;
- case GTK_RESPONSE_OK:
- *modtype = GCAL_RECURRENCE_MOD_THIS_AND_FUTURE;
- is_set = TRUE;
- break;
- case GTK_RESPONSE_YES:
- *modtype = GCAL_RECURRENCE_MOD_ALL;
- is_set = TRUE;
- break;
- default:
- is_set = FALSE;
- break;
- }
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
-
- return is_set;
-}
-
-struct
-{
- const gchar *territory;
- GcalWeekDay no_work_days;
-} no_work_day_per_locale[] = {
- { "AE", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* United Arab Emirates */,
- { "AF", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Afghanistan */,
- { "BD", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Bangladesh */,
- { "BH", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Bahrain */,
- { "BN", GCAL_WEEK_DAY_SUNDAY | GCAL_WEEK_DAY_FRIDAY } /* Brunei Darussalam */,
- { "CR", GCAL_WEEK_DAY_SATURDAY } /* Costa Rica */,
- { "DJ", GCAL_WEEK_DAY_FRIDAY } /* Djibouti */,
- { "DZ", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Algeria */,
- { "EG", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Egypt */,
- { "GN", GCAL_WEEK_DAY_SATURDAY } /* Equatorial Guinea */,
- { "HK", GCAL_WEEK_DAY_SATURDAY } /* Hong Kong */,
- { "IL", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Israel */,
- { "IQ", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Iraq */,
- { "IR", GCAL_WEEK_DAY_THURSDAY | GCAL_WEEK_DAY_FRIDAY } /* Iran */,
- { "KW", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Kuwait */,
- { "KZ", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Kazakhstan */,
- { "LY", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Libya */,
- { "MX", GCAL_WEEK_DAY_SATURDAY } /* Mexico */,
- { "MY", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Malaysia */,
- { "NP", GCAL_WEEK_DAY_SATURDAY } /* Nepal */,
- { "OM", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Oman */,
- { "QA", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Qatar */,
- { "SA", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Saudi Arabia */,
- { "SU", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Sudan */,
- { "SY", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Syria */,
- { "UG", GCAL_WEEK_DAY_SUNDAY } /* Uganda */,
- { "YE", GCAL_WEEK_DAY_FRIDAY | GCAL_WEEK_DAY_SATURDAY } /* Yemen */,
-};
-
-
-/**
- * is_workday:
- * @day: a guint representing the day of a week (0…Sunday, 6…Saturday)
- *
- * Checks whether @day is workday or not based on the Territory part of Locale.
- *
- * Returns: %TRUE if @day is a workday, %FALSE otherwise.
- */
-gboolean
-is_workday (guint day)
-{
- GcalWeekDay no_work_days;
- gchar *locale;
- gchar territory[3] = { 0, };
- guint i;
-
- if (day > 6)
- return FALSE;
-
- no_work_days = GCAL_WEEK_DAY_SATURDAY | GCAL_WEEK_DAY_SUNDAY;
-
- locale = getenv ("LC_ALL");
- if (!locale || g_utf8_strlen (locale, -1) < 5)
- locale = getenv ("LC_TIME");
-
- if (!locale)
- {
- g_warning ("Locale is NULL, assuming Saturday and Sunday as non workdays");
- return !(no_work_days & 1 << day);
- }
-
- g_return_val_if_fail (g_utf8_strlen (locale, -1) >= 5, TRUE);
-
- territory[0] = locale[3];
- territory[1] = locale[4];
-
- for (i = 0; i < G_N_ELEMENTS (no_work_day_per_locale); i++)
- {
- if (g_strcmp0 (territory, no_work_day_per_locale[i].territory) == 0)
- {
- no_work_days = no_work_day_per_locale[i].no_work_days;
- break;
- }
- }
-
- return !(no_work_days & 1 << day);
-}
-
-GList*
-filter_event_list_by_uid_and_modtype (GList *widgets,
- GcalRecurrenceModType mod,
- const gchar *uid)
-{
- GcalEvent *event;
- GList *result;
- GList *l;
-
- event = NULL;
- result = NULL;
-
- /* First pass: find the GcalEvent */
- for (l = widgets; l != NULL; l = l->next)
- {
- GcalEventWidget *event_widget;
- GcalEvent *ev;
-
- event_widget = l->data;
-
- /* Safeguard against stray widgets */
- if (!GCAL_IS_EVENT_WIDGET (event_widget))
- continue;
-
- ev = gcal_event_widget_get_event (event_widget);
-
- /*
- * We can assume only one event will have the exact uuid. Even among
- * recurrencies.
- */
- if (g_str_equal (uid, gcal_event_get_uid (ev)))
- {
- result = g_list_prepend (result, event_widget);
- event = ev;
- }
- }
-
- /* Second pass: find the other related events */
- if (event && mod != GCAL_RECURRENCE_MOD_THIS_ONLY)
- {
- ECalComponentId *id;
- ECalComponent *component;
- ESource *source;
- g_autofree gchar *id_prefix;
-
- component = gcal_event_get_component (event);
- source = gcal_event_get_source (event);
- id = e_cal_component_get_id (component);
- id_prefix = g_strdup_printf ("%s:%s", e_source_get_uid (source), id->uid);
-
- for (l = widgets; l != NULL; l = l->next)
- {
- GcalEventWidget *event_widget;
- GcalEvent *ev;
-
- event_widget = l->data;
-
- /* Safeguard against stray widgets */
- if (!GCAL_IS_EVENT_WIDGET (event_widget))
- continue;
-
- ev = gcal_event_widget_get_event (event_widget);
-
- if (g_str_equal (gcal_event_get_uid (ev), uid))
- continue;
-
- if (!g_str_has_prefix (gcal_event_get_uid (ev), id_prefix))
- continue;
-
- if (mod == GCAL_RECURRENCE_MOD_ALL)
- {
- result = g_list_prepend (result, event_widget);
- }
- else if (mod == GCAL_RECURRENCE_MOD_THIS_AND_FUTURE)
- {
- if (g_date_time_compare (gcal_event_get_date_start (event), gcal_event_get_date_start (ev)) < 0)
- result = g_list_prepend (result, event_widget);
- }
-
- }
-
- e_cal_component_free_id (id);
- }
-
- return result;
-}
-
-gboolean
-gcal_translate_child_window_position (GtkWidget *target,
- GdkWindow *child_window,
- gdouble src_x,
- gdouble src_y,
- gdouble *real_x,
- gdouble *real_y)
-{
- GdkWindow *window;
- gdouble x, y;
-
- x = src_x;
- y = src_y;
-
- /* Find the (x, y) values relative to the workbench */
- window = child_window;
- while (window && window != gtk_widget_get_window (target))
- {
- gdk_window_coords_to_parent (window, x, y, &x, &y);
- window = gdk_window_get_parent (window);
- }
-
- if (!window)
- return FALSE;
-
- if (real_x)
- *real_x = x;
-
- if (real_y)
- *real_y = y;
-
- return TRUE;
-}
diff --git a/src/gcal-utils.h b/src/gcal-utils.h
deleted file mode 100644
index bda43b95..00000000
--- a/src/gcal-utils.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * gcal-window.h
- * Copyright (C) 2015 Erick Pérez Castellanos
- *
- * gnome-calendar is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * gnome-calendar is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-#ifndef __GCAL_UTILS_H__
-#define __GCAL_UTILS_H__
-
-#include "gcal-manager.h"
-#include
-#include
-#include
-#include
-
-#define ICAL_TIME_TYPE (icaltime_get_type ())
-
-#define ALIGNED(x) (round (x) + 0.5)
-#define MINUTES_PER_DAY 1440
-#define MAX_MINUTES (7 * MINUTES_PER_DAY)
-
-#define gcal_clear_datetime(dt) g_clear_pointer (dt, g_date_time_unref)
-#define gcal_clear_timeout(pp) { if (pp && *pp) { g_source_remove (*pp); *pp = 0; } }
-
-#if !EDS_CHECK_VERSION (3, 31, 90)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (ESource, g_object_unref)
-#endif
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (ECalComponent, g_object_unref)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GWeatherLocation, gweather_location_unref)
-
-GType icaltime_get_type (void) G_GNUC_CONST;
-
-gint datetime_compare_date (GDateTime *dt1,
- GDateTime *dt2);
-
-icaltimetype* datetime_to_icaltime (GDateTime *dt);
-
-gboolean datetime_is_date (GDateTime *dt);
-
-GDateTime* icaltime_to_datetime (const icaltimetype *date);
-
-icaltimetype* gcal_dup_icaltime (const icaltimetype *date);
-
-gchar* gcal_get_weekday (gint i);
-
-gchar* gcal_get_month_name (gint i);
-
-cairo_surface_t* gcal_get_surface_from_color (GdkRGBA *color,
- gint size);
-
-cairo_surface_t* get_circle_surface_from_color (GdkRGBA *color,
- gint size);
-
-void get_color_name_from_source (ESource *source,
- GdkRGBA *out_color);
-
-gchar* get_desc_from_component (ECalComponent *component,
- const gchar *joint_char);
-
-gchar* get_uuid_from_component (ESource *source,
- ECalComponent *component);
-
-gint get_first_weekday (void);
-
-ECalComponent* build_component_from_details (const gchar *summary,
- GDateTime *initial_date,
- GDateTime *final_date);
-
-gint icaltime_compare_date (const icaltimetype *date1,
- const icaltimetype *date2);
-
-gint icaltime_compare_with_current (const icaltimetype *date1,
- const icaltimetype *date2,
- time_t *current_time_t);
-
-GDateTime* get_start_of_week (icaltimetype *date);
-
-GDateTime* get_end_of_week (icaltimetype *date);
-
-gboolean is_clock_format_24h (void);
-
-/* code brought from evolution */
-gsize e_strftime_fix_am_pm (gchar *str,
- gsize max,
- const gchar *fmt,
- const struct tm *tm);
-
-gsize e_utf8_strftime_fix_am_pm (gchar *str,
- gsize max,
- const gchar *fmt,
- const struct tm *tm);
-
-void fix_popover_menu_icons (GtkPopover *popover);
-
-
-void get_source_parent_name_color (GcalManager *manager,
- ESource *source,
- gchar **name,
- gchar **color);
-
-gchar* format_utc_offset (gint64 offset);
-
-gint get_alarm_trigger_minutes (GcalEvent *event,
- ECalComponentAlarm *alarm);
-
-gboolean should_change_date_for_scroll (gdouble *scroll_value,
- GdkEventScroll *scroll_event);
-
-gboolean is_source_enabled (ESource *source);
-
-gboolean ask_recurrence_modification_type (GtkWidget *parent,
- GcalRecurrenceModType *modtype,
- ESource *source);
-
-gboolean is_workday (guint day);
-
-GList* filter_event_list_by_uid_and_modtype (GList *widgets,
- GcalRecurrenceModType mod,
- const gchar *uid);
-
-gboolean gcal_translate_child_window_position (GtkWidget *target,
- GdkWindow *child_window,
- gdouble src_x,
- gdouble src_y,
- gdouble *real_x,
- gdouble *real_y);
-#endif /* __GCAL_UTILS_H__ */
diff --git a/src/gcal-window.c b/src/gcal-window.c
index 3f10f69a..d269ee3c 100644
--- a/src/gcal-window.c
+++ b/src/gcal-window.c
@@ -290,7 +290,6 @@ update_active_date (GcalWindow *window,
GDateTime *new_date)
{
g_autoptr (GDateTime) previous_date = NULL;
- g_autofree icaltimetype *new_icaldate = NULL;
g_autofree gchar *new_date_string = NULL;
GcalManager *manager;
GDateTime *date_start, *date_end;
@@ -300,16 +299,15 @@ update_active_date (GcalWindow *window,
GCAL_ENTRY;
previous_date = window->active_date;
- window->active_date = new_date;
+ window->active_date = g_date_time_ref (new_date);
manager = gcal_context_get_manager (window->context);
new_date_string = g_date_time_format (new_date, "%x %X %z");
g_debug ("Updating active date to %s", new_date_string);
- new_icaldate = datetime_to_icaltime (new_date);
- gcal_view_set_date (GCAL_VIEW (window->views[GCAL_WINDOW_VIEW_WEEK]), new_icaldate);
- gcal_view_set_date (GCAL_VIEW (window->views[GCAL_WINDOW_VIEW_MONTH]), new_icaldate);
- gcal_view_set_date (GCAL_VIEW (window->views[GCAL_WINDOW_VIEW_YEAR]), new_icaldate);
+ gcal_view_set_date (GCAL_VIEW (window->views[GCAL_WINDOW_VIEW_WEEK]), new_date);
+ gcal_view_set_date (GCAL_VIEW (window->views[GCAL_WINDOW_VIEW_MONTH]), new_date);
+ gcal_view_set_date (GCAL_VIEW (window->views[GCAL_WINDOW_VIEW_YEAR]), new_date);
/* year_view */
if (g_date_time_get_year (previous_date) != g_date_time_get_year (new_date))
@@ -367,10 +365,10 @@ update_active_date (GcalWindow *window,
!g_date_valid (&old_week) ||
g_date_get_iso8601_week_of_year (&old_week) != g_date_get_iso8601_week_of_year (&new_week))
{
- date_start = get_start_of_week (new_icaldate);
+ date_start = gcal_date_time_get_start_of_week (new_date);
range_start = g_date_time_to_unix (date_start);
- date_end = get_end_of_week (new_icaldate);
+ date_end = gcal_date_time_get_end_of_week (new_date);
range_end = g_date_time_to_unix (date_end);
gcal_manager_set_subscriber (manager, E_CAL_DATA_MODEL_SUBSCRIBER (window->week_view), range_start, range_end);
@@ -633,8 +631,8 @@ set_new_event_mode (GcalWindow *window,
/* new-event interaction: second variant */
static void
show_new_event_widget (GcalView *view,
- gpointer start_span,
- gpointer end_span,
+ GDateTime *start_span,
+ GDateTime *end_span,
gdouble x,
gdouble y,
GcalWindow *window)
@@ -1234,7 +1232,7 @@ gcal_window_finalize (GObject *object)
g_clear_object (&window->context);
g_clear_object (&window->views_switcher);
- g_clear_pointer (&window->active_date, g_free);
+ gcal_clear_datetime (&window->active_date);
G_OBJECT_CLASS (gcal_window_parent_class)->finalize (object);
@@ -1290,7 +1288,7 @@ gcal_window_set_property (GObject *object,
break;
case PROP_ACTIVE_DATE:
- update_active_date (GCAL_WINDOW (object), icaltime_to_datetime (g_value_get_boxed (value)));
+ update_active_date (GCAL_WINDOW (object), g_value_get_boxed (value));
break;
case PROP_NEW_EVENT_MODE:
@@ -1349,7 +1347,7 @@ gcal_window_get_property (GObject *object,
switch (property_id)
{
case PROP_ACTIVE_DATE:
- g_value_take_boxed (value, datetime_to_icaltime (self->active_date));
+ g_value_set_boxed (value, self->active_date);
break;
case PROP_ACTIVE_VIEW:
@@ -1420,7 +1418,7 @@ gcal_window_class_init (GcalWindowClass *klass)
properties[PROP_ACTIVE_DATE] = g_param_spec_boxed ("active-date",
"Date",
"The active/selected date",
- ICAL_TIME_TYPE,
+ G_TYPE_DATE_TIME,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
properties[PROP_ACTIVE_VIEW] = g_param_spec_enum ("active-view",
@@ -1529,7 +1527,7 @@ gcal_window_init (GcalWindow *self)
self,
NULL);
- self->active_date = g_date_time_new_now_local ();
+ self->active_date = g_date_time_new_from_unix_local (0);
self->rtl = gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL;
/* setup accels */
@@ -1554,7 +1552,7 @@ gcal_window_init (GcalWindow *self)
*/
GtkWidget*
gcal_window_new_with_date (GcalApplication *app,
- icaltimetype *date)
+ GDateTime *date)
{
return g_object_new (GCAL_TYPE_WINDOW,
"application", GTK_APPLICATION (app),
diff --git a/src/gcal-window.h b/src/gcal-window.h
index 8b7c55f9..4df9faa5 100644
--- a/src/gcal-window.h
+++ b/src/gcal-window.h
@@ -33,7 +33,7 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (GcalWindow, gcal_window, GCAL, WINDOW, GtkApplicationWindow)
GtkWidget* gcal_window_new_with_date (GcalApplication *app,
- icaltimetype *date);
+ GDateTime *date);
void gcal_window_set_search_mode (GcalWindow *self,
gboolean enabled);
diff --git a/src/views/gcal-month-view.c b/src/views/gcal-month-view.c
index 72168f49..e4a51fe7 100644
--- a/src/views/gcal-month-view.c
+++ b/src/views/gcal-month-view.c
@@ -119,7 +119,7 @@ struct _GcalMonthView
guint update_grid_id;
/* property */
- icaltimetype *date;
+ GDateTime *date;
GcalContext *context;
gboolean pending_event_allocation;
@@ -308,8 +308,8 @@ calculate_event_cells (GcalMonthView *self,
start_date = gcal_event_get_date_start (event);
start_date = all_day ? g_date_time_ref (start_date) : g_date_time_to_local (start_date);
- if (g_date_time_get_year (start_date) == self->date->year &&
- g_date_time_get_month (start_date) == self->date->month)
+ if (g_date_time_get_year (start_date) == g_date_time_get_year (self->date) &&
+ g_date_time_get_month (start_date) == g_date_time_get_month (self->date))
{
first_cell = g_date_time_get_day_of_month (start_date);
}
@@ -328,12 +328,12 @@ calculate_event_cells (GcalMonthView *self,
g_autoptr (GDateTime) end_date = NULL;
gint last_cell;
- last_cell = icaltime_days_in_month (self->date->month, self->date->year);
+ last_cell = gcal_date_time_get_days_in_month (self->date);
end_date = gcal_event_get_date_end (event);
end_date = all_day ? g_date_time_ref (end_date) : g_date_time_to_local (end_date);
- if (g_date_time_get_year (end_date) == self->date->year &&
- g_date_time_get_month (end_date) == self->date->month)
+ if (g_date_time_get_year (end_date) == g_date_time_get_year (self->date) &&
+ g_date_time_get_month (end_date) == g_date_time_get_month (self->date))
{
last_cell = g_date_time_get_day_of_month (end_date);
@@ -686,8 +686,8 @@ allocate_multiday_events (GcalMonthView *self,
* some checks and only applies the dates when it's valid.
*/
dt_start = g_date_time_new (g_date_time_get_timezone (gcal_event_get_date_start (event)),
- self->date->year,
- self->date->month,
+ g_date_time_get_year (self->date),
+ g_date_time_get_month (self->date),
day,
0, 0, 0);
@@ -931,12 +931,14 @@ update_weather (GcalMonthView *self,
static gboolean
update_month_cells (GcalMonthView *self)
{
- g_autoptr (GDateTime) dt;
+ g_autoptr (GDateTime) dt = NULL;
gboolean show_last_row;
guint row, col;
- show_last_row = g_date_get_days_in_month (self->date->month, self->date->year) + self->days_delay > 35;
- dt = g_date_time_new_local (self->date->year, self->date->month, 1, 0, 0, 0);
+ show_last_row = gcal_date_time_get_days_in_month (self->date) + self->days_delay > 35;
+ dt = g_date_time_new_local (g_date_time_get_year (self->date),
+ g_date_time_get_month (self->date),
+ 1, 0, 0, 0);
for (row = 0; row < 6; row++)
{
@@ -963,7 +965,7 @@ update_month_cells (GcalMonthView *self)
/* Different month */
different_month = day < self->days_delay ||
- day - self->days_delay >= icaltime_days_in_month (self->date->month, self->date->year);
+ day - self->days_delay >= gcal_date_time_get_days_in_month (self->date);
gcal_month_cell_set_different_month (cell, different_month);
@@ -1029,9 +1031,9 @@ update_header_labels (GcalMonthView *self)
{
gchar year_str[10] = { 0, };
- g_snprintf (year_str, 10, "%d", self->date->year);
+ g_snprintf (year_str, 10, "%d", g_date_time_get_year (self->date));
- gtk_label_set_label (GTK_LABEL (self->month_label), gcal_get_month_name (self->date->month - 1));
+ gtk_label_set_label (GTK_LABEL (self->month_label), gcal_get_month_name (g_date_time_get_month (self->date) - 1));
gtk_label_set_label (GTK_LABEL (self->year_label), year_str);
}
@@ -1068,7 +1070,9 @@ add_new_event_button_cb (GtkWidget *button,
gcal_month_popover_popdown (self->overflow_popover);
day = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (self->overflow_popover), "selected-day"));
- start_date = g_date_time_new_local (self->date->year, self->date->month, day, 0, 0, 0);
+ start_date = g_date_time_new_local (g_date_time_get_year (self->date),
+ g_date_time_get_month (self->date),
+ day, 0, 0, 0);
g_signal_emit_by_name (GCAL_VIEW (user_data), "create-event-detailed", start_date, NULL);
@@ -1127,7 +1131,7 @@ on_weather_service_weather_changed_cb (GcalWeatherService *weather_service,
* GcalView interface
*/
-static icaltimetype*
+static GDateTime*
gcal_month_view_get_date (GcalView *view)
{
GcalMonthView *self = GCAL_MONTH_VIEW (view);
@@ -1136,22 +1140,23 @@ gcal_month_view_get_date (GcalView *view)
}
static void
-gcal_month_view_set_date (GcalView *view,
- icaltimetype *date)
+gcal_month_view_set_date (GcalView *view,
+ GDateTime *date)
{
+ g_autofree gchar *new_date_string = NULL;
GcalMonthView *self;
GCAL_ENTRY;
self = GCAL_MONTH_VIEW (view);
- g_clear_pointer (&self->date, g_free);
+ gcal_set_date_time (&self->date, date);
- self->date = gcal_dup_icaltime (date);
- self->days_delay = (time_day_of_week (1, self->date->month - 1, self->date->year) - self->first_weekday + 7) % 7;
- self->keyboard_cell = self->days_delay + (self->date->day - 1);
+ self->days_delay = (time_day_of_week (1, g_date_time_get_month (self->date) - 1, g_date_time_get_year (self->date)) - self->first_weekday + 7) % 7;
+ self->keyboard_cell = self->days_delay + (g_date_time_get_day_of_month (self->date) - 1);
- GCAL_TRACE_MSG ("new date: %s", icaltime_as_ical_string (*date));
+ new_date_string = g_date_time_format (date, "%x %X %z");
+ GCAL_TRACE_MSG ("new date: %s", new_date_string);
update_header_labels (self);
update_month_cells (self);
@@ -1780,7 +1785,7 @@ gcal_month_view_button_press (GtkWidget *widget,
GCAL_ENTRY;
self = GCAL_MONTH_VIEW (widget);
- days = self->days_delay + icaltime_days_in_month (self->date->month, self->date->year);
+ days = self->days_delay + gcal_date_time_get_days_in_month (self->date);
/* The event may have come from a child widget, so make it relative to the month view */
if (!gcal_translate_child_window_position (widget, event->window, event->x, event->y, &x, &y))
@@ -1793,7 +1798,8 @@ gcal_month_view_button_press (GtkWidget *widget,
g_clear_pointer (&self->start_mark_cell, g_date_time_unref);
self->keyboard_cell = clicked_cell;
- self->start_mark_cell = g_date_time_new_local (self->date->year, self->date->month,
+ self->start_mark_cell = g_date_time_new_local (g_date_time_get_year (self->date),
+ g_date_time_get_month (self->date),
self->keyboard_cell - self->days_delay + 1,
0, 0, 0);
@@ -1815,7 +1821,7 @@ gcal_month_view_motion_notify_event (GtkWidget *widget,
GCAL_ENTRY;
self = GCAL_MONTH_VIEW (widget);
- days = self->days_delay + icaltime_days_in_month (self->date->month, self->date->year);
+ days = self->days_delay + gcal_date_time_get_days_in_month (self->date);
if (!gcal_translate_child_window_position (widget, event->window, event->x, event->y, &x, &y))
GCAL_RETURN (GDK_EVENT_PROPAGATE);
@@ -1834,8 +1840,8 @@ gcal_month_view_motion_notify_event (GtkWidget *widget,
self->keyboard_cell = new_end_cell;
g_clear_pointer (&self->end_mark_cell, g_date_time_unref);
- self->end_mark_cell = g_date_time_new_local (self->date->year,
- self->date->month,
+ self->end_mark_cell = g_date_time_new_local (g_date_time_get_year (self->date),
+ g_date_time_get_month (self->date),
new_end_cell - self->days_delay + 1,
0, 0, 0);
@@ -1863,7 +1869,7 @@ gcal_month_view_button_release (GtkWidget *widget,
GCAL_ENTRY;
self = GCAL_MONTH_VIEW (widget);
- days = self->days_delay + icaltime_days_in_month (self->date->month, self->date->year);
+ days = self->days_delay + gcal_date_time_get_days_in_month (self->date);
if (!gcal_translate_child_window_position (widget, event->window, event->x, event->y, &x, &y))
GCAL_RETURN (GDK_EVENT_PROPAGATE);
@@ -1872,14 +1878,17 @@ gcal_month_view_button_release (GtkWidget *widget,
if (current_day >= self->days_delay && current_day < days)
{
+ g_autoptr (GDateTime) new_active_date = NULL;
gboolean valid;
- g_clear_pointer (&self->end_mark_cell, g_date_time_unref);
-
self->keyboard_cell = current_day;
- self->end_mark_cell = g_date_time_new_local (self->date->year, self->date->month, current_day - self->days_delay + 1, 0, 0, 0);
+ new_active_date = g_date_time_new_local (g_date_time_get_year (self->date),
+ g_date_time_get_month (self->date),
+ current_day - self->days_delay + 1,
+ 0, 0, 0);
- self->date->day = g_date_time_get_day_of_month (self->end_mark_cell);
+ gcal_set_date_time (&self->end_mark_cell, new_active_date);
+ gcal_set_date_time (&self->date, new_active_date);
/* First, make sure to show the popover */
valid = emit_create_event (self);
@@ -1922,6 +1931,7 @@ gcal_month_view_key_press (GtkWidget *widget,
gboolean selection;
gboolean valid_key;
gboolean is_ltr;
+ gint days_in_month;
gint min, max, diff, month_change, current_day;
gint row, col;
@@ -1933,9 +1943,10 @@ gcal_month_view_key_press (GtkWidget *widget,
valid_key = FALSE;
diff = 0;
month_change = 0;
+ days_in_month = gcal_date_time_get_days_in_month (self->date);
current_day = self->keyboard_cell - self->days_delay + 1;
min = self->days_delay;
- max = self->days_delay + icaltime_days_in_month (self->date->month, self->date->year) - 1;
+ max = self->days_delay + days_in_month - 1;
is_ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL;
/*
@@ -1944,7 +1955,12 @@ gcal_month_view_key_press (GtkWidget *widget,
* focused cell.
*/
if (selection && self->start_mark_cell == NULL)
- self->start_mark_cell = g_date_time_new_local (self->date->year, self->date->month, current_day, 0, 0, 0);
+ {
+ self->start_mark_cell = g_date_time_new_local (g_date_time_get_year (self->date),
+ g_date_time_get_month (self->date),
+ current_day,
+ 0, 0, 0);
+ }
switch (event->keyval)
{
@@ -1974,7 +1990,16 @@ gcal_month_view_key_press (GtkWidget *widget,
* simulate it by changing the start & end selected cells = keyboard cell.
*/
if (!selection && !self->start_mark_cell && !self->end_mark_cell)
- self->start_mark_cell = self->end_mark_cell = g_date_time_new_local (self->date->year, self->date->month, current_day, 0, 0, 0);
+ {
+ g_autoptr (GDateTime) new_mark = NULL;
+
+ new_mark = g_date_time_new_local (g_date_time_get_year (self->date),
+ g_date_time_get_month (self->date),
+ current_day,
+ 0, 0, 0);
+ self->start_mark_cell = g_object_ref (new_mark);
+ self->end_mark_cell = g_object_ref (new_mark);
+ }
create_event = TRUE;
break;
@@ -1993,11 +2018,12 @@ gcal_month_view_key_press (GtkWidget *widget,
}
else
{
- month_change = self->keyboard_cell + diff > max ? 1 : -1;
- self->date->month += month_change;
- *self->date = icaltime_normalize (*self->date);
+ g_autoptr (GDateTime) new_month = NULL;
- self->days_delay = (time_day_of_week (1, self->date->month - 1, self->date->year) - self->first_weekday + 7) % 7;
+ month_change = self->keyboard_cell + diff > max ? 1 : -1;
+ new_month = g_date_time_add_months (self->date, month_change);
+
+ self->days_delay = (time_day_of_week (1, g_date_time_get_month (new_month) - 1, g_date_time_get_year (new_month)) - self->first_weekday + 7) % 7;
/*
* Set keyboard cell value to the sum or difference of days delay of successive
@@ -2009,7 +2035,7 @@ gcal_month_view_key_press (GtkWidget *widget,
if (month_change == 1)
self->keyboard_cell = self->days_delay + self->keyboard_cell + diff - max - 1;
else
- self->keyboard_cell = self->days_delay + icaltime_days_in_month (self->date->month, self->date->year) - min + self->keyboard_cell + diff;
+ self->keyboard_cell = self->days_delay + gcal_date_time_get_days_in_month (new_month) - min + self->keyboard_cell + diff;
}
/* Focus the selected month cell */
@@ -2019,7 +2045,7 @@ gcal_month_view_key_press (GtkWidget *widget,
gtk_widget_grab_focus (self->month_cell[row][col]);
current_day = self->keyboard_cell - self->days_delay + 1;
- self->date->day = current_day;
+ //self->date->day = current_day;
/*
* We can only emit the :create-event signal ~after~ grabbing the focus, otherwise
@@ -2032,7 +2058,10 @@ gcal_month_view_key_press (GtkWidget *widget,
if (selection)
{
- self->end_mark_cell = g_date_time_new_local (self->date->year, self->date->month, current_day, 0, 0, 0);
+ self->end_mark_cell = g_date_time_new_local (g_date_time_get_year (self->date),
+ g_date_time_get_month (self->date),
+ current_day,
+ 0, 0, 0);
}
else if (!selection && valid_key)
{
@@ -2055,8 +2084,14 @@ gcal_month_view_scroll_event (GtkWidget *widget,
*/
if (should_change_date_for_scroll (&self->scroll_value, scroll_event))
{
- self->date->month += self->scroll_value > 0 ? 1 : -1;
- *self->date = icaltime_normalize (*self->date);
+ g_autoptr (GDateTime) new_date = NULL;
+ gint diff;
+
+ diff = self->scroll_value > 0 ? 1 : -1;
+ new_date = g_date_time_add_months (self->date, diff);
+
+ gcal_clear_datetime (&self->date);
+ self->date = g_steal_pointer (&new_date);
self->scroll_value = 0;
gtk_widget_queue_draw (widget);
@@ -2144,7 +2179,7 @@ gcal_month_view_finalize (GObject *object)
{
GcalMonthView *self = GCAL_MONTH_VIEW (object);
- g_clear_pointer (&self->date, g_free);
+ gcal_clear_datetime (&self->date);
g_clear_pointer (&self->children, g_hash_table_destroy);
g_clear_pointer (&self->single_cell_children, g_hash_table_destroy);
g_clear_pointer (&self->overflow_cells, g_hash_table_destroy);
diff --git a/src/views/gcal-view.c b/src/views/gcal-view.c
index 7d50240c..6553fd90 100644
--- a/src/views/gcal-view.c
+++ b/src/views/gcal-view.c
@@ -40,8 +40,8 @@ gcal_view_default_init (GcalViewInterface *iface)
g_param_spec_boxed ("active-date",
"The active date",
"The active/selecetd date in the view",
- ICAL_TIME_TYPE,
- G_PARAM_READWRITE));
+ G_TYPE_DATE_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* GcalView::manager:
@@ -67,8 +67,8 @@ gcal_view_default_init (GcalViewInterface *iface)
NULL, NULL, NULL,
G_TYPE_NONE,
4,
- G_TYPE_POINTER,
- G_TYPE_POINTER,
+ G_TYPE_DATE_TIME,
+ G_TYPE_DATE_TIME,
G_TYPE_DOUBLE,
G_TYPE_DOUBLE);
@@ -83,7 +83,9 @@ gcal_view_default_init (GcalViewInterface *iface)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GcalViewInterface, create_event_detailed),
NULL, NULL, NULL,
- G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER);
+ G_TYPE_NONE, 2,
+ G_TYPE_DATE_TIME,
+ G_TYPE_DATE_TIME);
/**
* GcalView::event-activated:
@@ -102,13 +104,13 @@ gcal_view_default_init (GcalViewInterface *iface)
/**
* gcal_view_set_date:
* @view: a #GcalView
- * @date: an #icaltimetype
+ * @date: an #GDateTime
*
* Sets the date of @view.
*/
void
gcal_view_set_date (GcalView *view,
- icaltimetype *date)
+ GDateTime *date)
{
g_return_if_fail (GCAL_IS_VIEW (view));
g_return_if_fail (GCAL_VIEW_GET_IFACE (view)->set_date);
@@ -143,9 +145,9 @@ gcal_view_get_context (GcalView *self)
*
* Retrieves the date of @view.
*
- * Returns: (transfer none): an #icaltimetype.
+ * Returns: (transfer none): an #GDateTime.
*/
-icaltimetype*
+GDateTime*
gcal_view_get_date (GcalView *view)
{
g_return_val_if_fail (GCAL_IS_VIEW (view), NULL);
diff --git a/src/views/gcal-view.h b/src/views/gcal-view.h
index c8dc0d60..e16c2bd7 100644
--- a/src/views/gcal-view.h
+++ b/src/views/gcal-view.h
@@ -34,19 +34,19 @@ struct _GcalViewInterface
/* signals */
void (*create_event) (GcalView *view,
- icaltimetype *start_span,
- icaltimetype *end_span,
+ GDateTime *start_span,
+ GDateTime *end_span,
gdouble x,
gdouble y);
void (*create_event_detailed) (GcalView *view,
- icaltimetype *start_span,
- icaltimetype *end_span);
+ GDateTime *start_span,
+ GDateTime *end_span);
- icaltimetype* (*get_date) (GcalView *view);
+ GDateTime* (*get_date) (GcalView *view);
void (*set_date) (GcalView *view,
- icaltimetype *date);
+ GDateTime *date);
/* Marks related API */
void (*clear_marks) (GcalView *view);
@@ -57,9 +57,9 @@ struct _GcalViewInterface
};
void gcal_view_set_date (GcalView *view,
- icaltimetype *date);
+ GDateTime *date);
-icaltimetype* gcal_view_get_date (GcalView *view);
+GDateTime* gcal_view_get_date (GcalView *view);
GcalContext* gcal_view_get_context (GcalView *self);
diff --git a/src/views/gcal-week-grid.c b/src/views/gcal-week-grid.c
index d16b718b..d45e12b0 100644
--- a/src/views/gcal-week-grid.c
+++ b/src/views/gcal-week-grid.c
@@ -54,7 +54,7 @@ struct _GcalWeekGrid
GtkWidget *hours_sidebar;
GdkWindow *event_window;
- icaltimetype *active_date;
+ GDateTime *active_date;
GcalRangeTree *events;
@@ -134,7 +134,7 @@ get_event_range (GcalWeekGrid *self,
if (!self->active_date)
return;
- week_start = get_start_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
week_start_dst = g_date_time_is_daylight_savings (week_start);
if (start)
@@ -273,7 +273,7 @@ gcal_week_grid_finalize (GObject *object)
GcalWeekGrid *self = GCAL_WEEK_GRID (object);
g_clear_pointer (&self->events, gcal_range_tree_unref);
- g_clear_pointer (&self->active_date, g_free);
+ gcal_clear_datetime (&self->active_date);
G_OBJECT_CLASS (gcal_week_grid_parent_class)->finalize (object);
}
@@ -427,7 +427,7 @@ get_today_column (GcalWeekGrid *self)
gint days_diff;
today = g_date_time_new_now_local ();
- week_start = get_start_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
days_diff = g_date_time_difference (today, week_start) / G_TIME_SPAN_DAY;
/* Today is out of range */
@@ -872,7 +872,7 @@ gcal_week_grid_button_release (GtkWidget *widget,
/* Fake the week view's event so we can control the X and Y values */
weekview = gtk_widget_get_ancestor (widget, GCAL_TYPE_WEEK_VIEW);
- week_start = get_start_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
if (ltr)
{
@@ -1018,7 +1018,7 @@ gcal_week_grid_drag_drop (GtkWidget *widget,
goto out;
}
- week_start = get_start_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
dnd_date = g_date_time_add_minutes (week_start, drop_cell * 30);
/*
@@ -1256,10 +1256,9 @@ gcal_week_grid_clear_marks (GcalWeekGrid *self)
void
gcal_week_grid_set_date (GcalWeekGrid *self,
- icaltimetype *date)
+ GDateTime *date)
{
- g_clear_pointer (&self->active_date, g_free);
- self->active_date = gcal_dup_icaltime (date);
+ gcal_set_date_time (&self->active_date, date);
gtk_widget_queue_resize (GTK_WIDGET (self));
gtk_widget_queue_draw (GTK_WIDGET (self));
diff --git a/src/views/gcal-week-grid.h b/src/views/gcal-week-grid.h
index 787b288a..f21487c0 100644
--- a/src/views/gcal-week-grid.h
+++ b/src/views/gcal-week-grid.h
@@ -49,7 +49,7 @@ GList* gcal_week_grid_get_children_by_uuid (GcalWeekGrid
void gcal_week_grid_clear_marks (GcalWeekGrid *self);
void gcal_week_grid_set_date (GcalWeekGrid *self,
- icaltimetype *date);
+ GDateTime *date);
G_END_DECLS
diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c
index 6b41e703..c1932d8f 100644
--- a/src/views/gcal-week-header.c
+++ b/src/views/gcal-week-header.c
@@ -89,7 +89,7 @@ struct _GcalWeekHeader
*/
gboolean expanded;
- icaltimetype *active_date;
+ GDateTime *active_date;
gint selection_start;
gint selection_end;
@@ -150,7 +150,7 @@ add_weather_infos (GcalWeekHeader *self,
if (!self->active_date)
return 0;
- week_start_dt = get_start_of_week (self->active_date);
+ week_start_dt = gcal_date_time_get_start_of_week (self->active_date);
g_date_set_dmy (&week_start,
g_date_time_get_day_of_month (week_start_dt),
g_date_time_get_month (week_start_dt),
@@ -320,7 +320,7 @@ on_button_released (GcalWeekHeader *self,
start = start - end;
}
- week_start = get_start_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
selection_start = g_date_time_add_days (week_start, start);
selection_end = end == start ? g_date_time_ref (selection_start) : g_date_time_add_days (week_start, end + 1);
@@ -385,7 +385,7 @@ get_today_column (GcalWeekHeader *self)
gint days_diff;
today = g_date_time_new_now_local ();
- week_start = get_start_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
days_diff = g_date_time_difference (today, week_start) / G_TIME_SPAN_DAY;
/* Today is out of range */
@@ -630,7 +630,7 @@ split_event_widget_at_column (GcalWeekHeader *self,
gint new_width;
gint old_width;
- week_start = get_start_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
column_date = g_date_time_add_days (week_start, column);
end_column_date = g_date_time_add_days (column_date, 1);
@@ -821,8 +821,8 @@ add_event_to_grid (GcalWeekHeader *self,
if (!gcal_event_is_multiday (event))
return;
- week_start = get_start_of_week (self->active_date);
- week_end = get_end_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
+ week_end = gcal_date_time_get_end_of_week (self->active_date);
gcal_event_widget_set_date_start (GCAL_EVENT_WIDGET (widget), week_start);
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (widget), week_end);
@@ -889,7 +889,7 @@ add_event_to_grid (GcalWeekHeader *self,
static void
update_unchanged_events (GcalWeekHeader *self,
- icaltimetype *new_icaldt)
+ GDateTime *new_date)
{
g_autoptr (GDateTime) new_week_start, new_week_end;
g_autoptr (GDateTime) utc_week_start, utc_week_end;
@@ -898,8 +898,8 @@ update_unchanged_events (GcalWeekHeader *self,
events_to_update = NULL;
- new_week_start = get_start_of_week (new_icaldt);
- new_week_end = get_end_of_week (new_icaldt);
+ new_week_start = gcal_date_time_get_start_of_week (new_date);
+ new_week_end = gcal_date_time_get_end_of_week (new_date);
utc_week_start = g_date_time_new_utc (g_date_time_get_year (new_week_start),
g_date_time_get_month (new_week_start),
@@ -972,7 +972,7 @@ update_title (GcalWeekHeader *self)
if(!self->active_date)
return;
- week_start = get_start_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
week_end = g_date_time_add_days (week_start, 6);
week_mid = g_date_time_add_days (week_start, 3);
@@ -1157,7 +1157,7 @@ gcal_week_header_finalize (GObject *object)
GcalWeekHeader *self = GCAL_WEEK_HEADER (object);
gint i;
- g_clear_pointer (&self->active_date, g_free);
+ gcal_clear_datetime (&self->active_date);
for (i = 0; i < 7; i++)
g_list_free (self->events[i]);
@@ -1229,9 +1229,9 @@ gcal_week_header_draw (GtkWidget *widget,
pango_font_description_set_weight (bold_font, PANGO_WEIGHT_MEDIUM);
pango_layout_set_font_description (layout, bold_font);
- week_start = get_start_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
week_end = g_date_time_add_days (week_start, 6);
- current_cell = icaltime_day_of_week (*(self->active_date)) - 1;
+ current_cell = g_date_time_get_day_of_week (self->active_date) - 1;
current_cell = (7 + current_cell - self->first_weekday) % 7;
today_column = get_today_column (self);
@@ -1562,7 +1562,7 @@ gcal_week_header_drag_drop (GtkWidget *widget,
event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (event_widget));
start_date = gcal_event_get_date_start (event);
end_date = gcal_event_get_date_end (event);
- week_start = get_start_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
turn_all_day = !gcal_event_is_multiday (event) || gcal_event_get_all_day (event);
@@ -1736,8 +1736,8 @@ gcal_week_header_add_event (GcalWeekHeader *self,
g_return_if_fail (GCAL_IS_WEEK_HEADER (self));
all_day = gcal_event_get_all_day (event);
- week_start = get_start_of_week (self->active_date);
- week_end = get_end_of_week (self->active_date);
+ week_start = gcal_date_time_get_start_of_week (self->active_date);
+ week_end = gcal_date_time_get_end_of_week (self->active_date);
/* Retrieve the real start and end dates */
if (all_day)
@@ -1903,22 +1903,22 @@ gcal_week_header_clear_marks (GcalWeekHeader *self)
void
gcal_week_header_set_date (GcalWeekHeader *self,
- icaltimetype *date)
+ GDateTime *date)
{
- icaltimetype *old_date, *new_date;
+ GDateTime *old_date, *new_date;
old_date = self->active_date;
- new_date = gcal_dup_icaltime (date);
+ new_date = g_date_time_ref (date);
/*
* If the active date changed, but we're still in the same week,
* there's no need to recalculate visible events.
*/
if (old_date && new_date &&
- old_date->year == new_date->year &&
- icaltime_week_number (*old_date) == icaltime_week_number (*new_date))
+ g_date_time_get_year (old_date) == g_date_time_get_year (new_date) &&
+ g_date_time_get_week_numbering_year (old_date) == g_date_time_get_week_numbering_year (new_date))
{
- g_free (new_date);
+ g_date_time_unref (new_date);
return;
}
@@ -1932,6 +1932,6 @@ gcal_week_header_set_date (GcalWeekHeader *self,
update_weather_infos (self);
- g_clear_pointer (&old_date, g_free);
+ gcal_clear_datetime (&old_date);
}
diff --git a/src/views/gcal-week-header.h b/src/views/gcal-week-header.h
index df86a526..5a37940f 100644
--- a/src/views/gcal-week-header.h
+++ b/src/views/gcal-week-header.h
@@ -50,7 +50,7 @@ GtkSizeGroup* gcal_week_header_get_sidebar_size_group (GcalWeekHeader
void gcal_week_header_clear_marks (GcalWeekHeader *self);
void gcal_week_header_set_date (GcalWeekHeader *self,
- icaltimetype *date);
+ GDateTime *date);
G_END_DECLS
diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c
index 3f168c0e..8b7eb875 100644
--- a/src/views/gcal-week-view.c
+++ b/src/views/gcal-week-view.c
@@ -49,7 +49,7 @@ struct _GcalWeekView
GtkWidget *week_grid;
/* property */
- icaltimetype *date;
+ GDateTime *date;
GcalContext *context;
guint scroll_grid_timeout_id;
@@ -129,8 +129,8 @@ update_grid_scroll_position (GcalWeekView *self)
}
now = g_date_time_new_now_local ();
- week_start = get_start_of_week (self->date);
- week_end = get_end_of_week (self->date);
+ week_start = gcal_date_time_get_start_of_week (self->date);
+ week_end = gcal_date_time_get_end_of_week (self->date);
/* Don't animate when not today */
if (datetime_compare_date (now, week_start) < 0 || datetime_compare_date (now, week_end) >= 0)
@@ -173,7 +173,7 @@ schedule_position_scroll (GcalWeekView *self)
}
/* GcalView implementation */
-static icaltimetype*
+static GDateTime*
gcal_week_view_get_date (GcalView *view)
{
GcalWeekView *self = GCAL_WEEK_VIEW (view);
@@ -182,15 +182,14 @@ gcal_week_view_get_date (GcalView *view)
}
static void
-gcal_week_view_set_date (GcalView *view,
- icaltimetype *date)
+gcal_week_view_set_date (GcalView *view,
+ GDateTime *date)
{
GcalWeekView *self = GCAL_WEEK_VIEW (view);
GCAL_ENTRY;
- g_clear_pointer (&self->date, g_free);
- self->date = gcal_dup_icaltime (date);
+ gcal_set_date_time (&self->date, date);
/* Propagate the new date */
gcal_week_grid_set_date (GCAL_WEEK_GRID (self->week_grid), date);
diff --git a/src/views/gcal-year-view.c b/src/views/gcal-year-view.c
index 2edff1cd..9c725a8f 100644
--- a/src/views/gcal-year-view.c
+++ b/src/views/gcal-year-view.c
@@ -70,8 +70,8 @@ struct _GcalYearView
GcalContext *context;
/* range shown on the sidebar */
- icaltimetype *start_selected_date;
- icaltimetype *end_selected_date;
+ GDateTime *start_selected_date;
+ GDateTime *end_selected_date;
/* geometry info */
GridData *navigator_grid;
@@ -107,7 +107,7 @@ struct _GcalYearView
gint k;
/* date property */
- icaltimetype *date;
+ GDateTime *date;
/*
* Array with the events at every month. Events
@@ -211,71 +211,70 @@ update_selected_dates_from_button_data (GcalYearView *year_view)
if (year_view->selected_data->start_day != 0)
{
ButtonData selected_data = *(year_view->selected_data);
+
order_selected_data (&selected_data);
- year_view->start_selected_date->day = selected_data.start_day;
- year_view->start_selected_date->month = selected_data.start_month + 1;
- year_view->start_selected_date->year = year_view->date->year;
- year_view->end_selected_date->is_date = TRUE;
+ gcal_clear_datetime (&year_view->start_selected_date);
+ year_view->start_selected_date = g_date_time_new_local (g_date_time_get_year (year_view->date),
+ selected_data.start_month + 1,
+ selected_data.start_day,
+ 0, 0, 0);
- year_view->end_selected_date->day = selected_data.end_day;
- year_view->end_selected_date->month = selected_data.end_month + 1;
- year_view->end_selected_date->year = year_view->date->year;
- year_view->end_selected_date->hour = 23;
- year_view->end_selected_date->minute = 59;
- year_view->end_selected_date->is_date = TRUE;
- *(year_view->end_selected_date) = icaltime_normalize (*(year_view->end_selected_date));
+ gcal_clear_datetime (&year_view->end_selected_date);
+ year_view->end_selected_date = g_date_time_new_local (g_date_time_get_year (year_view->date),
+ selected_data.start_month + 1,
+ selected_data.start_day,
+ 23, 59, 59);
}
else
{
- g_autofree icaltimetype *current_date;
- g_autoptr (GDateTime) now;
-
- now = g_date_time_new_now_local ();
- current_date = datetime_to_icaltime (now);
+ g_autoptr (GDateTime) start_date = NULL;
if (year_view->date)
- *(year_view->start_selected_date) = *year_view->date;
+ start_date = g_date_time_ref (year_view->date);
else
- *(year_view->start_selected_date) = *current_date;
+ start_date = g_date_time_new_now_local ();
- year_view->start_selected_date->hour = 0;
- year_view->start_selected_date->minute = 0;
- year_view->start_selected_date->second = 0;
+ gcal_clear_datetime (&year_view->start_selected_date);
+ year_view->start_selected_date = g_date_time_new (gcal_context_get_timezone (year_view->context),
+ g_date_time_get_year (start_date),
+ g_date_time_get_month (start_date),
+ g_date_time_get_day_of_month (start_date),
+ 0, 0, 0);
- *(year_view->end_selected_date) = *(year_view->start_selected_date);
- year_view->end_selected_date->hour = 23;
- year_view->end_selected_date->minute = 59;
- *(year_view->end_selected_date) = icaltime_normalize (*(year_view->end_selected_date));
+ gcal_clear_datetime (&year_view->end_selected_date);
+ year_view->end_selected_date = g_date_time_add_days (year_view->start_selected_date, 1);
- year_view->selected_data->start_day = year_view->start_selected_date->day;
- year_view->selected_data->start_month = year_view->start_selected_date->month - 1;
- year_view->selected_data->end_day = year_view->end_selected_date->day;
- year_view->selected_data->end_month = year_view->end_selected_date->month -1;
+ year_view->selected_data->start_day = g_date_time_get_day_of_month (year_view->start_selected_date);
+ year_view->selected_data->start_month = g_date_time_get_month (year_view->start_selected_date) - 1;
+ year_view->selected_data->end_day = g_date_time_get_day_of_month (year_view->end_selected_date);
+ year_view->selected_data->end_month = g_date_time_get_month (year_view->end_selected_date)-1;
}
- if (year_view->end_selected_date->year != year_view->start_selected_date->year)
+ if (g_date_time_get_year (year_view->end_selected_date) != g_date_time_get_year (year_view->start_selected_date))
{
- year_view->end_selected_date->day = 31;
- year_view->end_selected_date->month = 12;
- year_view->end_selected_date->year = year_view->start_selected_date->year;
+ g_autoptr (GDateTime) end_of_year = NULL;
+
+ end_of_year = g_date_time_new (gcal_context_get_timezone (year_view->context),
+ g_date_time_get_year (year_view->start_selected_date),
+ G_DATE_DECEMBER,
+ 31,
+ 0, 0, 0);
+ gcal_set_date_time (&year_view->end_selected_date, end_of_year);
}
}
static void
update_no_events_page (GcalYearView *year_view)
{
- g_autoptr (GDateTime) start_selected_date, now;
+ g_autoptr (GDateTime) now = NULL;
gboolean has_range;
gchar *title;
now = g_date_time_new_now_local ();
- start_selected_date = icaltime_to_datetime (year_view->start_selected_date);
+ has_range = datetime_compare_date (year_view->start_selected_date, year_view->end_selected_date);
- has_range = (year_view->start_selected_date->day != year_view->end_selected_date->day ||
- year_view->start_selected_date->month != year_view->end_selected_date->month);
-
- if (datetime_compare_date (now, start_selected_date) == 0)
+ if (datetime_compare_date (now, year_view->start_selected_date) == 0)
{
title = g_strdup_printf ("%s%s", _("Today"), has_range ? "…" : "");
}
@@ -286,13 +285,13 @@ update_no_events_page (GcalYearView *year_view)
/* Translators: This is a date format in the sidebar of the year
* view when the selection starts at the specified day and the
* end is unspecified. */
- title = g_date_time_format (start_selected_date, _("%B %d…"));
+ title = g_date_time_format (year_view->start_selected_date, _("%B %d…"));
}
else
{
/* Translators: This is a date format in the sidebar of the year
* view when there is only one specified day selected. */
- title = g_date_time_format (start_selected_date, _("%B %d"));
+ title = g_date_time_format (year_view->start_selected_date, _("%B %d"));
}
}
@@ -307,10 +306,11 @@ add_event_to_day_array (GcalYearView *year_view,
GList **days_widgets_array,
gint days_span)
{
+ g_autoptr (GDateTime) second_date = NULL;
+ g_autoptr (GDateTime) date = NULL;
GcalManager *manager;
GtkWidget *child_widget;
GDateTime *dt_start, *dt_end;
- GDateTime *date, *second_date;
gboolean is_readonly;
gint i;
@@ -324,7 +324,7 @@ add_event_to_day_array (GcalYearView *year_view,
dt_end = gcal_event_get_date_end (event);
/* normalize date on each new event */
- date = icaltime_to_datetime (year_view->start_selected_date);
+ date = g_date_time_ref (year_view->start_selected_date);
second_date = g_date_time_add_days (date, 1);
/* marking and cloning */
@@ -402,14 +402,13 @@ add_event_to_day_array (GcalYearView *year_view,
second_date = g_date_time_add_days (second_date, 1);
g_clear_pointer (&aux, g_date_time_unref);
}
-
- g_clear_pointer (&second_date, g_date_time_unref);
- g_clear_pointer (&date, g_date_time_unref);
}
static void
update_sidebar (GcalYearView *year_view)
{
+ g_autofree icaltimetype *start_icaldatetime = NULL;
+ g_autofree icaltimetype *end_icaldatetime = NULL;
GcalManager *manager;
GtkWidget *child_widget;
GList *events, *l;
@@ -420,11 +419,16 @@ update_sidebar (GcalYearView *year_view)
gtk_container_foreach (GTK_CONTAINER (year_view->events_sidebar), (GtkCallback) gtk_widget_destroy, NULL);
- days_span = icaltime_day_of_year(*(year_view->end_selected_date)) - icaltime_day_of_year(*(year_view->start_selected_date)) + 1;
+ if (!year_view->start_selected_date || !year_view->end_selected_date)
+ return;
+
+ days_span = g_date_time_get_day_of_year (year_view->end_selected_date) - g_date_time_get_day_of_year (year_view->start_selected_date) + 1;
days_widgets_array = g_new0 (GList*, days_span);
manager = gcal_context_get_manager (year_view->context);
- events = gcal_manager_get_events (manager, year_view->start_selected_date, year_view->end_selected_date);
+ start_icaldatetime = datetime_to_icaltime (year_view->start_selected_date);
+ end_icaldatetime = datetime_to_icaltime (year_view->end_selected_date);
+ events = gcal_manager_get_events (manager, start_icaldatetime, end_icaldatetime);
if (events == NULL)
{
days_span = 0;
@@ -478,7 +482,6 @@ update_sidebar_headers (GtkListBoxRow *row,
GtkWidget *row_child, *before_child = NULL, *row_header = NULL;
GcalEvent *row_event, *before_event;
GDateTime *row_date, *before_date = NULL;
- icaltimetype date;
gint row_shift, before_shift =-1;
year_view = GCAL_YEAR_VIEW (user_data);
@@ -503,23 +506,18 @@ update_sidebar_headers (GtkListBoxRow *row,
if (before_shift == -1 || before_shift != row_shift)
{
- g_autoptr (GDateTime) now, dt;
+ g_autoptr (GDateTime) now = NULL;
GtkWidget *label;
gchar *label_str;
row_header = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
now = g_date_time_new_now_local ();
- date = *(year_view->start_selected_date);
- icaltime_adjust (&date, row_shift, 0, 0, 0);
-
- dt = icaltime_to_datetime (&date);
-
- if (datetime_compare_date (dt, now) == 0)
+ if (datetime_compare_date (year_view->start_selected_date, now) == 0)
label_str = g_strdup (_("Today"));
else
/* Translators: This is a date format in the sidebar of the year view. */
- label_str = g_date_time_format (dt, _("%B %d"));
+ label_str = g_date_time_format (year_view->start_selected_date, _("%B %d"));
label = gtk_label_new (label_str);
gtk_style_context_add_class (gtk_widget_get_style_context (label), "sidebar-header");
@@ -539,19 +537,25 @@ update_sidebar_headers (GtkListBoxRow *row,
static void
update_date (GcalYearView *year_view,
- icaltimetype *new_date)
+ GDateTime *new_date)
{
gboolean needs_reset = FALSE;
- if (year_view->date != NULL && icaltime_compare_date (year_view->date, new_date) && year_view->start_selected_date->day != 0)
- needs_reset = TRUE;
- g_clear_pointer (&year_view->date, g_free);
- year_view->date = gcal_dup_icaltime (new_date);
+ if (year_view->date &&
+ year_view->start_selected_date &&
+ !g_date_time_equal (year_view->date, new_date))
+ {
+ needs_reset = TRUE;
+ }
+
+ gcal_set_date_time (&year_view->date, new_date);
year_view->first_week_of_year = get_last_week_of_year_dmy (year_view->first_weekday,
- 1, G_DATE_JANUARY, year_view->date->year);;
+ 1, G_DATE_JANUARY,
+ g_date_time_get_year (year_view->date));;
year_view->last_week_of_year = get_last_week_of_year_dmy (year_view->first_weekday,
- 31, G_DATE_DECEMBER, year_view->date->year);
+ 31, G_DATE_DECEMBER,
+ g_date_time_get_year (year_view->date));
if (needs_reset)
reset_sidebar (year_view);
@@ -580,7 +584,7 @@ calculate_coord_for_date (GcalYearView *year_view,
/* else */
sw = 1 - 2 * year_view->k;
- clicked_cell = day + ((time_day_of_week (1, month, year_view->date->year) - year_view->first_weekday + 7) % 7) - 1;
+ clicked_cell = day + ((time_day_of_week (1, month, g_date_time_get_year (year_view->date)) - year_view->first_weekday + 7) % 7) - 1;
cell_x = (clicked_cell % 7 + year_view->k + year_view->show_week_numbers) * year_view->navigator_grid->box_side * sw;
cell_x += (year_view->k * year_view->navigator_grid->box_side * (7 + year_view->show_week_numbers));
@@ -670,9 +674,9 @@ calculate_day_month_for_coord (GcalYearView *year_view,
column = (x - (year_view->navigator_grid->coordinates[month].x + box_side * year_view->show_week_numbers * (1 - year_view->k))) / box_side;
clicked_cell = row * 7 + column;
day = 7 * ((clicked_cell + 7 * year_view->k) / 7) + sw * (clicked_cell % 7) + (1 - year_view->k);
- day -= ((time_day_of_week (1, month, year_view->date->year) - year_view->first_weekday + 7) % 7);
+ day -= ((time_day_of_week (1, month, g_date_time_get_year (year_view->date)) - year_view->first_weekday + 7) % 7);
- if (day < 1 || day > time_days_in_month (year_view->date->year, month))
+ if (day < 1 || day > time_days_in_month (g_date_time_get_year (year_view->date), month))
return FALSE;
*out_day = day;
@@ -680,16 +684,15 @@ calculate_day_month_for_coord (GcalYearView *year_view,
}
static guint
count_events_at_day (GcalYearView *self,
- icaltimetype *today)
+ GDateTime *today)
{
- g_autoptr (GDateTime) today_start, today_end;
+ g_autoptr (GDateTime) today_end = NULL;
GPtrArray *events;
guint i, n_events;
- events = self->events[today->month - 1];
+ events = self->events[g_date_time_get_month (today) - 1];
n_events = 0;
- today_start = icaltime_to_datetime (today);
- today_end = g_date_time_add_days (today_start, 1);
+ today_end = g_date_time_add_days (today, 1);
for (i = 0; i < events->len; i++)
{
@@ -707,7 +710,7 @@ count_events_at_day (GcalYearView *self,
if (datetime_compare_date (event_start, today_end) >= 0 ||
- datetime_compare_date (event_end, today_start) < 0)
+ datetime_compare_date (event_end, today) < 0)
{
continue;
}
@@ -731,7 +734,8 @@ draw_month_grid (GcalYearView *year_view,
PangoLayout *layout, *slayout;
PangoFontDescription *font_desc, *sfont_desc;
- g_autoptr (GDateTime) now;
+ g_autoptr (GDateTime) day = NULL;
+ g_autoptr (GDateTime) now = NULL;
GdkRGBA color;
gint layout_width, layout_height, i, j, sw;
@@ -741,7 +745,6 @@ draw_month_grid (GcalYearView *year_view,
gint days_delay, days, shown_rows;
gchar *str, *nr_day, *nr_week;
gboolean selected_day;
- icaltimetype today;
now = g_date_time_new_now_local ();
@@ -804,21 +807,19 @@ draw_month_grid (GcalYearView *year_view,
gtk_style_context_get (context, state_flags, "font", &font_desc, NULL);
pango_layout_set_font_description (layout, font_desc);
- days_delay = (time_day_of_week (1, month_nr, year_view->date->year) - year_view->first_weekday + 7) % 7;
- days = days_delay + icaltime_days_in_month (month_nr + 1, year_view->date->year);
+ days_delay = (time_day_of_week (1, month_nr, g_date_time_get_year (year_view->date)) - year_view->first_weekday + 7) % 7;
+ days = days_delay + g_date_get_days_in_month (month_nr + 1, g_date_time_get_year (year_view->date));
shown_rows = ceil (days / 7.0);
- today = icaltime_today ();
- today.year = year_view->date->year;
- today.month = month_nr + 1;
- today.day = 1;
- today.hour = 0;
- today.minute = 0;
- today.second = 0;
- today.zone = gcal_manager_get_system_timezone (gcal_context_get_manager (year_view->context));
+ day = g_date_time_new (gcal_context_get_timezone (year_view->context),
+ g_date_time_get_year (year_view->date),
+ month_nr + 1,
+ 1, 0, 0, 0);
for (i = 0; i < 7 * shown_rows; i++)
{
+ g_autoptr (GDateTime) next_day = NULL;
+
column = (i % 7) + (year_view->k || year_view->show_week_numbers);
column_is_workday = is_workday ((7 * year_view->k + sw * (column - (year_view->show_week_numbers * !year_view->k) + (sw * year_view->first_weekday))) % 7);
row = i / 7;
@@ -902,7 +903,7 @@ draw_month_grid (GcalYearView *year_view,
}
}
- if (year_view->date->year == g_date_time_get_year (now) &&
+ if (g_date_time_get_year (year_view->date) == g_date_time_get_year (now) &&
month_nr + 1 == g_date_time_get_month (now) &&
j == g_date_time_get_day_of_month (now))
{
@@ -967,10 +968,7 @@ draw_month_grid (GcalYearView *year_view,
layout);
}
- /* Update the current day, so we can count the events at this day */
- today.day = j;
-
- if (count_events_at_day (year_view, &today) > 0)
+ if (count_events_at_day (year_view, day) > 0)
{
gtk_style_context_save (context);
gtk_style_context_add_class (context, "with-events");
@@ -988,6 +986,10 @@ draw_month_grid (GcalYearView *year_view,
gtk_style_context_restore (context);
}
+ /* Update the current day, so we can count the events at this day */
+ next_day = g_date_time_add_days (day, 1);
+ gcal_set_date_time (&day, next_day);
+
g_free (nr_day);
}
pango_font_description_free (font_desc);
@@ -1076,7 +1078,7 @@ draw_navigator (GcalYearView *year_view,
gtk_style_context_save (context);
gtk_style_context_add_class (context, "primary-label");
- header_str = g_strdup_printf ("%d", year_view->date->year);
+ header_str = g_strdup_printf ("%d", g_date_time_get_year (year_view->date));
gtk_style_context_get (context, state_flags, "font", &font_desc, NULL);
gtk_style_context_get_padding (context, state_flags, &padding);
@@ -1145,8 +1147,9 @@ navigator_button_release_cb (GcalYearView *year_view,
GdkEventButton *event,
GtkWidget *widget)
{
- gint day, month;
+ g_autoptr (GDateTime) new_date = NULL;
gboolean is_title = FALSE;
+ gint day, month;
if (!year_view->button_pressed)
return FALSE;
@@ -1155,15 +1158,18 @@ navigator_button_release_cb (GcalYearView *year_view,
goto fail;
if (is_title)
- day = g_date_get_days_in_month (month + 1, year_view->date->year);
+ day = g_date_get_days_in_month (month + 1, g_date_time_get_year (year_view->date));
year_view->button_pressed = FALSE;
year_view->selected_data->end_day = day;
year_view->selected_data->end_month = month;
/* update date and notify */
- year_view->date->day = day;
- year_view->date->month = month + 1;
+ new_date = g_date_time_new_local (g_date_time_get_year (year_view->date),
+ month + 1,
+ day,
+ 0, 0, 0);
+ gcal_set_date_time (&year_view->date, new_date);
g_object_notify (G_OBJECT (year_view), "active-date");
gtk_widget_queue_draw (widget);
@@ -1211,7 +1217,7 @@ navigator_motion_notify_cb (GcalYearView *year_view,
if (year_view->button_pressed)
{
if (is_title)
- day = g_date_get_days_in_month (month + 1, year_view->date->year);
+ day = g_date_get_days_in_month (month + 1, g_date_time_get_year (year_view->date));
year_view->selected_data->end_day = day;
year_view->selected_data->end_month = month;
@@ -1239,6 +1245,7 @@ static void
navigator_edge_overshot_cb (GcalYearView *self,
GtkPositionType position_type)
{
+ g_autoptr (GDateTime) new_date = NULL;
GtkAdjustment *adjustment;
/* Ignore horizontal scrolling (and the year view never scrolls horizontally anyway) */
@@ -1247,8 +1254,8 @@ navigator_edge_overshot_cb (GcalYearView *self,
adjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolled_window));
- self->date->year += position_type == GTK_POS_BOTTOM ? 1 : -1;
- *self->date = icaltime_normalize (*self->date);
+ new_date = g_date_time_add_years (self->date, position_type == GTK_POS_BOTTOM ? 1 : -1);
+ gcal_set_date_time (&self->date, new_date);
gtk_adjustment_set_value (adjustment, 0.0);
gtk_widget_queue_draw (self->navigator);
@@ -1277,8 +1284,10 @@ navigator_scroll_event_cb (GcalYearView *self,
*/
if (should_change_date_for_scroll (&self->scroll_value, scroll_event))
{
- self->date->year += self->scroll_value > 0 ? 1 : -1;
- *self->date = icaltime_normalize (*self->date);
+ g_autoptr (GDateTime) new_date = NULL;
+
+ new_date = g_date_time_add_years (self->date, self->scroll_value > 0 ? 1 : -1);
+ gcal_set_date_time (&self->date, new_date);
self->scroll_value = 0;
gtk_widget_queue_draw (self->navigator);
@@ -1293,34 +1302,23 @@ static void
add_event_clicked_cb (GcalYearView *year_view,
GtkButton *button)
{
- GDateTime *start_date, *end_date = NULL;
+ g_autoptr (GDateTime) start_date = NULL;
+ g_autoptr (GDateTime) end_date = NULL;
- if (year_view->start_selected_date->day == 0)
+ if (year_view->start_selected_date)
{
start_date = g_date_time_new_now_local ();
}
else
{
- icaltimetype *dtstart, *dtend;
- GDateTime *tmp_date;
-
- dtstart = year_view->start_selected_date;
- dtend = year_view->end_selected_date;
-
- start_date = g_date_time_new_local (dtstart->year, dtstart->month, dtstart->day, 0, 0, 0);
- tmp_date = g_date_time_new_local (dtend->year, dtend->month, dtend->day, 0, 0, 0);
- end_date = g_date_time_add_days (tmp_date, 1);
-
- g_clear_pointer (&tmp_date, g_date_time_unref);
+ start_date = g_date_time_ref (year_view->start_selected_date);
+ end_date = g_date_time_add_days (year_view->end_selected_date, 1);
}
if (year_view->popover_mode)
gtk_widget_hide (year_view->popover);
g_signal_emit_by_name (GCAL_VIEW (year_view), "create-event-detailed", start_date, end_date);
-
- g_clear_pointer (&start_date, g_date_time_unref);
- g_clear_pointer (&end_date, g_date_time_unref);
}
static void
@@ -1492,7 +1490,7 @@ navigator_drag_drop_cb (GcalYearView *self,
end_dt = gcal_event_get_date_end (event);
drop_date = g_date_time_add_full (start_dt,
- self->date->year - g_date_time_get_year (start_dt),
+ g_date_time_get_year (self->date) - g_date_time_get_year (start_dt),
(month + 1) - g_date_time_get_month (start_dt),
day - g_date_time_get_day_of_month (start_dt),
0, 0, 0);
@@ -1551,7 +1549,7 @@ navigator_drag_leave_cb (GcalYearView *self,
}
/* GcalView implementation */
-static icaltimetype*
+static GDateTime*
gcal_year_view_get_date (GcalView *view)
{
GcalYearView *self = GCAL_YEAR_VIEW (view);
@@ -1560,8 +1558,8 @@ gcal_year_view_get_date (GcalView *view)
}
static void
-gcal_year_view_set_date (GcalView *view,
- icaltimetype *date)
+gcal_year_view_set_date (GcalView *view,
+ GDateTime *date)
{
GCAL_ENTRY;
@@ -1828,10 +1826,10 @@ gcal_year_view_component_added (ECalDataModelSubscriber *subscriber,
start_month = g_date_time_get_month (event_start) - 1;
end_month = g_date_time_get_month (event_end) - 1;
- if (g_date_time_get_year (event_start) < self->date->year)
+ if (g_date_time_get_year (event_start) < g_date_time_get_year (self->date))
start_month = 0;
- if (g_date_time_get_year (event_end) > self->date->year)
+ if (g_date_time_get_year (event_end) > g_date_time_get_year (self->date))
end_month = 11;
/* Add the event to the cache */
@@ -2027,11 +2025,6 @@ gcal_year_view_init (GcalYearView *self)
self->navigator_grid = g_new0 (GridData, 1);
self->selected_data = g_new0 (ButtonData, 1);
- self->start_selected_date = g_new0 (icaltimetype, 1);
- self->start_selected_date->zone = e_cal_util_get_system_timezone ();
- self->end_selected_date = g_new0 (icaltimetype, 1);
- self->end_selected_date->zone = e_cal_util_get_system_timezone ();
-
/* bind GNOME Shell' show week numbers property to GNOME Calendar's one */
self->calendar_settings = g_settings_new ("org.gnome.desktop.calendar");
g_settings_bind (self->calendar_settings, "show-weekdate", self, "show-week-numbers", G_SETTINGS_BIND_DEFAULT);
@@ -2078,7 +2071,10 @@ update_weather (GcalYearView *self)
GDate date;
guint i;
- g_date_set_dmy (&date, self->date->day, self->date->month, self->date->year);
+ g_date_set_dmy (&date,
+ g_date_time_get_day_of_month (self->date),
+ g_date_time_get_month (self->date),
+ g_date_time_get_year (self->date));
weather_infos = gcal_weather_service_get_weather_infos (weather_service);