summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatteo F. Vescovi <mfv@debian.org>2020-10-04 23:59:05 +0200
committerMatteo F. Vescovi <mfv@debian.org>2020-10-04 23:59:05 +0200
commit0c4e3cc35a823dd0a7463092f25a2d080201bea4 (patch)
treedb45cca862827390dd783b23e76211f945bd5391
New upstream version 42+dfsg
-rw-r--r--README.md6
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js39
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js102
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js73
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/extension.js655
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/freonItem.js47
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js78
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/icons/freon-fan-symbolic.svg133
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg146
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/icons/freon-temperature-symbolic.svg127
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/icons/freon-voltage-symbolic.svg125
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE94
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg58
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg58
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/de/LC_MESSAGES/freon.mobin0 -> 2322 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/es_AR/LC_MESSAGES/freon.mobin0 -> 2402 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/es_ES/LC_MESSAGES/freon.mobin0 -> 2362 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/fr/LC_MESSAGES/freon.mobin0 -> 2365 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/hu/LC_MESSAGES/freon.mobin0 -> 2603 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/freon.mobin0 -> 2639 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mobin0 -> 2500 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/pt_BR/LC_MESSAGES/freon.mobin0 -> 2383 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mobin0 -> 3233 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mobin0 -> 3250 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/zh_CN/LC_MESSAGES/freon.mobin0 -> 2178 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mobin0 -> 4735 bytes
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/metadata.json9
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js72
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js59
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/de.po127
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po128
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po140
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/fr.po128
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/freon.pot144
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/hu.po148
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/it.po148
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/pl.po133
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po128
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/ru.po151
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po151
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po128
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po253
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/prefs.js136
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml97
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js86
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js51
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/stylesheet.css7
-rw-r--r--freon@UshakovVasilii_Github.yahoo.com/udisks2.js125
48 files changed, 4290 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5a139e7
--- /dev/null
+++ b/README.md
@@ -0,0 +1,6 @@
+gnome-shell-extension-freon
+====================================
+
+Freon is forked from [gnome-shell-extension-sensors](https://github.com/xtranophilist/gnome-shell-extension-sensors). Freon is an extension for displaying CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM in GNOME Shell.
+
+**[For more info, check out the Freon wiki.](https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki)**
diff --git a/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js b/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js
new file mode 100644
index 0000000..fc6ea77
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js
@@ -0,0 +1,39 @@
+const GLib = imports.gi.GLib;
+
+const Me = imports.misc.extensionUtils.getCurrentExtension();
+const CommandLineUtil = Me.imports.commandLineUtil;
+
+var AticonfigUtil = class extends CommandLineUtil.CommandLineUtil {
+
+ constructor() {
+ super();
+ let path = GLib.find_program_in_path('aticonfig');
+ this._argv = path ? [path, '--odgt'] : null;
+ }
+
+ /*
+ Default Adapter - AMD Radeon R9 200 Series
+ Sensor 0: Temperature - 37.00 C
+ */
+ get temp() {
+ if(!this._output)
+ return [];
+ let label = null;
+ let temp = null;
+ for (let line of this._output) {
+ if(!line)
+ continue;
+ let r;
+ if(line.indexOf('Adapter') > 0)
+ label = (r = /Adapter \- (.*)/.exec(line)) ? r[1] : undefined;
+ if(line.indexOf('Temperature') > 0)
+ temp = (r = /Temperature \- (\d{1,3}.\d{1,2})/.exec(line)) ? parseFloat(r[1]) : undefined;
+ }
+
+ if(!label || !temp)
+ return [];
+
+ return [{ label : label.trim(), temp : temp}];
+ }
+
+};
diff --git a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js
new file mode 100644
index 0000000..6ccc1c8
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js
@@ -0,0 +1,102 @@
+const GLib = imports.gi.GLib;
+const Gio = imports.gi.Gio;
+
+const Me = imports.misc.extensionUtils.getCurrentExtension();
+const CommandLineUtil = Me.imports.commandLineUtil;
+
+var BumblebeeNvidiaUtil = class extends CommandLineUtil.CommandLineUtil {
+
+ constructor() {
+ super();
+ // optirun nvidia-smi -q -d TEMPERATURE
+ this._path = GLib.find_program_in_path('optirun');
+ this._argv = this._path ? [this._path, 'nvidia-smi', '-q', '-d', 'TEMPERATURE'] : null;
+
+ // original source here:
+ // https://github.com/meden/gse-bumblebee-indicator
+ // thank meden!
+ let virtualDisplay = ':8';
+
+ let bumblebeeConfPath = '/etc/bumblebee/bumblebee.conf';
+ if(GLib.file_test(bumblebeeConfPath, GLib.FileTest.EXISTS)){
+ let configFile = Gio.File.new_for_path(bumblebeeConfPath);
+ let contents = configFile.load_contents(null);
+ if (contents[0]) {
+ let pattern = /^VirtualDisplay=.*$/m
+ let match = new String(pattern.exec(new String(contents)));
+ virtualDisplay = match.substr(16);
+ }
+ }
+ let lockFilePath = '/tmp/.X' + virtualDisplay + '-lock';
+ this._lockMonitor = Gio.File.new_for_path(
+ lockFilePath).monitor_file(Gio.FileMonitorFlags.NONE, null
+ );
+ this._lockMonitor.id = this._lockMonitor.connect(
+ 'changed', this._statusChanged.bind(this)
+ );
+
+ // Check if the lock file already exists
+ // (needed when NVIDIA card is already in use at that point)
+ if(GLib.file_test(lockFilePath, GLib.FileTest.EXISTS)){
+ this._detectLabel();
+ this._active = true;
+ }
+ }
+
+ _detectLabel() {
+ // optirun nvidia-smi -L
+ // GPU 0: GeForce GT 525M (UUID: GPU-...)
+ for (let line of GLib.spawn_command_line_sync(this._path + " nvidia-smi -L")){
+ let match = /.*GPU [\d]:([\w\d\ ]+).*/.exec(line);
+ if(match){
+ this._label = match[1];
+ if(this._label)
+ this._label = this._label.trim();
+ break;
+ }
+ }
+ }
+
+ _statusChanged(monitor, a_file, other_file, event_type) {
+ if (event_type == Gio.FileMonitorEvent.CREATED) {
+ if(this._argv && !this._label)
+ this._detectLabel();
+ this._active = true;
+ } else if (event_type == Gio.FileMonitorEvent.DELETED) {
+ this._active = false;
+ }
+ }
+
+ execute(callback) {
+ if(this._active)
+ super.execute(callback);
+ else
+ this._output = [];
+ }
+
+ get temp() {
+ let key = 'bumblebee-nvidia'
+ let label = this._label ? this._label : _('Bumblebee + NVIDIA');
+ if(this._active && this._output){
+ // GPU Current Temp : 37 C
+ for (let line of this._output) {
+ if(!line)
+ continue;
+ let r;
+ if(line.indexOf('GPU Current Temp') > 0)
+ return [{
+ label: key,
+ temp: (r = /[\s]*GPU Current Temp[\s]*:[\s]*(\d{1,3}).*/.exec(line)) ? parseFloat(r[1]) : null,
+ displayName: label
+ }];
+ }
+ }
+ return [{label: key, temp: null, displayName: label}];
+ }
+
+ destroy(){
+ super.destroy();
+ this._lockMonitor.disconnect(this._lockMonitor.id);
+ }
+
+};
diff --git a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js
new file mode 100644
index 0000000..813fe59
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js
@@ -0,0 +1,73 @@
+const ByteArray = imports.byteArray;
+const GLib = imports.gi.GLib;
+const Gio = imports.gi.Gio;
+
+var CommandLineUtil = class {
+
+ constructor(){
+ this._argv = null;
+ this._updated = false;
+ }
+
+ execute(callback) {
+ try{
+ this._callback = callback;
+ let [exit, pid, stdinFd, stdoutFd, stderrFd] =
+ GLib.spawn_async_with_pipes(null, /* cwd */
+ this._argv, /* args */
+ null, /* env */
+ GLib.SpawnFlags.DO_NOT_REAP_CHILD,
+ null /* child_setup */);
+ let stdout = new Gio.UnixInputStream({fd: stdoutFd, close_fd: true});
+ let outReader = new Gio.DataInputStream({base_stream: stdout});
+
+ let stderr = new Gio.UnixInputStream({fd: stderrFd, close_fd: true});
+ let errReader = new Gio.DataInputStream({base_stream: stderr});
+
+ GLib.close(stdinFd);
+
+ let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, (pid, status, requestObj) => {
+ let output = [];
+ let error_output = [];
+ let [line, size] = [null, 0];
+
+ while (([line, size] = outReader.read_line(null)) != null && line != null) {
+ if(line)
+ output.push(ByteArray.toString(line));
+ }
+ stdout.close(null);
+
+ while (([line, size] = errReader.read_line(null)) != null && line != null) {
+ if(line)
+ error_output.push(ByteArray.toString(line));
+ }
+ stderr.close(null);
+
+ GLib.source_remove(childWatch);
+ this._output = output;
+ this._error_output = error_output;
+ this._updated = true;
+ callback();
+ });
+ } catch(e){
+ global.log(e.toString());
+ }
+ }
+
+ get available(){
+ return this._argv != null;
+ }
+
+ get updated (){
+ return this._updated;
+ }
+
+ set updated (updated){
+ this._updated = updated;
+ }
+
+ destroy(){
+ this._argv = null;
+ }
+
+};
diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js
new file mode 100644
index 0000000..6fe9d2b
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js
@@ -0,0 +1,655 @@
+const St = imports.gi.St;
+const PanelMenu = imports.ui.panelMenu;
+const PopupMenu = imports.ui.popupMenu;
+const Main = imports.ui.main;
+const Util = imports.misc.util;
+const Mainloop = imports.mainloop;
+const Clutter = imports.gi.Clutter;
+const Gio = imports.gi.Gio;
+const GLib = imports.gi.GLib;
+const GObject = imports.gi.GObject;
+
+const ExtensionUtils = imports.misc.extensionUtils;
+const Me = ExtensionUtils.getCurrentExtension();
+const UDisks2 = Me.imports.udisks2;
+const AticonfigUtil = Me.imports.aticonfigUtil;
+const NvidiaUtil = Me.imports.nvidiaUtil;
+const HddtempUtil = Me.imports.hddtempUtil;
+const SensorsUtil = Me.imports.sensorsUtil;
+const smartctlUtil = Me.imports.smartctlUtil;
+const nvmecliUtil = Me.imports.nvmecliUtil;
+const BumblebeeNvidiaUtil = Me.imports.bumblebeeNvidiaUtil;
+const FreonItem = Me.imports.freonItem;
+
+const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
+const _ = Gettext.gettext;
+
+function _makeLogFunction(prefix) {
+ return msg => {
+ // Grab the second line of a stack trace, i.e. caller of debug()
+ let regex = /(?:(?:[^<.]+<\.)?([^@]+))?@(.+):(\d+):\d+/g;
+ let trace = ((msg.stack) ? msg : new Error()).stack.split('\n')[1];
+ let [m, func, file, line] = regex.exec(trace);
+ file = GLib.path_get_basename(file);
+
+ let hdr = [file, func, line].filter(k => (k)).join(':');
+
+ GLib.log_structured(
+ 'freon',
+ GLib.LogLevelFlags.LEVEL_MESSAGE,
+ {
+ MESSAGE: `[${prefix}] [${hdr}]: ${msg}`,
+ SYSLOG_IDENTIFIER: 'org.gnome.shell.extensions.freon',
+ CODE_FILE: file,
+ CODE_FUNC: `${func}`,
+ CODE_LINE: `${line}`
+ }
+ );
+ }
+}
+
+const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extends PanelMenu.Button {
+ _init() {
+ super._init(St.Align.START);
+
+ this._settings = ExtensionUtils.getSettings();
+
+ var _debugFunc = _makeLogFunction('DEBUG');
+ this.debug = this._settings.get_boolean('debug') ? _debugFunc : () => {};
+
+ this._settings.connect('changed::debug', () => {
+ this.debug = this._settings.get_boolean('debug') ? _debugFunc : () => {};
+ });
+
+ this._sensorMenuItems = {};
+
+ this._utils = {
+ sensors: new SensorsUtil.SensorsUtil()
+ };
+ this._initDriveUtility();
+ this._initGpuUtility();
+
+ let temperatureIcon = Gio.icon_new_for_string(Me.path + '/icons/material-icons/material-temperature-symbolic.svg');
+ this._sensorIcons = {
+ 'temperature' : temperatureIcon,
+ 'temperature-average' : temperatureIcon,
+ 'temperature-maximum' : temperatureIcon,
+ 'gpu-temperature' : Gio.icon_new_for_string(Me.path + '/icons/material-icons/material-gpu-temperature-symbolic.svg'),
+ 'drive-temperature' : Gio.icon_new_for_string('drive-harddisk-symbolic'),
+ 'voltage' : Gio.icon_new_for_string(Me.path + '/icons/freon-voltage-symbolic.svg'),
+ 'fan' : Gio.icon_new_for_string(Me.path + '/icons/freon-fan-symbolic.svg')
+ }
+
+ this._menuLayout = new St.BoxLayout();
+ this._hotLabels = {};
+ this._hotIcons = {};
+ let hotSensors = this._settings.get_strv('hot-sensors');
+ let showIcon = this._settings.get_boolean('show-icon-on-panel');
+ for (let s of hotSensors){
+ this._createHotItem(s, showIcon);
+ }
+
+ if(hotSensors.length == 0){
+ this._createInitialIcon();
+ }
+
+ this.add_actor(this._menuLayout);
+
+ this._settingChangedSignals = [];
+ this._addSettingChangedSignal('update-time', this._updateTimeChanged.bind(this));
+ this._addSettingChangedSignal('unit', this._querySensors.bind(this));
+ this._addSettingChangedSignal('show-degrees-on-panel', this._updateUI.bind(this));
+ this._addSettingChangedSignal('show-icon-on-panel', this._showIconOnPanelChanged.bind(this));
+ this._addSettingChangedSignal('hot-sensors', this._querySensors.bind(this));
+ this._addSettingChangedSignal('show-decimal-value', this._querySensors.bind(this));
+ this._addSettingChangedSignal('show-fan-rpm', this._querySensors.bind(this));
+ this._addSettingChangedSignal('show-voltage', this._querySensors.bind(this));
+ this._addSettingChangedSignal('drive-utility', this._driveUtilityChanged.bind(this));
+ this._addSettingChangedSignal('gpu-utility', this._gpuUtilityChanged.bind(this));
+ this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this));
+ this._addSettingChangedSignal('panel-box-index', this._positionInPanelChanged.bind(this));
+ this._addSettingChangedSignal('group-temperature', this._querySensors.bind(this))
+ this._addSettingChangedSignal('group-voltage', this._rerender.bind(this))
+
+ this.connect('destroy', this._onDestroy.bind(this));
+
+ // don't postprone the first call by update-time.
+ this._querySensors();
+
+ this._addTimer();
+ this._updateUI(true);
+ this._updateUITimeoutId = Mainloop.timeout_add(250, () => {
+ this._updateUI();
+ // readd to update queue
+ return true;
+ });
+ }
+
+ _createHotItem(s, showIcon, gicon){
+ if(showIcon){
+ let i = new St.Icon({ style_class: 'system-status-icon'});
+ this._hotIcons[s] = i;
+ if(gicon)
+ i.gicon = gicon;
+ this._menuLayout.add(i);
+ }
+ let l = new St.Label({
+ text: '\u26a0', // ⚠, warning
+ y_expand: true,
+ y_align: Clutter.ActorAlign.CENTER});
+ l.set_style_class_name(showIcon ? 'freon-panel-icon-label' : 'freon-panel-no-icon-label');
+ this._hotLabels[s] = l;
+ this._menuLayout.add(l);
+ }
+
+ _createInitialIcon() {
+ this._initialIcon = new St.Icon({ style_class: 'system-status-icon'});
+ this._initialIcon.gicon = this._sensorIcons['gpu-temperature'];
+ this._menuLayout.add(this._initialIcon);
+ }
+
+ _rerender(){
+ this._needRerender = true;
+ this._querySensors();
+ }
+
+ _positionInPanelChanged(){
+ this.container.get_parent().remove_actor(this.container);
+
+ // small HACK with private boxes :)
+ let boxes = {
+ left: Main.panel._leftBox,
+ center: Main.panel._centerBox,
+ right: Main.panel._rightBox
+ };
+
+ let p = this.positionInPanel;
+ let i = this._settings.get_int('panel-box-index');
+ boxes[p].insert_child_at_index(this.container, i);
+ }
+
+ _showIconOnPanelChanged(){
+ let showIcon = this._settings.get_boolean('show-icon-on-panel');
+ if (showIcon) {
+ let index = 0;
+ for(let k in this._hotLabels){
+ let i = new St.Icon({ style_class: 'system-status-icon'});
+ this._hotIcons[k] = i;
+ i.gicon = this._sensorMenuItems[k].gicon;
+ this._menuLayout.insert_child_at_index(i, index);
+ index += 2;
+ }
+ } else {
+ for(let k in this._hotIcons)
+ this._hotIcons[k].destroy();
+ this._hotIcons = {};
+ }
+ for (let l in this._hotLabels)
+ this._hotLabels[l].set_style_class_name(showIcon ? 'freon-panel-icon-label' : 'freon-panel-no-icon-label');
+ }
+
+ _driveUtilityChanged(){
+ this._destroyDriveUtility();
+ this._initDriveUtility();
+ this._querySensors();
+ }
+
+ _initDriveUtility(){
+ switch(this._settings.get_string('drive-utility')){
+ case 'hddtemp':
+ this._utils.disks = new HddtempUtil.HddtempUtil();
+ break;
+ case 'udisks2':
+ this._utils.disks = new UDisks2.UDisks2(() => {
+ // this._updateDisplay(); we cannot change actor in background thread #74
+ });
+ break;
+ case 'smartctl':
+ this._utils.disks = new smartctlUtil.smartctlUtil();
+ break;
+ case 'nvmecli':
+ this._utils.disks = new nvmecliUtil.nvmecliUtil();
+ break;
+ }
+ }
+
+ _destroyDriveUtility(){
+ if(this._utils.disks){
+ this._utils.disks.destroy();
+ delete this._utils.disks;
+ }
+ }
+
+ _initGpuUtility(){
+ switch(this._settings.get_string('gpu-utility')){
+ case 'nvidia-settings':
+ this._utils.gpu = new NvidiaUtil.NvidiaUtil();
+ break;
+ case 'aticonfig':
+ this._utils.gpu = new AticonfigUtil.AticonfigUtil();
+ break;
+ case 'bumblebee-nvidia-smi':
+ this._utils.gpu = new BumblebeeNvidiaUtil.BumblebeeNvidiaUtil();
+ break;
+ }
+ }
+
+ _destroyGpuUtility(){
+ if(this._utils.gpu){
+ this._utils.gpu.destroy();
+ delete this._utils.gpu;
+ }
+ }
+
+ _gpuUtilityChanged(){
+ this._destroyGpuUtility();
+ this._initGpuUtility();
+ this._querySensors();
+ }
+
+ _updateTimeChanged(){
+ Mainloop.source_remove(this._timeoutId);
+ this._addTimer();
+ }
+
+ _addTimer(){
+ this._timeoutId = Mainloop.timeout_add_seconds(this._settings.get_int('update-time'), () => {
+ this._querySensors();
+ // readd to update queue
+ return true;
+ });
+ }
+
+ _addSettingChangedSignal(key, callback){
+ this._settingChangedSignals.push(this._settings.connect('changed::' + key, callback));
+ }
+
+ _onDestroy(){
+ this._destroyDriveUtility();
+ this._destroyGpuUtility();
+ Mainloop.source_remove(this._timeoutId);
+ Mainloop.source_remove(this._updateUITimeoutId);
+
+ for (let signal of this._settingChangedSignals){
+ this._settings.disconnect(signal);
+ };
+ }
+
+ _querySensors(){
+ for (let sensor of Object.values(this._utils)) {
+ if (sensor.available) {
+ sensor.execute(() => {
+ // we cannot change actor in background thread #74
+ });
+ }
+ }
+ }
+
+ _updateUI(needUpdate = false){
+ for (let sensor of Object.values(this._utils)) {
+ if (sensor.available && sensor.updated) {
+ this.debug(sensor + ' updated');
+ sensor.updated = false;
+ needUpdate = true;
+ }
+ }
+ if(needUpdate) {
+ this._updateDisplay(); // #74
+ this.debug('update display');
+ }
+ }
+
+ _fixNames(sensors){
+ let names = [];
+ for (let s of sensors){
+ if(s.type == 'separator' ||
+ s.type == 'temperature-group' ||
+ s.type == 'temperature-average' ||
+ s.type == 'temperature-maximum')
+ continue;
+ let name = s.label;
+ let i = 1;
+ while(names.indexOf(name) >= 0){
+ name = s.label + '-' + i++;
+ }
+ if(name != s.label){
+ s.displayName = s.label;
+ s.label = name;
+ }
+ names.push(name);
+ }
+ }
+
+ _updateDisplay(){
+ let gpuTempInfo = this._utils.sensors.gpu;
+
+ if (this._utils.gpu && this._utils.gpu.available)
+ gpuTempInfo = gpuTempInfo.concat(this._utils.gpu.temp);
+
+ let sensorsTempInfo = this._utils.sensors.temp;
+
+ let fanInfo = [];
+ if (this._settings.get_boolean('show-fan-rpm'))
+ fanInfo = this._utils.sensors.rpm;
+
+ let voltageInfo = [];
+ if (this._settings.get_boolean('show-voltage'))
+ voltageInfo = this._utils.sensors.volt;
+
+ let driveTempInfo = [];
+ if(this._utils.disks && this._utils.disks.available) {
+ driveTempInfo = this._utils.disks.temp;
+ }
+
+ sensorsTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) });
+ driveTempInfo.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) });
+
+ let tempInfo = gpuTempInfo.concat(sensorsTempInfo).concat(driveTempInfo);
+
+ if (tempInfo.length > 0){
+ let total = 0;
+ let sum = 0;
+ let max = 0;
+ for (let i of tempInfo){
+ if(i.temp !== null && i.temp >= 0){
+ total++;
+ sum += i.temp;
+ if (i.temp > max)
+ max = i.temp;
+ }
+ }
+
+ let sensors = [];
+
+ for (let i of gpuTempInfo){
+ sensors.push({
+ type: 'gpu-temperature',
+ label: i.label,
+ value: this._formatTemp(i.temp),
+ displayName: i.displayName});
+ }
+ for (let i of sensorsTempInfo){
+ sensors.push({type:'temperature', label: i.label, value:this._formatTemp(i.temp)});
+ }
+ for (let i of driveTempInfo){
+ sensors.push({type:'drive-temperature', label: i.label, value:this._formatTemp(i.temp)});
+ }
+
+ if (tempInfo.length > 0){
+ sensors.push({type : 'separator'});
+
+ // Add average and maximum entries
+ sensors.push({type: 'temperature-average',
+ key: '__average__',
+ label: _("Average"),
+ value: this._formatTemp(sum/total)});
+ sensors.push({type: 'temperature-maximum',
+ key: '__max__',
+ label: _("Maximum"),
+ value: this._formatTemp(max)});
+
+ if(fanInfo.length > 0 || voltageInfo.length > 0)
+ sensors.push({type : 'separator'});
+ }
+
+ if(sensorsTempInfo.length > 0 && this._settings.get_boolean('group-temperature')){
+ sum = 0;
+ for (let i of sensorsTempInfo){
+ sum += i.temp;
+ }
+ sensors.push({
+ type:'temperature-group',
+ label:'temperature-group',
+ value: this._formatTemp(sum / sensorsTempInfo.length)});
+ }
+
+ for (let fan of fanInfo){
+ sensors.push({
+ type:'fan',
+ label:fan.label,
+ value:_("%drpm").format(fan.rpm)});
+ }
+ if (fanInfo.length > 0 && voltageInfo.length > 0){
+ sensors.push({type : 'separator'});
+ }
+ for (let voltage of voltageInfo){
+ sensors.push({
+ type : 'voltage',
+ label:voltage.label,
+ value:_("%s%.2fV").format(((voltage.volt >= 0) ? '+' : ''),
+ voltage.volt)});
+ }
+
+ this._fixNames(sensors);
+
+ for (let k in this._hotLabels)
+ this._hotLabels[k].set_text('\u26a0'); // ⚠, warning
+
+ for (let s of sensors)
+ if(s.type != 'separator') {
+ let l = this._hotLabels[s.key || s.label];
+ if(l)
+ l.set_text(s.value);
+ }
+
+ if(this._lastSensorsCount && this._lastSensorsCount==sensors.length){
+ for (let s of sensors) {
+ if(s.type != 'separator') {
+ let item = this._sensorMenuItems[s.key || s.label];
+ if(item) {
+ if(s.type == 'temperature-group')
+ item.status.text = s.value;
+ else {
+ item.value = s.value;
+ if(s.displayName)
+ item.display_name = s.displayName;
+ }
+ } else {
+ this._needRerender = true;
+ }
+ }
+ }
+ } else {
+ this._needRerender = true;
+ }
+
+ if(this._needRerender){
+ this._needRerender = false;
+ this.debug('Render all MenuItems');
+ this.menu.removeAll();
+ this._appendMenuItems(sensors);
+ }
+ } else {
+ this._sensorMenuItems = {};
+ this.menu.removeAll();
+
+ let item = new PopupMenu.PopupMenuItem(
+ this._utils.sensors.available
+ ? _("Please run sensors-detect as root.")
+ : _("Please install lm_sensors.\nIf this doesn\'t help, click here to report with your sensors output!")
+ );
+ item.connect('activate',function() {
+ Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki/Dependency"]);
+ });
+ this.menu.addMenuItem(item);
+ this._appendStaticMenuItems();
+ }
+ }
+
+ _appendStaticMenuItems(){
+ // separator
+ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
+
+ let wiki = new PopupMenu.PopupBaseMenuItem();
+ wiki.actor.add_child(new St.Label({ text: _("Go to the Freon wiki"), x_align: Clutter.ActorAlign.CENTER, x_expand: true }));
+ wiki.connect('activate', function () {
+ Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki"]);
+ });
+ this.menu.addMenuItem(wiki);
+
+ let settings = new PopupMenu.PopupBaseMenuItem();
+ settings.actor.add_child(new St.Label({ text: _("Sensor Settings"), x_align: Clutter.ActorAlign.CENTER, x_expand: true }));
+ settings.connect('activate', function () {
+ Util.spawn(["gnome-extensions", "prefs", Me.metadata.uuid]);
+ });
+ this.menu.addMenuItem(settings);
+ }
+
+ _appendMenuItems(sensors){
+ this._lastSensorsCount = sensors.length;
+ this._sensorMenuItems = {};
+ let needGroupTemperature = this._settings.get_boolean('group-temperature');
+ let needGroupVoltage = this._settings.get_boolean('group-voltage');
+
+ if(needGroupVoltage){
+ let i = 0;
+ for (let s of sensors)
+ if(s.type == 'voltage')
+ i++;
+ if(i < 2)
+ needGroupVoltage = false;
+ }
+
+ let temperatureGroup = null;
+ let voltageGroup = null;
+
+ for (let s of sensors){
+ if(s.type == 'separator'){
+ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
+ } else if (s.type == 'temperature-group') {
+ if(temperatureGroup) {
+ temperatureGroup.status.text = s.value;
+ this._sensorMenuItems['temperature-group'] = temperatureGroup;
+ }
+ } else {
+ let key = s.key || s.label;
+ let item = new FreonItem.FreonItem(this._sensorIcons[s.type], key, s.label, s.value, s.displayName || undefined);
+ item.connect('activate', (self) => {
+ let l = this._hotLabels[self.key];
+ let hotSensors = this._settings.get_strv('hot-sensors');
+ if(l){
+ hotSensors.splice(hotSensors.indexOf(self.key), 1);
+ delete this._hotLabels[self.key];
+ l.destroy(); // destroy is called after dict cleanup to prevert set_label on not exist actor
+ let i = this._hotIcons[self.key];
+ if(i){
+ i.destroy();
+ delete this._hotIcons[self.key];
+ }
+ self.main = false;
+ } else {
+ hotSensors.push(self.key);
+ if(Object.keys(this._hotLabels).length == 0){
+ this._initialIcon.destroy();
+ this._initialIcon = null;
+ }
+ let showIcon = this._settings.get_boolean('show-icon-on-panel');
+ this._createHotItem(self.key, showIcon, self.gicon);
+ self.main = true;
+ }
+
+ for(let i = hotSensors.length -1; i >= 0 ; i--){
+ let k = hotSensors[i];
+ if(!this._sensorMenuItems[k]){
+ hotSensors.splice(i, 1);
+ let ll = this._hotLabels[k]
+ delete this._hotLabels[k];
+ ll.destroy(); // destroy is called after dict cleanup to prevert set_label on not exist actor
+ if(this._hotIcons[k]){
+ this._hotIcons[k].destroy();
+ delete this._hotIcons[k];
+ }
+ }
+ }
+
+ if(Object.keys(this._hotLabels).length == 0)
+ this._createInitialIcon();
+
+ this._settings.set_strv('hot-sensors', hotSensors.filter(
+ function(item, pos) {
+ return hotSensors.indexOf(item) == pos;
+ }));
+ });
+ if (this._hotLabels[key]) {
+ item.main = true;
+ if(this._hotIcons[key])
+ this._hotIcons[key].gicon = item.gicon;
+ }
+ this._sensorMenuItems[key] = item;
+
+ if(needGroupTemperature && s.type == 'temperature') {
+ if(!temperatureGroup) {
+ temperatureGroup = new PopupMenu.PopupSubMenuMenuItem(_('Temperature Sensors'), true);
+ temperatureGroup.icon.gicon = this._sensorIcons['temperature'];
+ if(!temperatureGroup.status) { // gnome 3.18 and hight
+ temperatureGroup.status = new St.Label({
+ style_class: 'popup-status-menu-item',
+ y_expand: true,
+ y_align: Clutter.ActorAlign.CENTER });
+ temperatureGroup.actor.insert_child_at_index(temperatureGroup.status, 4);
+ }
+ this.menu.addMenuItem(temperatureGroup);
+ }
+ temperatureGroup.menu.addMenuItem(item);
+ } else if(needGroupVoltage && s.type == 'voltage') {
+ if(!voltageGroup) {
+ voltageGroup = new PopupMenu.PopupSubMenuMenuItem(_('Voltage'), true);
+ voltageGroup.icon.gicon = this._sensorIcons['voltage'];
+ this.menu.addMenuItem(voltageGroup);
+ }
+ voltageGroup.menu.addMenuItem(item);
+ } else {
+ this.menu.addMenuItem(item);
+ }
+ }
+ }
+ this._appendStaticMenuItems();
+ }
+
+
+ _toFahrenheit(c){
+ return ((9/5)*c+32);
+ }
+
+ _formatTemp(value) {
+ if(value === null)
+ return 'N/A';
+ if (this._settings.get_string('unit')=='fahrenheit'){
+ value = this._toFahrenheit(value);
+ }
+ let format = '%.1f';
+ if (!this._settings.get_boolean('show-decimal-value')){
+ format = '%.0f';
+ }
+ format += '%s';
+
+ if(this._settings.get_boolean('show-degrees-on-panel')){
+ return format.format(value, (this._settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C" );
+ } else {
+ return format.format(value, "");
+ }
+ }
+
+ get positionInPanel(){
+ return this._settings.get_string('position-in-panel');
+ }
+});
+
+let freonMenu;
+
+function init(extensionMeta) {
+ ExtensionUtils.initTranslations();
+}
+
+function enable() {
+ freonMenu = new FreonMenuButton();
+ Main.panel.addToStatusArea('freonMenu', freonMenu);
+ freonMenu._positionInPanelChanged();
+}
+
+function disable() {
+ freonMenu.destroy();
+ freonMenu = null;
+}
diff --git a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js
new file mode 100644
index 0000000..05d623d
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js
@@ -0,0 +1,47 @@
+const GObject = imports.gi.GObject;
+const PopupMenu = imports.ui.popupMenu;
+const St = imports.gi.St;
+
+var FreonItem = GObject.registerClass(class FreonItem extends PopupMenu.PopupBaseMenuItem {
+
+ _init(gIcon, key, label, value, displayName) {
+ super._init();
+ this._main = false;
+ this._key = key;
+ this._gIcon = gIcon;
+
+ this._labelActor = new St.Label({text: displayName ? displayName : label});
+ this.actor.add(new St.Icon({ style_class: 'popup-menu-icon', gicon : gIcon}));
+ this.actor.add(this._labelActor, {x_fill: true, expand: true});
+ this._valueLabel = new St.Label({text: value});
+ this.actor.add(this._valueLabel);
+ }
+
+ set main(main) {
+ if(main)
+ this.setOrnament(PopupMenu.Ornament.CHECK);
+ else
+ this.setOrnament(PopupMenu.Ornament.NONE);
+ this._main = main;
+ }
+
+ get main() {
+ return this._main;
+ }
+
+ get key() {
+ return this._key;
+ }
+
+ set display_name(text) {
+ return this._labelActor.text = text;
+ }
+
+ get gicon() {
+ return this._gIcon;
+ }
+
+ set value(value) {
+ this._valueLabel.text = value;
+ }
+});
diff --git a/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js b/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js
new file mode 100644
index 0000000..e5d1d6d
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js
@@ -0,0 +1,78 @@
+const GLib = imports.gi.GLib;
+
+const Me = imports.misc.extensionUtils.getCurrentExtension();
+const CommandLineUtil = Me.imports.commandLineUtil;
+
+var HddtempUtil = class extends CommandLineUtil.CommandLineUtil {
+
+ constructor() {
+ super();
+ let hddtempArgv = GLib.find_program_in_path('hddtemp');
+ if(hddtempArgv) {
+ // check if this user can run hddtemp directly.
+ if(!GLib.spawn_command_line_sync(hddtempArgv)[3]){
+ this._argv = [hddtempArgv];
+ return;
+ }
+ }
+
+ // doesn't seem to be the case… is it running as a daemon?
+ // Check first for systemd
+ let systemctl = GLib.find_program_in_path('systemctl');
+ let pidof = GLib.find_program_in_path('pidof');
+ let nc = GLib.find_program_in_path('nc');
+ let pid = undefined;
+
+ if(systemctl) {
+ let activeState = GLib.spawn_command_line_sync(systemctl + " show hddtemp.service -p ActiveState")[1].toString().trim();
+ if(activeState == "ActiveState=active") {
+ let output = GLib.spawn_command_line_sync(systemctl + " show hddtemp.service -p MainPID")[1].toString().trim();
+
+ if(output.length && output.split("=").length == 2)
+ pid = Number(output.split("=")[1].trim());
+ }
+ }
+
+ // systemd isn't used on this system, try sysvinit instead
+ if(!pid && pidof) {
+ let output = GLib.spawn_command_line_sync("pidof hddtemp")[1].toString().trim();
+ if(output.length)
+ pid = Number(output.trim());
+ }
+
+ if(nc && pid) {
+ // get daemon command line
+ let cmdline = GLib.file_get_contents('/proc/'+pid+'/cmdline');
+ // get port or assume default
+ let match = /(-p\W*|--port=)(\d{1,5})/.exec(cmdline)
+ let port = match ? parseInt(match[2]) : 7634;
+ // use net cat to get data
+ this._argv = [nc, 'localhost', port.toString()];
+ }
+ }
+
+ get temp() {
+ if(!this._output)
+ return [];
+
+ let sep = /nc$/.exec(this._argv[0]) ? '|' : ': ';
+ let hddtempOutput = [];
+ if (this._output.join().indexOf(sep+sep) > 0) {
+ hddtempOutput = this._output.join().split(sep+sep);
+ } else {
+ hddtempOutput = this._output;
+ }
+
+ let sensors = [];
+ for (let line of hddtempOutput) {
+ let fields = line.split(sep).filter(function(e){ return e; });
+ let sensor = { label: fields[1], temp: parseFloat(fields[2])};
+ //push only if the temp is a Number
+ if (!isNaN(sensor.temp))
+ sensors.push(sensor);
+ }
+
+ return sensors;
+ }
+
+};
diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/freon-fan-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-fan-symbolic.svg
new file mode 100644
index 0000000..a584b74
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-fan-symbolic.svg
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg7384"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ height="16"
+ sodipodi:docname="fan.svg"
+ width="16">
+ <metadata
+ id="metadata90">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:object-paths="true"
+ inkscape:cy="7.9523753"
+ inkscape:current-layer="svg7384"
+ inkscape:window-width="1680"
+ pagecolor="#555753"
+ showborder="false"
+ showguides="true"
+ inkscape:snap-nodes="false"
+ objecttolerance="10"
+ showgrid="true"
+ inkscape:object-nodes="true"
+ inkscape:pageshadow="2"
+ inkscape:guide-bbox="true"
+ inkscape:window-x="0"
+ inkscape:snap-bbox="true"
+ bordercolor="#666666"
+ id="namedview88"
+ inkscape:window-maximized="1"
+ inkscape:snap-global="false"
+ inkscape:window-y="27"
+ gridtolerance="10"
+ inkscape:zoom="45.254834"
+ inkscape:window-height="991"
+ borderopacity="1"
+ guidetolerance="10"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:cx="6.4701314"
+ inkscape:bbox-paths="false"
+ inkscape:snap-grids="true"
+ inkscape:pageopacity="1"
+ inkscape:snap-to-guides="true">
+ <inkscape:grid
+ visible="true"
+ spacingx="1px"
+ type="xygrid"
+ spacingy="1px"
+ id="grid4866"
+ empspacing="2"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <title
+ id="title9167">Gnome Symbolic Icon Theme</title>
+ <defs
+ id="defs7386" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer9"
+ inkscape:label="status"
+ style="display:inline" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer10"
+ inkscape:label="devices" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer11"
+ inkscape:label="apps" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer12"
+ inkscape:label="actions" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer13"
+ inkscape:label="places" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer14"
+ inkscape:label="mimetypes" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer15"
+ inkscape:label="emblems"
+ style="display:inline" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="g4953"
+ inkscape:label="categories"
+ style="display:inline" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="M 8 0 C 7.7662783 -3.1322393e-17 7.5411335 0.011610998 7.3125 0.03125 C 5.2102943 1.4256475 5.5987411 4.0108346 6.90625 6.34375 C 7.2209706 6.1372503 7.5954602 6 8 6 C 8.0316752 6 8.062435 5.9985435 8.09375 6 C 8.7335699 3.3508722 11.235427 1.3679906 11.96875 1.0625 C 10.798244 0.39154001 9.4458996 -7.7509341e-16 8 0 z M 4 1.09375 C 2.5986515 1.9071018 1.4765974 3.1207274 0.78125 4.59375 C 0.9182133 7.1283275 3.3250439 8.0908827 6 8.125 C 5.9974202 8.0834163 6 8.0422335 6 8 C 6 7.6007368 6.1109237 7.2184502 6.3125 6.90625 C 4.3514736 5.0277432 3.8996391 1.8856213 4 1.09375 z M 13.15625 3.0625 C 11.454675 3.0097524 9.9536158 4.4003424 8.875 6.21875 C 9.2647725 6.4100014 9.5848814 6.7069783 9.78125 7.09375 C 12.408696 6.3344077 15.40554 7.5273725 16 8 C 16 6.3023731 15.464331 4.7324062 14.5625 3.4375 C 14.086383 3.1993071 13.609414 3.0765477 13.15625 3.0625 z M 10 7.875 C 10.00258 7.9165837 10 7.9577665 10 8 C 10 8.3992632 9.8890763 8.7815498 9.6875 9.09375 C 11.648527 10.972257 12.100361 14.114379 12 14.90625 C 13.401349 14.092898 14.523403 12.879273 15.21875 11.40625 C 15.081787 8.8716722 12.674956 7.9091173 10 7.875 z M 0 8 C -4.5501758e-16 9.6976269 0.53566854 11.267594 1.4375 12.5625 C 3.7013779 13.695079 5.7591272 12.083936 7.125 9.78125 C 6.7352275 9.5899986 6.4151186 9.2930217 6.21875 8.90625 C 3.5913037 9.6655923 0.5944604 8.4726275 0 8 z M 9.09375 9.65625 C 8.7790294 9.8627497 8.4045398 10 8 10 C 7.9683248 10 7.937565 10.001457 7.90625 10 C 7.26643 12.649128 4.7645729 14.632009 4.03125 14.9375 C 5.2017564 15.60846 6.5541004 16 8 16 C 8.2337217 16 8.4588665 15.988389 8.6875 15.96875 C 10.789706 14.574352 10.401259 11.989165 9.09375 9.65625 z "
+ id="path3830" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="path3896"
+ sodipodi:cx="8.0433397"
+ sodipodi:cy="8.0008545"
+ sodipodi:rx="0.9722718"
+ sodipodi:ry="0.95017475"
+ d="m 9.0156115,8.0008545 a 0.9722718,0.95017475 0 1 1 -1.9445436,0 0.9722718,0.95017475 0 1 1 1.9445436,0 z"
+ transform="matrix(1.028519,0,0,1.052438,-0.27272757,-0.42040319)" />
+</svg>
diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg
new file mode 100644
index 0000000..e75e10a
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg7384"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ height="16"
+ sodipodi:docname="sensors-temperature-symbolic.svg"
+ width="16">
+ <metadata
+ id="metadata90">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:object-paths="true"
+ inkscape:cy="6.8111905"
+ inkscape:current-layer="svg7384"
+ inkscape:window-width="959"
+ pagecolor="#555753"
+ showborder="false"
+ showguides="true"
+ inkscape:snap-nodes="false"
+ objecttolerance="10"
+ showgrid="true"
+ inkscape:object-nodes="true"
+ inkscape:pageshadow="2"
+ inkscape:guide-bbox="true"
+ inkscape:window-x="960"
+ inkscape:snap-bbox="true"
+ bordercolor="#666666"
+ id="namedview88"
+ inkscape:window-maximized="0"
+ inkscape:snap-global="false"
+ inkscape:window-y="27"
+ gridtolerance="10"
+ inkscape:zoom="29.86819"
+ inkscape:window-height="1014"
+ borderopacity="1"
+ guidetolerance="10"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:cx="11.158975"
+ inkscape:bbox-paths="false"
+ inkscape:snap-grids="true"
+ inkscape:pageopacity="1"
+ inkscape:snap-to-guides="true">
+ <inkscape:grid
+ visible="true"
+ spacingx="1px"
+ type="xygrid"
+ spacingy="1px"
+ id="grid4866"
+ empspacing="2"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <title
+ id="title9167">Gnome Symbolic Icon Theme</title>
+ <defs
+ id="defs7386" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="M 8.5 0 C 7.6715729 -1.4802974e-16 7 0.67157284 7 1.5 L 7 11.5 C 6.3881928 11.955718 6 12.678476 6 13.5 C 6 14.880712 7.1192882 16 8.5 16 C 9.8807118 16 11 14.880712 11 13.5 C 11 12.678476 10.611807 11.955718 10 11.5 L 10 10 L 9 10 L 9 12.09375 C 9.586412 12.29759 10 12.844162 10 13.5 C 10 14.328427 9.3284271 15 8.5 15 C 7.6715729 15 7 14.328427 7 13.5 C 7 12.844162 7.413588 12.29759 8 12.09375 L 8 1.5 C 8 1.2238576 8.2238576 1 8.5 1 C 8.7761424 1 9 1.2238576 9 1.5 L 9 3 L 10 3 L 10 1.5 C 10 0.67157284 9.3284271 -1.4802974e-16 8.5 0 z M 9 4 L 9 6 L 10 6 L 10 4 L 9 4 z M 9 7 L 9 9 L 10 9 L 10 7 L 9 7 z "
+ id="path2996" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer9"
+ inkscape:label="status"
+ style="display:inline" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer10"
+ inkscape:label="devices" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer11"
+ inkscape:label="apps" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer12"
+ inkscape:label="actions" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer13"
+ inkscape:label="places" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer14"
+ inkscape:label="mimetypes" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer15"
+ inkscape:label="emblems"
+ style="display:inline" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="g4953"
+ inkscape:label="categories"
+ style="display:inline" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="M 8.5 5.90625 C 8.4323857 5.90625 8.4010746 5.9421069 8.375 6 C 8.3656131 6.0208415 8.34375 6.0381589 8.34375 6.0625 L 8.34375 13.03125 C 8.1487143 13.099435 8 13.281698 8 13.5 C 8 13.776142 8.2238576 14 8.5 14 C 8.7761424 14 9 13.776142 9 13.5 C 9 13.281698 8.8512857 13.099435 8.65625 13.03125 L 8.65625 6.0625 C 8.65625 6.0381589 8.6343869 6.0208415 8.625 6 C 8.5989254 5.9421069 8.5676143 5.90625 8.5 5.90625 z "
+ id="rect3817" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="M 6,11 6,4 2,4 2,14 5,14 5,13 3,13 3,5 5,5 5,11 z"
+ id="path2997"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 12,14 1,0 0,-11 1,0 0,-1 -2,0 z"
+ id="path3767"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <rect
+ style="opacity:0.6;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect3769"
+ width="1"
+ height="7"
+ x="13"
+ y="5" />
+</svg>
diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/freon-temperature-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-temperature-symbolic.svg
new file mode 100644
index 0000000..ed342e1
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-temperature-symbolic.svg
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg7384"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ height="16"
+ sodipodi:docname="temperature.svg"
+ width="16">
+ <metadata
+ id="metadata90">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:object-paths="true"
+ inkscape:cy="9.324553"
+ inkscape:current-layer="svg7384"
+ inkscape:window-width="1680"
+ pagecolor="#555753"
+ showborder="false"
+ showguides="true"
+ inkscape:snap-nodes="false"
+ objecttolerance="10"
+ showgrid="true"
+ inkscape:object-nodes="true"
+ inkscape:pageshadow="2"
+ inkscape:guide-bbox="true"
+ inkscape:window-x="0"
+ inkscape:snap-bbox="true"
+ bordercolor="#666666"
+ id="namedview88"
+ inkscape:window-maximized="1"
+ inkscape:snap-global="false"
+ inkscape:window-y="27"
+ gridtolerance="10"
+ inkscape:zoom="29.86819"
+ inkscape:window-height="991"
+ borderopacity="1"
+ guidetolerance="10"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:cx="6.3428911"
+ inkscape:bbox-paths="false"
+ inkscape:snap-grids="true"
+ inkscape:pageopacity="1"
+ inkscape:snap-to-guides="true">
+ <inkscape:grid
+ visible="true"
+ spacingx="1px"
+ type="xygrid"
+ spacingy="1px"
+ id="grid4866"
+ empspacing="2"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <title
+ id="title9167">Gnome Symbolic Icon Theme</title>
+ <defs
+ id="defs7386" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="M 8.5 0 C 7.6715729 -1.4802974e-16 7 0.67157284 7 1.5 L 7 11.5 C 6.3881928 11.955718 6 12.678476 6 13.5 C 6 14.880712 7.1192882 16 8.5 16 C 9.8807118 16 11 14.880712 11 13.5 C 11 12.678476 10.611807 11.955718 10 11.5 L 10 10 L 9 10 L 9 12.09375 C 9.586412 12.29759 10 12.844162 10 13.5 C 10 14.328427 9.3284271 15 8.5 15 C 7.6715729 15 7 14.328427 7 13.5 C 7 12.844162 7.413588 12.29759 8 12.09375 L 8 1.5 C 8 1.2238576 8.2238576 1 8.5 1 C 8.7761424 1 9 1.2238576 9 1.5 L 9 3 L 10 3 L 10 1.5 C 10 0.67157284 9.3284271 -1.4802974e-16 8.5 0 z M 9 4 L 9 6 L 10 6 L 10 4 L 9 4 z M 9 7 L 9 9 L 10 9 L 10 7 L 9 7 z "
+ id="path2996" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer9"
+ inkscape:label="status"
+ style="display:inline" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer10"
+ inkscape:label="devices" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer11"
+ inkscape:label="apps" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer12"
+ inkscape:label="actions" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer13"
+ inkscape:label="places" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer14"
+ inkscape:label="mimetypes" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer15"
+ inkscape:label="emblems"
+ style="display:inline" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="g4953"
+ inkscape:label="categories"
+ style="display:inline" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="M 8.5 5.90625 C 8.4323857 5.90625 8.4010746 5.9421069 8.375 6 C 8.3656131 6.0208415 8.34375 6.0381589 8.34375 6.0625 L 8.34375 13.03125 C 8.1487143 13.099435 8 13.281698 8 13.5 C 8 13.776142 8.2238576 14 8.5 14 C 8.7761424 14 9 13.776142 9 13.5 C 9 13.281698 8.8512857 13.099435 8.65625 13.03125 L 8.65625 6.0625 C 8.65625 6.0381589 8.6343869 6.0208415 8.625 6 C 8.5989254 5.9421069 8.5676143 5.90625 8.5 5.90625 z "
+ id="rect3817" />
+</svg>
diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/freon-voltage-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-voltage-symbolic.svg
new file mode 100644
index 0000000..b2e7eff
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-voltage-symbolic.svg
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg7384"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ height="16"
+ sodipodi:docname="voltage.svg"
+ width="16">
+ <metadata
+ id="metadata90">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:object-paths="true"
+ inkscape:cy="8.2822539"
+ inkscape:current-layer="svg7384"
+ inkscape:window-width="1680"
+ pagecolor="#555753"
+ showborder="false"
+ showguides="true"
+ inkscape:snap-nodes="false"
+ objecttolerance="10"
+ showgrid="true"
+ inkscape:object-nodes="true"
+ inkscape:pageshadow="2"
+ inkscape:guide-bbox="true"
+ inkscape:window-x="0"
+ inkscape:snap-bbox="true"
+ bordercolor="#666666"
+ id="namedview88"
+ inkscape:window-maximized="1"
+ inkscape:snap-global="false"
+ inkscape:window-y="27"
+ gridtolerance="10"
+ inkscape:zoom="68.593502"
+ inkscape:window-height="991"
+ borderopacity="1"
+ guidetolerance="10"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:cx="6.2925429"
+ inkscape:bbox-paths="false"
+ inkscape:snap-grids="true"
+ inkscape:pageopacity="1"
+ inkscape:snap-to-guides="true">
+ <inkscape:grid
+ visible="true"
+ spacingx="1px"
+ type="xygrid"
+ spacingy="1px"
+ id="grid4866"
+ empspacing="2"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <title
+ id="title9167">Gnome Symbolic Icon Theme</title>
+ <defs
+ id="defs7386" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer9"
+ inkscape:label="status"
+ style="display:inline" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer10"
+ inkscape:label="devices" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer11"
+ inkscape:label="apps" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer12"
+ inkscape:label="actions" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer13"
+ inkscape:label="places" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer14"
+ inkscape:label="mimetypes" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="layer15"
+ inkscape:label="emblems"
+ style="display:inline" />
+ <g
+ transform="translate(-261,-277)"
+ inkscape:groupmode="layer"
+ id="g4953"
+ inkscape:label="categories"
+ style="display:inline" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 11.40625,1 c -0.455108,0.038189 -0.61564,0.1791748 -1.25,0.625 L 2.84375,7.34375 C 1.9959525,8.0221961 2,8.0144269 2,9 l 0,1 4,0 -3.1875,3.1875 C 1.98932,14.004249 2.00091,13.998722 2,15 l 0,1 1,0.03125 c 0.986227,-0.01956 0.997937,-0.03056 1.84375,-0.625 L 12.15625,9.6875 C 13.004048,9.0090539 13,8.9855731 13,8 L 13,7 9,7 12.1875,3.8125 C 13.01068,2.9957516 12.99909,3.0012778 13,2 l 0,-1 -1,0 c -0.246557,0.00489 -0.442047,-0.0127296 -0.59375,0 z"
+ id="path3898"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sccsccccccccsccccccs" />
+</svg>
diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE
new file mode 100644
index 0000000..4ae316b
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE
@@ -0,0 +1,94 @@
+Copyright (c) 2014, Austin Andrews (http://materialdesignicons.com/),
+with Reserved Font Name Material Design Icons.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg
new file mode 100644
index 0000000..b01e803
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="freon-gpu-temperature-symbolic.svg"
+ id="svg4"
+ viewBox="0 0 20 20"
+ height="20"
+ width="20"
+ version="1.1">
+ <metadata
+ id="metadata10">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs8" />
+ <sodipodi:namedview
+ inkscape:current-layer="svg4"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="1080"
+ inkscape:cy="7.8571429"
+ inkscape:cx="6.202381"
+ inkscape:zoom="42"
+ fit-margin-bottom="0"
+ fit-margin-right="0"
+ fit-margin-left="0"
+ fit-margin-top="0"
+ showgrid="false"
+ id="namedview6"
+ inkscape:window-height="1376"
+ inkscape:window-width="2560"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+ <path
+ id="path2"
+ d="m 0,5.0000001 v 1.5 H 1 V 15 H 2.5 V 5.0000001 c -0.8,0 -1.7,0 -2.5,0 m 4,0 v 0 9.0000009 H 5 V 15 h 7 v -0.999999 h 8 V 5.0000001 H 4 m 11.5,2 A 2.5,2.5 0 0 1 18,9.5000011 2.5,2.5 0 0 1 15.5,12.000001 2.5,2.5 0 0 1 13,9.5000011 2.5,2.5 0 0 1 15.5,7.0000001 Z" />
+</svg>
diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg
new file mode 100644
index 0000000..03a1556
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="freon-temperature-symbolic.svg"
+ id="svg4"
+ viewBox="0 0 20 20"
+ height="20"
+ width="20"
+ version="1.1">
+ <metadata
+ id="metadata10">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs8" />
+ <sodipodi:namedview
+ inkscape:current-layer="svg4"
+ inkscape:window-maximized="1"
+ inkscape:window-y="27"
+ inkscape:window-x="1080"
+ inkscape:cy="10.61704"
+ inkscape:cx="12.176048"
+ inkscape:zoom="29.698485"
+ fit-margin-bottom="0"
+ fit-margin-right="0"
+ fit-margin-left="0"
+ fit-margin-top="0"
+ showgrid="false"
+ id="namedview6"
+ inkscape:window-height="1376"
+ inkscape:window-width="2560"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+ <path
+ id="path2"
+ d="M 13,11 V 3 A 3,3 0 0 0 7,3 v 8 a 5,5 0 1 0 6,0 M 10,2 a 1,1 0 0 1 1,1 v 7 H 9 V 3 a 1,1 0 0 1 1,-1 z" />
+</svg>
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/de/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/de/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..4611aa1
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/de/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/es_AR/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/es_AR/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..261b768
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/es_AR/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/es_ES/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/es_ES/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..b65723d
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/es_ES/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/fr/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/fr/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..27e131a
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/fr/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/hu/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/hu/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..32c7b98
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/hu/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..5c03f2f
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..3419809
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/pt_BR/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/pt_BR/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..f870695
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/pt_BR/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..c2f6d5c
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..aa8879e
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/zh_CN/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/zh_CN/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..3b00152
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/zh_CN/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mo
new file mode 100644
index 0000000..c541003
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mo
Binary files differ
diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json
new file mode 100644
index 0000000..fd19b7a
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json
@@ -0,0 +1,9 @@
+{
+ "shell-version": ["3.38"],
+ "uuid": "freon@UshakovVasilii_Github.yahoo.com",
+ "name": "Freon",
+ "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)",
+ "settings-schema": "org.gnome.shell.extensions.freon",
+ "gettext-domain": "freon",
+ "url": "https://github.com/UshakovVasilii/gnome-shell-extension-freon"
+ }
diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js
new file mode 100644
index 0000000..78d9f79
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js
@@ -0,0 +1,72 @@
+const ByteArray = imports.byteArray;
+const GLib = imports.gi.GLib;
+const Gio = imports.gi.Gio;
+
+const Me = imports.misc.extensionUtils.getCurrentExtension();
+const CommandLineUtil = Me.imports.commandLineUtil;
+
+var NvidiaUtil = class extends CommandLineUtil.CommandLineUtil {
+
+ constructor() {
+ super();
+ let path = GLib.find_program_in_path('nvidia-smi');
+ this._argv = path ? [path, '--query-gpu=temperature.gpu', '--format=csv,noheader'] : null;
+ this._labels = [];
+ if(this._argv){
+ // [0] ushakov-pc:0[gpu:0] (GeForce GTX 770)
+ let [exit, pid, stdinFd, stdoutFd, stderrFd] =
+ GLib.spawn_async_with_pipes(null, /* cwd */
+ [path, '--query-gpu=name', '--format=csv,noheader'], /* args */
+ null, /* env */
+ GLib.SpawnFlags.DO_NOT_REAP_CHILD,
+ null /* child_setup */);
+
+ let stdout = new Gio.UnixInputStream({fd: stdoutFd, close_fd: true});
+ let outReader = new Gio.DataInputStream({base_stream: stdout});
+
+ GLib.close(stdinFd);
+ GLib.close(stderrFd);
+ let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, (pid, status, requestObj) => {
+ let output = [];
+ let [line, size] = [null, 0];
+
+ while (([line, size] = outReader.read_line(null)) != null && line != null) {
+ this._labels.push(ByteArray.toString(line));
+ }
+
+ stdout.close(null);
+ GLib.source_remove(childWatch);
+ });
+ }
+ }
+
+ get temp() {
+ let output = [];
+ if(this._output)
+ output.push(...this._output)
+ if(this._error_output)
+ output.push(...this._error_output)
+
+ if(output.length === 0)
+ return [];
+ let temps = [];
+ for (let line of this._output) {
+ let convertedLine = parseFloat(line);
+
+ if(!line || !convertedLine)
+ continue;
+ temps.push(convertedLine);
+ }
+
+ let gpus = [];
+
+ if(this._labels.length == temps.length){
+ for(let i = 0; i < this._labels.length; i++){
+ gpus.push({ label: this._labels[i], temp: temps[i] })
+ }
+ }
+
+ return gpus;
+ }
+
+};
diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js
new file mode 100644
index 0000000..ae2ea93
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js
@@ -0,0 +1,59 @@
+const GLib = imports.gi.GLib;
+
+const Me = imports.misc.extensionUtils.getCurrentExtension();
+
+function getNvmeData (argv){
+ const nvme = GLib.find_program_in_path('nvme')
+ return JSON.parse(GLib.spawn_command_line_sync(`${nvme} ${argv} -o json`)[1].toString())
+}
+
+var nvmecliUtil = class {
+ constructor(callback) {
+ this._nvmeDevices = [];
+ try {
+ this._nvmeDevices = getNvmeData("list")["Devices"]
+ } catch (e) {
+ global.log('[FREON] Unable to find nvme devices: ' + e);
+ }
+ this._updated = true;
+ }
+
+ get available(){
+ return this._nvmeDevices.length > 0;
+ }
+
+ get updated (){
+ return this._updated;
+ }
+
+ set updated (updated){
+ this._updated = updated;
+ }
+
+ get temp() {
+ let sensors = [];
+ for (let device of this._nvmeDevices) {
+ var smart_log = getNvmeData(`smart-log ${device["DevicePath"]}`);
+ if( smart_log.hasOwnProperty('temperature_sensor_2') ){
+ sensors.push({ label: device["ModelNumber"] + " S1",
+ temp: parseFloat(smart_log.temperature_sensor_1) - 273.15 });
+ sensors.push({ label: device["ModelNumber"] + " S2",
+ temp: parseFloat(smart_log.temperature_sensor_2) - 273.15 });
+ }
+ else{
+ sensors.push({ label: device["ModelNumber"],
+ temp: parseFloat(smart_log.temperature) - 273.15 });
+ }
+ }
+ return sensors;
+ }
+
+ destroy(callback) {
+ this._nvmeDevices = [];
+ }
+
+ execute(callback) {
+ this._updated = true;
+ }
+
+};
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/de.po b/freon@UshakovVasilii_Github.yahoo.com/po/de.po
new file mode 100644
index 0000000..bea26fb
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/de.po
@@ -0,0 +1,127 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-06 17:05-0300\n"
+"PO-Revision-Date: 2018-08-07 11:27+0200\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Last-Translator: Dennis M. Pöpperl <free-software@dm-poepperl.de>\n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.0.9\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:319
+msgid "Average"
+msgstr "Durchschnitt"
+
+#: extension.js:320
+msgid "Maximum"
+msgstr "Maximum"
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr "%d1/min"
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2fV"
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr "Bitte sensors-detect als root ausführen."
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"Bitte lm_sensors installieren.\n"
+"Falls dies nicht hilft, hier klicken, um einen Bericht mit den Sensorausgaben zu erstellen!"
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr "Temperatursensoren"
+
+#: extension.js:495
+msgid "Voltage"
+msgstr "Spannung"
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr "Sensoreinstellungen"
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr "Sensoren abfragen alle (Sekunden)"
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr "Dezimalwert anzeigen"
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr "Eine Nachkommastelle anzeigen"
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr "Temperatureinheit"
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr "Position auf der Leiste"
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr "Symbol auf der Leiste anzeigen"
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr "Lüftergeschwindigkeit anzeigen"
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr "Versorgungsspannung anzeigen"
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr "Temperatureinträge gruppieren"
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr "Funktioniert, wenn es mindestens drei Temperatursensoren gibt"
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr "Spannungseinträge gruppieren"
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr "Funktioniert, wenn es mindestens drei Spannungssensoren gibt"
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr "HDD/SSD-Temperaturdienst"
+
+#: prefs.js:79
+msgid "None"
+msgstr "Keiner"
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr "Grafikkartendienst"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po b/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po
new file mode 100644
index 0000000..fe7adcc
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po
@@ -0,0 +1,128 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-04-15 09:27-0300\n"
+"PO-Revision-Date: 2016-04-15 09:27-0300\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.4\n"
+"Last-Translator: Martin Benvenuti <martinbenvenutimdq@gmail.com>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Language: es_AR\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:319
+msgid "Average"
+msgstr "Promedio"
+
+#: extension.js:320
+msgid "Maximum"
+msgstr "Máxima"
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr "%drpm"
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2fV"
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr "Por favor ejecute sensors-detect como root."
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"Por favor, instale lm_sensors.\n"
+"Si esto no ayuda, haga click aquí para reportar con la salida de sus sensores."
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr "Sensores de temperatura"
+
+#: extension.js:495
+msgid "Voltage"
+msgstr "Voltaje"
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr "Configuraciones de sensores"
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr "Obtener información de sensores cada (seg)"
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr "Mostrar valor decimal"
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr "Mostrar un dígito decimal después de la coma"
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr "Unidad de temperatura"
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr "Posición en el panel"
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr "Mostrar ícono en el panel"
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr "Mostrar velocidad del fan"
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr "Mostrar voltaje de alimentación"
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr "Agrupar items de temperatura"
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr "Funciona si tenés más de tres sensores de temperatura"
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr "Agrupar items de voltaje"
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr "Funciona si tenés más de tres sensores de voltaje"
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr "Utilidad de temperatura del HDD/SSD"
+
+#: prefs.js:79
+msgid "None"
+msgstr "Ninguna"
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr "Utilidad de temperatura de la placa de video"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po b/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po
new file mode 100644
index 0000000..d8fc691
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po
@@ -0,0 +1,140 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-12-01 21:29+0100\n"
+"PO-Revision-Date: 2016-12-01 21:37+0100\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.11\n"
+"Last-Translator: Suriem Kumite <surkum@gmail.com>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: es_ES\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:319
+msgid "Average"
+msgstr "Promedio"
+
+#: extension.js:320
+msgid "Maximum"
+msgstr "Máxima"
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr "%drpm"
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2fV"
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr "Por favor ejecute sensors-detect como root."
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"Por favor, instale lm_sensors.\n"
+"Si esto no ayuda, haga click aquí para informar adjuntando la salida de sus sensores."
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr "Sensores de temperatura"
+
+#: extension.js:495
+msgid "Voltage"
+msgstr "Voltaje"
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr "Configuraciones de los sensores"
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr "Sondear sensores cada (seg)"
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr "Mostrar valor decimal"
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr "Mostrar un decimal después de la coma"
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr "Unidad de temperatura"
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr "Posición en el panel"
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr "Mostrar ícono en el panel"
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr "Mostrar velocidad del ventilador"
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr "Mostrar voltaje de la fuente de alimentación"
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr "Agrupar elementos de temperatura"
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr "Funciona si tienes más de tres sensores de temperatura"
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr "Agrupar elementos de voltaje"
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr "Funciona si tienes más de tres sensores de voltaje"
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr "Utilidad de temperatura del HDD/SSD"
+
+#: prefs.js:79
+msgid "None"
+msgstr "Ninguna"
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr "Utilidad de temperatura de la placa de video"
+
+#: prefs.js:49
+msgid "Left"
+msgstr "Izquierda"
+
+#: prefs.js:49
+msgid "Center"
+msgstr "Centro"
+
+#: prefs.js:49
+msgid "Right"
+msgstr "Derecha"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/fr.po b/freon@UshakovVasilii_Github.yahoo.com/po/fr.po
new file mode 100644
index 0000000..1a900cd
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/fr.po
@@ -0,0 +1,128 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-26 21:32+0200\n"
+"PO-Revision-Date: 2016-09-26 22:21+0200\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.8\n"
+"Last-Translator: mr-intrepide <theintrepid95@gmail.com>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Language: fr\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:319
+msgid "Average"
+msgstr "Moyenne"
+
+#: extension.js:320
+msgid "Maximum"
+msgstr "Maximum"
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr "%drpm"
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2fV"
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr "Exécuter \"sensors-detect\" en mode super utilisateur."
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"Installer \"lm_sensors\"\n"
+"Si cela n'aide pas, cliquez ici pour le signaler avec votre sortie de commande \"sensors\" !"
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr "Capteurs de température"
+
+#: extension.js:495
+msgid "Voltage"
+msgstr "Tension"
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr "Paramètres des capteurs"
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr "Rafraichir toutes les (s)"
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr "Afficher après la virgule"
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr "Affiche un chiffre après la virgule"
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr "Unité de température"
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr "Position dans le panneau"
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr "Afficher l'icône sur le panneau"
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr "Afficher vitesse ventilateur"
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr "Afficher tension alimentation"
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr "Groupe température"
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr "Fonctionne si vous avez plus de trois capteurs de température"
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr "Groupe tension"
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr "Fonctionne si vous avez plus de trois capteurs de tension"
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr "Programme température HDD/SSD"
+
+#: prefs.js:79
+msgid "None"
+msgstr "Aucun"
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr "Programme température carte vidéo"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot b/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot
new file mode 100644
index 0000000..cafa337
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot
@@ -0,0 +1,144 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-06 17:05-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr ""
+
+#: extension.js:319
+msgid "Average"
+msgstr ""
+
+#: extension.js:320
+msgid "Maximum"
+msgstr ""
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr ""
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr ""
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr ""
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr ""
+
+#: extension.js:495
+msgid "Voltage"
+msgstr ""
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr ""
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr ""
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr ""
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr ""
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr ""
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr ""
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr ""
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr ""
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr ""
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr ""
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr ""
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr ""
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr ""
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr ""
+
+#: prefs.js:79
+msgid "None"
+msgstr ""
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr ""
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr ""
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr ""
+
+#: prefs.js:49
+msgid "Left"
+msgstr ""
+
+#: prefs.js:49
+msgid "Center"
+msgstr ""
+
+#: prefs.js:49
+msgid "Right"
+msgstr ""
+
+#: extension.js:479
+msgid "Go to the Freon wiki"
+msgstr ""
+
+#: extension.js:486
+msgid "Sensor Settings"
+msgstr "" \ No newline at end of file
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/hu.po b/freon@UshakovVasilii_Github.yahoo.com/po/hu.po
new file mode 100644
index 0000000..5652bba
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/hu.po
@@ -0,0 +1,148 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-06 17:05-0300\n"
+"PO-Revision-Date: 2020-07-17 18:13+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.3\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:319
+msgid "Average"
+msgstr "Átlag"
+
+#: extension.js:320
+msgid "Maximum"
+msgstr "Maximum"
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr "%drpm"
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2fV"
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr "Kérlek futtasd a sensors-detect programot root felhasználóként."
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"Kérlek telepítsd az lm_sensors csomagot.\n"
+"Ha nem segít, akkor kattints ide a probléma jelentéséhez!"
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr "Hőmérők"
+
+#: extension.js:495
+msgid "Voltage"
+msgstr "Feszültség"
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr "Szenzorbeállítások"
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr "Szenzoradatok lekérdezés ennyi másodpercenként"
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr "Tizedesjegy mutatása"
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr "Egy tizedesjegy mutatása az egész rész után"
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr "Hőmérséklet mértékegysége"
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr "Pozíció a panelen"
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr "Ikon mutatása a panelen"
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr "Ventilátorsebesség mutatása"
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr "Tápfeszültség mutatása"
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr "Hőmérsékletek csoportosítása"
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr "Akkor működik, ha több, mint három hőmérő van"
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr "Feszültségek csoportosítása"
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr "Akkor működik, ha több, mint három feszültségmérő van"
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr "HDD/SSD hőmérsékletének lekérdezése ezzel"
+
+#: prefs.js:79
+msgid "None"
+msgstr "Egyik sem"
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr "Videokártya hőmérsékletének lekérdezése ezzel"
+
+#: prefs.js:49
+msgid "Left"
+msgstr "Bal"
+
+#: prefs.js:49
+msgid "Center"
+msgstr "Közép"
+
+#: prefs.js:49
+msgid "Right"
+msgstr "Jobb"
+
+#: extension.js:479
+msgid "Go to the Freon wiki"
+msgstr "Freon wiki megnyitása"
+
+#: extension.js:486
+msgid "Sensor Settings"
+msgstr "Szenzorbeállítások"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/it.po b/freon@UshakovVasilii_Github.yahoo.com/po/it.po
new file mode 100644
index 0000000..8e7041c
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/it.po
@@ -0,0 +1,148 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-06 17:05-0300\n"
+"PO-Revision-Date: 2020-05-12 11:59+0200\n"
+"Language-Team: Jimmy Scionti <jimmy.scionti@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.3\n"
+"Last-Translator: Jimmy Scionti <jimmy.scionti@gmail.com>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: it\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:319
+msgid "Average"
+msgstr "Media"
+
+#: extension.js:320
+msgid "Maximum"
+msgstr "Massimo"
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr "%drpm"
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2fV"
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr "Eseguire sensors-detect come amministratore di sistema."
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"Installare lm_sensors.\n"
+"Se il problema persiste, cliccare qui per inviare la segnalazione con l'elenco dei sensori!"
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr "Sensori di temperatura"
+
+#: extension.js:495
+msgid "Voltage"
+msgstr "Voltaggio"
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr "Impostazioni sensori"
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr "Interrogare i sensori ogni (sec)"
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr "Mostrare valori decimali"
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr "Mostrare solo un decimale"
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr "Unità temperatura"
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr "Posizione nel pannello"
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr "Mostrare icona sul pannello"
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr "Mostrare velocità ventola"
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr "Mostrare tensione di alimentazione"
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr "Raggruppare i sensori di temperatura"
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr "Funziona solo se sono disponibili più di tre sensori di temperatura"
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr "Raggruppare i sensori di tensione"
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr "Funziona solo se sono disponibili più di tre sensori di tensione"
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr "Utilità di temperatura HDD/SSD"
+
+#: prefs.js:79
+msgid "None"
+msgstr "Nessuno"
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr "Utilità di temperatura scheda video"
+
+#: prefs.js:49
+msgid "Left"
+msgstr "Sinistra"
+
+#: prefs.js:49
+msgid "Center"
+msgstr "Centro"
+
+#: prefs.js:49
+msgid "Right"
+msgstr "Destra"
+
+#: extension.js:479
+msgid "Go to the Freon wiki"
+msgstr "Visitare wiki Freon"
+
+#: extension.js:486
+msgid "Sensor Settings"
+msgstr "Impostazioni sensore"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/pl.po b/freon@UshakovVasilii_Github.yahoo.com/po/pl.po
new file mode 100644
index 0000000..8c55592
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/pl.po
@@ -0,0 +1,133 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-06 17:05-0300\n"
+"PO-Revision-Date: 2018-02-03 01:30+0100\n"
+"Language-Team: POLISH <jakub.zywiec@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.6\n"
+"Last-Translator: Jakub Żywiec <jakub.zywiec@gmail.com>\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Language: pl\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:319
+msgid "Average"
+msgstr "Średnia"
+
+#: extension.js:320
+msgid "Maximum"
+msgstr "Maksymalna"
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr "%drpm"
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2fV"
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr "Uruchom \"sensors-detect\" jako użytkownik root."
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"Zainstaluj \"lm_sensors\"\n"
+"Jeśli to nie pomoże, kliknij tutaj, aby zgłosić wyniki czujników!"
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr "Czujnik temperatury"
+
+#: extension.js:495
+msgid "Voltage"
+msgstr "Napięcie"
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr "Ustawienia czujników"
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr "Aktualizuj czujniki co (sek)"
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr "Pokaż wartość dziesiętną"
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr "Wyświetlaj do jednego miejsca po przecinku"
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr "Jednostka temperatury"
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr "Pozycja w Panelu"
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr "Pokaż ikonę w Panelu"
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr "Pokaż prędkość wentylatora"
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr "Pokaż napięcie zasilacza"
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr "Grupuj temperatury"
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr "Zadziała, jeśli funkcjonują co najmniej trzy czujniki temperatury"
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr "Grupuj napięcia"
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr "Zadziała, jeśli funkcjonują co najmniej trzy czujniki napięcia"
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr ""
+"Narzędzie do pomiaru\n"
+"temperatury twardego dysku"
+
+#: prefs.js:79
+msgid "None"
+msgstr "Brak"
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr ""
+"Narzędzie do pomiaru\n"
+"temperatury karty graficzenej"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po b/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po
new file mode 100644
index 0000000..94cbf63
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po
@@ -0,0 +1,128 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-06 17:05-0300\n"
+"PO-Revision-Date: 2015-10-06 17:31-0300\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.4\n"
+"Last-Translator: Fábio Nogueira <deb-user-ba@ubuntu.com>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Language: pt_BR\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:319
+msgid "Average"
+msgstr "Média"
+
+#: extension.js:320
+msgid "Maximum"
+msgstr "Máxima"
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr "%drpm"
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2fV"
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr "Por favor execute sensors-detect como root."
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"Por favor, instale lm_sensors.\n"
+"Se isto não ajudar, clique aqui para reportar com suas saídas de sensores!"
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr "Sensores de temperatura"
+
+#: extension.js:495
+msgid "Voltage"
+msgstr "Voltagem"
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr "Configurações dos sensores"
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr "Sensores de sondagem a cada (seg)"
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr "Exibir valor decimal"
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr "Exibir um dígito após o decimal"
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr "Unidade de temperatura"
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr "Posição no painel"
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr "Exibir ícone no painel"
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr "Exibir velocidade da ventoinha"
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr "Exibir tensão da alimentação"
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr "Itens do grupo de temperatura"
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr "Funciona se você tiver mais que três sensores de temperatura"
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr "Itens do grupo de tensão"
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr "Funciona se você tiver mais que três sensores de tensão"
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr "Utilitário de temperatura HDD/SSD"
+
+#: prefs.js:79
+msgid "None"
+msgstr "Nenhum"
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr "Utilitário de temperatura da placa de vídeo"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/ru.po b/freon@UshakovVasilii_Github.yahoo.com/po/ru.po
new file mode 100644
index 0000000..31a2fb9
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/ru.po
@@ -0,0 +1,151 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-06 17:05-0300\n"
+"PO-Revision-Date: 2019-09-19 17:58+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.3\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:319
+msgid "Average"
+msgstr "Средняя"
+
+#: extension.js:320
+msgid "Maximum"
+msgstr "Максимальная"
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr "%d об/мин"
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2f В"
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr "Пожалуйста, запустите sensors-detect как суперпользователь"
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"Пожалуйста, установите lm_sensors.\n"
+"Если это не поможет, нажмите здесь, чтобы сообщить с выходом датчиков!"
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr "Датчики температуры"
+
+#: extension.js:495
+msgid "Voltage"
+msgstr "Напряжение"
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr "Настройки"
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr "Опрос датчиков каждые (сек)"
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr "Показывать десятичные значения"
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr "Показывать одну цифру после запятой"
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr "Единица измерения температуры"
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr "Позиция на панели"
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr "Отображать иконку на панели"
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr "Отображать скорость вентилятора"
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr "Отображать напряжение питания"
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr "Объединить показания температуры"
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr "Работает если у вас более трёх датчиков температуры"
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr "Объединить показания напряжения"
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr "Работает если у вас более трёх датчиков напряжения"
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr "Утилита для определения температуры HDD/SSD"
+
+#: prefs.js:79
+msgid "None"
+msgstr "Нет"
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr "Утилита для определения температуры видеокарты"
+
+#: prefs.js:49
+msgid "Left"
+msgstr "Слева"
+
+#: prefs.js:49
+msgid "Center"
+msgstr "По центру"
+
+#: prefs.js:49
+msgid "Right"
+msgstr "Справа"
+
+#: extension.js:479
+msgid "Go to the Freon wiki"
+msgstr "Перейти на wiki Freon"
+
+#: extension.js:486
+#, fuzzy
+#| msgid "Sensors Settings"
+msgid "Sensor Settings"
+msgstr "Настройки"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po b/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po
new file mode 100644
index 0000000..4f41d8f
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po
@@ -0,0 +1,151 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-10-06 17:05-0300\n"
+"PO-Revision-Date: 2019-09-19 17:53+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.3\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:319
+msgid "Average"
+msgstr "Середня"
+
+#: extension.js:320
+msgid "Maximum"
+msgstr "Максимальна"
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr "%dоб/хв"
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2fВ"
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr "Будь ласка, запустіть детектор сенсорів як root."
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"Будь ласка, встановіть lm_sensors.\n"
+"Якщо це не допоможе, натисніть тут, щоб повідомити про відсутність сенсорів!"
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr "Сенсори температури"
+
+#: extension.js:495
+msgid "Voltage"
+msgstr "Напруга"
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr "Налаштування сенсорів"
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr "Опитувати сенсори кожні (сек)"
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr "Показувати десяткове значення"
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr "Показувати одну цифру після десяткового знаку"
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr "Одиниця виміру температури"
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr "Положення на панелі"
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr "Показувати значок на панелі"
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr "Показувати швидкість вентилятора"
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr "Показувати напругу живлення"
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr "Групувати елементи температури"
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr "Працює, якщо у вас більше трьох сенсорів температури"
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr "Групувати елементи напруги"
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr "Працює, якщо у вас більше трьох сенсорів напруги"
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr "Утиліта для визначення температури HDD/SSD"
+
+#: prefs.js:79
+msgid "None"
+msgstr "Ніяка"
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr "Утиліта для визначення температури відеокарти"
+
+#: prefs.js:49
+msgid "Left"
+msgstr "Ліворуч"
+
+#: prefs.js:49
+msgid "Center"
+msgstr "В центрі"
+
+#: prefs.js:49
+msgid "Right"
+msgstr "Праворуч"
+
+#: extension.js:479
+msgid "Go to the Freon wiki"
+msgstr "Перейти на wiki Freon"
+
+#: extension.js:486
+#, fuzzy
+#| msgid "Sensors Settings"
+msgid "Sensor Settings"
+msgstr "Налаштування сенсорів"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po b/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po
new file mode 100644
index 0000000..a5fd5f0
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po
@@ -0,0 +1,128 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-02-20 19:18+0800\n"
+"PO-Revision-Date: 2016-02-20 19:19+0800\n"
+"Last-Translator: Dingzhong Chen <wsxy162@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: bumblebeeNvidiaUtil.js:75 prefs.js:82
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:319
+msgid "Average"
+msgstr "平均值"
+
+#: extension.js:320
+msgid "Maximum"
+msgstr "最大值"
+
+#: extension.js:341
+#, javascript-format
+msgid "%drpm"
+msgstr "%drpm"
+
+#: extension.js:350
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2fV"
+
+#: extension.js:396
+msgid "Please run sensors-detect as root."
+msgstr "请以 root 运行 sensors-detect。"
+
+#: extension.js:397
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"请安装 lm_sensors。\n"
+"如果这不管用,点击这里并报告你的传感器输出!"
+
+#: extension.js:488
+msgid "Temperature Sensors"
+msgstr "温度传感器"
+
+#: extension.js:495
+msgid "Voltage"
+msgstr "电压"
+
+#: extension.js:509
+msgid "Sensors Settings"
+msgstr "传感器设置"
+
+#: prefs.js:33
+msgid "Poll Sensors Every (sec)"
+msgstr "查询传感器每(秒)"
+
+#: prefs.js:39
+msgid "Show Decimal Value"
+msgstr "显示小数部分"
+
+#: prefs.js:40
+msgid "Show one digit after decimal"
+msgstr "显示小数点后一位数字"
+
+#: prefs.js:45
+msgid "Temperature Unit"
+msgstr "温度单位"
+
+#: prefs.js:51
+msgid "Position in Panel"
+msgstr "面板位置"
+
+#: prefs.js:55
+msgid "Show Icon on Panel"
+msgstr "在面板显示图标"
+
+#: prefs.js:58
+msgid "Show Fan Speed"
+msgstr "显示风扇转速"
+
+#: prefs.js:61
+msgid "Show Power Supply Voltage"
+msgstr "显示电源电压"
+
+#: prefs.js:64
+msgid "Group Temperature Items"
+msgstr "编组温度项"
+
+#: prefs.js:65
+msgid "Works if you have more than three temperature sensors"
+msgstr "如果你有超过三个温度传感器时可用"
+
+#: prefs.js:68
+msgid "Group Voltage Items"
+msgstr "编组电压项"
+
+#: prefs.js:69
+msgid "Works if you have more than three voltage sensors"
+msgstr "如果你有超过三个电压传感器时可用"
+
+#: prefs.js:74
+msgid "HDD/SSD Temperature Utility"
+msgstr "HDD/SSD 温度工具"
+
+#: prefs.js:79
+msgid "None"
+msgstr "无"
+
+#: prefs.js:80
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:81
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:84
+msgid "Video Card Temperature Utility"
+msgstr "显卡温度工具"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po b/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po
new file mode 100644
index 0000000..534129b
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po
@@ -0,0 +1,253 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-05-31 11:23-0700\n"
+"PO-Revision-Date: 2020-05-31 11:53-0700\n"
+"Last-Translator: Bowie Chen <bowiechen@users.noreply.github.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.3\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Poedit-Basepath: ..\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: bumblebeeNvidiaUtil.js:79 prefs.js:83
+msgid "Bumblebee + NVIDIA"
+msgstr "Bumblebee + NVIDIA"
+
+#: extension.js:381
+msgid "Average"
+msgstr "平均值"
+
+#: extension.js:385
+msgid "Maximum"
+msgstr "最大值"
+
+#: extension.js:407
+#, javascript-format
+msgid "%drpm"
+msgstr "%drpm"
+
+#: extension.js:416
+#, javascript-format
+msgid "%s%.2fV"
+msgstr "%s%.2fV"
+
+#: extension.js:465
+msgid "Please run sensors-detect as root."
+msgstr "請以 root 執行 sensors-detect。"
+
+#: extension.js:466
+msgid ""
+"Please install lm_sensors.\n"
+"If this doesn't help, click here to report with your sensors output!"
+msgstr ""
+"請安裝 lm_sensors。\n"
+"如果沒有改進,點擊這裡並輸出您的感測器數據!"
+
+#: extension.js:481
+msgid "Go to the Freon wiki"
+msgstr "到 Freon 的 wiki"
+
+#: extension.js:488
+msgid "Sensor Settings"
+msgstr "感測器設定"
+
+#: extension.js:579
+msgid "Temperature Sensors"
+msgstr "溫度感測器"
+
+#: extension.js:593
+msgid "Voltage"
+msgstr "電壓"
+
+#: prefs.js:30
+msgid "Poll Sensors Every (sec)"
+msgstr "更新速率(每秒)"
+
+#: prefs.js:36
+msgid "Show Decimal Value"
+msgstr "顯示小數部分"
+
+#: prefs.js:37 schemas/org.gnome.shell.extensions.sensors.gschema.xml:33
+msgid "Show one digit after decimal"
+msgstr "顯示小數點後一位數"
+
+#: prefs.js:42
+msgid "Temperature Unit"
+msgstr "溫度單位"
+
+#: prefs.js:46
+msgid "Left"
+msgstr "左"
+
+#: prefs.js:46
+msgid "Center"
+msgstr "中"
+
+#: prefs.js:46
+msgid "Right"
+msgstr "右"
+
+#: prefs.js:48 schemas/org.gnome.shell.extensions.sensors.gschema.xml:62
+msgid "Position in Panel"
+msgstr "面板位置"
+
+#: prefs.js:56 schemas/org.gnome.shell.extensions.sensors.gschema.xml:20
+msgid "Show Icon on Panel"
+msgstr "在面板顯示圖示"
+
+#: prefs.js:59
+msgid "Show Fan Speed"
+msgstr "顯示風扇轉速"
+
+#: prefs.js:62
+msgid "Show Power Supply Voltage"
+msgstr "顯示電源電壓"
+
+#: prefs.js:65
+msgid "Group Temperature Items"
+msgstr "聚集溫度項目"
+
+#: prefs.js:66
+msgid "Works if you have more than three temperature sensors"
+msgstr "如果您有超過三個溫度感測器時可用"
+
+#: prefs.js:69
+msgid "Group Voltage Items"
+msgstr "聚集電壓項目"
+
+#: prefs.js:70
+msgid "Works if you have more than three voltage sensors"
+msgstr "如果您有超過三個電壓感測器時可用"
+
+#: prefs.js:75
+msgid "HDD/SSD Temperature Utility"
+msgstr "HDD/SSD 溫度工具"
+
+#: prefs.js:80
+msgid "None"
+msgstr "無"
+
+#: prefs.js:81
+msgid "NVIDIA"
+msgstr "NVIDIA"
+
+#: prefs.js:82
+msgid "Catalyst"
+msgstr "Catalyst"
+
+#: prefs.js:85
+msgid "Video Card Temperature Utility"
+msgstr "顯示卡溫度工具"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:8
+msgid "Seconds before next update"
+msgstr "每幾秒從工具讀取最新數據"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:9
+msgid ""
+"This is the seconds after CPU temperature extension updates the data from "
+"the syetem"
+msgstr "從溫度工具讀取數據的頻率"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:14
+msgid "Unit"
+msgstr "單位"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:15
+msgid ""
+"The unit ('centigrade' or 'fahrenheit') the extension should display the "
+"temperature in"
+msgstr "使用攝氏或是華氏顯示溫度"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:21
+msgid "Show sensor icon on top panel"
+msgstr "在面板顯示圖示"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:26
+msgid "Sensors to show in panel"
+msgstr "面板中顯示的感測器"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:27
+msgid "Select the sensord whose values has to be shown in the panel"
+msgstr "選擇面板中要顯示的感測器"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:32
+msgid "Show decimal value"
+msgstr "顯示小數部分"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:38
+msgid "Display Fan RPM"
+msgstr "顯示風扇每分鐘轉速"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:39
+msgid "Display fan rotation per minute"
+msgstr "顯示風扇每分鐘轉速"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:44
+msgid "Display voltage"
+msgstr "顯示電壓"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:45
+msgid "Display voltage of various components"
+msgstr "顯示套件電壓"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:50
+msgid "Utility for detect HDD/SSD temperature"
+msgstr "偵測 HDD/SSD 溫度工具"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:51
+msgid "Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2')"
+msgstr "偵測 HDD/SSD 溫度工具(無、hddtemp、udisks2)"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:56
+msgid "Utility for detect video card temperature"
+msgstr "偵測顯示卡溫度工具"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:57
+msgid ""
+"Utility for detect video card temperature ('none', 'nvidia-settings' or "
+"'aticonfig')"
+msgstr "偵測顯示卡溫度工具(無、nvidia-settings、aticonfig)"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:63
+msgid "Position in Panel ('left', 'center', 'right')"
+msgstr "面板位置(左、中、右)"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:68
+msgid "Index in panel box"
+msgstr "面板順位"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:69
+msgid ""
+"Index within the selected panel box (0: first, 1: second, ..., -1: last)"
+msgstr "面板順位(0為第一、1為第二、以此類推;-1為倒數第一)"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:74
+msgid "Group temperature menu items"
+msgstr "組合溫度項目"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:75
+msgid "Group more than three sensors temperature menu items"
+msgstr "如果您有超過三個溫度感測器時可用"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:80
+msgid "Group voltage menu items"
+msgstr "組合電壓項目"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:81
+msgid "Group more than three voltage menu items"
+msgstr "如果您有超過三個電壓感測器時可用"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:86
+msgid "Enable debug logging"
+msgstr "啟用開發者輸出"
+
+#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:87
+msgid "Enable debug logging from the extension"
+msgstr "從擴充啟用開發者輸出"
diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js
new file mode 100644
index 0000000..e491f5d
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js
@@ -0,0 +1,136 @@
+const GObject = imports.gi.GObject;
+const Gio = imports.gi.Gio;
+const Gtk = imports.gi.Gtk;
+
+const ExtensionUtils = imports.misc.extensionUtils;
+const Me = ExtensionUtils.getCurrentExtension();
+
+const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
+const _ = Gettext.gettext;
+
+const modelColumn = {
+ label: 0,
+ separator: 1
+}
+
+function init() {
+ ExtensionUtils.initTranslations();
+}
+
+var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget extends Gtk.Grid {
+
+ _init() {
+ super._init();
+ this.margin = this.row_spacing = this.column_spacing = 20;
+
+ this._settings = ExtensionUtils.getSettings();
+
+ let i = 0;
+
+ this.attach(new Gtk.Label({ label: _('Poll Sensors Every (sec)'), halign : Gtk.Align.END}), 0, i, 1, 1);
+ let updateTime = Gtk.SpinButton.new_with_range (1, 60, 1);
+ this.attach(updateTime, 1, i++, 1, 1);
+ this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT);
+
+ this._addSwitch({key : 'show-decimal-value', y : i, x : 0,
+ label : _('Show Decimal Value'),
+ help : _("Show one digit after decimal")});
+
+ this._addComboBox({
+ items : {centigrade : "\u00b0C", fahrenheit : "\u00b0F"},
+ key: 'unit', y : i++, x : 3,
+ label: _('Temperature Unit')
+ });
+
+ this._addComboBox({
+ items : {left : _('Left'), center : _('Center'), right : _('Right')},
+ key: 'position-in-panel', y : i, x : 0,
+ label: _('Position in Panel')
+ });
+
+ let panelBoxIndex = Gtk.SpinButton.new_with_range (-1, 20, 1);
+ this.attach(panelBoxIndex, 2, i, 1, 1);
+ this._settings.bind('panel-box-index', panelBoxIndex, 'value', Gio.SettingsBindFlags.DEFAULT);
+
+ this._addSwitch({key : 'show-degrees-on-panel', y : i++, x : 3,
+ label : _('Show \u00b0C/\u00b0F on Panel')});
+
+ this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 3,
+ label : _('Show Icon on Panel')});
+
+ this._addSwitch({key : 'show-fan-rpm', y : i, x : 0,
+ label : _('Show Fan Speed')});
+
+ this._addSwitch({key : 'show-voltage', y : i++, x : 3,
+ label : _('Show Power Supply Voltage')});
+
+ this._addSwitch({key : 'group-temperature', y : i, x : 0,
+ label : _('Group Temperature Items'),
+ help : _("Works if you have more than three temperature sensors")});
+
+ this._addSwitch({key : 'group-voltage', y : i++, x : 3,
+ label : _('Group Voltage Items'),
+ help : _("Works if you have more than three voltage sensors")});
+
+ this._addComboBox({
+ items : {none : 'None', hddtemp : 'Hddtemp', udisks2 : 'UDisks2', smartctl : 'smartctl', nvmecli : 'nvme-cli'},
+ key: 'drive-utility', y : i, x : 0,
+ label: _('HDD/SSD Temperature Utility')
+ });
+
+ this._addComboBox({
+ items : {
+ 'none' : _('None'),
+ 'nvidia-settings' : _('NVIDIA'),
+ 'aticonfig' : _('Catalyst'),
+ 'bumblebee-nvidia-smi': _('Bumblebee + NVIDIA') },
+ key: 'gpu-utility', y : i, x : 3,
+ label: _('Video Card Temperature Utility')
+ });
+ }
+
+ _addSwitch(params){
+ let lbl = new Gtk.Label({label: params.label,halign : Gtk.Align.END});
+ this.attach(lbl, params.x, params.y, 1, 1);
+ let sw = new Gtk.Switch({halign : Gtk.Align.END, valign : Gtk.Align.CENTER});
+ this.attach(sw, params.x + 1, params.y, 1, 1);
+ if(params.help){
+ lbl.set_tooltip_text(params.help);
+ sw.set_tooltip_text(params.help);
+ }
+ this._settings.bind(params.key, sw, 'active', Gio.SettingsBindFlags.DEFAULT);
+ }
+
+ _addComboBox(params){
+ let model = new Gtk.ListStore();
+ model.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]);
+
+ let combobox = new Gtk.ComboBox({model: model});
+ let renderer = new Gtk.CellRendererText();
+ combobox.pack_start(renderer, true);
+ combobox.add_attribute(renderer, 'text', 1);
+
+ for(let k in params.items){
+ model.set(model.append(), [0, 1], [k, params.items[k]]);
+ }
+
+ combobox.set_active(Object.keys(params.items).indexOf(this._settings.get_string(params.key)));
+
+ combobox.connect('changed', (entry) => {
+ let [success, iter] = combobox.get_active_iter();
+ if (!success)
+ return;
+ this._settings.set_string(params.key, model.get_value(iter, 0))
+ });
+
+ this.attach(new Gtk.Label({ label: params.label, halign : Gtk.Align.END}), params.x, params.y, 1, 1);
+ this.attach(combobox, params.x + 1, params.y, 1, 1);
+ }
+
+});
+
+function buildPrefsWidget() {
+ let w = new FreonPrefsWidget();
+ w.show_all();
+ return w;
+}
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
new file mode 100644
index 0000000..499c572
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schemalist gettext-domain="gse-sensors">
+
+ <schema id="org.gnome.shell.extensions.freon" path="/org/gnome/shell/extensions/freon/">
+
+ <key type="i" name="update-time">
+ <default>5</default>
+ <summary>Seconds before next update</summary>
+ <description>This is the seconds after CPU temperature extension updates the data from the syetem</description>
+ </key>
+
+ <key type="s" name="unit">
+ <default>'centigrade'</default>
+ <summary>Unit</summary>
+ <description>The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in</description>
+ </key>
+
+ <key type="b" name="show-degrees-on-panel">
+ <default>true</default>
+ <summary>Show degrees celsius/fahrenheit on Panel</summary>
+ <description>Show degrees celsius/fahrenheit on Panel</description>
+ </key>
+
+ <key type="b" name="show-icon-on-panel">
+ <default>true</default>
+ <summary>Show Icon on Panel</summary>
+ <description>Show sensor icon on top panel</description>
+ </key>
+
+ <key name="hot-sensors" type="as">
+ <default>["__average__", "__max__"]</default>
+ <summary>Sensors to show in panel</summary>
+ <description>Select the sensord whose values has to be shown in the panel</description>
+ </key>
+
+ <key type="b" name="show-decimal-value">
+ <default>false</default>
+ <summary>Show decimal value</summary>
+ <description>Show one digit after decimal</description>
+ </key>
+
+ <key type="b" name="show-fan-rpm">
+ <default>true</default>
+ <summary>Display Fan RPM</summary>
+ <description>Display fan rotation per minute</description>
+ </key>
+
+ <key type="b" name="show-voltage">
+ <default>true</default>
+ <summary>Display voltage</summary>
+ <description>Display voltage of various components</description>
+ </key>
+
+ <key type="s" name="drive-utility">
+ <default>'udisks2'</default>
+ <summary>Utility for detect HDD/SSD temperature</summary>
+ <description>Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2')</description>
+ </key>
+
+ <key type="s" name="gpu-utility">
+ <default>'none'</default>
+ <summary>Utility for detect video card temperature</summary>
+ <description>Utility for detect video card temperature ('none', 'nvidia-settings' or 'aticonfig')</description>
+ </key>
+
+ <key type="s" name="position-in-panel">
+ <default>'right'</default>
+ <summary>Position in Panel</summary>
+ <description>Position in Panel ('left', 'center', 'right')</description>
+ </key>
+
+ <key name="panel-box-index" type="i">
+ <default>0</default>
+ <summary>Index in panel box</summary>
+ <description>Index within the selected panel box (0: first, 1: second, ..., -1: last)</description>
+ </key>
+
+ <key type="b" name="group-temperature">
+ <default>true</default>
+ <summary>Group temperature menu items</summary>
+ <description>Group more than three sensors temperature menu items</description>
+ </key>
+
+ <key type="b" name="group-voltage">
+ <default>true</default>
+ <summary>Group voltage menu items</summary>
+ <description>Group more than three voltage menu items</description>
+ </key>
+
+ <key type="b" name="debug">
+ <default>false</default>
+ <summary>Enable debug logging</summary>
+ <description>Enable debug logging from the extension</description>
+ </key>
+
+ </schema>
+</schemalist>
diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js
new file mode 100644
index 0000000..50ff2bc
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js
@@ -0,0 +1,86 @@
+const GLib = imports.gi.GLib;
+
+const Me = imports.misc.extensionUtils.getCurrentExtension();
+const CommandLineUtil = Me.imports.commandLineUtil;
+
+var SensorsUtil = class extends CommandLineUtil.CommandLineUtil {
+
+ constructor() {
+ super();
+ let path = GLib.find_program_in_path('sensors');
+ // -A: Do not show adapter -j: JSON output
+ this._argv = path ? [path, '-A', '-j'] : null;
+ }
+
+ get temp() {
+ return this._parseGenericSensorsOutput(/^temp\d+_input/, 'temp');
+ }
+
+ get gpu() {
+ return this._parseGpuSensorsOutput(/^temp\d+_input/, 'temp');
+ }
+
+ get rpm() {
+ return this._parseGenericSensorsOutput(/^fan\d+_input/, 'rpm');
+ }
+
+ get volt() {
+ return this._parseGenericSensorsOutput(/^in\d+_input/, 'volt');
+ }
+
+ _parseGenericSensorsOutput(sensorFilter, sensorType) {
+ return this._parseSensorsOutput(sensorFilter, sensorType, false);
+ }
+
+ _parseGpuSensorsOutput(sensorFilter, sensorType) {
+ return this._parseSensorsOutput(sensorFilter, sensorType, true);
+ }
+
+ _parseSensorsOutput(sensorFilter, sensorType, gpuFlag) {
+ if(!this._output)
+ return [];
+
+ let data = []
+ try {
+ data = JSON.parse(this._output.join(''));
+ } catch (e) {
+ try {
+ // fix for wrong lm_sensors output
+ // https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues/114#issuecomment-491613545
+ let lineRemoved = this._output.filter(l => l.trim() !== ',').join('\n');
+ let errorRemoved = lineRemoved.replace(/ERROR.*Can't read/, "");
+ errorRemoved = errorRemoved.replace(/ERROR.*I\/O error/, "");
+ data = JSON.parse(errorRemoved);
+ } catch (e) {
+ global.log(e.toString());
+ return [];
+ }
+ }
+
+ let sensors = [];
+ for (var chipset in data) {
+ let gpuFilter = /(radeon|amdgpu|nouveau)/;
+ if (!data.hasOwnProperty(chipset) || (gpuFlag != gpuFilter.test(chipset) && sensorType === 'temp'))
+ continue;
+
+ let chipsetSensors = data[chipset]
+ for (var sensor in chipsetSensors) {
+ if (!chipsetSensors.hasOwnProperty(sensor))
+ continue;
+
+ let fields = chipsetSensors[sensor];
+ for (var key in fields) {
+ if (fields.hasOwnProperty(key) && sensorFilter.test(key)) {
+ let feature = {
+ label: sensor,
+ [sensorType]: parseFloat(fields[key])
+ };
+ sensors.push(feature);
+ break;
+ }
+ }
+ }
+ }
+ return sensors;
+ }
+};
diff --git a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js
new file mode 100644
index 0000000..03d469b
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js
@@ -0,0 +1,51 @@
+const GLib = imports.gi.GLib;
+
+const Me = imports.misc.extensionUtils.getCurrentExtension();
+const ByteArray = imports.byteArray;
+function getSmartData (argv){
+ const smartctl = GLib.find_program_in_path('smartctl')
+ return JSON.parse(ByteArray.toString( GLib.spawn_command_line_sync(`${smartctl} ${argv} -j`)[1] ))
+}
+
+var smartctlUtil = class {
+ constructor(callback) {
+ this._smartDevices = [];
+ try {
+ this._smartDevices = getSmartData("--scan")["devices"]
+ global.log('[FREON] test devices: ' + e);
+ } catch (e) {
+ global.log('[FREON] Unable to find smart devices: ' + e);
+ }
+ this._updated = true;
+ }
+
+ get available(){
+ return this._smartDevices.length > 0;
+ }
+
+ get updated (){
+ return this._updated;
+ }
+
+ set updated (updated){
+ this._updated = updated;
+ }
+
+ get temp() {
+ return this._smartDevices.map(device => {
+ return {
+ label: getSmartData(`--info ${device["name"]}`)["model_name"],
+ temp: parseFloat(getSmartData(`--attributes ${device["name"]}`).temperature.current)
+ }
+ })
+ }
+
+ destroy(callback) {
+ this._smartDevices = [];
+ }
+
+ execute(callback) {
+ this._updated = true;
+ }
+
+};
diff --git a/freon@UshakovVasilii_Github.yahoo.com/stylesheet.css b/freon@UshakovVasilii_Github.yahoo.com/stylesheet.css
new file mode 100644
index 0000000..9b10182
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/stylesheet.css
@@ -0,0 +1,7 @@
+.freon-panel-icon-label {
+ padding: 0 0;
+}
+
+.freon-panel-no-icon-label {
+ padding: 0 4px;
+}
diff --git a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js
new file mode 100644
index 0000000..5c7700f
--- /dev/null
+++ b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js
@@ -0,0 +1,125 @@
+const Gio = imports.gi.Gio;
+
+const UDisksDriveProxy = Gio.DBusProxy.makeProxyWrapper(
+'<node> \
+ <interface name="org.freedesktop.UDisks2.Drive"> \
+ <property type="s" name="Model" access="read"/> \
+ </interface> \
+</node>');
+
+const UDisksDriveAtaProxy = Gio.DBusProxy.makeProxyWrapper(
+'<node> \
+ <interface name="org.freedesktop.UDisks2.Drive.Ata"> \
+ <property type="d" name="SmartTemperature" access="read"/> \
+ </interface> \
+</node>');
+
+// Poor man's async.js
+const Async = {
+ // mapping will be done in parallel
+ map(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
+var UDisks2 = class {
+
+ constructor(callback) {
+ this._udisksProxies = [];
+ this._get_drive_ata_proxies((proxies) => {
+ this._udisksProxies = proxies;
+ callback();
+ });
+ this._updated = true;
+ }
+
+ get available(){
+ return this._udisksProxies.length > 0;
+ }
+
+ get updated (){
+ return this._updated;
+ }
+
+ set updated (updated){
+ this._updated = updated;
+ }
+
+ // creates a list of sensor objects from the list of proxies given
+ get temp() {
+ 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 - 273.15
+ };
+ });
+ }
+
+ // calls callback with [{ drive: UDisksDriveProxy, ata: UDisksDriveAtaProxy }, ... ] for every drive that implements both interfaces
+ _get_drive_ata_proxies(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(callback) {
+ for (let proxy of this._udisksProxies){
+ if(proxy.drive){
+ proxy.drive.run_dispose();
+ }
+ if(proxy.ata){
+ proxy.ata.run_dispose();
+ }
+ }
+ this._udisksProxies = [];
+ }
+
+ execute(callback) {
+ this._updated = true;
+ }
+
+};