Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 119 additions & 1 deletion extension.js
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,55 @@ export default class HibernateButtonExtension extends Extension {
}
}

_loginManagerCanRebootToFirmwareSetup(asyncCallback) {
if (this._loginManager._proxy) {
// systemd path
this._loginManager._proxy.call(
'CanRebootToFirmwareSetup',
null,
Gio.DBusCallFlags.NONE,
-1,
null,
function (proxy, asyncResult) {
let result, error;

try {
result = proxy.call_finish(asyncResult).deep_unpack();
} catch (e) {
error = e;
}

if (error) asyncCallback(false);
else asyncCallback(!['no', 'na'].includes(result[0]));
}
);
} else {
this.can_suspend_then_hibernate_sourceID = GLib.idle_add(() => {
asyncCallback(false);
return false;
});
}
}

_loginManagerUEFI() {
this._loginManager._proxy.call(
'SetRebootToFirmwareSetup',
GLib.Variant.new('(b)', [true]),
Gio.DBusCallFlags.NONE,
-1,
null,
null
);
this._loginManager._proxy.call(
'Reboot',
GLib.Variant.new('(b)', [true]),
Gio.DBusCallFlags.NONE,
-1,
null,
null
);
}

_updateHaveHibernate() {
this._loginManagerCanHibernate(result => {
log(`Able to hibernate: ${result}`);
Expand Down Expand Up @@ -217,6 +266,19 @@ export default class HibernateButtonExtension extends Extension {
this._haveSuspendThenHibernate && !Main.sessionMode.isLocked && this._setting.get_boolean('show-suspend-then-hibernate');
}

_updateHaveRebootToFirmwareSetup() {
this._loginManagerCanRebootToFirmwareSetup(result => {
log(`Able to reboot to firmware setup: ${result}`);
this._haveRebootToFirmwareSetup = result;
this._updateUEFI();
});
}

_updateUEFI() {
this._uefiMenuItem.visible =
this._haveRebootToFirmwareSetup && !Main.sessionMode.isLocked && this._setting.get_boolean('show-uefi');
}

_updateDefaults() {
console.log("Update defaults");
let menuItems = this.systemMenu._systemItem.menu._getMenuItems()
Expand Down Expand Up @@ -336,6 +398,39 @@ export default class HibernateButtonExtension extends Extension {
}
}

_onUEFIClicked() {
this.systemMenu._systemItem.menu.itemActivated();

if (this._setting.get_boolean('show-uefi-dialog')) {
let DialogContent = {
subject: C_('title', __('UEFI')),
description: __('Do you really want to boot to UEFI?'),
confirmButtons: [
{
signal: 'Cancel',
label: C_('button', __('Cancel')),
key: Clutter.Escape,
},
{
signal: 'Confirmed',
label: C_('button', __('UEFI')),
default: true,
},
],
};

this._dialog = new ConfirmDialog(
DialogContent
);
this._dialog.connect('Confirmed', () =>
this._loginManagerUEFI()
);
this._dialog.open();
} else {
this._loginManagerUEFI()
}
}

_disableExtension() {
Main.extensionManager.disableExtension('hibernate-status@dromi')
console.log('Disabled')
Expand Down Expand Up @@ -460,9 +555,21 @@ export default class HibernateButtonExtension extends Extension {
() => this._onSuspendThenHibernateClicked()
);

this._uefiMenuItem = new PopupMenu.PopupMenuItem(
__('UEFI')
);
this._uefiMenuItemId = this._uefiMenuItem.connect(
'activate',
() => this._onUEFIClicked()
);

let afterSuspendPosition =
this.systemMenu._systemItem.menu.numMenuItems - 5;

this.systemMenu._systemItem.menu.addMenuItem(
this._uefiMenuItem,
afterSuspendPosition
);
this.systemMenu._systemItem.menu.addMenuItem(
this._hybridSleepMenuItem,
afterSuspendPosition
Expand All @@ -474,7 +581,7 @@ export default class HibernateButtonExtension extends Extension {
this.systemMenu._systemItem.menu.addMenuItem(
this._suspendThenHibernateMenuItem,
afterSuspendPosition
);
);

this._menuOpenStateChangedId = this.systemMenu._systemItem.menu.connect(
'open-state-changed',
Expand All @@ -484,6 +591,7 @@ export default class HibernateButtonExtension extends Extension {
this._updateHaveHibernate();
this._updateHaveHybridSleep();
this._updateHaveSuspendThenHibernate();
this._updateHaveRebootToFirmwareSetup();
}
);
}
Expand Down Expand Up @@ -514,6 +622,11 @@ export default class HibernateButtonExtension extends Extension {
);
this._menuOpenStateChangedId = 0;
}

if (this._uefiMenuItemId) {
this._uefiMenuItem.disconnect(this._uefiMenuItemId);
this._uefiMenuItemId = 0;
}

if (this._suspendThenHibernateMenuItemId) {
this._suspendThenHibernateMenuItem.disconnect(this._suspendThenHibernateMenuItemId);
Expand All @@ -530,6 +643,11 @@ export default class HibernateButtonExtension extends Extension {
this._hibernateMenuItemId = 0;
}

if (this._uefiMenuItem) {
this._uefiMenuItem.destroy();
this._uefiMenuItem = 0;
}

if (this._suspendThenHibernateMenuItem) {
this._suspendThenHibernateMenuItem.destroy();
this._suspendThenHibernateMenuItem = 0;
Expand Down
12 changes: 12 additions & 0 deletions prefs.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,10 @@ export default class Prefs extends ExtensionPreferences {
const suspend_then_hibernate_row = new Adw.SwitchRow({
title: __('Suspend then hibernate'),
});
const uefi_row = new Adw.SwitchRow({
title: __('UEFI'),
});
modes_group.add(uefi_row);
modes_group.add(suspend_then_hibernate_row);
const restart_row = new Adw.SwitchRow({
title: __('Restart...'),
Expand Down Expand Up @@ -146,6 +150,10 @@ export default class Prefs extends ExtensionPreferences {
title: __('Suspend then Hibernate'),
});
dialog_group.add(suspend_then_hibernate_dialog_row);
const uefi_dialog_row = new Adw.SwitchRow({
title: __('UEFI'),
});
dialog_group.add(uefi_dialog_row);

window._settings = this.getSettings();
window._settings.bind('show-suspend', suspend_row, 'active',
Expand All @@ -160,6 +168,8 @@ export default class Prefs extends ExtensionPreferences {
Gio.SettingsBindFlags.DEFAULT);
window._settings.bind('show-custom-reboot', restart_to_row, 'active',
Gio.SettingsBindFlags.DEFAULT);
window._settings.bind('show-uefi', uefi_row, 'active',
Gio.SettingsBindFlags.DEFAULT);
window._settings.bind('show-shutdown', shutdown_row, 'active',
Gio.SettingsBindFlags.DEFAULT);
window._settings.bind('show-hibernate-dialog', hibernate_dialog_row, 'active',
Expand All @@ -168,5 +178,7 @@ export default class Prefs extends ExtensionPreferences {
Gio.SettingsBindFlags.DEFAULT);
window._settings.bind('show-suspend-then-hibernate-dialog', suspend_then_hibernate_dialog_row, 'active',
Gio.SettingsBindFlags.DEFAULT);
window._settings.bind('show-uefi-dialog', uefi_dialog_row, 'active',
Gio.SettingsBindFlags.DEFAULT);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
<key type="b" name="show-custom-reboot">
<default>true</default>
</key>
<key type="b" name="show-uefi">
<default>false</default>
</key>
<key type="b" name="show-hibernate-dialog">
<default>true</default>
</key>
Expand All @@ -34,5 +37,8 @@
<key type="b" name="show-suspend-then-hibernate-dialog">
<default>false</default>
</key>
<key type="b" name="show-uefi-dialog">
<default>true</default>
</key>
</schema>
</schemalist>