diff --git a/freon@UshakovVasilii_Github.yahoo.com/batteryUtil.js b/freon@UshakovVasilii_Github.yahoo.com/batteryUtil.js new file mode 100644 index 0000000..c4f3d91 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/batteryUtil.js @@ -0,0 +1,110 @@ +import GLib from 'gi://GLib'; + + +export default class BatteryUtil { + + constructor(callback) { + this._bat_path = []; // Path to batteries for cat + this._find_batteries(); + } + + get available(){ + return (this._bat_path[0]) ? true : false; + } + + get energy() { + let features = [] + this._bat_path.forEach((bat_path) => { + let energy = parseFloat(this._get_sensor_data(bat_path, "energy_now")); + energy /= 1000000.00; + + let bat_name = bat_path.split('/').pop(); + let feature = { + label: bat_name + " Energy", + ["power"]: energy + }; + features.push(feature); + }); + return features; + } + + get power() { + let features = []; + this._bat_path.forEach((bat_path) => { + let power = parseFloat(this._get_sensor_data(bat_path, "power_now")); + power /= 1000000.00; + + let state = this._get_sensor_data(bat_path, "status"); + if (state.startsWith("Dis")) + power *= -1; + + let bat_name = bat_path.split('/').pop(); + let feature = { + label: bat_name + " Power", + ["power"]: power + }; + features.push(feature); + }) + return features; + } + + get voltage() { + let features = []; + this._bat_path.forEach((bat_path) => { + let voltage = parseFloat(this._get_sensor_data(bat_path, "voltage_now")); + voltage /= 1000000.00; + + let bat_name = bat_path.split('/').pop(); + let feature = { + label: bat_name + " Voltage", + ["volt"]: voltage + }; + features.push(feature); + }) + return features; + } + + + destroy(callback) { + this._bat_path = []; + } + + execute(callback) { + } + + _find_batteries() { + const cmd = `find /sys/class/power_supply/ -type l -name "BAT*"` + let cmd_res = [] + try { + cmd_res = GLib.spawn_command_line_sync(cmd) + } catch (e) { + logError(e, `[FREON] failed to execute "find"`) + } + if (cmd_res[0] == true) { + this._bat_path = new TextDecoder().decode( cmd_res[1] ).split('\n') + let trailing_path = this._bat_path.pop() + if (trailing_path.length > 1) // remove empty trailing Elements + this._bat_path.push(trailing_path) + } + else { + print(`"find" returned an error: ${cmd_res[2]}`) + } + } + + _get_sensor_data(bat_path, sensor) { + const path = `${bat_path}/${sensor}` + const cmd = "cat " + path; + + let cmd_res = [] + try { + cmd_res = GLib.spawn_command_line_sync(cmd) + } catch (e) { + logError(e, `[FREON] failed to execute "cat"`) + } + if (cmd_res[0] == true) + return new TextDecoder().decode(cmd_res[1]) + else + return "" + } + +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index d7ba65d..1b248f7 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -23,6 +23,7 @@ import Udisks2Util from './udisks2.js'; import HddtempUtil from './hddtempUtil.js'; import SmartctlUtil from './smartctlUtil.js'; import NvmecliUtil from './nvmecliUtil.js'; +import BatteryUtil from './batteryUtil.js'; import FreonItem from './freonItem.js'; @@ -76,6 +77,7 @@ class FreonMenuButton extends PanelMenu.Button { this._initSensorsUtility(); this._initFreeipmiUtility(); this._initLiquidctlUtility(); + this._initBatteryUtility(); this._initNvidiaUtility(); this._initBumblebeeNvidiaUtility(); @@ -88,6 +90,7 @@ class FreonMenuButton extends PanelMenu.Button { let temperatureIcon = Gio.icon_new_for_string(path + '/icons/material-icons/material-temperature-symbolic.svg'); let voltageIcon = Gio.icon_new_for_string(path + '/icons/freon-voltage-symbolic.svg'); + let batteryIcon = Gio.icon_new_for_string(path + '/icons/freon-battery-symbolic.svg'); this._sensorIcons = { 'temperature' : temperatureIcon, @@ -98,6 +101,7 @@ class FreonMenuButton extends PanelMenu.Button { 'voltage' : voltageIcon, 'fan' : Gio.icon_new_for_string(path + '/icons/freon-fan-symbolic.svg'), 'power' : voltageIcon, + 'battery' : batteryIcon, } this._menuLayout = new St.BoxLayout(); @@ -136,9 +140,9 @@ class FreonMenuButton extends PanelMenu.Button { this._addSettingChangedSignal('show-decimal-value', this._querySensors.bind(this)); this._addSettingChangedSignal('use-generic-lmsensors', this._sensorsUtilityChanged.bind(this)); - this._addSettingChangedSignal('use-generic-freeipmi', this._freeipmiUtilityChanged.bind(this)); - this._addSettingChangedSignal('exec-method-freeipmi', this._freeipmiUtilityChanged.bind(this)); + this._addSettingChangedSignal('freeimpi-selected', this._freeipmiUtilityChanged.bind(this)); this._addSettingChangedSignal('use-generic-liquidctl', this._liquidctlUtilityChanged.bind(this)); + this._addSettingChangedSignal('show-battery-stats', this._batteryUtilityChanged.bind(this)); this._addSettingChangedSignal('use-gpu-nvidia', this._nvidiaUtilityChanged.bind(this)); this._addSettingChangedSignal('use-gpu-nvidiabumblebee', this._nvidiabumblebeeUtilityChanged.bind(this)); @@ -153,6 +157,7 @@ class FreonMenuButton extends PanelMenu.Button { this._addSettingChangedSignal('show-rotationrate', this._rerender.bind(this)); this._addSettingChangedSignal('show-voltage', this._rerender.bind(this)); this._addSettingChangedSignal('show-power', this._rerender.bind(this)); + this._addSettingChangedSignal('group-temperature', this._rerender.bind(this)) this._addSettingChangedSignal('group-rotationrate', this._rerender.bind(this)) @@ -213,9 +218,21 @@ class FreonMenuButton extends PanelMenu.Button { 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); + let p = this._settings.get_int('position-in-panel'); + + console.debug(p) + + switch (p) { + case 0: + boxes['left'].insert_child_at_index(this.container, i); break; + case 1: + boxes['center'].insert_child_at_index(this.container, i); break; + case 2: + default: + boxes['right'].insert_child_at_index(this.container, i); break; + } + //boxes[p].insert_child_at_index(this.container, i); } _showIconOnPanelChanged(){ @@ -258,14 +275,16 @@ class FreonMenuButton extends PanelMenu.Button { } _initFreeipmiUtility() { - if (this._settings.get_boolean('use-generic-freeipmi')) - { - let exec_method = this._settings.get_string('exec-method-freeipmi'); + let exec_method = this._settings.get_int('freeimpi-selected'); + if (exec_method != 0) { try { - this._utils.freeipmi = new FreeipmiUtil(exec_method); + if (exec_method == 1) + this._utils.freeipmi = new FreeipmiUtil("direct"); + else if (exec_method == 2) + this._utils.freeipmi = new FreeipmiUtil("pkexec"); } catch (e) { - if (exec_method != 'direct') { - this._settings.set_string('exec-method-freeipmi', 'direct'); + if (exec_method == 2) { + this._settings.set_int('freeimpi-selected', 1); this._freeipmiUtilityChanged(); } } @@ -305,6 +324,25 @@ class FreonMenuButton extends PanelMenu.Button { this._updateUI(true); } + _initBatteryUtility() { + if (this._settings.get_boolean("show-battery-stats")) + this._utils.battery = new BatteryUtil(); + } + + _destroyBatteryUtility() { + if (this._utils.battery) { + this._utils.battery.destroy(); + delete this._utils.battery; + } + } + + _batteryUtilityChanged() { + this._destroyBatteryUtility(); + this._initBatteryUtility(); + this._querySensors(); + this._updateUI(true); + } + _initNvidiaUtility() { if (this._settings.get_boolean('use-gpu-nvidia')) this._utils.nvidia = new NvidiaUtil(); @@ -471,6 +509,8 @@ class FreonMenuButton extends PanelMenu.Button { this._destroySmartctlUtility(); this._destroyNvmecliUtility(); + this._destroyBatteryUtility(); + GLib.Source.remove(this._timeoutId); GLib.Source.remove(this._updateUITimeoutId); @@ -549,8 +589,10 @@ class FreonMenuButton extends PanelMenu.Button { fanInfo = fanInfo.concat(this._utils.sensors.rpm); if (this._settings.get_boolean('show-voltage')) voltageInfo = voltageInfo.concat(this._utils.sensors.volt); - if (this._settings.get_boolean('show-power')) + if (this._settings.get_boolean('show-power')) { powerInfo = powerInfo.concat(this._utils.sensors.power); + } + } if (this._utils.freeipmi && this._utils.freeipmi.available) { @@ -571,6 +613,12 @@ class FreonMenuButton extends PanelMenu.Button { voltageInfo = voltageInfo.concat(this._utils.liquidctl.volt); } + if (this._utils.battery && this._utils.battery.available) { + if (this._settings.get_boolean('show-battery-stats')) { + powerInfo = powerInfo.concat(this._utils.battery.power) + } + } + if (this._utils.nvidia && this._utils.nvidia.available) if (this._settings.get_boolean('show-temperature')) gpuTempInfo = gpuTempInfo.concat(this._utils.nvidia.temp); @@ -733,9 +781,12 @@ class FreonMenuButton extends PanelMenu.Button { for (let power of powerInfo){ const unit = this._settings.get_boolean('show-power-unit') ? _('W'): ''; - + let _icon = 'power'; + if (power.label.startsWith("BAT")) { + _icon = 'battery'; + } sensors.push({ - icon: 'power', + icon: _icon, type: 'power', label: power.label, value: _("%s%.2f%s").format(((power.power >= 0) ? '+' : ''), @@ -959,27 +1010,32 @@ class FreonMenuButton extends PanelMenu.Button { } _formatTemp(value) { - if(value === null) + let unit_type = this._settings.get_int('unit'); + let show_unit = this._settings.get_boolean('show-temperature-unit'); + + 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-temperature-unit')){ - return format.format(value, (this._settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C" ); - } else { - return format.format(value, ""); + if (unit_type == 1) { + value = this._toFahrenheit(value); } + + if (show_unit) { + if (unit_type == 0) { + format += "\u00b0C"; + } else if (unit_type == 1) { + format += "\u00b0F"; + } + } + return format.format(value); } - get positionInPanel(){ - return this._settings.get_string('position-in-panel'); - } } export default class extends Extension { diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/freon-battery-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-battery-symbolic.svg new file mode 100644 index 0000000..b57789a --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-battery-symbolic.svg @@ -0,0 +1,55 @@ + + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + Gnome Symbolic Icon Theme + + + + diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index c3db20d..1941ec9 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -1,230 +1,188 @@ -import Gio from 'gi://Gio'; -import GObject from 'gi://GObject'; -import Gtk from 'gi://Gtk?version=4.0'; +import Gio from 'gi://Gio' +import Gtk from 'gi://Gtk' +import Adw from 'gi://Adw' import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; -const modelColumn = { - label: 0, - separator: 1 -} -var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget extends Gtk.Grid { +export default class FreonPreferences extends ExtensionPreferences { - constructor(settings) { - super(); - this.margin = this.row_spacing = this.column_spacing = 20; + fillPreferencesWindow(window) { + window.set_default_size(1010, 800); - this._settings = settings; - - let i = 0; - let j = 0; - - this._addLabel({ - label: _('Display Options'), - y : i++, x : j + const grid = new Gtk.Grid({ + column_homogeneous: true, + column_spacing: 10, + row_homogeneous: false, }); - this._addLabel({ - label: _('Poll Sensors Every (sec)'), - y : i, x : j + this._settings = this.getSettings() + const page = new Adw.PreferencesPage({ + title: _('General'), + icon_name: 'dialog-information-symbolic', + }); + + const display_options = this._create_display_options(); + const generic_sensor_providers = this._create_generic_sensor_providers(); + const gpu_sensor_providers = this._create_gpu_sensor_providers(); + const drive_sensor_providers = this._create_drive_sensor_providers(); + const show_sensors = this._create_show_sensors(); + const item_group = this._create_item_grouping(); - let updateTime = Gtk.SpinButton.new_with_range (1, 60, 1); - this.attach(updateTime, j + 1, i++, 1, 1); - this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT); + grid.attach(display_options, 0, 0, 1, 12); + grid.attach(generic_sensor_providers, 1, 0, 1, 4); + grid.attach(gpu_sensor_providers, 1, 4, 1, 4); + grid.attach(drive_sensor_providers, 1, 8, 1, 4); + grid.attach(show_sensors, 2, 0, 1, 6); + grid.attach(item_group, 2, 6, 1, 4); - this._addComboBox({ - label: _('Position on Panel'), - items : {left : _('Left'), center : _('Center'), right : _('Right')}, - key: 'position-in-panel', y : i++, x : j - }); + const widget = new Adw.PreferencesGroup({ + hexpand: true, + vexpand: true, + }) + widget.add(grid); - this._addLabel({ - label: _('Index on Panel'), - y : i, x : j - }); + page.add(widget); - let panelBoxIndex = Gtk.SpinButton.new_with_range (-1, 20, 1); - this.attach(panelBoxIndex, j + 1, i++, 1, 1); - this._settings.bind('panel-box-index', panelBoxIndex, 'value', Gio.SettingsBindFlags.DEFAULT); - - this._addSwitch({key : 'show-icon-on-panel', y : i++, x : j, - label : _('Show Icon on Panel')}); - - this._addComboBox({ - label: _('Temperature Unit'), - items : {centigrade : _("\u00b0C"), fahrenheit : _("\u00b0F")}, - key: 'unit', y : i++, x : j - }); - - this._addSwitch({key : 'show-temperature-unit', y : i++, x : j, - label : _('Show Temperature Unit')}); - - this._addSwitch({key : 'show-rotationrate-unit', y : i++, x : j, - label : _('Show Rotation Rate Unit')}); - - this._addSwitch({key : 'show-voltage-unit', y : i++, x : j, - label : _('Show Voltage Unit')}); - - this._addSwitch({key : 'show-power-unit', y : i++, x : j, - label : _('Show Power Unit')}); - - this._addSwitch({key : 'show-decimal-value', y : i++, x : j, - label : _('Show Decimal Values'), - help : _("Show additionnal digits after decimal point")}); - - i = 0; - j = 2; - - this._addLabel({ - label: _('Generic Sensor Providers'), - y : i++, x : j - }); - - this._addSwitch({key : 'use-generic-lmsensors', y : i++, x : j, - label : 'lm-sensors', - help : _('Read sensors from lm-sensors')}); - - this._addSwitch({key : 'use-generic-freeipmi', y : i, x : j, - label : 'FreeIPMI', - help : _('Read sensors using ipmi-sensors from FreeIPMI')}); - - this._addComboBox({ - items : { - 'direct' : _('Direct'), - 'pkexec' : 'pkexec' }, - key: 'exec-method-freeipmi', y : i++, x : j + 1, - label: '' - }); - - this._addSwitch({key : 'use-generic-liquidctl', y : i++, x : j, - label : 'liquidctl', - help : _('Read sensors from liquidctl (requires v1.7.0 or later)')}); - - this._addLabel({ - label: _('GPU Sensor Providers'), - y : i++, x : j - }); - - this._addSwitch({key : 'use-gpu-nvidia', y : i++, x : j, - label : 'Nvidia'}); - - this._addSwitch({key : 'use-gpu-bumblebeenvidia', y : i++, x : j, - label : 'Bumblebee + Nvidia'}); - - this._addSwitch({key : 'use-gpu-aticonfig', y : i++, x : j, - label : 'Catalyst'}); - - this._addLabel({ - label: _('Drive Sensor Providers'), - y : i++, x : j - }); - - this._addSwitch({key : 'use-drive-udisks2', y : i++, x : j, - label : 'Udisks2'}); - - this._addSwitch({key : 'use-drive-hddtemp', y : i++, x : j, - label : 'Hddtemp'}); - - this._addSwitch({key : 'use-drive-smartctl', y : i++, x : j, - label : 'smartctl', - help : _('Read drive sensors using smartctl from smartmontools')}); - - this._addSwitch({key : 'use-drive-nvmecli', y : i++, x : j, - label : 'nvme-cli'}); - - i = 0; - j = 5; - - this._addLabel({ - label: _('Show Sensors'), - y : i++, x : j - }); - - this._addSwitch({key : 'show-temperature', y : i++, x : j, - label : _('Temperature')}); - - this._addSwitch({key : 'show-rotationrate', y : i++, x : j, - label : _('Rotation Rate')}); - - this._addSwitch({key : 'show-voltage', y : i++, x : j, - label : _('Voltage')}); - - this._addSwitch({key : 'show-power', y : i++, x : j, - label : _('Power')}); - - this._addLabel({ - label: _('Group Items'), - y : i++, x : j - }); - - this._addSwitch({key : 'group-temperature', y : i++, x : j, - label : _('Temperature'), - help : _("Group three or more temperature sensors")}); - - this._addSwitch({key : 'group-rotationrate', y : i++, x : j, - label : _('Rotation Rate'), - help : _("Group three or more rotation rate sensors")}); - - this._addSwitch({key : 'group-voltage', y : i++, x : j, - label : _('Voltage'), - help : _("Group three or more voltage sensors")}); - } - - _addLabel(params){ - let lbl = new Gtk.Label({label: params.label,halign : Gtk.Align.END}); - this.attach(lbl, params.x, params.y, 1, 1); - - if(params.help){ - lbl.set_tooltip_text(params.help); - } + window.add(page); } - _addSwitch(params){ - this._addLabel(params); - let sw = new Gtk.Switch({halign : Gtk.Align.END, valign : Gtk.Align.CENTER}); - this.attach(sw, params.x + 1, params.y, 1, 1); + _create_display_options() { + const group = new Adw.PreferencesGroup({ + title: _('Display Options'), + width_request: 320, + }) + + const sensor_poll_intervall = new Adw.SpinRow({ + title: _('Sensor Polling Interval'), + adjustment: new Gtk.Adjustment({ + lower: 1, + upper: 60, + value: 5, + step_increment: 1, + }) + }) + this._settings.bind('update-time', sensor_poll_intervall, 'value', Gio.SettingsBindFlags.DEFAULT) + group.add(sensor_poll_intervall) - if(params.help){ - sw.set_tooltip_text(params.help); - } + const position_in_panel = new Adw.ComboRow({ + title: _('Panel Position'), + model: new Gtk.StringList({strings: ["Left", "Center", "Right"] }), + }) + this._settings.bind("position-in-panel", position_in_panel, "selected", Gio.SettingsBindFlags.NO_SENSETIVITY); + group.add(position_in_panel) - this._settings.bind(params.key, sw, 'active', Gio.SettingsBindFlags.DEFAULT); + + const index_on_panel = new Adw.SpinRow({ + title: _('Index on Panel'), + adjustment: new Gtk.Adjustment({ + lower: -1, + upper: 25, + value: 1, + step_increment: 1, + }) + }); + group.add(index_on_panel); + this._settings.bind('panel-box-index', index_on_panel, 'value', Gio.SettingsBindFlags.DEFAULT); + + group.add(this._addSwitch("Show Icon on Panel", "show-icon-on-panel")); + + const unit_setting = new Adw.ComboRow({ + title: _('Temperature Unit'), + model: new Gtk.StringList({strings: ["\u00b0C", "\u00b0F"]}), + }); + this._settings.bind("unit", unit_setting, "selected", Gio.SettingsBindFlags.NO_SENSETIVITY); + group.add(unit_setting); + + group.add(this._addSwitch("Show Temperature Unit", "show-temperature-unit")); + group.add(this._addSwitch("Show Rotation Rate Unit", "show-rotationrate-unit")); + group.add(this._addSwitch("Show Voltage Unit", "show-voltage-unit")); + group.add(this._addSwitch("Show Power Unit", "show-power-unit")); + group.add(this._addSwitch("Show Decimal Values", "show-decimal-value", "Show additionnal digits after decimal point")); + return group; } - _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)) + _create_generic_sensor_providers() { + const group = new Adw.PreferencesGroup({ + title: _('Generic Sensor Providers'), + width_request: 320, }); - this._addLabel(params); + group.add(this._addSwitch("lm-sensors", "use-generic-lmsensors", "Read sensors from lm-sensors")); + group.add(this._addSwitch("liquidctl", "use-generic-liquidctl", "Read sensors from liquidctl (v1.7.0+)")); - this.attach(combobox, params.x + 1, params.y, 1, 1); + const freeimpi = new Adw.ComboRow({ + title: _('FreeIMPI'), + model: new Gtk.StringList({strings: ["Disabled", "Direct", "pkexec"] }), + selected: this._settings.get_int("freeimpi-selected"), + subtitle: "Read sensors using ipmi-sensors from FreeIPMI" + }); + this._settings.bind("freeimpi-selected", freeimpi, "selected", Gio.SettingsBindFlags.NO_SENSETIVITY); + group.add(freeimpi); + + return group; } -}); -export default class extends ExtensionPreferences { + _create_gpu_sensor_providers() { + const group = new Adw.PreferencesGroup({ + title: _('GPU Sensor Providers'), + width_request: 320, + }); + group.add(this._addSwitch("Nvidia", "use-gpu-nvidia")); + group.add(this._addSwitch("Bumblebee + Nvidia", "use-gpu-bumblebeenvidia")); + group.add(this._addSwitch("Catalyst", "use-gpu-aticonfig")); - getPreferencesWidget() { - return new FreonPrefsWidget(this.getSettings()); + return group; + } + + _create_drive_sensor_providers() { + const group = new Adw.PreferencesGroup({ + title: _('Drive Sensor Providers'), + width_request: 320, + }); + group.add(this._addSwitch("Udisks2", "use-drive-udisks2")); + group.add(this._addSwitch("Hddtemp", "use-drive-hddtemp")); + group.add(this._addSwitch("smartctl", "use-drive-smartctl", "Read drive sensors using smartctl from smartmontools")); + group.add(this._addSwitch("nvme-cli", "use-drive-nvmecli")); + + return group; + } + + _create_show_sensors() { + const group = new Adw.PreferencesGroup({ + title: _('Show Sensors'), + width_request: 320, + }) + + group.add(this._addSwitch("Temperature", "show-temperature")); + group.add(this._addSwitch("Rotation Rate", "show-rotationrate")); + group.add(this._addSwitch("Voltage", "show-voltage")); + group.add(this._addSwitch("Power", "show-power")); + group.add(this._addSwitch("Battery", "show-battery-stats")); + return group + } + + _create_item_grouping() { + const group = new Adw.PreferencesGroup({ + title: _('Group Items'), + width_request: 320, + description: "Group three or more sensor of the same type", + }) + group.add(this._addSwitch("Temperature", "group-temperature")); + group.add(this._addSwitch("Rotation Rate", "group-rotationrate")); + group.add(this._addSwitch("Voltage", "group-voltage")); + return group; + } + + _addSwitch(title, key, help = "") { + const sw = new Adw.SwitchRow({ + title: _(title), + active: this._settings.get_boolean(key), + subtitle: help + }); + this._settings.bind(key, sw, 'active', Gio.SettingsBindFlags.DEFAULT); + return sw; } } diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index 31e0343..83536dc 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -15,10 +15,10 @@ This is the seconds after CPU temperature extension updates the data from the system - - 'right' + + 2 Position in Panel - Position in Panel ('left', 'center', 'right') + Position in Panel ('Left', 'Center', 'Right') @@ -33,22 +33,22 @@ Show sensor icon on top panel - - true - Display Temperature - Display temperature - - - - 'centigrade' - Unit - The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in + + 0 + Select centigrade or fahrenheit + Choose wether to display the Number for centigrade or fahrenheit true - Show degrees celsius/fahrenheit on Panel - Show degrees celsius/fahrenheit on Panel + Enable the display of Temperature Unit on Panel + Enable the display of Temperature Unit on Panel + + + + true + Show RPM on Panel + Show RPM on Panel @@ -87,14 +87,14 @@ Read sensors from lm-sensors - - false - Read sensors using ipmi-sensors from FreeIPMI - Read sensors using ipmi-sensors from FreeIPMI + + 0 + Selected element number in the FreeIMPI-Dropdown + Selected element number in the FreeIMPI-Dropdown - 'direct' + 'Disabled' Method to run FreeIPMI utility Method to run FreeIPMI utility @@ -158,6 +158,12 @@ Display voltage Display voltage of various components + + + true + Show battery statistics + If a battery is available, battery stats will be retrieved + true