From 073fc961c1b14aaa4b40a11298d02c804b48b89b Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Fri, 26 Apr 2019 13:04:37 -0300 Subject: [PATCH] view: Turn 'active-date' into a GDateTime property Drop the bomb! --- src/gcal-application.c | 21 +- src/gcal-utils.c | 1369 ---------------------------------- src/gcal-utils.h | 140 ---- src/gcal-window.c | 30 +- src/gcal-window.h | 2 +- src/views/gcal-month-view.c | 127 ++-- src/views/gcal-view.c | 20 +- src/views/gcal-view.h | 16 +- src/views/gcal-week-grid.c | 17 +- src/views/gcal-week-grid.h | 2 +- src/views/gcal-week-header.c | 48 +- src/views/gcal-week-header.h | 2 +- src/views/gcal-week-view.c | 15 +- src/views/gcal-year-view.c | 258 ++++--- 14 files changed, 289 insertions(+), 1778 deletions(-) delete mode 100644 src/gcal-utils.c delete mode 100644 src/gcal-utils.h 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);