diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 05c42fe..6465c68 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -5,18 +5,16 @@ const PopupMenu = imports.ui.popupMenu; const Main = imports.ui.main; const Util = imports.misc.util; const Mainloop = imports.mainloop; -const Shell = imports.gi.Shell; const Clutter = imports.gi.Clutter; const Gio = imports.gi.Gio; const Me = imports.misc.extensionUtils.getCurrentExtension(); const Convenience = Me.imports.convenience; const Utilities = Me.imports.utilities; +const UDisks2 = Me.imports.udisks2; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; -let settings; - const FreonItem = new Lang.Class({ Name: 'FreonItem', Extends: PopupMenu.PopupBaseMenuItem, @@ -24,12 +22,7 @@ const FreonItem = new Lang.Class({ _init: function(gIcon, label, value) { this.parent(); this._hasMainDot = false; - - this.connect('activate', function () { - settings.set_string('main-sensor', label); - }); this._label = label; - this._value = value; this.actor.add(new St.Icon({ style_class: 'system-status-icon', gicon : gIcon})); this.actor.add(new St.Label({text: label}), {x_fill: true, expand: true}); @@ -51,6 +44,10 @@ const FreonItem = new Lang.Class({ this.setOrnament(PopupMenu.Ornament.NONE); }, + getLabel: function() { + return this._label; + }, + setValue: function(value) { this._valueLabel.text = value; } @@ -58,7 +55,6 @@ const FreonItem = new Lang.Class({ const FreonMenuButton = new Lang.Class({ Name: 'FreonMenuButton', - Extends: PanelMenu.Button, _init: function(){ @@ -70,6 +66,8 @@ const FreonMenuButton = new Lang.Class({ this._hddtempOutput = ''; this._aticonfigOutput = ''; + this._settings = Convenience.getSettings(); + this._sensorIcons = { temperature : Gio.icon_new_for_string(Me.path + '/icons/sensors-temperature-symbolic.svg'), voltage : Gio.icon_new_for_string(Me.path + '/icons/sensors-voltage-symbolic.svg'), @@ -81,27 +79,20 @@ const FreonMenuButton = new Lang.Class({ this.actor.add_actor(this.statusLabel); this.sensorsArgv = Utilities.detectSensors(); - if(settings.get_boolean('show-hdd-temp')) - this.hddtempArgv = Utilities.detectHDDTemp(); - if(settings.get_boolean('show-aticonfig-temp')) + this._initDriveUtility(); + if(this._settings.get_boolean('show-aticonfig-temp')) this.aticonfigArgv = Utilities.detectAtiConfig(); - this.udisksProxies = []; - Utilities.UDisks.get_drive_ata_proxies(Lang.bind(this, function(proxies) { - this.udisksProxies = proxies; - this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); - })); - this._settingChangedSignals = []; this._addSettingChangedSignal('update-time', Lang.bind(this, this._updateTimeChanged)); this._addSettingChangedSignal('unit', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-label', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('main-sensor', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-decimal-value', Lang.bind(this, this._querySensors)); - this._addSettingChangedSignal('show-hdd-temp', Lang.bind(this, this._showHddTempChanged)); this._addSettingChangedSignal('show-fan-rpm', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-voltage', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-aticonfig-temp', Lang.bind(this, this._showAtiConfigChanged)); + this._addSettingChangedSignal('drive-utility', Lang.bind(this, this._driveUtilityChanged)); this.connect('destroy', Lang.bind(this, this._onDestroy)); @@ -111,25 +102,45 @@ const FreonMenuButton = new Lang.Class({ this._addTimer(); }, - _updateTimeChanged : function(){ - //global.log('[FREON] readd timer'); + _driveUtilityChanged : function(){ + this._destroyDriveUtility(); + this._initDriveUtility(); + this._querySensors(); + }, + _initDriveUtility : function(){ + switch(this._settings.get_string('drive-utility')){ + case 'hddtemp': + this.hddtempArgv = Utilities.detectHDDTemp(); + break; + case 'udisks2': + this._udisks2 = new UDisks2.UDisks2(Lang.bind(this, function() { + this._updateDisplay(); + })); + break; + } + }, + + _destroyDriveUtility : function(){ + if(this._udisks2){ + this._udisks2.destroy(); + this._udisks2 = null; + } + this.hddtempArgv = null; + }, + + _updateTimeChanged : function(){ Mainloop.source_remove(this._timeoutId); this._addTimer(); }, - _showHddTempChanged : function(){ - this.hddtempArgv = settings.get_boolean('show-hdd-temp') ? Utilities.detectHDDTemp() : undefined; - this._querySensors(); - }, - _showAtiConfigChanged : function(){ - this.aticonfigArgv = settings.get_boolean('show-aticonfig-temp') ? Utilities.detectAtiConfig() : undefined; + this.aticonfigArgv = this._settings.get_boolean('show-aticonfig-temp') ? Utilities.detectAtiConfig() : undefined; this._querySensors(); }, _addTimer : function(){ - this._timeoutId = Mainloop.timeout_add_seconds(settings.get_int('update-time'), Lang.bind(this, function (){ + this._timeoutId = Mainloop.timeout_add_seconds(this._settings.get_int('update-time'), Lang.bind(this, function (){ this._querySensors(); // readd to update queue return true; @@ -137,23 +148,15 @@ const FreonMenuButton = new Lang.Class({ }, _addSettingChangedSignal : function(key, callback){ - this._settingChangedSignals.push(settings.connect('changed::' + key, callback)); + this._settingChangedSignals.push(this._settings.connect('changed::' + key, callback)); }, _onDestroy: function(){ - for each (let proxy in this.udisksProxies){ - if(proxy.drive){ - proxy.drive.run_dispose(); - } - if(proxy.ata){ - proxy.ata.run_dispose(); - } - } - + this._destroyDriveUtility(); Mainloop.source_remove(this._timeoutId); for each (let signal in this._settingChangedSignals){ - settings.disconnect(signal); + this._settings.disconnect(signal); }; }, @@ -162,47 +165,48 @@ const FreonMenuButton = new Lang.Class({ if (this.sensorsArgv){ new Utilities.Future(this.sensorsArgv, Lang.bind(this,function(stdout){ this._sensorsOutput = stdout; - this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); + this._updateDisplay(); })); } - if (settings.get_boolean('show-hdd-temp') && this.hddtempArgv){ + if (this._settings.get_string('drive-utility') == 'hddtemp' && this.hddtempArgv){ new Utilities.Future(this.hddtempArgv, Lang.bind(this,function(stdout){ this._hddtempOutput = stdout; - this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); + this._updateDisplay(); })); } - if (settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv){ + if (this._settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv){ new Utilities.Future(this.aticonfigArgv, Lang.bind(this,function(stdout){ this._aticonfigOutput = stdout; - this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); + this._updateDisplay(); })); } }, - _updateDisplay: function(sensors_output, hddtemp_output, aticonfig_output){ + _updateDisplay: function(){ let tempInfo = []; let fanInfo = []; let voltageInfo = []; - tempInfo = Utilities.parseSensorsOutput(sensors_output,Utilities.parseSensorsTemperatureLine); + tempInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseSensorsTemperatureLine); tempInfo = tempInfo.filter(Utilities.filterTemperature); - if (settings.get_boolean('show-fan-rpm')){ - fanInfo = Utilities.parseSensorsOutput(sensors_output,Utilities.parseFanRPMLine); + if (this._settings.get_boolean('show-fan-rpm')){ + fanInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseFanRPMLine); fanInfo = fanInfo.filter(Utilities.filterFan); } - if (settings.get_boolean('show-voltage')){ - voltageInfo = Utilities.parseSensorsOutput(sensors_output,Utilities.parseVoltageLine); + if (this._settings.get_boolean('show-voltage')){ + voltageInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseVoltageLine); } - if(settings.get_boolean('show-hdd-temp') && this.hddtempArgv) - tempInfo = tempInfo.concat(Utilities.parseHddTempOutput(hddtemp_output, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|')); + if(this._settings.get_string('drive-utility') == 'hddtemp' && this.hddtempArgv) { + tempInfo = tempInfo.concat(Utilities.parseHddTempOutput(this._hddtempOutput, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|')); + } else if(this._settings.get_string('drive-utility') == 'udisks2'){ + tempInfo = tempInfo.concat(this._udisks2.getHDDTemp()); + } - if(settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv) - tempInfo = tempInfo.concat(Utilities.parseAtiConfigOutput(aticonfig_output)); - - tempInfo = tempInfo.concat(Utilities.UDisks.create_list_from_proxies(this.udisksProxies)); + if(this._settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv) + tempInfo = tempInfo.concat(Utilities.parseAtiConfigOutput(this._aticonfigOutput)); tempInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); fanInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); @@ -245,13 +249,13 @@ const FreonMenuButton = new Lang.Class({ } let needAppendMenuItems = false; - let mainSensor = settings.get_string('main-sensor'); + let mainSensor = this._settings.get_string('main-sensor'); let sensorCount = 0; for each (let s in sensorsList) { if(s.type != 'separator') { sensorCount++; if (mainSensor == s.label) { - if(settings.get_boolean('show-label')) + if(this._settings.get_boolean('show-label')) this.statusLabel.set_text('%s: %s'.format(s.label, s.value)); else this.statusLabel.set_text(s.value); @@ -311,12 +315,15 @@ const FreonMenuButton = new Lang.Class({ _appendMenuItems : function(sensorsList){ this._sensorMenuItems = {}; - let mainSensor = settings.get_string('main-sensor'); + let mainSensor = this._settings.get_string('main-sensor'); for each (let s in sensorsList){ if(s.type == 'separator'){ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } else { let item = new FreonItem(this._sensorIcons[s.type], s.label, s.value); + item.connect('activate', Lang.bind(this, function (self) { + this._settings.set_string('main-sensor', self.getLabel()); + })); if (mainSensor == s.label) item.addMainDot(); this._sensorMenuItems[s.label] = item; @@ -346,16 +353,16 @@ const FreonMenuButton = new Lang.Class({ }, _formatTemp: function(value) { - if (settings.get_string('unit')=='fahrenheit'){ + if (this._settings.get_string('unit')=='fahrenheit'){ value = this._toFahrenheit(value); } let format = '%.1f'; - if (!settings.get_boolean('show-decimal-value')){ + if (!this._settings.get_boolean('show-decimal-value')){ //ret = Math.round(value); format = '%d'; } format += '%s'; - return format.format(value, (settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C"); + return format.format(value, (this._settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C"); } }); @@ -363,7 +370,6 @@ let freonMenu; function init(extensionMeta) { Convenience.initTranslations(); - settings = Convenience.getSettings(); } function enable() { diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 70dd745..8180541 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -71,8 +71,34 @@ const FreonPrefsWidget = new GObject.Class({ // - this._addSwitch({key : 'show-hdd-temp', y : i, x : 0, - label : _('Show Drive Temperature')}); + // HDD Temperature Utility ComboBox + let hddTempUtilModel = new Gtk.ListStore(); + hddTempUtilModel.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]); + + let hddTempUtil = new Gtk.ComboBox({model: hddTempUtilModel}); + let hddTempUtilRenderer = new Gtk.CellRendererText(); + hddTempUtil.pack_start(hddTempUtilRenderer, true); + hddTempUtil.add_attribute(hddTempUtilRenderer, 'text', 1); + + let hddTempUtilItems = ['none', 'hddtemp', 'udisks2']; + + hddTempUtilModel.set(hddTempUtilModel.append(), [0, 1], [hddTempUtilItems[0], 'None']); + hddTempUtilModel.set(hddTempUtilModel.append(), [0, 1], [hddTempUtilItems[1], 'Hddtemp']); + hddTempUtilModel.set(hddTempUtilModel.append(), [0, 1], [hddTempUtilItems[2], 'UDisks2']); + + hddTempUtil.set_active(hddTempUtilItems.indexOf(this._settings.get_string('drive-utility'))); + + hddTempUtil.connect('changed', Lang.bind(this, function(entry) { + let [success, iter] = hddTempUtil.get_active_iter(); + if (!success) + return; + this._settings.set_string('drive-utility', hddTempUtilModel.get_value(iter, 0)) + })); + + this.attach(new Gtk.Label({ label: _('Utility for HDD/SSD temperature'), halign : Gtk.Align.END}), 0, i, 1, 1); + this.attach(hddTempUtil, 1, i, 1, 1); + + // this._addSwitch({key : 'show-fan-rpm', y : i++, x : 2, label : _('Show Fan Speed')}); @@ -80,10 +106,9 @@ const FreonPrefsWidget = new GObject.Class({ this._addSwitch({key : 'show-voltage', y : i, x : 0, label : _('Show Power Supply Voltage')}); - this._addSwitch({key : 'show-aticonfig-temp', y : i, x : 2, + this._addSwitch({key : 'show-aticonfig-temp', y : i++, x : 2, label : _('Use Catalyst'), help : _('Show AMD video card temperature, use aticonfig from Catalyst driver.')}); - }, _addSwitch : function(params){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 6e6fad0..ebcd33e 100644 Binary files a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled and b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled differ diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index aa33a37..f7e7673 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -12,7 +12,7 @@ 'centigrade' Unit - The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in. + The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in @@ -33,28 +33,28 @@ Show one digit after decimal - - true - Display HDD Temp - Display hard disk drive temperature. Requires hddtemp installed. - - true Display Fan RPM - Display fan rotation per minute. + Display fan rotation per minute true Display voltage - Display voltage of various components. + Display voltage of various components false Show AMD Card Temperature (Catalyst) - Show AMD card temperature, use aticonfig from Catalyst driver. + Show AMD card temperature, use aticonfig from Catalyst driver + + + + 'none' + Utility for detect HDD/SSD temperature + Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2') diff --git a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js new file mode 100644 index 0000000..f90e8f3 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js @@ -0,0 +1,109 @@ +const Lang = imports.lang; +const Gio = imports.gi.Gio; + +const UDisksDriveProxy = Gio.DBusProxy.makeProxyWrapper( +' \ + \ + \ + \ +'); + +const UDisksDriveAtaProxy = Gio.DBusProxy.makeProxyWrapper( +' \ + \ + \ + \ +'); + +// 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 + } + } +} + +// routines for handling of udisks2 +const UDisks2 = new Lang.Class({ + Name: 'UDisks2', + + _init: function(callback) { + this._udisksProxies = []; + this._get_drive_ata_proxies(Lang.bind(this, function(proxies) { + this._udisksProxies = proxies; + callback(); + })); + }, + + // creates a list of sensor objects from the list of proxies given + getHDDTemp: function() { + return this._udisksProxies.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! + global.log('[FREON] 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) { + global.log('[FREON] 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) { + global.log('[FREON] Could not find UDisks2 objects: ' + e); + } + }); + }, + + destroy: function(callback) { + for each (let proxy in this._udisksProxies){ + if(proxy.drive){ + proxy.drive.run_dispose(); + } + if(proxy.ata){ + proxy.ata.run_dispose(); + } + } + }, + +}); diff --git a/freon@UshakovVasilii_Github.yahoo.com/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js index 909e7e7..31d0a28 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/utilities.js +++ b/freon@UshakovVasilii_Github.yahoo.com/utilities.js @@ -1,25 +1,10 @@ const GLib = imports.gi.GLib; -const GObject = imports.gi.GObject; const Gio = imports.gi.Gio; const Lang = imports.lang; 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; @@ -272,78 +257,3 @@ 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); - } - }); - } -};