panel: Refactor quick settings loading for asynchronous imports

When the Shell ports to ESM, our inline imports of the network and
bluetooth indicators will no longer be possible, refactor quick settings
to load indicators asynchronously.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2563>
This commit is contained in:
Evan Welsh 2023-06-07 08:30:29 -07:00 committed by Marge Bot
parent 7116d91852
commit 5d8e860a48

View File

@ -14,6 +14,25 @@ const PanelMenu = imports.ui.panelMenu;
const {QuickSettingsMenu, SystemIndicator} = imports.ui.quickSettings; const {QuickSettingsMenu, SystemIndicator} = imports.ui.quickSettings;
const Main = imports.ui.main; const Main = imports.ui.main;
const RemoteAccessStatus = imports.ui.status.remoteAccess;
const PowerProfileStatus = imports.ui.status.powerProfiles;
const RFKillStatus = imports.ui.status.rfkill;
const VolumeStatus = imports.ui.status.volume;
const BrightnessStatus = imports.ui.status.brightness;
const SystemStatus = imports.ui.status.system;
const LocationStatus = imports.ui.status.location;
const NightLightStatus = imports.ui.status.nightLight;
const DarkModeStatus = imports.ui.status.darkMode;
const ThunderboltStatus = imports.ui.status.thunderbolt;
const AutoRotateStatus = imports.ui.status.autoRotate;
const BackgroundAppsStatus = imports.ui.status.backgroundApps;
const {DateMenuButton} = imports.ui.dateMenu;
const {ATIndicator} = imports.ui.status.accessibility;
const {InputSourceIndicator} = imports.ui.status.keyboard;
const {DwellClickIndicator} = imports.ui.status.dwellClick;
const {ScreenRecordingIndicator, ScreenSharingIndicator} = imports.ui.status.remoteAccess;
var PANEL_ICON_SIZE = 16; var PANEL_ICON_SIZE = 16;
var APP_MENU_ICON_MARGIN = 0; var APP_MENU_ICON_MARGIN = 0;
@ -325,8 +344,8 @@ class UnsafeModeIndicator extends SystemIndicator {
var QuickSettings = GObject.registerClass( var QuickSettings = GObject.registerClass(
class QuickSettings extends PanelMenu.Button { class QuickSettings extends PanelMenu.Button {
_init() { constructor() {
super._init(0.0, C_('System menu in the top bar', 'System'), true); super(0.0, C_('System menu in the top bar', 'System'), true);
this._indicators = new St.BoxLayout({ this._indicators = new St.BoxLayout({
style_class: 'panel-status-indicators-box', style_class: 'panel-status-indicators-box',
@ -335,29 +354,46 @@ class QuickSettings extends PanelMenu.Button {
this.setMenu(new QuickSettingsMenu(this, N_QUICK_SETTINGS_COLUMNS)); this.setMenu(new QuickSettingsMenu(this, N_QUICK_SETTINGS_COLUMNS));
if (Config.HAVE_NETWORKMANAGER) this._setupIndicators().catch(error =>
this._network = new imports.ui.status.network.Indicator(); logError(error, 'Failed to setup quick settings'));
else }
async _setupIndicators() {
if (Config.HAVE_NETWORKMANAGER) {
// TODO: This will be an asynchronous import once this migrates
// to modules. Add a no-op await now to enforce this being an async
// function.
const NetworkStatus = await imports.ui.status.network;
this._network = new NetworkStatus.Indicator();
} else {
this._network = null; this._network = null;
}
if (Config.HAVE_BLUETOOTH) if (Config.HAVE_BLUETOOTH) {
this._bluetooth = new imports.ui.status.bluetooth.Indicator(); // TODO: This will be an asynchronous import once this migrates
else // to modules. Add a no-op await now to enforce this being an async
// function.
const BluetoothStatus = await imports.ui.status.bluetooth;
this._bluetooth = new BluetoothStatus.Indicator();
} else {
this._bluetooth = null; this._bluetooth = null;
}
this._system = new imports.ui.status.system.Indicator(); this._system = new SystemStatus.Indicator();
this._volume = new imports.ui.status.volume.Indicator(); this._volume = new VolumeStatus.Indicator();
this._brightness = new imports.ui.status.brightness.Indicator(); this._brightness = new BrightnessStatus.Indicator();
this._remoteAccess = new imports.ui.status.remoteAccess.RemoteAccessApplet(); this._remoteAccess = new RemoteAccessStatus.RemoteAccessApplet();
this._location = new imports.ui.status.location.Indicator(); this._location = new LocationStatus.Indicator();
this._thunderbolt = new imports.ui.status.thunderbolt.Indicator(); this._thunderbolt = new ThunderboltStatus.Indicator();
this._nightLight = new imports.ui.status.nightLight.Indicator(); this._nightLight = new NightLightStatus.Indicator();
this._darkMode = new imports.ui.status.darkMode.Indicator(); this._darkMode = new DarkModeStatus.Indicator();
this._powerProfiles = new imports.ui.status.powerProfiles.Indicator(); this._powerProfiles = new PowerProfileStatus.Indicator();
this._rfkill = new imports.ui.status.rfkill.Indicator(); this._rfkill = new RFKillStatus.Indicator();
this._autoRotate = new imports.ui.status.autoRotate.Indicator(); this._autoRotate = new AutoRotateStatus.Indicator();
this._unsafeMode = new UnsafeModeIndicator(); this._unsafeMode = new UnsafeModeIndicator();
this._backgroundApps = new imports.ui.status.backgroundApps.Indicator(); this._backgroundApps = new BackgroundAppsStatus.Indicator();
this._indicators.add_child(this._brightness); this._indicators.add_child(this._brightness);
this._indicators.add_child(this._remoteAccess); this._indicators.add_child(this._remoteAccess);
@ -406,12 +442,12 @@ const PANEL_ITEM_IMPLEMENTATIONS = {
'activities': ActivitiesButton, 'activities': ActivitiesButton,
'appMenu': AppMenuButton, 'appMenu': AppMenuButton,
'quickSettings': QuickSettings, 'quickSettings': QuickSettings,
'dateMenu': imports.ui.dateMenu.DateMenuButton, 'dateMenu': DateMenuButton,
'a11y': imports.ui.status.accessibility.ATIndicator, 'a11y': ATIndicator,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator, 'keyboard': InputSourceIndicator,
'dwellClick': imports.ui.status.dwellClick.DwellClickIndicator, 'dwellClick': DwellClickIndicator,
'screenRecording': imports.ui.status.remoteAccess.ScreenRecordingIndicator, 'screenRecording': ScreenRecordingIndicator,
'screenSharing': imports.ui.status.remoteAccess.ScreenSharingIndicator, 'screenSharing': ScreenSharingIndicator,
}; };
var Panel = GObject.registerClass( var Panel = GObject.registerClass(