From 650dd587fb11c3b97438f4bba6e3a60812939408 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Thu, 27 Sep 2018 09:25:30 +0200 Subject: [PATCH] Add downstream patches implementing the "Boot Options" menu from: https://wiki.gnome.org/Design/OS/BootOptions --- ...new-ConfirmedRebootToBootOptions-sig.patch | 173 ++++++++++++++++++ ...t-grub-boot-flags-on-shutdown-reboot.patch | 58 ++++++ gnome-session.spec | 10 +- 3 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 0001-Add-support-for-new-ConfirmedRebootToBootOptions-sig.patch create mode 100644 0002-Fedora-Set-grub-boot-flags-on-shutdown-reboot.patch diff --git a/0001-Add-support-for-new-ConfirmedRebootToBootOptions-sig.patch b/0001-Add-support-for-new-ConfirmedRebootToBootOptions-sig.patch new file mode 100644 index 0000000..1ff6a6e --- /dev/null +++ b/0001-Add-support-for-new-ConfirmedRebootToBootOptions-sig.patch @@ -0,0 +1,173 @@ +From cba2fdd2ee9fc3decd4179feeda0cb7d833f1022 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 14 Aug 2018 14:41:43 +0200 +Subject: [PATCH 1/2] Add support for new ConfirmedRebootToBootOptions signal + send by org.gnome.SessionManager.EndSessionDialog + +In order to allow the user to choose advanced boot-options on systems where +the boot menu is not shown by default at boot, gnome-shell's endSessionDialog.js +may emit a new ConfirmedRebootToBootOptions signal to indicate that +gnome-session should reboot the system in such a way that the boot-menu will +be shown next boot. + +This implements the backend for the "Boot Options" button from: +https://wiki.gnome.org/Design/OS/BootOptions + +Note that at the moment ConfirmedRebootToBootOptions is just treated as an +alias to ConfirmedReboot, since there is no bootloader agnostic way yet to +indicate the menu should be shown. + +For now the FIXME may be patched with a distro specific patch to implement +this for the distro's chosen bootloader. I will start a discussion on +systemd-devel to come up with a distro / bootloader agnostic interface +for this. +--- + gnome-session/gsm-manager.c | 28 ++++++++++++++++++++++++++++ + gnome-session/gsm-shell.c | 10 ++++++++++ + gnome-session/gsm-shell.h | 7 ++++--- + 3 files changed, 42 insertions(+), 3 deletions(-) + +diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c +index 6eeea4a6..e0f190a1 100644 +--- a/gnome-session/gsm-manager.c ++++ b/gnome-session/gsm-manager.c +@@ -109,6 +109,7 @@ typedef enum + GSM_MANAGER_LOGOUT_NONE, + GSM_MANAGER_LOGOUT_LOGOUT, + GSM_MANAGER_LOGOUT_REBOOT, ++ GSM_MANAGER_LOGOUT_REBOOT_TO_BOOT_OPTIONS, + GSM_MANAGER_LOGOUT_REBOOT_INTERACT, + GSM_MANAGER_LOGOUT_SHUTDOWN, + GSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT, +@@ -165,6 +166,7 @@ struct GsmManagerPrivate + guint shell_end_session_dialog_confirmed_logout_id; + guint shell_end_session_dialog_confirmed_shutdown_id; + guint shell_end_session_dialog_confirmed_reboot_id; ++ guint shell_end_session_dialog_confirmed_reboot_to_boot_options_id; + }; + + enum { +@@ -478,6 +480,7 @@ gsm_manager_quit (GsmManager *manager) + gsm_quit (); + break; + case GSM_MANAGER_LOGOUT_REBOOT: ++ case GSM_MANAGER_LOGOUT_REBOOT_TO_BOOT_OPTIONS: + case GSM_MANAGER_LOGOUT_REBOOT_INTERACT: + gsm_system_complete_shutdown (manager->priv->system); + break; +@@ -1138,6 +1141,7 @@ end_session_or_show_shell_dialog (GsmManager *manager) + type = GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT; + break; + case GSM_MANAGER_LOGOUT_REBOOT: ++ case GSM_MANAGER_LOGOUT_REBOOT_TO_BOOT_OPTIONS: + case GSM_MANAGER_LOGOUT_REBOOT_INTERACT: + type = GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART; + break; +@@ -3324,6 +3328,12 @@ disconnect_shell_dialog_signals (GsmManager *manager) + manager->priv->shell_end_session_dialog_confirmed_reboot_id = 0; + } + ++ if (manager->priv->shell_end_session_dialog_confirmed_reboot_to_boot_options_id != 0) { ++ g_signal_handler_disconnect (manager->priv->shell, ++ manager->priv->shell_end_session_dialog_confirmed_reboot_to_boot_options_id); ++ manager->priv->shell_end_session_dialog_confirmed_reboot_to_boot_options_id = 0; ++ } ++ + if (manager->priv->shell_end_session_dialog_open_failed_id != 0) { + g_signal_handler_disconnect (manager->priv->shell, + manager->priv->shell_end_session_dialog_open_failed_id); +@@ -3386,6 +3396,14 @@ on_shell_end_session_dialog_confirmed_reboot (GsmShell *shell, + disconnect_shell_dialog_signals (manager); + } + ++static void ++on_shell_end_session_dialog_confirmed_reboot_to_boot_options (GsmShell *shell, ++ GsmManager *manager) ++{ ++ _handle_end_session_dialog_response (manager, GSM_MANAGER_LOGOUT_REBOOT_TO_BOOT_OPTIONS); ++ disconnect_shell_dialog_signals (manager); ++} ++ + static void + connect_shell_dialog_signals (GsmManager *manager) + { +@@ -3421,6 +3439,12 @@ connect_shell_dialog_signals (GsmManager *manager) + "end-session-dialog-confirmed-reboot", + G_CALLBACK (on_shell_end_session_dialog_confirmed_reboot), + manager); ++ ++ manager->priv->shell_end_session_dialog_confirmed_reboot_to_boot_options_id = ++ g_signal_connect (manager->priv->shell, ++ "end-session-dialog-confirmed-reboot-to-boot-options", ++ G_CALLBACK (on_shell_end_session_dialog_confirmed_reboot_to_boot_options), ++ manager); + } + + static void +@@ -3694,6 +3718,10 @@ do_query_end_session_exit (GsmManager *manager) + case GSM_MANAGER_LOGOUT_REBOOT_INTERACT: + reboot = TRUE; + break; ++ case GSM_MANAGER_LOGOUT_REBOOT_TO_BOOT_OPTIONS: ++ /* FIXME tell bootmanager to show menu on next boot */ ++ reboot = TRUE; ++ break; + case GSM_MANAGER_LOGOUT_SHUTDOWN: + case GSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT: + shutdown = TRUE; +diff --git a/gnome-session/gsm-shell.c b/gnome-session/gsm-shell.c +index 04cfa2f5..d727232d 100644 +--- a/gnome-session/gsm-shell.c ++++ b/gnome-session/gsm-shell.c +@@ -69,6 +69,7 @@ enum { + END_SESSION_DIALOG_CONFIRMED_LOGOUT, + END_SESSION_DIALOG_CONFIRMED_SHUTDOWN, + END_SESSION_DIALOG_CONFIRMED_REBOOT, ++ END_SESSION_DIALOG_CONFIRMED_REBOOT_TO_BOOT_OPTIONS, + NUMBER_OF_SIGNALS + }; + +@@ -179,6 +180,14 @@ gsm_shell_class_init (GsmShellClass *shell_class) + NULL, NULL, NULL, + G_TYPE_NONE, 0); + ++ signals [END_SESSION_DIALOG_CONFIRMED_REBOOT_TO_BOOT_OPTIONS] = ++ g_signal_new ("end-session-dialog-confirmed-reboot-to-boot-options", ++ G_OBJECT_CLASS_TYPE (object_class), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET (GsmShellClass, end_session_dialog_confirmed_reboot_to_boot_options), ++ NULL, NULL, NULL, ++ G_TYPE_NONE, 0); ++ + g_type_class_add_private (shell_class, sizeof (GsmShellPrivate)); + } + +@@ -342,6 +351,7 @@ on_end_session_dialog_dbus_signal (GDBusProxy *proxy, + { "Canceled", END_SESSION_DIALOG_CANCELED }, + { "ConfirmedLogout", END_SESSION_DIALOG_CONFIRMED_LOGOUT }, + { "ConfirmedReboot", END_SESSION_DIALOG_CONFIRMED_REBOOT }, ++ { "ConfirmedRebootToBootOptions", END_SESSION_DIALOG_CONFIRMED_REBOOT_TO_BOOT_OPTIONS }, + { "ConfirmedShutdown", END_SESSION_DIALOG_CONFIRMED_SHUTDOWN }, + { NULL, -1 } + }; +diff --git a/gnome-session/gsm-shell.h b/gnome-session/gsm-shell.h +index e236493a..b1cdd457 100644 +--- a/gnome-session/gsm-shell.h ++++ b/gnome-session/gsm-shell.h +@@ -64,9 +64,10 @@ struct _GsmShellClass + void (* end_session_dialog_closed) (GsmShell *shell); + void (* end_session_dialog_canceled) (GsmShell *shell); + +- void (* end_session_dialog_confirmed_logout) (GsmShell *shell); +- void (* end_session_dialog_confirmed_shutdown) (GsmShell *shell); +- void (* end_session_dialog_confirmed_reboot) (GsmShell *shell); ++ void (* end_session_dialog_confirmed_logout) (GsmShell *shell); ++ void (* end_session_dialog_confirmed_shutdown) (GsmShell *shell); ++ void (* end_session_dialog_confirmed_reboot) (GsmShell *shell); ++ void (* end_session_dialog_confirmed_reboot_to_boot_options) (GsmShell *shell); + + }; + +-- +2.19.0 + diff --git a/0002-Fedora-Set-grub-boot-flags-on-shutdown-reboot.patch b/0002-Fedora-Set-grub-boot-flags-on-shutdown-reboot.patch new file mode 100644 index 0000000..43afe68 --- /dev/null +++ b/0002-Fedora-Set-grub-boot-flags-on-shutdown-reboot.patch @@ -0,0 +1,58 @@ +From 10d271c9819e3b9986e50e1eede7d3c126c45ff5 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 14 Aug 2018 14:49:59 +0200 +Subject: [PATCH 2/2] Fedora: Set grub boot-flags on shutdown / reboot + +Fedora's grub will automatically hide the boot-menu if the previous +boot has set the boot_success flag in grub's environment. This happens +automatically 30 seconds after login. + +But if the user shuts down or reboots from the system-menu before then +(e.g. directly from gdm) then the boot_success flag gets not set. If +a reboot / shutdown is initiated through gnome-session then the user +is successfully interacting with the system, so set the boot_success +flag from gnome_session for this case to fix reboot from gdm leading to +the boot-menu not being hidden. + +Likewise implement ConfirmedRebootMenu handling in a Fedora specific +way (for now) by setting the menu_show_once grub bootflag in this case. +--- + gnome-session/gsm-manager.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c +index e0f190a1..1444c553 100644 +--- a/gnome-session/gsm-manager.c ++++ b/gnome-session/gsm-manager.c +@@ -3716,14 +3716,27 @@ do_query_end_session_exit (GsmManager *manager) + break; + case GSM_MANAGER_LOGOUT_REBOOT: + case GSM_MANAGER_LOGOUT_REBOOT_INTERACT: ++ /* ++ * Fedora specific patch to make sure the boot-menu does not ++ * show when it is configured to auto-hide and a reboot is ++ * initiated directly from gdm. ++ */ ++ system("/usr/sbin/grub2-set-bootflag boot_success"); + reboot = TRUE; + break; + case GSM_MANAGER_LOGOUT_REBOOT_TO_BOOT_OPTIONS: +- /* FIXME tell bootmanager to show menu on next boot */ ++ /* Fedora specific implementation to show the menu on next boot */ ++ system("/usr/sbin/grub2-set-bootflag menu_show_once"); + reboot = TRUE; + break; + case GSM_MANAGER_LOGOUT_SHUTDOWN: + case GSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT: ++ /* ++ * Fedora specific patch to make sure the boot-menu does not ++ * show when it is configured to auto-hide and a shutdown is ++ * initiated directly from gdm. ++ */ ++ system("/usr/sbin/grub2-set-bootflag boot_success"); + shutdown = TRUE; + break; + default: +-- +2.19.0 + diff --git a/gnome-session.spec b/gnome-session.spec index 0bda28b..38ce84b 100644 --- a/gnome-session.spec +++ b/gnome-session.spec @@ -9,7 +9,7 @@ Name: gnome-session Version: 3.30.1 -Release: 1%{?dist} +Release: 2%{?dist} Summary: GNOME session manager License: GPLv2+ @@ -21,6 +21,10 @@ Patch1: gnome-session-3.3.92-nv30.patch Patch3: gnome-session-3.6.2-swrast.patch # https://bugzilla.gnome.org/show_bug.cgi?id=772421 Patch4: 0001-check-accelerated-gles-Use-eglGetPlatformDisplay-EXT.patch +# Implement https://wiki.gnome.org/Design/OS/BootOptions +# This should go upstream once systemd has a generic interface for this +Patch5: 0001-Add-support-for-new-ConfirmedRebootToBootOptions-sig.patch +Patch6: 0002-Fedora-Set-grub-boot-flags-on-shutdown-reboot.patch BuildRequires: meson BuildRequires: gcc @@ -126,6 +130,10 @@ Desktop file to add GNOME on wayland to display manager session menu. %{_datadir}/glib-2.0/schemas/org.gnome.SessionManager.gschema.xml %changelog +* Thu Sep 27 2018 Hans de Goede - 3.30.1-2 +- Add downstream patches implementing the "Boot Options" menu from: + https://wiki.gnome.org/Design/OS/BootOptions + * Wed Sep 26 2018 Kalev Lember - 3.30.1-1 - Update to 3.30.1