gnome-shell/js/ui/status/powerProfiles.js
Marco Trevisan (Treviño) 71da3048a1 status/powerProfiles: Use newer DBus API
Since some time the power-profiles-daemon project has been moved under
the upower umbrella and renamed its API to follow that.

While the legacy name is still supported, there are plans to not support
it anymore in future [2]. So let's update gnome-shell code to use the
current main name instead.

[1] https://gitlab.freedesktop.org/upower/power-profiles-daemon/-/merge_requests/148
[2] https://gitlab.freedesktop.org/upower/power-profiles-daemon/-/merge_requests/166

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3629>
2025-02-07 01:03:27 +01:00

131 lines
4.0 KiB
JavaScript

import Gio from 'gi://Gio';
import GObject from 'gi://GObject';
import {QuickMenuToggle, SystemIndicator} from '../quickSettings.js';
import * as PopupMenu from '../popupMenu.js';
import {loadInterfaceXML} from '../../misc/fileUtils.js';
const BUS_NAME = 'org.freedesktop.UPower.PowerProfiles';
const OBJECT_PATH = '/org/freedesktop/UPower/PowerProfiles';
const PowerProfilesIface = loadInterfaceXML('org.freedesktop.UPower.PowerProfiles');
const PowerProfilesProxy = Gio.DBusProxy.makeProxyWrapper(PowerProfilesIface);
const PROFILE_PARAMS = {
'performance': {
name: C_('Power profile', 'Performance'),
iconName: 'power-profile-performance-symbolic',
},
'balanced': {
name: C_('Power profile', 'Balanced'),
iconName: 'power-profile-balanced-symbolic',
},
'power-saver': {
name: C_('Power profile', 'Power Saver'),
iconName: 'power-profile-power-saver-symbolic',
},
};
const LAST_PROFILE_KEY = 'last-selected-power-profile';
const PowerProfilesToggle = GObject.registerClass(
class PowerProfilesToggle extends QuickMenuToggle {
_init() {
super._init({title: _('Power Mode')});
this._profileItems = new Map();
this.connect('clicked', () => {
this._proxy.ActiveProfile = this.checked
? 'balanced'
: global.settings.get_string(LAST_PROFILE_KEY);
});
this._proxy = new PowerProfilesProxy(Gio.DBus.system, BUS_NAME, OBJECT_PATH,
(proxy, error) => {
if (error) {
log(error.message);
} else {
this._proxy.connect('g-properties-changed', (p, properties) => {
const profilesChanged = !!properties.lookup_value('Profiles', null);
if (profilesChanged)
this._syncProfiles();
this._sync();
});
if (this._proxy.g_name_owner)
this._syncProfiles();
}
this._sync();
});
this._profileSection = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(this._profileSection);
this.menu.setHeader('power-profile-balanced-symbolic', _('Power Mode'));
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addSettingsAction(_('Power Settings'),
'gnome-power-panel.desktop');
this._sync();
}
_syncProfiles() {
this._profileSection.removeAll();
this._profileItems.clear();
const profiles = this._proxy.Profiles
.map(p => p.Profile.unpack())
.reverse();
for (const profile of profiles) {
const {name, iconName} = PROFILE_PARAMS[profile];
if (!name)
continue;
const item = new PopupMenu.PopupImageMenuItem(name, iconName);
item.connect('activate',
() => (this._proxy.ActiveProfile = profile));
this._profileItems.set(profile, item);
this._profileSection.addMenuItem(item);
}
this.menuEnabled = this._profileItems.size > 2;
}
_sync() {
this.visible = this._proxy.g_name_owner !== null;
if (!this.visible)
return;
const {ActiveProfile: activeProfile} = this._proxy;
for (const [profile, item] of this._profileItems) {
item.setOrnament(profile === activeProfile
? PopupMenu.Ornament.CHECK
: PopupMenu.Ornament.NONE);
}
const {name: subtitle, iconName} = PROFILE_PARAMS[activeProfile];
this.set({subtitle, iconName});
this.checked = activeProfile !== 'balanced';
if (this.checked)
global.settings.set_string(LAST_PROFILE_KEY, activeProfile);
}
});
export const Indicator = GObject.registerClass(
class Indicator extends SystemIndicator {
_init() {
super._init();
this.quickSettingsItems.push(new PowerProfilesToggle());
}
});