Hello community, here is the log from the commit of package gnome-calendar for openSUSE:Factory checked in at 2020-06-22 17:47:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gnome-calendar (Old) and /work/SRC/openSUSE:Factory/.gnome-calendar.new.2956 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gnome-calendar" Mon Jun 22 17:47:05 2020 rev:31 rq:816395 version:3.36.2 Changes: -------- --- /work/SRC/openSUSE:Factory/gnome-calendar/gnome-calendar.changes 2020-04-23 18:31:09.172169835 +0200 +++ /work/SRC/openSUSE:Factory/.gnome-calendar.new.2956/gnome-calendar.changes 2020-06-22 17:47:07.938077832 +0200 @@ -1,0 +2,11 @@ +Thu Jun 18 16:02:31 UTC 2020 - Bjørn Lie <bjorn....@gmail.com> + +- Update to version 3.36.2: + + Week view now properly translates the event to the local + timezone. + + Properly commit sequence after event changes, and prevent data + loss. + + Fix first weekday calculation. + + Updated translations. + +------------------------------------------------------------------- Old: ---- gnome-calendar-3.36.1.tar.xz New: ---- gnome-calendar-3.36.2.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gnome-calendar.spec ++++++ --- /var/tmp/diff_new_pack.r9p0sV/_old 2020-06-22 17:47:08.598079902 +0200 +++ /var/tmp/diff_new_pack.r9p0sV/_new 2020-06-22 17:47:08.602079915 +0200 @@ -17,7 +17,7 @@ Name: gnome-calendar -Version: 3.36.1 +Version: 3.36.2 Release: 0 Summary: A calendar application for GNOME License: GPL-3.0-or-later ++++++ gnome-calendar-3.36.1.tar.xz -> gnome-calendar-3.36.2.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/NEWS new/gnome-calendar-3.36.2/NEWS --- old/gnome-calendar-3.36.1/NEWS 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/NEWS 2020-06-18 02:35:17.539159000 +0200 @@ -1,3 +1,9 @@ +Major changes in 3.36.2: +* Week view now properly translates the event to the local timezone (Douglas Fuller) +* Properly commit sequence after event changes, and prevent data loss +* Fix first weekday calculation (Evangelos Ribeiro Tzaras) +* Updated translations + Major changes in 3.36.1: * Introduce a new engine * Fix a lot of bugs diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/data/appdata/org.gnome.Calendar.appdata.xml.in.in new/gnome-calendar-3.36.2/data/appdata/org.gnome.Calendar.appdata.xml.in.in --- old/gnome-calendar-3.36.1/data/appdata/org.gnome.Calendar.appdata.xml.in.in 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/data/appdata/org.gnome.Calendar.appdata.xml.in.in 2020-06-18 02:35:17.539159000 +0200 @@ -49,6 +49,12 @@ <project_group>GNOME</project_group> <releases> + <release date="2020-04-16" version="3.36.2"> + <description> + <p> This is a stable release that fixes important bugs.</p> + </description> + </release> + <release date="2020-04-16" version="3.36.1"> <description> <p> This is a stable release that fixes a lot of bugs, and introduces a new engine for Calendar. This new engine should be more robust and stable.</p> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/meson.build new/gnome-calendar-3.36.2/meson.build --- old/gnome-calendar-3.36.1/meson.build 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/meson.build 2020-06-18 02:35:17.542492400 +0200 @@ -1,7 +1,7 @@ project( 'gnome-calendar', 'c', - version: '3.36.1', + version: '3.36.2', license: 'GPL3+', meson_version: '>= 0.50.0' ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/src/core/gcal-event.c new/gnome-calendar-3.36.2/src/core/gcal-event.c --- old/gnome-calendar-3.36.1/src/core/gcal-event.c 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/src/core/gcal-event.c 2020-06-18 02:35:17.562492400 +0200 @@ -800,6 +800,28 @@ } /** + * gcal_event_new: + * @self: a #GcalEvent + * + * Clones @event into a new #GcalEvent instance. This is useful + * for updating events. + * + * Returns: (transfer full)(nullable): a #GcalEvent + */ +GcalEvent* +gcal_event_new_from_event (GcalEvent *self) +{ + g_autoptr (ECalComponent) component = NULL; + + g_return_val_if_fail (GCAL_IS_EVENT (self), NULL); + + component = e_cal_component_clone (self->component); + e_cal_component_commit_sequence (component); + + return gcal_event_new (self->calendar, component, NULL); +} + +/** * gcal_event_get_all_day: * @self: a #GcalEvent * @@ -1179,6 +1201,8 @@ g_hash_table_iter_remove (&iter); } + e_cal_component_commit_sequence (self->component); + GCAL_EXIT; } @@ -1223,6 +1247,8 @@ e_cal_component_alarm_free (new_alarm); + e_cal_component_commit_sequence (self->component); + GCAL_EXIT; } @@ -1240,18 +1266,20 @@ gcal_event_remove_alarm (GcalEvent *self, guint type) { + const gchar *alarm_uid; + g_return_if_fail (GCAL_IS_EVENT (self)); + alarm_uid = g_hash_table_lookup (self->alarms, GINT_TO_POINTER (type)); + /* Only 1 alarm per relative time */ - if (g_hash_table_contains (self->alarms, GINT_TO_POINTER (type))) + if (alarm_uid) { - const gchar *alarm_uid; - - alarm_uid = g_hash_table_lookup (self->alarms, GINT_TO_POINTER (type)); - e_cal_component_remove_alarm (self->component, alarm_uid); g_hash_table_remove (self->alarms, GINT_TO_POINTER (type)); + + e_cal_component_commit_sequence (self->component); } } @@ -1292,6 +1320,7 @@ if (g_strcmp0 (current_location, location) != 0) { e_cal_component_set_location (self->component, (location && *location) ? location : NULL); + e_cal_component_commit_sequence (self->component); g_clear_pointer (&self->location, g_free); self->location = g_strdup (location ? location : ""); @@ -1621,6 +1650,8 @@ i_cal_component_add_property (icalcomp, prop); } + e_cal_component_commit_sequence (self->component); + g_clear_object (&rrule); g_clear_object (&prop); } @@ -1789,6 +1820,8 @@ i_cal_component_take_property (icalcomp, property); } + e_cal_component_commit_sequence (self->component); + GCAL_EXIT; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/src/core/gcal-event.h new/gnome-calendar-3.36.2/src/core/gcal-event.h --- old/gnome-calendar-3.36.1/src/core/gcal-event.h 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/src/core/gcal-event.h 2020-06-18 02:35:17.562492400 +0200 @@ -53,6 +53,8 @@ ECalComponent *component, GError **error); +GcalEvent* gcal_event_new_from_event (GcalEvent *self); + gboolean gcal_event_get_all_day (GcalEvent *self); void gcal_event_set_all_day (GcalEvent *self, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/src/core/gcal-manager.c new/gnome-calendar-3.36.2/src/core/gcal-manager.c --- old/gnome-calendar-3.36.1/src/core/gcal-manager.c 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/src/core/gcal-manager.c 2020-06-18 02:35:17.562492400 +0200 @@ -1099,6 +1099,8 @@ clone = e_cal_component_clone (ecomponent); comp = e_cal_component_get_icalcomponent (clone); + g_assert (clone != NULL); + e_cal_client_create_object_sync (gcal_calendar_get_client (calendar), comp, E_CAL_OPERATION_FLAG_NONE, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/src/gui/gcal-edit-dialog.c new/gnome-calendar-3.36.2/src/gui/gcal-edit-dialog.c --- old/gnome-calendar-3.36.1/src/gui/gcal-edit-dialog.c 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/src/gui/gcal-edit-dialog.c 2020-06-18 02:35:17.572492400 +0200 @@ -387,6 +387,7 @@ e_cal_component_set_recurid (comp, NULL); e_cal_component_set_rrules (comp, NULL); + e_cal_component_commit_sequence (comp); } static gchar* @@ -654,6 +655,140 @@ } } +static void +apply_changes_to_event (GcalEditDialog *self) +{ + GcalRecurrenceFrequency freq; + GcalRecurrence *old_recur; + GDateTime *start_date, *end_date; + gboolean was_all_day; + gboolean all_day; + gchar *note_text; + gsize i; + + /* Update summary */ + gcal_event_set_summary (self->event, gtk_entry_get_text (GTK_ENTRY (self->summary_entry))); + + /* Update description */ + g_object_get (G_OBJECT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->notes_text))), + "text", ¬e_text, + NULL); + + gcal_event_set_description (self->event, note_text); + g_free (note_text); + + all_day = gtk_switch_get_active (self->all_day_switch); + was_all_day = gcal_event_get_all_day (self->event); + + if (!was_all_day && all_day) + gcal_event_save_original_timezones (self->event); + + /* + * Update start & end dates. The dates are already translated to the current + * timezone (unless the event used to be all day, but no longer is). + */ + start_date = get_date_start (self); + end_date = get_date_end (self); + +#ifdef GCAL_ENABLE_TRACE + { + g_autofree gchar *start_dt_string = g_date_time_format (start_date, "%x %X %z"); + g_autofree gchar *end_dt_string = g_date_time_format (end_date, "%x %X %z"); + + g_debug ("New start date: %s", start_dt_string); + g_debug ("New end date: %s", end_dt_string); + } +#endif + + gcal_event_set_all_day (self->event, all_day); + + /* + * The end date for multi-day events is exclusive, so we bump it by a day. + * This fixes the discrepancy between the end day of the event and how it + * is displayed in the month view. See bug 769300. + */ + if (all_day) + { + GDateTime *fake_end_date = g_date_time_add_days (end_date, 1); + + g_clear_pointer (&end_date, g_date_time_unref); + end_date = fake_end_date; + } + else if (!all_day && was_all_day) + { + /* When an all day event is changed to be not an all day event, we + * need to correct for the fact that the event's timezone was until + * now set to UTC. That means we need to change the timezone to + * localtime now, or else it will be saved incorrectly. + */ + GDateTime *localtime_date; + + localtime_date = g_date_time_to_local (start_date); + g_clear_pointer (&start_date, g_date_time_unref); + start_date = localtime_date; + + localtime_date = g_date_time_to_local (end_date); + g_clear_pointer (&end_date, g_date_time_unref); + end_date = localtime_date; + } + + gcal_event_set_date_start (self->event, start_date); + gcal_event_set_date_end (self->event, end_date); + + g_clear_pointer (&start_date, g_date_time_unref); + g_clear_pointer (&end_date, g_date_time_unref); + + /* Update alarms */ + gcal_event_remove_all_alarms (self->event); + + for (i = 0; i < self->alarms->len; i++) + gcal_event_add_alarm (self->event, g_ptr_array_index (self->alarms, i)); + + clear_alarms (self); + + /* Check Repeat popover and set recurrence-rules accordingly */ + old_recur = gcal_event_get_recurrence (self->event); + freq = gtk_combo_box_get_active (GTK_COMBO_BOX (self->repeat_combo)); + + if (freq != GCAL_RECURRENCE_NO_REPEAT) + { + GcalRecurrence *recur; + + recur = gcal_recurrence_new (); + recur->frequency = freq; + recur->limit_type = gtk_combo_box_get_active (GTK_COMBO_BOX (self->repeat_duration_combo)); + + if (recur->limit_type == GCAL_RECURRENCE_UNTIL) + recur->limit.until = gcal_date_selector_get_date (GCAL_DATE_SELECTOR (self->until_date_selector)); + else if (recur->limit_type == GCAL_RECURRENCE_COUNT) + recur->limit.count = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (self->number_of_occurrences_spin)); + + /* Only apply the new recurrence if it's different from the old one */ + if (!gcal_recurrence_is_equal (old_recur, recur)) + { + /* Remove the previous recurrence... */ + remove_recurrence_properties (self->event); + + /* ... and set the new one */ + gcal_event_set_recurrence (self->event, recur); + + self->recurrence_changed = TRUE; + } + + g_clear_pointer (&recur, gcal_recurrence_unref); + } + else + { + /* When NO_REPEAT is set, make sure to remove the old recurrent */ + remove_recurrence_properties (self->event); + + /* If the recurrence from an recurrent event was removed, mark it as changed */ + if (old_recur && old_recur->frequency != GCAL_RECURRENCE_NO_REPEAT) + self->recurrence_changed = TRUE; + } +} + + /* * Callbacks */ @@ -791,138 +926,16 @@ } else { - GcalRecurrenceFrequency freq; - GcalRecurrence *old_recur; GcalCalendar *calendar; - GDateTime *start_date, *end_date; - gboolean was_all_day; - gboolean all_day; - gchar *note_text; - gsize i; - - /* Update summary */ - gcal_event_set_summary (self->event, gtk_entry_get_text (GTK_ENTRY (self->summary_entry))); - - /* Update description */ - g_object_get (G_OBJECT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->notes_text))), - "text", ¬e_text, - NULL); - - gcal_event_set_description (self->event, note_text); - g_free (note_text); - - all_day = gtk_switch_get_active (self->all_day_switch); - was_all_day = gcal_event_get_all_day (self->event); - - if (!was_all_day && all_day) - gcal_event_save_original_timezones (self->event); - - /* - * Update start & end dates. The dates are already translated to the current - * timezone (unless the event used to be all day, but no longer is). - */ - start_date = get_date_start (self); - end_date = get_date_end (self); - -#ifdef GCAL_ENABLE_TRACE - { - g_autofree gchar *start_dt_string = g_date_time_format (start_date, "%x %X %z"); - g_autofree gchar *end_dt_string = g_date_time_format (end_date, "%x %X %z"); - - g_debug ("New start date: %s", start_dt_string); - g_debug ("New end date: %s", end_dt_string); - } -#endif - - gcal_event_set_all_day (self->event, all_day); - - /* - * The end date for multi-day events is exclusive, so we bump it by a day. - * This fixes the discrepancy between the end day of the event and how it - * is displayed in the month view. See bug 769300. - */ - if (all_day) - { - GDateTime *fake_end_date = g_date_time_add_days (end_date, 1); - - g_clear_pointer (&end_date, g_date_time_unref); - end_date = fake_end_date; - } - else if (!all_day && was_all_day) - { - /* When an all day event is changed to be not an all day event, we - * need to correct for the fact that the event's timezone was until - * now set to UTC. That means we need to change the timezone to - * localtime now, or else it will be saved incorrectly. - */ - GDateTime *localtime_date; - - localtime_date = g_date_time_to_local (start_date); - g_clear_pointer (&start_date, g_date_time_unref); - start_date = localtime_date; - - localtime_date = g_date_time_to_local (end_date); - g_clear_pointer (&end_date, g_date_time_unref); - end_date = localtime_date; - } - - gcal_event_set_date_start (self->event, start_date); - gcal_event_set_date_end (self->event, end_date); - - g_clear_pointer (&start_date, g_date_time_unref); - g_clear_pointer (&end_date, g_date_time_unref); - - /* Update alarms */ - gcal_event_remove_all_alarms (self->event); - - for (i = 0; i < self->alarms->len; i++) - gcal_event_add_alarm (self->event, g_ptr_array_index (self->alarms, i)); - - clear_alarms (self); - - /* Check Repeat popover and set recurrence-rules accordingly */ - old_recur = gcal_event_get_recurrence (self->event); - freq = gtk_combo_box_get_active (GTK_COMBO_BOX (self->repeat_combo)); - - if (freq != GCAL_RECURRENCE_NO_REPEAT) - { - GcalRecurrence *recur; + gint response; - recur = gcal_recurrence_new (); - recur->frequency = freq; - recur->limit_type = gtk_combo_box_get_active (GTK_COMBO_BOX (self->repeat_duration_combo)); - - if (recur->limit_type == GCAL_RECURRENCE_UNTIL) - recur->limit.until = gcal_date_selector_get_date (GCAL_DATE_SELECTOR (self->until_date_selector)); - else if (recur->limit_type == GCAL_RECURRENCE_COUNT) - recur->limit.count = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (self->number_of_occurrences_spin)); + apply_changes_to_event (self); - /* Only apply the new recurrence if it's different from the old one */ - if (!gcal_recurrence_is_equal (old_recur, recur)) - { - /* Remove the previous recurrence... */ - remove_recurrence_properties (self->event); - - /* ... and set the new one */ - gcal_event_set_recurrence (self->event, recur); - - self->recurrence_changed = TRUE; - } - - g_clear_pointer (&recur, gcal_recurrence_unref); - } - else - { - /* When NO_REPEAT is set, make sure to remove the old recurrent */ - remove_recurrence_properties (self->event); - - /* If the recurrence from an recurrent event was removed, mark it as changed */ - if (old_recur && old_recur->frequency != GCAL_RECURRENCE_NO_REPEAT) - self->recurrence_changed = TRUE; - } + response = self->event_is_new ? GCAL_RESPONSE_CREATE_EVENT : GCAL_RESPONSE_SAVE_EVENT; /* Update the source if needed */ calendar = gcal_event_get_calendar (self->event); + if (self->selected_calendar && calendar != self->selected_calendar) { if (self->event_is_new) @@ -934,14 +947,14 @@ gcal_manager_move_event_to_source (gcal_context_get_manager (self->context), self->event, gcal_calendar_get_source (self->selected_calendar)); + response = GTK_RESPONSE_CANCEL; } } self->selected_calendar = NULL; /* Send the response */ - gtk_dialog_response (GTK_DIALOG (self), - self->event_is_new ? GCAL_RESPONSE_CREATE_EVENT : GCAL_RESPONSE_SAVE_EVENT); + gtk_dialog_response (GTK_DIALOG (self), response); } GCAL_EXIT; @@ -1430,6 +1443,7 @@ gcal_edit_dialog_set_event (GcalEditDialog *self, GcalEvent *event) { + g_autoptr (GcalEvent) cloned_event = NULL; GcalRecurrenceLimitType limit_type; GcalRecurrenceFrequency frequency; GcalRecurrence *recur; @@ -1445,7 +1459,7 @@ g_return_if_fail (GCAL_IS_EDIT_DIALOG (self)); - g_set_object (&self->event, event); + g_clear_object (&self->event); self->setting_event = TRUE; @@ -1459,8 +1473,11 @@ if (!event) GCAL_GOTO (out); + cloned_event = gcal_event_new_from_event (event); + self->event = g_object_ref (cloned_event); + /* Recurrences */ - recur = gcal_event_get_recurrence (event); + recur = gcal_event_get_recurrence (cloned_event); frequency = recur ? recur->frequency : GCAL_RECURRENCE_NO_REPEAT; limit_type = recur ? recur->limit_type : GCAL_RECURRENCE_FOREVER; @@ -1492,8 +1509,8 @@ break; } - all_day = gcal_event_get_all_day (event); - calendar = gcal_event_get_calendar (event); + all_day = gcal_event_get_all_day (cloned_event); + calendar = gcal_event_get_calendar (cloned_event); /* Clear event data */ gcal_edit_dialog_clear_data (self); @@ -1506,7 +1523,7 @@ /* Load new event data */ /* summary */ - summary = gcal_event_get_summary (event); + summary = gcal_event_get_summary (cloned_event); if (g_strcmp0 (summary, "") == 0) gtk_entry_set_text (GTK_ENTRY (self->summary_entry), _("Unnamed event")); @@ -1514,7 +1531,7 @@ gtk_entry_set_text (GTK_ENTRY (self->summary_entry), summary); /* dialog titlebar's title & subtitle */ - surface = get_circle_surface_from_color (gcal_event_get_color (event), 10); + surface = get_circle_surface_from_color (gcal_event_get_color (cloned_event), 10); gtk_image_set_from_surface (GTK_IMAGE (self->source_image), surface); g_clear_pointer (&surface, cairo_surface_destroy); @@ -1522,10 +1539,10 @@ self->selected_calendar = calendar; /* retrieve start and end dates */ - date_start = gcal_event_get_date_start (event); + date_start = gcal_event_get_date_start (cloned_event); date_start = all_day ? g_date_time_ref (date_start) : g_date_time_to_local (date_start); - date_end = gcal_event_get_date_end (event); + date_end = gcal_event_get_date_end (cloned_event); /* * This is subtracting what has been added in action_button_clicked (). * See bug 769300. @@ -1561,11 +1578,11 @@ self->recurrence_changed = FALSE; /* location */ - gtk_entry_set_text (GTK_ENTRY (self->location_entry), gcal_event_get_location (event)); + gtk_entry_set_text (GTK_ENTRY (self->location_entry), gcal_event_get_location (cloned_event)); /* notes */ gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->notes_text)), - gcal_event_get_description (event), + gcal_event_get_description (cloned_event), -1); set_writable (self, !gcal_calendar_is_read_only (calendar)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/src/utils/gcal-date-time-utils.c new/gnome-calendar-3.36.2/src/utils/gcal-date-time-utils.c --- old/gnome-calendar-3.36.1/src/utils/gcal-date-time-utils.c 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/src/utils/gcal-date-time-utils.c 2020-06-18 02:35:17.575825700 +0200 @@ -84,7 +84,7 @@ first_weekday = get_first_weekday (); weekday = g_date_time_get_day_of_week (date) % 7; - n_days_after_week_start = (weekday - first_weekday) % 7; + n_days_after_week_start = (7 + weekday - first_weekday) % 7; start_of_week = g_date_time_add_days (date, -n_days_after_week_start); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/src/views/gcal-month-cell.c new/gnome-calendar-3.36.2/src/views/gcal-month-cell.c --- old/gnome-calendar-3.36.1/src/views/gcal-month-cell.c 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/src/views/gcal-month-cell.c 2020-06-18 02:35:17.575825700 +0200 @@ -22,6 +22,7 @@ #include "config.h" #include "gcal-application.h" #include "gcal-clock.h" +#include "gcal-debug.h" #include "gcal-event-widget.h" #include "gcal-utils.h" #include "gcal-month-cell.h" @@ -203,6 +204,7 @@ gint y, guint time) { + g_autoptr (GcalEvent) changed_event = NULL; GcalRecurrenceModType mod; GcalMonthCell *self; GcalCalendar *calendar; @@ -218,24 +220,27 @@ event_widget = gtk_drag_get_source_widget (context); mod = GCAL_RECURRENCE_MOD_THIS_ONLY; + GCAL_ENTRY; + if (!GCAL_IS_EVENT_WIDGET (event_widget)) - return FALSE; + GCAL_RETURN (FALSE); if (self->different_month) - return FALSE; + GCAL_RETURN (FALSE); event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (event_widget)); - calendar = gcal_event_get_calendar (event); + changed_event = gcal_event_new_from_event (event); + calendar = gcal_event_get_calendar (changed_event); - if (gcal_event_has_recurrence (event) && + if (gcal_event_has_recurrence (changed_event) && !ask_recurrence_modification_type (widget, &mod, calendar)) { - goto out; + GCAL_GOTO (out); } /* Move the event's date */ - start_dt = gcal_event_get_date_start (event); - end_dt = gcal_event_get_date_end (event); + start_dt = gcal_event_get_date_start (changed_event); + end_dt = gcal_event_get_date_end (changed_event); start_month = g_date_time_get_month (start_dt); start_year = g_date_time_get_year (start_dt); @@ -260,18 +265,18 @@ new_start = g_date_time_add_days (start_dt, diff); - gcal_event_set_date_start (event, new_start); + gcal_event_set_date_start (changed_event, new_start); /* The event may have a NULL end date, so we have to check it here */ if (end_dt) { GDateTime *new_end = g_date_time_add (new_start, timespan); - gcal_event_set_date_end (event, new_end); + gcal_event_set_date_end (changed_event, new_end); g_clear_pointer (&new_end, g_date_time_unref); } - gcal_manager_update_event (gcal_context_get_manager (self->context), event, mod); + gcal_manager_update_event (gcal_context_get_manager (self->context), changed_event, mod); } g_clear_pointer (&start_dt, g_date_time_unref); @@ -281,7 +286,7 @@ gtk_drag_unhighlight (widget); gtk_drag_finish (context, TRUE, FALSE, time); - return TRUE; + GCAL_RETURN (TRUE); } static void diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/src/views/gcal-week-grid.c new/gnome-calendar-3.36.2/src/views/gcal-week-grid.c --- old/gnome-calendar-3.36.1/src/views/gcal-week-grid.c 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/src/views/gcal-week-grid.c 2020-06-18 02:35:17.579159000 +0200 @@ -575,12 +575,12 @@ for (j = 0; widgets_data && j < widgets_data->len; j++) { + g_autoptr (GDateTime) event_start = NULL; + g_autoptr (GDateTime) event_end = NULL; GtkStyleContext *context; GtkAllocation child_allocation; GtkWidget *event_widget; GcalRange *event_range; - GDateTime *event_start; - GDateTime *event_end; ChildData *data; GtkBorder margin; guint64 events_at_range; @@ -594,8 +594,8 @@ data = g_ptr_array_index (widgets_data, j); event_widget = data->widget; event_range = gcal_event_get_range (data->event); - event_start = gcal_event_get_date_start (data->event); - event_end = gcal_event_get_date_end (data->event); + event_start = g_date_time_to_local (gcal_event_get_date_start (data->event)); + event_end = g_date_time_to_local (gcal_event_get_date_end (data->event)); context = gtk_widget_get_style_context (event_widget); /* The total number of events available in this range */ @@ -900,11 +900,12 @@ gint y, guint time) { + g_autoptr (GDateTime) week_start = NULL; + g_autoptr (GDateTime) dnd_date = NULL; + g_autoptr (GDateTime) new_end = NULL; + g_autoptr (GcalEvent) changed_event = NULL; GcalRecurrenceModType mod; GcalWeekGrid *self; - g_autoptr (GDateTime) week_start; - g_autoptr (GDateTime) dnd_date; - g_autoptr (GDateTime) new_end; GcalCalendar *calendar; GtkWidget *event_widget; GcalEvent *event; @@ -918,9 +919,6 @@ event_widget = gtk_drag_get_source_widget (context); mod = GCAL_RECURRENCE_MOD_THIS_ONLY; - week_start = NULL; - dnd_date = NULL; - new_end = NULL; if (!GCAL_IS_EVENT_WIDGET (event_widget)) return FALSE; @@ -937,9 +935,10 @@ } event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (event_widget)); - calendar = gcal_event_get_calendar (event); + changed_event = gcal_event_new_from_event (event); + calendar = gcal_event_get_calendar (changed_event); - if (gcal_event_has_recurrence (event) && + if (gcal_event_has_recurrence (changed_event) && !ask_recurrence_modification_type (widget, &mod, calendar)) { goto out; @@ -952,23 +951,23 @@ * Calculate the diff between the dropped cell and the event's start date, * so we can update the end date accordingly. */ - timespan = g_date_time_difference (gcal_event_get_date_end (event), gcal_event_get_date_start (event)); + timespan = g_date_time_difference (gcal_event_get_date_end (changed_event), gcal_event_get_date_start (changed_event)); /* * Set the event's start and end dates. Since the event may have a * NULL end date, so we have to check it here */ - gcal_event_set_all_day (event, FALSE); - gcal_event_set_date_start (event, dnd_date); + gcal_event_set_all_day (changed_event, FALSE); + gcal_event_set_date_start (changed_event, dnd_date); /* Setup the new end date */ new_end = g_date_time_add (dnd_date, timespan); - gcal_event_set_date_end (event, new_end); + gcal_event_set_date_end (changed_event, new_end); /* Commit the changes */ - gcal_manager_update_event (gcal_context_get_manager (self->context), event, mod); + gcal_manager_update_event (gcal_context_get_manager (self->context), changed_event, mod); out: /* Cancel the DnD */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/src/views/gcal-week-header.c new/gnome-calendar-3.36.2/src/views/gcal-week-header.c --- old/gnome-calendar-3.36.1/src/views/gcal-week-header.c 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/src/views/gcal-week-header.c 2020-06-18 02:35:17.579159000 +0200 @@ -1525,11 +1525,12 @@ gint y, guint time) { + g_autoptr (GDateTime) week_start = NULL; + g_autoptr (GDateTime) dnd_date = NULL; + g_autoptr (GDateTime) new_end = NULL; + g_autoptr (GDateTime) tmp_dt = NULL; + g_autoptr (GcalEvent) changed_event = NULL; GcalWeekHeader *self; - g_autoptr (GDateTime) week_start; - g_autoptr (GDateTime) dnd_date; - g_autoptr (GDateTime) new_end; - g_autoptr (GDateTime) tmp_dt; GDateTime *start_date; GDateTime *end_date; GTimeSpan difference; @@ -1546,11 +1547,6 @@ drop_cell = get_dnd_cell (widget, x, y); event_widget = gtk_drag_get_source_widget (context); - week_start = NULL; - dnd_date = NULL; - new_end = NULL; - tmp_dt = NULL; - if (!GCAL_IS_EVENT_WIDGET (event_widget)) return FALSE; @@ -1559,11 +1555,12 @@ drop_cell = 6 - drop_cell; 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); + changed_event = gcal_event_new_from_event (event); + start_date = gcal_event_get_date_start (changed_event); + end_date = gcal_event_get_date_end (changed_event); 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); + turn_all_day = !gcal_event_is_multiday (changed_event) || gcal_event_get_all_day (changed_event); if (!turn_all_day) { @@ -1592,20 +1589,20 @@ difference = turn_all_day ? 24 : g_date_time_difference (end_date, start_date) / G_TIME_SPAN_HOUR; new_end = g_date_time_add_hours (dnd_date, difference); - gcal_event_set_date_end (event, new_end); + gcal_event_set_date_end (changed_event, new_end); /* * Set the start date ~after~ the end date, so we can compare * the event's start and end dates above */ - gcal_event_set_date_start (event, dnd_date); + gcal_event_set_date_start (changed_event, dnd_date); if (turn_all_day) - gcal_event_set_all_day (event, TRUE); + gcal_event_set_all_day (changed_event, TRUE); /* Commit the changes */ gcal_manager_update_event (gcal_context_get_manager (self->context), - event, + changed_event, GCAL_RECURRENCE_MOD_THIS_ONLY); /* Cancel the DnD */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/src/views/gcal-year-view.c new/gnome-calendar-3.36.2/src/views/gcal-year-view.c --- old/gnome-calendar-3.36.1/src/views/gcal-year-view.c 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/src/views/gcal-year-view.c 2020-06-18 02:35:17.579159000 +0200 @@ -1485,6 +1485,7 @@ if (!is_title) { + g_autoptr (GcalEvent) changed_event = NULL; GcalRecurrenceModType mod; GcalEventWidget *event_widget; GcalCalendar *calendar; @@ -1494,17 +1495,18 @@ event_widget = GCAL_EVENT_WIDGET (gtk_drag_get_source_widget (context)); event = gcal_event_widget_get_event (event_widget); - calendar = gcal_event_get_calendar (event); + changed_event = gcal_event_new_from_event (event); + calendar = gcal_event_get_calendar (changed_event); mod = GCAL_RECURRENCE_MOD_THIS_ONLY; - if (gcal_event_has_recurrence (event) && + if (gcal_event_has_recurrence (changed_event) && !ask_recurrence_modification_type (GTK_WIDGET (self), &mod, calendar)) { goto out; } - start_dt = gcal_event_get_date_start (event); - end_dt = gcal_event_get_date_end (event); + start_dt = gcal_event_get_date_start (changed_event); + end_dt = gcal_event_get_date_end (changed_event); drop_date = g_date_time_add_full (start_dt, g_date_time_get_year (self->date) - g_date_time_get_year (start_dt), @@ -1518,7 +1520,7 @@ GDateTime *new_start; new_start = g_date_time_add (start_dt, diff); - gcal_event_set_date_start (event, new_start); + gcal_event_set_date_start (changed_event, new_start); /* The event may have a NULL end date, so we have to check it here */ if (end_dt) @@ -1526,12 +1528,14 @@ GDateTime *new_end; new_end = g_date_time_add (end_dt, diff); - gcal_event_set_date_end (event, new_end); + gcal_event_set_date_end (changed_event, new_end); g_clear_pointer (&new_end, g_date_time_unref); } - gcal_manager_update_event (gcal_context_get_manager (self->context), event, mod); + gcal_manager_update_event (gcal_context_get_manager (self->context), + changed_event, + mod); g_clear_pointer (&new_start, g_date_time_unref); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-calendar-3.36.1/tests/test-event.c new/gnome-calendar-3.36.2/tests/test-event.c --- old/gnome-calendar-3.36.1/tests/test-event.c 2020-04-16 22:07:39.000000000 +0200 +++ new/gnome-calendar-3.36.2/tests/test-event.c 2020-06-18 02:35:17.579159000 +0200 @@ -82,6 +82,31 @@ /*********************************************************************************************************************/ static void +event_clone (void) +{ + g_autoptr (GcalEvent) clone1 = NULL; + g_autoptr (GcalEvent) clone2 = NULL; + g_autoptr (GcalEvent) event = NULL; + g_autoptr (GError) error = NULL; + + event = create_event_for_string (STUB_EVENT, &error); + + g_assert_no_error (error); + g_assert_nonnull (event); + + clone1 = gcal_event_new_from_event (event); + g_assert_nonnull (clone1); + + gcal_event_set_summary (event, "Another summary"); + + clone2 = gcal_event_new_from_event (event); + g_assert_nonnull (clone2); +} + + +/*********************************************************************************************************************/ + +static void event_uid (void) { g_autoptr (GcalEvent) event = NULL; @@ -227,6 +252,7 @@ g_test_init (&argc, &argv, NULL); g_test_add_func ("/event/new", event_new); + g_test_add_func ("/event/clone", event_clone); g_test_add_func ("/event/uid", event_uid); g_test_add_func ("/event/summary", event_summary); g_test_add_func ("/event/date/start", event_date_start); @@ -236,4 +262,3 @@ return g_test_run (); } -