diff --git a/desktop-extensions/gnome/schemas/org.gnome.shell.extensions.asusctl-gex.gschema.xml b/desktop-extensions/gnome/schemas/org.gnome.shell.extensions.asusctl-gex.gschema.xml index 614b8034..0a2f755b 100644 --- a/desktop-extensions/gnome/schemas/org.gnome.shell.extensions.asusctl-gex.gschema.xml +++ b/desktop-extensions/gnome/schemas/org.gnome.shell.extensions.asusctl-gex.gschema.xml @@ -7,9 +7,9 @@ false - - false - hide the supergfxctl-gex notice + + + 100 \ No newline at end of file diff --git a/desktop-extensions/gnome/src/extension.ts b/desktop-extensions/gnome/src/extension.ts index 642544d8..a2651d60 100644 --- a/desktop-extensions/gnome/src/extension.ts +++ b/desktop-extensions/gnome/src/extension.ts @@ -13,14 +13,16 @@ import { Platform } from './modules/dbus/platform'; import { QuickPanelOd } from './modules/quick_toggles/panel_od'; import { IndicateMiniLed } from './modules/indicators/mini_led'; import { QuickMiniLed } from './modules/quick_toggles/mini_led'; +import { SliderChargeLevel } from './modules/sliders/charge'; class Extension { private _indicateMiniLed: typeof IndicateMiniLed; private _quickMiniLed: typeof QuickMiniLed; private _quickPanelOd: typeof QuickPanelOd; - private _dbus_power!: Power; - private _dbus_anime!: AnimeDbus; + private _sliderCharge: typeof SliderChargeLevel; + public _dbus_power!: Power; + public _dbus_anime!: AnimeDbus; public dbus_platform!: Platform; public dbus_supported!: Supported; @@ -28,6 +30,7 @@ class Extension { this._indicateMiniLed = null; this._quickMiniLed = null; this._quickPanelOd = null; + this._sliderCharge = null; this.dbus_supported = new Supported(); this.dbus_supported.start(); @@ -56,6 +59,11 @@ class Extension { this._quickPanelOd = new QuickPanelOd(this.dbus_platform); } } + if (this.dbus_supported.supported.charge_ctrl.charge_level_set) { + if (this._sliderCharge == null) { + this._sliderCharge = new SliderChargeLevel(this._dbus_power); + } + } } disable() { @@ -71,6 +79,10 @@ class Extension { this._quickPanelOd.destroy(); this._quickPanelOd = null; } + if (this._sliderCharge != null) { + this._sliderCharge.destroy(); + this._sliderCharge = null; + } this._dbus_power.stop(); this.dbus_platform.stop(); diff --git a/desktop-extensions/gnome/src/modules/helpers.ts b/desktop-extensions/gnome/src/modules/helpers.ts index 8b231817..e367a813 100644 --- a/desktop-extensions/gnome/src/modules/helpers.ts +++ b/desktop-extensions/gnome/src/modules/helpers.ts @@ -3,9 +3,9 @@ declare const imports: any; const { QuickToggle } = imports.ui.quickSettings; const QuickSettingsMenu = imports.ui.main.panel.statusArea.quickSettings; -export function addQuickSettingsItems(items: [typeof QuickToggle]) { +export function addQuickSettingsItems(items: [typeof QuickToggle], width = 1) { // Add the items with the built-in function - QuickSettingsMenu._addItems(items); + QuickSettingsMenu._addItems(items, width); // Ensure the tile(s) are above the background apps menu for (const item of items) { diff --git a/desktop-extensions/gnome/src/modules/sliders/charge.ts b/desktop-extensions/gnome/src/modules/sliders/charge.ts new file mode 100644 index 00000000..3ece485b --- /dev/null +++ b/desktop-extensions/gnome/src/modules/sliders/charge.ts @@ -0,0 +1,60 @@ +import { Power } from "../dbus/power"; +import { addQuickSettingsItems } from "../helpers"; + +declare const imports: any; + +const { GObject } = imports.gi; +const ExtensionUtils = imports.misc.extensionUtils; +const QuickSettings = imports.ui.quickSettings; + +export const SliderChargeLevel = GObject.registerClass( + class SliderChargeLevel extends QuickSettings.QuickSlider { + private _dbus_power: Power; + + constructor(dbus_power: Power) { + super({ + iconName: 'selection-mode-symbolic', + }); + this._dbus_power = dbus_power; + + this._sliderChangedId = this.slider.connect('drag-end', + this._onSliderChanged.bind(this)); + + // Binding the slider to a GSettings key + this._settings = ExtensionUtils.getSettings(); + + this._settings.connect('changed::charge-level', + this._onSettingsChanged.bind(this)); + + // Set an accessible name for the slider + this.slider.accessible_name = 'Charge level'; + + this._sync(); + this._onSettingsChanged(); + + addQuickSettingsItems([this], 2); + } + + _onSettingsChanged() { + // Prevent the slider from emitting a change signal while being updated + this.slider.block_signal_handler(this._sliderChangedId); + this.slider.value = this._settings.get_uint('charge-level') / 100.0; + this.slider.unblock_signal_handler(this._sliderChangedId); + } + + _onSliderChanged() { + // Assuming our GSettings holds values between 0..100, adjust for the + // slider taking values between 0..1 + const percent = Math.floor(this.slider.value * 100); + const stored = Math.floor(this._settings.get_uint('charge-level') / 100.0); + if (this.slider.value !== stored) + this._dbus_power.setChargingLimit(percent); + this._settings.set_uint('charge-level', percent); + } + + _sync() { + const value = this._dbus_power.getChargingLimit(); + if (this.slider.value !== value / 100) + this._settings.set_uint('charge-level', value); + } + }); \ No newline at end of file