Files
2026-03-02 02:24:32 +09:00

229 lines
8.8 KiB
JavaScript

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';
export default class FreonPreferences extends ExtensionPreferences {
fillPreferencesWindow(window) {
window.set_default_size(1010, 800);
const grid = new Gtk.Grid({
column_homogeneous: true,
column_spacing: 10,
row_homogeneous: false,
});
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();
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);
const widget = new Adw.PreferencesGroup({
hexpand: true,
vexpand: true,
})
widget.add(grid);
page.add(widget);
window.add(page);
}
_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)
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)
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 additional digits after decimal point"));
return group;
}
_create_generic_sensor_providers() {
const group = new Adw.PreferencesGroup({
title: _('Generic Sensor Providers'),
width_request: 320,
});
const cpuUsageSwitch = this._addSwitch("CPU Usage", "use-cpu-usage", "Read CPU usage from /proc/stat");
group.add(cpuUsageSwitch);
const cpuUsageInterval = new Adw.SpinRow({
title: _('CPU Usage Polling Interval'),
subtitle: _('Seconds between CPU usage updates'),
adjustment: new Gtk.Adjustment({
lower: 1,
upper: 60,
value: this._settings.get_int('cpu-usage-update-time'),
step_increment: 1,
}),
});
this._settings.bind('cpu-usage-update-time', cpuUsageInterval, 'value', Gio.SettingsBindFlags.DEFAULT);
cpuUsageInterval.sensitive = this._settings.get_boolean('use-cpu-usage');
this._settings.connect('changed::use-cpu-usage', () => {
cpuUsageInterval.sensitive = this._settings.get_boolean('use-cpu-usage');
});
group.add(cpuUsageInterval);
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+)"));
const wattdSwitch = this._addSwitch("wattd", "use-generic-wattd", "Read power data from wattd");
group.add(wattdSwitch);
const wattdInterval = new Adw.SpinRow({
title: _('Wattd Polling Interval'),
subtitle: _('Seconds between wattd updates'),
adjustment: new Gtk.Adjustment({
lower: 1,
upper: 300,
value: this._settings.get_int('wattd-update-time'),
step_increment: 1,
}),
});
this._settings.bind('wattd-update-time', wattdInterval, 'value', Gio.SettingsBindFlags.DEFAULT);
wattdInterval.sensitive = this._settings.get_boolean('use-generic-wattd');
this._settings.connect('changed::use-generic-wattd', () => {
wattdInterval.sensitive = this._settings.get_boolean('use-generic-wattd');
});
group.add(wattdInterval);
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;
}
_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"));
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"));
group.add(this._addSwitch("CPU Usage", "show-cpu-usage"));
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;
}
}