gnome-shell/0002-endSessionDialog-Support-rebooting-into-the-bootload.patch

116 lines
4.2 KiB
Diff
Raw Normal View History

From 552fcb1cb7b6d41a54dbd01375bb289934581192 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 15 Aug 2018 15:03:56 +0200
Subject: [PATCH 2/2] endSessionDialog: Support rebooting into the bootloader
menu aka ("Boot Options")
This implements the "Alt" behavior for the "Reboot" button as outlined in
the design here: https://wiki.gnome.org/Design/OS/BootOptions
This causes the endSessionDialog to send a ConfirmedRebootToBootOptions signal
to gnome-session instead of the normal ConfirmedReboot signal, actually
telling the boot-loader that it should show its menu the next boot is left
up to gnome-session.
2019-02-07 01:50:26 +00:00
Note I've tried implemeting this with the AltSwitcher class from
js/ui/status/system.js first, but that puts the button in a St.Bin()
which causes the button to think it is the only button on the dialog
and makes it have rounded corners on both of its bottom corners.
---
js/ui/endSessionDialog.js | 50 +++++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js
index faeefe276..43aa3d632 100644
--- a/js/ui/endSessionDialog.js
+++ b/js/ui/endSessionDialog.js
@@ -255,6 +255,9 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
this._totalSecondsToStayOpen = 0;
this._applications = [];
this._sessions = [];
+ this._capturedEventId = 0;
+ this._rebootButton = null;
+ this._rebootButtonAlt = null;
this.connect('destroy',
this._onDestroy.bind(this));
@@ -438,6 +441,26 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
this._sessionHeader.visible = hasSessions;
2019-02-07 01:50:26 +00:00
}
+ _onCapturedEvent(actor, event) {
+ let altEnabled = false;
+
+ let type = event.type();
+ if (type != Clutter.EventType.KEY_PRESS && type != Clutter.EventType.KEY_RELEASE)
+ return Clutter.EVENT_PROPAGATE;
+
+ let key = event.get_key_symbol();
+ if (key != Clutter.KEY_Alt_L && key != Clutter.KEY_Alt_R)
+ return Clutter.EVENT_PROPAGATE;
+
+ if (type == Clutter.EventType.KEY_PRESS)
+ altEnabled = true;
+
+ this._rebootButton.visible = !altEnabled;
+ this._rebootButtonAlt.visible = altEnabled;
+
+ return Clutter.EVENT_PROPAGATE;
2019-02-07 01:50:26 +00:00
+ }
+
_updateButtons() {
this.clearButtons();
@@ -458,7 +481,32 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
});
},
label: label });
+
+ // Add Alt "Boot Options" option to the Reboot button
+ if (signal == 'ConfirmedReboot') {
+ this._rebootButton = button;
+ this._rebootButtonAlt = this.addButton(
+ { action: () => {
+ this.close(true);
+ let signalId = this.connect('closed', () => {
+ this.disconnect(signalId);
+ this._confirm('ConfirmedRebootToBootOptions');
+ });
+ },
+ label: C_("button", "Boot Options") });
+ this._rebootButtonAlt.visible = false;
+ this._capturedEventId = global.stage.connect('captured-event', this._onCapturedEvent.bind(this));
+ }
+ }
2019-02-07 01:50:26 +00:00
+ }
+
+ _stopAltCapture() {
+ if (this._capturedEventId > 0) {
+ global.stage.disconnect(this._capturedEventId);
+ this._capturedEventId = 0;
}
+ this._rebootButton = null;
+ this._rebootButtonAlt = null;
2019-02-07 01:50:26 +00:00
}
close(skipSignal) {
@@ -470,6 +518,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
cancel() {
this._stopTimer();
+ this._stopAltCapture();
this._dbusImpl.emit_signal('Canceled', null);
this.close();
2019-02-07 01:50:26 +00:00
}
@@ -478,6 +527,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
let callback = () => {
this._fadeOutDialog();
this._stopTimer();
+ this._stopAltCapture();
this._dbusImpl.emit_signal(signal, null);
};
--
2.21.0