summaryrefslogtreecommitdiff
path: root/raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/extension.js
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/extension.js')
-rw-r--r--raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/extension.js170
1 files changed, 170 insertions, 0 deletions
diff --git a/raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/extension.js b/raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/extension.js
new file mode 100644
index 0000000..035e019
--- /dev/null
+++ b/raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/extension.js
@@ -0,0 +1,170 @@
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
+import * as QuickSettings from 'resource:///org/gnome/shell/ui/quickSettings.js';
+
+
+import { Extension } from "resource:///org/gnome/shell/extensions/extension.js";
+import { getDefault } from "resource:///org/gnome/shell/misc/systemActions.js";
+import GObject from "gi://GObject";
+
+//import
+import { LogWarning, Log } from './utils.js';
+import { BootLoaders, Bootloader } from "./bootloader.js";
+
+
+const RebootQuickMenu = GObject.registerClass(
+class RebootQuickMenu extends QuickSettings.QuickMenuToggle {
+
+ _init(extension) {
+ const init_params = { iconName: 'system-reboot-symbolic', toggleMode: false };
+ init_params.title = "Reboot Into";
+ super._init(init_params);
+
+ // Set toggle to be unchecked
+ this.checked = false;
+
+ // Open menu and set toggle check to true
+ this.clickedID = this.connect("clicked", () => {
+ this.menu.open();
+ this.checked = true;
+ });
+
+ // Connect 'menu-closed' to update checked state
+ this.menuClosedID = this.menu.connect("menu-closed", () => {
+ this.checked = false;
+ });
+
+ // Add boot options to menu
+ try {
+ this.createBootMenu(extension);
+ }
+ catch (e) {
+ LogWarning(e);
+ }
+ }
+
+ cleanConns() {
+ // Disconnect all connections
+ this.disconnect(this.openStateID);
+ this.disconnect(this.clickedID);
+ }
+
+ async createBootMenu(extension) {
+ // Get boot options
+ const type = await Bootloader.GetUseableType(extension);
+
+
+ const header_title = `Boot Options - ${type}`;
+
+ // Set Menu Header
+ this.menu.setHeader('system-reboot-symbolic', header_title, 'Reboot into the selected entry');
+
+ const loader = await Bootloader.GetUseable(type);
+
+ if (loader === undefined) {
+ // Set Menu Header
+ this.menu.setHeader('system-reboot-symbolic', 'Error', 'The selected boot loader cannot be found...');
+
+ // Add reload option, to refresh extension menu without reloading GNOME or the extension
+ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
+ this.menu.addAction('Reload', () => {
+ this.menu.removeAll();
+ this.createBootMenu();
+ });
+
+ // Add button to open settings
+ this.menu.addAction('Settings', () => {
+ extension.openPreferences();
+ });
+
+ return;
+ }
+
+ loader.GetBootOptions().then(([bootOps, defaultOpt]) => {
+ if (bootOps !== undefined) {
+ this._itemsSection = new PopupMenu.PopupMenuSection();
+
+ for (let [title, id] of bootOps) {
+ Log(`${title} - ${id}`);
+ this._itemsSection.addAction(String(title), () => {
+ // Set boot option
+ loader.SetBootOption(String(id)).then(result => {
+ if (result) {
+ // On success trigger restart dialog
+ new getDefault().activateRestart();
+ }
+ });
+ }, (title === defaultOpt || id === defaultOpt)? "pan-end-symbolic" : undefined);
+ }
+
+ this.menu.addMenuItem(this._itemsSection);
+ }
+
+ // Add reload option, to refresh extension menu without reloading GNOME or the extension
+ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
+ this.menu.addAction('Reload', () => {
+ this.menu.removeAll();
+ this.createBootMenu();
+ });
+
+ // Add button to open settings
+ this.menu.addAction('Settings', () => {
+ extension.openPreferences();
+ });
+
+ loader.CanQuickReboot().then(async result => {
+ if (!result) return;
+ if (!await loader.QuickRebootEnabled()) {
+ this.menu.addAction('Enable Quick Reboot', async () => {
+ await loader.EnableQuickReboot(extension);
+ this.menu.removeAll();
+ this.createBootMenu();
+ });
+ }
+ else {
+ this.menu.addAction('Disable Quick Reboot', async () => {
+ await loader.DisableQuickReboot();
+ this.menu.removeAll();
+ this.createBootMenu();
+ });
+ }
+ });
+
+ }).catch((error) => {
+ LogWarning(error);
+ // Only do this if the current bootloader is grub
+ if (type === BootLoaders.GRUB)
+ {
+ // Only add this if all fails, giving user option to make the config readable
+ this.menu.addMenuItem(new PopupSeparatorMenuItem());
+ this.menu.addAction('Fix Grub.conf Perms', async () => {
+ await loader.SetReadable();
+ this.menu.removeAll();
+ this.createBootMenu(extension);
+ });
+ }
+ })
+ }
+});
+
+export default class CustomReboot extends Extension {
+
+ enable() {
+ // Add items to QuickSettingsMenu
+ this._indicator = new QuickSettings.SystemIndicator();
+ this.menu = new RebootQuickMenu(this);
+ this._indicator.quickSettingsItems.push(this.menu);
+ Main.panel.statusArea.quickSettings.addExternalIndicator(this._indicator, 1);
+ }
+
+ disable() {
+ this.menu.cleanConns();
+ this.menu = null;
+
+ this._indicator.quickSettingsItems.forEach(item => {
+ item.destroy();
+ });
+ this._indicator.destroy();
+ this._indicator = null;
+ }
+}