From e21aa6b8695dd6fba7424e9e264549a989788cfe Mon Sep 17 00:00:00 2001 From: Jens Lody Date: Sat, 26 Oct 2013 18:08:46 +0200 Subject: [PATCH] Use different timers to update actual weather and forecast (save bandwidth on owm-server); minimal update interval is 10 min --- ...me.shell.extensions.weather.gschema.xml.in | 10 ++- src/extension.js | 62 ++++++++++++++----- src/prefs.js | 25 ++++++-- 3 files changed, 75 insertions(+), 22 deletions(-) diff --git a/data/org.gnome.shell.extensions.weather.gschema.xml.in b/data/org.gnome.shell.extensions.weather.gschema.xml.in index 6985f6f..e1600c5 100644 --- a/data/org.gnome.shell.extensions.weather.gschema.xml.in +++ b/data/org.gnome.shell.extensions.weather.gschema.xml.in @@ -84,9 +84,13 @@ 'center' <_summary>Position in Panel - - 300 - <_summary>Refresh interval + + 600 + <_summary>Refresh interval (actual weather) + + + 3600 + <_summary>Refresh interval (forecast) false diff --git a/src/extension.js b/src/extension.js index 1b10160..4cea0ce 100644 --- a/src/extension.js +++ b/src/extension.js @@ -67,7 +67,8 @@ const WEATHER_USE_SYMBOLIC_ICONS_KEY = 'use-symbolic-icons'; const WEATHER_SHOW_TEXT_IN_PANEL_KEY = 'show-text-in-panel'; const WEATHER_POSITION_IN_PANEL_KEY = 'position-in-panel'; const WEATHER_SHOW_COMMENT_IN_PANEL_KEY = 'show-comment-in-panel'; -const WEATHER_REFRESH_INTERVAL = 'refresh-interval'; +const WEATHER_REFRESH_INTERVAL_CURRENT = 'refresh-interval-current'; +const WEATHER_REFRESH_INTERVAL_FORECAST = 'refresh-interval-forecast'; const WEATHER_CENTER_FORECAST_KEY = 'center-forecast'; const WEATHER_DAYS_FORECAST = 'days-forecast'; @@ -235,7 +236,8 @@ const WeatherMenuButton = new Lang.Class({ let item = new PopupMenu.PopupMenuItem(_("Reload Weather Information")); item.connect('activate', Lang.bind(this, function() { - this.refreshWeather(false); + this.refreshWeatherCurrent(false); + this.refreshWeatherForecast(false); })); this.menu.addMenuItem(item); @@ -250,7 +252,8 @@ const WeatherMenuButton = new Lang.Class({ this.rebuildFutureWeatherUi(); // Show weather - this.refreshWeather(true); + this.refreshWeatherCurrent(true); + this.refreshWeatherForecast(true); this.menu.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged)); }, @@ -275,7 +278,8 @@ const WeatherMenuButton = new Lang.Class({ this._settings = Convenience.getSettings(WEATHER_SETTINGS_SCHEMA); this._settingsC = this._settings.connect("changed", function() { that.rebuildFutureWeatherUi(); - that.refreshWeather(false); + that.refreshWeatherCurrent(false); + that.refreshWeatherForecast(false); }); }, @@ -288,7 +292,8 @@ const WeatherMenuButton = new Lang.Class({ schema: schemaInterface }); this._settingsInterfaceC = this._settingsInterface.connect("changed", function() { - that.refreshWeather(false); + that.refreshWeatherCurrent(false); + that.refreshWeatherForecast(false); }); }, @@ -489,16 +494,30 @@ const WeatherMenuButton = new Lang.Class({ this._settings.set_boolean(WEATHER_SHOW_COMMENT_IN_PANEL_KEY, v); }, - get _refresh_interval() { + get _refresh_interval_current() { if (!this._settings) this.loadConfig(); - return this._settings.get_int(WEATHER_REFRESH_INTERVAL); + let v = this._settings.get_int(WEATHER_REFRESH_INTERVAL_CURRENT); + return ((v >= 600)?v:600); }, - set _refresh_interval(v) { + set _refresh_interval_current(v) { if (!this._settings) this.loadConfig(); - this._settings.set_int(WEATHER_REFRESH_INTERVAL, v); + this._settings.set_int(WEATHER_REFRESH_INTERVAL_CURRENT, ((v >= 600)?v:600)); + }, + + get _refresh_interval_forecast() { + if (!this._settings) + this.loadConfig(); + let v = this._settings.get_int(WEATHER_REFRESH_INTERVAL_FORECAST); + return ((v >= 600)?v:600); + }, + + set _refresh_interval_forecast(v) { + if (!this._settings) + this.loadConfig(); + this._settings.set_int(WEATHER_REFRESH_INTERVAL_FORECAST, ((v >= 600)?v:600)); }, get _center_forecast() { @@ -607,7 +626,6 @@ const WeatherMenuButton = new Lang.Class({ for (let a in cities) { if (!this.extractCity(cities[a])) { - this._weatherInfo.text = encodeURI('http://api.openweathermap.org/data/2.5/weather?q=' + cities[a] + '&type=accurate'); this.load_json_async(encodeURI('http://api.openweathermap.org/data/2.5/weather?q=' + cities[a] + '&type=like'), function() { let city = arguments[0]; @@ -631,7 +649,8 @@ const WeatherMenuButton = new Lang.Class({ } else continue; } - this.refreshWeather(); + this.refreshWeatherCurrent(false); + this.refreshWeatherForecast(false); return; }, @@ -1051,7 +1070,7 @@ weather-storm.png = weather-storm-symbolic.svg return 0; }, - refreshWeather: function(recurse) { + refreshWeatherCurrent: function(recurse) { if (!this.extractId(this._city)) { this.updateCities(); return 0; @@ -1290,6 +1309,21 @@ weather-storm.png = weather-storm-symbolic.svg return 0; }); + // Repeatedly refresh weather if recurse is set + if (recurse) { + this._timeoutCurrent = Mainloop.timeout_add_seconds(this._refresh_interval_current, Lang.bind(this, function() { + this.refreshWeatherCurrent(true); + })); + } + return 0; + }, + + refreshWeatherForecast: function(recurse) { + if (!this.extractId(this._city)) { + this.updateCities(); + return 0; + } + this.load_json_async(this.get_weather_forecast_url(), function(json) { if (!json) return 0; @@ -1377,8 +1411,8 @@ weather-storm.png = weather-storm-symbolic.svg // Repeatedly refresh weather if recurse is set if (recurse) { - this._timeoutS = Mainloop.timeout_add_seconds(this._refresh_interval, Lang.bind(this, function() { - this.refreshWeather(true); + this._timeoutForecast = Mainloop.timeout_add_seconds(this._refresh_interval_forecast, Lang.bind(this, function() { + this.refreshWeatherForecast(true); })); } return 0; diff --git a/src/prefs.js b/src/prefs.js index a9dc6bb..277fb14 100644 --- a/src/prefs.js +++ b/src/prefs.js @@ -53,7 +53,8 @@ const WEATHER_USE_SYMBOLIC_ICONS_KEY = 'use-symbolic-icons'; const WEATHER_SHOW_TEXT_IN_PANEL_KEY = 'show-text-in-panel'; const WEATHER_POSITION_IN_PANEL_KEY = 'position-in-panel'; const WEATHER_SHOW_COMMENT_IN_PANEL_KEY = 'show-comment-in-panel'; -const WEATHER_REFRESH_INTERVAL = 'refresh-interval'; +const WEATHER_REFRESH_INTERVAL_CURRENT = 'refresh-interval-current'; +const WEATHER_REFRESH_INTERVAL_FORECAST = 'refresh-interval-forecast'; const WEATHER_CENTER_FORECAST_KEY = 'center-forecast'; const WEATHER_DAYS_FORECAST = 'days-forecast'; @@ -696,16 +697,30 @@ const WeatherPrefsWidget = new GObject.Class({ this.Settings.set_boolean(WEATHER_SHOW_COMMENT_IN_PANEL_KEY, v); }, - get refresh_interval() { + get refresh_interval_current() { if (!this.Settings) this.loadConfig(); - return this.Settings.get_int(WEATHER_REFRESH_INTERVAL); + let v = this.Settings.get_int(WEATHER_REFRESH_INTERVAL_CURRENT); + return ((v >= 600)?v:600); }, - set refresh_interval(v) { + set refresh_interval_current(v) { if (!this.Settings) this.loadConfig(); - this.Settings.set_int(WEATHER_REFRESH_INTERVAL, v); + this.Settings.set_int(WEATHER_REFRESH_INTERVAL_CURRENT, ((v >= 600)?v:600)); + }, + + get refresh_interval_forecast() { + if (!this.Settings) + this.loadConfig(); + let v = this.Settings.get_int(WEATHER_REFRESH_INTERVAL_FORECAST); + return ((v >= 600)?v:600); + }, + + set refresh_interval_forecast(v) { + if (!this.Settings) + this.loadConfig(); + this.Settings.set_int(WEATHER_REFRESH_INTERVAL_FORECAST, ((v >= 600)?v:600)); }, get center_forecast() {