const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const GObject = imports.gi.GObject; const Mainloop = imports.mainloop; const LoginManager = imports.misc.loginManager; const Main = imports.ui.main; const StatusSystem = imports.ui.status.system; const PopupMenu = imports.ui.popupMenu; const ModalDialog = imports.ui.modalDialog; const CheckBox = imports.ui.checkBox.CheckBox; const St = imports.gi.St; const Clutter = imports.gi.Clutter; const ExtensionUtils = imports.misc.extensionUtils; // Use __ () and N__() for the extension gettext domain, and reuse // the shell domain with the default _() and N_() const Gettext = imports.gettext.domain('hibernate-status-button'); const __ = Gettext.gettext; const N__ = function(e) { return e }; ExtensionUtils.initTranslations('hibernate-status-button'); var HibernateDialogContent = { subject: C_("title", __("Hibernate")), description: __("Do you really want to hibernate the system?"), confirmButtons: [{ signal: 'Cancel', label: C_("button", __("Cancel")), key: Clutter.Escape }, { signal: 'ConfirmedHibernate', label: C_("button", __("Hibernate")), default: true }], iconName: 'document-save-symbolic', iconStyleClass: 'end-session-dialog-shutdown-icon', }; var SystemdMissingDialogContent = { subject: C_("title", __("Hibernate button: Systemd Missing")), description: __("Systemd seems to be missing and is required."), confirmButtons: [{ signal: 'Cancel', label: C_("button", __("Cancel")), key: Clutter.Escape }, { signal: 'DisableExtension', label: C_("button", __("Disable Extension")), default: true }], iconName: 'document-save-symbolic', iconStyleClass: 'end-session-dialog-shutdown-icon', }; var HibernateFailedDialogContent = { subject: C_("title", __("Hibernate button: Hibernate failed")), description: __("Looks like hibernation failed.\n" + "On some linux distributions hibernation is disabled\n" + "because not all hardware supports it well;\n" + "please check your distribution documentation\n" + "on how to enable it."), checkBox: __("You are wrong, don't check this anymore!"), confirmButtons: [{ signal: 'Cancel', label: C_("button", __("Cancel")), key: Clutter.Escape }, { signal: 'DisableExtension', label: C_("button", __("Disable Extension")), default: true }], iconName: 'document-save-symbolic', iconStyleClass: 'end-session-dialog-shutdown-icon', }; const _DIALOG_ICON_SIZE = 32; function _setLabelText(label, text) { if (text) { label.set_text(text); label.show(); } else { label.set_text(''); label.hide(); } } var ConfirmDialog = GObject.registerClass({ Signals: { 'ConfirmedHibernate': { param_types: [ GObject.TYPE_BOOLEAN ] }, 'DisableExtension': { param_types: [ GObject.TYPE_BOOLEAN ] }, 'Cancel': { param_types: [ GObject.TYPE_BOOLEAN ] } } }, class ConfirmDialog extends ModalDialog.ModalDialog { _init(dialog) { super._init({ styleClass: 'end-session-dialog', destroyOnClose: true }); let mainContentLayout = new St.BoxLayout({ vertical: false, x_expand: true , y_expand: false }); this.contentLayout.add(mainContentLayout); this._iconBin = new St.Bin({ x_expand: true, y_expand: false, x_align: St.Align.END, y_align: St.Align.START }); mainContentLayout.add(this._iconBin); let messageLayout = new St.BoxLayout({ vertical: true, y_align: St.Align.START }); mainContentLayout.add(messageLayout); this._subjectLabel = new St.Label({ style_class: 'end-session-dialog-subject', y_expand: false, y_align: St.Align.START }); messageLayout.add(this._subjectLabel); this._descriptionLabel = new St.Label({ style_class: 'end-session-dialog-description', y_expand: true, y_align: St.Align.START }); messageLayout.add(this._descriptionLabel); // fill dialog _setLabelText(this._descriptionLabel, dialog.description); _setLabelText(this._subjectLabel, dialog.subject); if (dialog.iconName) { this._iconBin.child = new St.Icon({ icon_name: dialog.iconName, icon_size: _DIALOG_ICON_SIZE, style_class: dialog.iconStyleClass }); } if (dialog.checkBox) { this._checkBox = new CheckBox(dialog.checkBox); mainContentLayout.add(this._checkBox.actor); } let buttons = []; for (let i = 0; i < dialog.confirmButtons.length; i++) { let signal = dialog.confirmButtons[i].signal; let label = dialog.confirmButtons[i].label; let keys = dialog.confirmButtons[i].key; buttons.push({ action: () => { let signalId = this.connect('closed', () => { this.disconnect(signalId); this._confirm(signal); }); this.close(); }, label: label, key: keys }); }; this.setButtons(buttons); } _confirm(signal) { var checked; if (this._checkBox) checked = this._checkBox.actor.get_checked() this.emit(signal, checked); } cancel() { this.close(); } });