diff --git a/src/extension.js b/src/extension.js index 22adee7..5ea77f0 100644 --- a/src/extension.js +++ b/src/extension.js @@ -74,6 +74,12 @@ const SensorsMenuButton = new Lang.Class({ this.hddtempArgv = Utilities.detectHDDTemp(); } + this.udisksProxies = []; + Utilities.UDisks.get_drive_ata_proxies((function(proxies) { + this.udisksProxies = proxies; + this._updateDisplay(this._sensorsOutput, this._hddtempOutput); + }).bind(this)); + this._settingsChanged = settings.connect("changed", Lang.bind(this,function(){ this._querySensors(false); })); this._querySensors(true); @@ -128,6 +134,8 @@ const SensorsMenuButton = new Lang.Class({ if(this.hddtempArgv) tempInfo = tempInfo.concat(Utilities.parseHddTempOutput(hddtemp_output, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|')); + tempInfo = tempInfo.concat(Utilities.UDisks.create_list_from_proxies(this.udisksProxies)); + tempInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); fanInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); voltageInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); diff --git a/src/prefs.js b/src/prefs.js index 97d6a12..2ba004b 100644 --- a/src/prefs.js +++ b/src/prefs.js @@ -96,7 +96,7 @@ const SensorsPrefsWidget = new GObject.Class({ } - //List of items of the ComboBox + //List of items of the ComboBox this._model = new Gtk.ListStore(); this._model.set_column_types([GObject.TYPE_STRING, GObject.TYPE_BOOLEAN]); this._appendItem(_("Average")); @@ -110,6 +110,7 @@ const SensorsPrefsWidget = new GObject.Class({ //Fill the list this._getSensorsLabels(); + this._getUdisksLabels(); if(this._display_hdd_temp) { this._appendSeparator(); @@ -192,6 +193,14 @@ const SensorsPrefsWidget = new GObject.Class({ } }, + _getUdisksLabels: function() { + Utilities.UDisks.get_drive_ata_proxies((function(proxies) { + let list = Utilities.UDisks.create_list_from_proxies(proxies); + + this._appendMultipleItems(list); + }).bind(this)); + }, + _getActiveSensorIter: function() { /* Get the first iter in the list */ [success, iter] = this._model.get_iter_first(); diff --git a/src/utilities.js b/src/utilities.js index 5949f70..83f33c4 100644 --- a/src/utilities.js +++ b/src/utilities.js @@ -6,6 +6,16 @@ const Me = imports.misc.extensionUtils.getCurrentExtension(); const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; +const UDisksDriveProxy = Gio.DBusProxy.makeProxyWrapper( + + +); + +const UDisksDriveAtaProxy = Gio.DBusProxy.makeProxyWrapper( + + +); + function detectSensors() { let path = GLib.find_program_in_path('sensors'); return path ? [path] : undefined; @@ -231,7 +241,78 @@ const Future = new Lang.Class({ } }); +// Poor man's async.js +const Async = { + // mapping will be done in parallel + map: function(arr, mapClb /* function(in, successClb)) */, resClb /* function(result) */) { + let counter = arr.length; + let result = []; + for (let i = 0; i < arr.length; ++i) { + mapClb(arr[i], (function(i, newVal) { + result[i] = newVal; + if (--counter == 0) resClb(result); + }).bind(null, i)); // i needs to be bound since it will be changed during the next iteration + } + } +} + function debug(str){ //tail -f -n100 ~/.cache/gdm/session.log | grep temperature print ('LOG temperature@xtranophilist: ' + str); } + +// routines for handling of udisks2 +const UDisks = { + // creates a list of sensor objects from the list of proxies given + create_list_from_proxies: function(proxies) { + return proxies.filter(function(proxy) { + // 0K means no data available + return proxy.ata.SmartTemperature > 0; + }).map(function(proxy) { + return { + label: proxy.drive.Model, + temp: proxy.ata.SmartTemperature - 272.15 + }; + }); + }, + + // calls callback with [{ drive: UDisksDriveProxy, ata: UDisksDriveAtaProxy }, ... ] for every drive that implements both interfaces + get_drive_ata_proxies: function(callback) { + Gio.DBusObjectManagerClient.new(Gio.DBus.system, 0, "org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", null, null, function(src, res) { + try { + let objMgr = Gio.DBusObjectManagerClient.new_finish(res); //might throw + + let objPaths = objMgr.get_objects().filter(function(o) { + return o.get_interface("org.freedesktop.UDisks2.Drive") != null + && o.get_interface("org.freedesktop.UDisks2.Drive.Ata") != null; + }).map(function(o) { return o.get_object_path() }); + + // now create the proxy objects, log and ignore every failure + Async.map(objPaths, function(obj, callback) { + // create the proxies object + let driveProxy = new UDisksDriveProxy(Gio.DBus.system, "org.freedesktop.UDisks2", obj, function(res, error) { + if (error) { //very unlikely - we even checked the interfaces before! + debug("Could not create proxy on "+obj+":"+error); + callback(null); + return; + } + let ataProxy = new UDisksDriveAtaProxy(Gio.DBus.system, "org.freedesktop.UDisks2", obj, function(res, error) { + if (error) { + debug("Could not create proxy on "+obj+":"+error); + callback(null); + return; + } + + callback({ drive: driveProxy, ata: ataProxy }); + }); + }); + }, function(proxies) { + // filter out failed attempts == null values + callback(proxies.filter(function(a) { return a != null; })); + }); + } catch (e) { + debug("Could not find UDisks objects: "+e); + } + }); + } +};