From 59fc26f8214e8cad343ef464c6e9fdf61ce2aea1 Mon Sep 17 00:00:00 2001 From: Martin Andersson Date: Thu, 13 Aug 2015 23:57:49 +0100 Subject: [PATCH] calendar: Rebuild the calendar when the time zone changes A time zone change can cause the date to change so we need to clear SpiderMonkey's time zone cache and rebuild the calendar. https://bugzilla.gnome.org/show_bug.cgi?id=678507 --- js/ui/calendar.js | 7 +++++++ js/ui/dateMenu.js | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/js/ui/calendar.js b/js/ui/calendar.js index 3db612f22..efa3f44a3 100644 --- a/js/ui/calendar.js +++ b/js/ui/calendar.js @@ -428,6 +428,13 @@ var Calendar = new Lang.Class({ this.emit('selected-date-changed', new Date(this._selectedDate)); }, + updateTimeZone: function() { + // The calendar need to be rebuilt after a time zone update because + // the date might have changed. + this._rebuildCalendar(); + this._update(); + }, + _buildHeader: function() { let layout = this.actor.layout_manager; let offsetCols = this._useWeekdate ? 1 : 0; diff --git a/js/ui/dateMenu.js b/js/ui/dateMenu.js index 0aad37eca..4f46a0da5 100644 --- a/js/ui/dateMenu.js +++ b/js/ui/dateMenu.js @@ -22,6 +22,7 @@ const PanelMenu = imports.ui.panelMenu; const PopupMenu = imports.ui.popupMenu; const Calendar = imports.ui.calendar; const Weather = imports.misc.weather; +const System = imports.system; function _isToday(date) { let now = new Date(); @@ -545,6 +546,7 @@ var DateMenuButton = new Lang.Class({ this._clock = new GnomeDesktop.WallClock(); this._clock.bind_property('clock', this._clockDisplay, 'text', GObject.BindingFlags.SYNC_CREATE); + this._clock.connect('notify::timezone', Lang.bind(this, this._updateTimeZone)); Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated)); this._sessionUpdated(); @@ -564,6 +566,15 @@ var DateMenuButton = new Lang.Class({ this._eventSource = eventSource; }, + _updateTimeZone: function() { + // SpiderMonkey caches the time zone so we must explicitly clear it + // before we can update the calendar, see + // https://bugzilla.gnome.org/show_bug.cgi?id=678507 + System.clearDateCaches(); + + this._calendar.updateTimeZone(); + }, + _sessionUpdated: function() { let eventSource; let showEvents = Main.sessionMode.showCalendarEvents;