/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ const Clutter = imports.gi.Clutter; const DBus = imports.dbus; const Lang = imports.lang; const Mainloop = imports.mainloop; const Shell = imports.gi.Shell; const Gvc = imports.gi.Gvc; const Signals = imports.signals; const St = imports.gi.St; const Soup = imports.gi.Soup; const PanelMenu = imports.ui.panelMenu; const PopupMenu = imports.ui.popupMenu; const Util = imports.misc.util; const Gettext = imports.gettext.domain('gnome-shell'); const _ = Gettext.gettext; function Indicator() { this._init.apply(this, arguments); } Indicator.prototype = { __proto__: PanelMenu.SystemStatusButton.prototype, get_icon: function(code) { code = parseInt(code, 10); switch (code){ case 4: return 'weather-storm'; case 5: case 10: case 11: case 12: case 39: case 40: return 'weather-showers'; case 26: return 'weather-overcast'; case 28: case 30: case 44: return 'weather-few-clouds'; case 32: case 34: case 36: return 'weather-clear'; default: return 'weather-snow'; } }, _callback: function(s, sm, ind) { msg = sm.response_body.data.split("\n"); output = ind._outputTomorrow; for (i=0; i 0) { exp=/code="(\d*)"/g; cloud = exp.exec(msg[i])[1]; exp=/text="([A-Za-z ]*)"/g; text = exp.exec(msg[i])[1]; exp=/temp="(\d*)"/g; temp = exp.exec(msg[i])[1]; ind._outputToday.label.set_text(text + ' ' + temp + 'C ' + '(' + cloud + ')'); gicon = Shell.util_icon_from_string(ind.get_icon(cloud)); ind._outputToday._icon.gicon = gicon; ind.setGIcon(gicon); } if (msg[i].search("yweather:forecast") > 0) { exp=/code="(\d*)"/g; cloud = exp.exec(msg[i])[1]; exp=/text="([A-Za-z ]*)"/g; text = exp.exec(msg[i])[1]; exp=/day="([A-Za-z ]*)"/g; day = exp.exec(msg[i])[1]; exp=/low="(\d*)"/g; templ = exp.exec(msg[i])[1]; exp=/high="(\d*)"/g; temph = exp.exec(msg[i])[1]; output.label.set_text(day + ' ' + text + ' ' + templ + 'C-' + temph + 'C ' + '(' + cloud + ')'); gicon = Shell.util_icon_from_string(ind.get_icon(cloud)); output._icon.gicon = gicon; output = ind._outputNext; } } }, _on_update: function(ind) { zone = 'SPXX0220'; uri = 'http://weather.yahooapis.com/forecastrss?p='+zone+'&u=c'; s = Soup.SessionAsync.new(); sm = Soup.Message.new('GET', uri); s.queue_message(sm, function(x, xm) { ind._callback(x, xm, ind); }, null); return true; }, _init: function() { PanelMenu.SystemStatusButton.prototype._init.call(this, 'weather-clear', null); this._control = new Gvc.MixerControl({ name: 'GNOME Shell weather' }); obj = this; Mainloop.timeout_add(3000, function() { return obj._on_update(obj); }); this._outputTitle = new PopupMenu.PopupMenuItem(_("Weather"), { reactive: false }); this.menu.addMenuItem(this._outputTitle); this._outputToday = new PopupMenu.PopupImageMenuItem(_("Today") + " 0C", 'weather-few-clouds'); this.menu.addMenuItem(this._outputToday); this._outputTomorrow = new PopupMenu.PopupImageMenuItem(_("Tomorrow") + " 0C", 'weather-few-clouds'); this.menu.addMenuItem(this._outputTomorrow); this._outputNext = new PopupMenu.PopupImageMenuItem(_("Next") + " 0C", 'weather-few-clouds'); this.menu.addMenuItem(this._outputNext); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addAction(_("Weather Settings"),function() { }); }, };