diff --git a/src/extension.js b/src/extension.js index 21e048b..9bc0784 100644 --- a/src/extension.js +++ b/src/extension.js @@ -30,6 +30,7 @@ const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; +const Gtk = imports.gi.Gtk; const Lang = imports.lang; const Mainloop = imports.mainloop; const Cairo = imports.cairo; @@ -101,6 +102,7 @@ WeatherMenuButton.prototype = { this._currentWeatherIcon.icon_type = this._icontype; this._forecast[0].Icon.icon_type = this._icontype; this._forecast[1].Icon.icon_type = this._icontype; + this.refreshWeather(false); })); // Panel icon @@ -176,109 +178,123 @@ WeatherMenuButton.prototype = { }, get_weather_icon: function(code) { - switch (parseInt(code, 10)) { /* see http://developer.yahoo.com/weather/#codetable */ + /* fallback icons are: weather-clear-night weather-clear weather-few-clouds-night weather-few-clouds weather-fog weather-overcast weather-severe-alert weather-showers weather-showers-scattered weather-snow weather-storm */ + switch (parseInt(code, 10)) { case 0:/* tornado */ - return 'weather-severe-alert'; + return ['weather-severe-alert']; case 1:/* tropical storm */ - return 'weather-severe-alert'; + return ['weather-severe-alert']; case 2:/* hurricane */ - return 'weather-severe-alert'; + return ['weather-severe-alert']; case 3:/* severe thunderstorms */ - return 'weather-severe-alert'; + return ['weather-severe-alert']; case 4:/* thunderstorms */ - return 'weather-storm'; + return ['weather-storm']; case 5:/* mixed rain and snow */ - return 'weather-snow-rain'; + return ['weather-snow-rain', 'weather-snow']; case 6:/* mixed rain and sleet */ - return 'weather-snow-rain'; + return ['weather-snow-rain', 'weather-snow']; case 7:/* mixed snow and sleet */ - return 'weather-snow'; + return ['weather-snow']; case 8:/* freezing drizzle */ - return 'weather-freezing-rain'; + return ['weather-freezing-rain', 'weather-showers']; case 9:/* drizzle */ - return 'weather-fog'; + return ['weather-fog']; case 10:/* freezing rain */ - return 'weather-freezing-rain'; + return ['weather-freezing-rain', 'weather-showers']; case 11:/* showers */ - return 'weather-showers'; + return ['weather-showers']; case 12:/* showers */ - return 'weather-showers'; + return ['weather-showers']; case 13:/* snow flurries */ - return 'weather-snow'; + return ['weather-snow']; case 14:/* light snow showers */ - return 'weather-snow'; + return ['weather-snow']; case 15:/* blowing snow */ - return 'weather-snow'; + return ['weather-snow']; case 16:/* snow */ - return 'weather-snow'; + return ['weather-snow']; case 17:/* hail */ - return 'weather-snow'; + return ['weather-snow']; case 18:/* sleet */ - return 'weather-snow'; + return ['weather-snow']; case 19:/* dust */ - return 'weather-fog'; + return ['weather-fog']; case 20:/* foggy */ - return 'weather-fog'; + return ['weather-fog']; case 21:/* haze */ - return 'weather-fog'; + return ['weather-fog']; case 22:/* smoky */ - return 'weather-fog'; + return ['weather-fog']; case 23:/* blustery */ - return 'weather-few-clouds'; + return ['weather-few-clouds']; case 24:/* windy */ - return 'weather-few-clouds'; + return ['weather-few-clouds']; case 25:/* cold */ - return 'weather-few-clouds'; + return ['weather-few-clouds']; case 26:/* cloudy */ - return 'weather-overcast'; + return ['weather-overcast']; case 27:/* mostly cloudy (night) */ - return 'weather-clouds-night'; + return ['weather-clouds-night', 'weather-few-clouds-night']; case 28:/* mostly cloudy (day) */ - return 'weather-clouds'; + return ['weather-clouds', 'weather-overcast']; case 29:/* partly cloudy (night) */ - return 'weather-few-clouds-night'; + return ['weather-few-clouds-night']; case 30:/* partly cloudy (day) */ - return 'weather-few-clouds'; + return ['weather-few-clouds']; case 31:/* clear (night) */ - return 'weather-clear-night'; + return ['weather-clear-night']; case 32:/* sunny */ - return 'weather-clear'; + return ['weather-clear']; case 33:/* fair (night) */ - return 'weather-clear-night'; + return ['weather-clear-night']; case 34:/* fair (day) */ - return 'weather-clear'; + return ['weather-clear']; case 35:/* mixed rain and hail */ - return 'weather-snow-rain'; + return ['weather-snow-rain', 'weather-showers']; case 36:/* hot */ - return 'weather-clear'; + return ['weather-clear']; case 37:/* isolated thunderstorms */ - return 'weather-storm'; + return ['weather-storm']; case 38:/* scattered thunderstorms */ case 39:/* scattered thunderstorms */ - return 'weather-storm'; + return ['weather-storm']; case 40:/* scattered showers */ - return 'weather-showers-scattered'; + return ['weather-showers-scattered', 'weather-showers']; case 41:/* heavy snow */ - return 'weather-snow'; + return ['weather-snow']; case 42:/* scattered snow showers */ - return 'weather-snow'; + return ['weather-snow']; case 43:/* heavy snow */ - return 'weather-snow'; + return ['weather-snow']; case 44:/* partly cloudy */ - return 'weather-few-clouds'; + return ['weather-few-clouds']; case 45:/* thundershowers */ - return 'weather-storm'; + return ['weather-storm']; case 46:/* snow showers */ - return 'weather-snow'; + return ['weather-snow']; case 47:/* isolated thundershowers */ - return 'weather-storm'; + return ['weather-storm']; case 3200:/* not available */ default: - return 'weather-severe-alert'; + return ['weather-severe-alert']; } }, + get_weather_icon_safely: function(code) { + let iconname = this.get_weather_icon(code); + if (!this.has_icon(iconname[0]) && iconname.length > 1) + return iconname[1]; + else + return iconname[0]; + }, + + has_icon: function(icon) { + //TODO correct symbolic name? (cf. symbolic_names_for_icon) + return Gtk.IconTheme.get_default().has_icon(icon + (this._icontype == St.IconType.SYMBOLIC ? '-symbolic' : '')); + }, + get_weather_condition: function(code) { switch (parseInt(code, 10)){ case 0:/* tornado */ @@ -445,7 +461,7 @@ WeatherMenuButton.prototype = { let wind_direction = weather.get_object_member('wind').get_string_member('direction'); let wind = weather.get_object_member('wind').get_double_member('speed'); wind_unit = weather.get_object_member('units').get_string_member('speed'); - let iconname = this.get_weather_icon(weather.get_object_member('condition').get_string_member('code')); + let iconname = this.get_weather_icon_safely(weather.get_object_member('condition').get_string_member('code')); this._currentWeatherIcon.icon_name = this._weatherIcon.icon_name = iconname; this._weatherInfo.text = (comment + ', ' + temperature + ' ' + this.unit_to_unicode()); @@ -479,7 +495,7 @@ WeatherMenuButton.prototype = { forecastUi.Day.text = date_string[i] + ' (' + this.get_locale_day(forecastData.get_string_member('day')) + ')'; forecastUi.Temperature.text = t_low + '\u2013' + t_high + ' ' + this.unit_to_unicode(); forecastUi.Summary.text = comment; - forecastUi.Icon.icon_name = this.get_weather_icon(code); + forecastUi.Icon.icon_name = this.get_weather_icon_safely(code); } });