diff --git a/src/extension.js b/src/extension.js index e8df4cf..54f476b 100644 --- a/src/extension.js +++ b/src/extension.js @@ -49,6 +49,7 @@ const Lang = imports.lang; const Mainloop = imports.mainloop; const Soup = imports.gi.Soup; const St = imports.gi.St; +const GnomeSession = imports.misc.gnomeSession; const Util = imports.misc.util; const _ = Gettext.gettext; @@ -199,6 +200,8 @@ const OpenweatherMenuButton = new Lang.Class({ else Main.panel._menus.addMenu(this.menu); + this._session = new GnomeSession.SessionManager(); + this._old_position_in_panel = this._position_in_panel; // Current weather @@ -250,6 +253,14 @@ const OpenweatherMenuButton = new Lang.Class({ this._network_monitor = Gio.network_monitor_get_default(); + this._presence = new GnomeSession.Presence(Lang.bind(this, function(proxy, error) { + this._onStatusChanged(proxy.status); + })); + this._presence_connection = this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) { + this._onStatusChanged(status); + })); + + this._idle = false; this._connected = false; this._network_monitor_connection = this._network_monitor.connect('network-changed', Lang.bind(this, this._onNetworkStateChanged)); this._checkConnectionState(); @@ -257,6 +268,14 @@ const OpenweatherMenuButton = new Lang.Class({ this.menu.connect('open-state-changed', Lang.bind(this, this.recalcLayout)); }, + _onStatusChanged: function(status) { + this._idle = false; + + if (status == GnomeSession.PresenceStatus.IDLE) { + this._idle = true; + } + }, + stop: function() { if (_httpSession !== undefined) _httpSession.abort(); @@ -273,6 +292,11 @@ const OpenweatherMenuButton = new Lang.Class({ this._timeoutForecast = undefined; + if (this._presence_connection) { + this._presence.disconnect(this._presence_connection); + this._presence_connection = undefined; + } + if (this._network_monitor_connection) { this._network_monitor.disconnect(this._network_monitor_connection); this._network_monitor_connection = undefined; @@ -937,6 +961,7 @@ const OpenweatherMenuButton = new Lang.Class({ }, load_json_async: function(url, params, fun) { + // log(new Error().fileName+':'+new Error().lineNumber+' => url = '+url); if (_httpSession === undefined) { _httpSession = new Soup.Session(); } @@ -1132,13 +1157,13 @@ const OpenweatherMenuButton = new Lang.Class({ reloadWeatherCurrent: function(interval) { if (this._timeoutCurrent) { Mainloop.source_remove(this._timeoutCurrent); + this._timeoutCurrent = undefined; } this._timeoutCurrent = Mainloop.timeout_add_seconds(interval, Lang.bind(this, function() { - this.currentWeatherCache = undefined; - if (this._connected) - this.parseWeatherCurrent(); - else - this.rebuildCurrentWeatherUi(); + // only invalidate cached data, if we can connect the weather-providers server + if (this._connected && !this._idle) + this.currentWeatherCache = undefined; + this.parseWeatherCurrent(); return true; })); }, @@ -1146,13 +1171,13 @@ const OpenweatherMenuButton = new Lang.Class({ reloadWeatherForecast: function(interval) { if (this._timeoutForecast) { Mainloop.source_remove(this._timeoutForecast); + this._timeoutForecast = undefined; } this._timeoutForecast = Mainloop.timeout_add_seconds(interval, Lang.bind(this, function() { - this.forecastWeatherCache = undefined; - if (this._connected) - this.parseWeatherForecast(); - else - this.rebuildFutureWeatherUi(); + // only invalidate cached data, if we can connect the weather-providers server + if (this._connected && !this._idle) + this.forecastWeatherCache = undefined; + this.parseWeatherForecast(); return true; })); },