c751d8e
From 3e5779207e2bfab25978e80ac62e8af8c3685f8e Mon Sep 17 00:00:00 2001
650dd58
From: Hans de Goede <hdegoede@redhat.com>
650dd58
Date: Tue, 14 Aug 2018 14:41:43 +0200
650dd58
Subject: [PATCH 1/2] Add support for new ConfirmedRebootToBootOptions signal
650dd58
 send by org.gnome.SessionManager.EndSessionDialog
650dd58
650dd58
In order to allow the user to choose advanced boot-options on systems where
650dd58
the boot menu is not shown by default at boot, gnome-shell's endSessionDialog.js
650dd58
may emit a new ConfirmedRebootToBootOptions signal to indicate that
650dd58
gnome-session should reboot the system in such a way that the boot-menu will
650dd58
be shown next boot.
650dd58
650dd58
This implements the backend for the "Boot Options" button from:
650dd58
https://wiki.gnome.org/Design/OS/BootOptions
650dd58
650dd58
Note that at the moment ConfirmedRebootToBootOptions is just treated as an
650dd58
alias to ConfirmedReboot, since there is no bootloader agnostic way yet to
650dd58
indicate the menu should be shown.
650dd58
650dd58
For now the FIXME may be patched with a distro specific patch to implement
650dd58
this for the distro's chosen bootloader. I will start a discussion on
650dd58
systemd-devel to come up with a distro / bootloader agnostic interface
650dd58
for this.
650dd58
---
650dd58
 gnome-session/gsm-manager.c | 28 ++++++++++++++++++++++++++++
650dd58
 gnome-session/gsm-shell.c   | 10 ++++++++++
650dd58
 gnome-session/gsm-shell.h   |  7 ++++---
650dd58
 3 files changed, 42 insertions(+), 3 deletions(-)
650dd58
650dd58
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
c751d8e
index d41bdcac..e0c05d82 100644
650dd58
--- a/gnome-session/gsm-manager.c
650dd58
+++ b/gnome-session/gsm-manager.c
c751d8e
@@ -117,6 +117,7 @@ typedef enum
650dd58
         GSM_MANAGER_LOGOUT_NONE,
650dd58
         GSM_MANAGER_LOGOUT_LOGOUT,
650dd58
         GSM_MANAGER_LOGOUT_REBOOT,
650dd58
+        GSM_MANAGER_LOGOUT_REBOOT_TO_BOOT_OPTIONS,
650dd58
         GSM_MANAGER_LOGOUT_REBOOT_INTERACT,
650dd58
         GSM_MANAGER_LOGOUT_SHUTDOWN,
650dd58
         GSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT,
c751d8e
@@ -176,6 +177,7 @@ struct GsmManagerPrivate
650dd58
         guint                   shell_end_session_dialog_confirmed_logout_id;
650dd58
         guint                   shell_end_session_dialog_confirmed_shutdown_id;
650dd58
         guint                   shell_end_session_dialog_confirmed_reboot_id;
650dd58
+        guint                   shell_end_session_dialog_confirmed_reboot_to_boot_options_id;
650dd58
 };
650dd58
 
650dd58
 enum {
c751d8e
@@ -490,6 +492,7 @@ gsm_manager_quit (GsmManager *manager)
650dd58
                 gsm_quit ();
650dd58
                 break;
650dd58
         case GSM_MANAGER_LOGOUT_REBOOT:
650dd58
+        case GSM_MANAGER_LOGOUT_REBOOT_TO_BOOT_OPTIONS:
650dd58
         case GSM_MANAGER_LOGOUT_REBOOT_INTERACT:
650dd58
                 gsm_system_complete_shutdown (manager->priv->system);
c751d8e
                 gsm_quit ();
c751d8e
@@ -1161,6 +1164,7 @@ end_session_or_show_shell_dialog (GsmManager *manager)
650dd58
                 type = GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT;
650dd58
                 break;
650dd58
         case GSM_MANAGER_LOGOUT_REBOOT:
650dd58
+        case GSM_MANAGER_LOGOUT_REBOOT_TO_BOOT_OPTIONS:
650dd58
         case GSM_MANAGER_LOGOUT_REBOOT_INTERACT:
650dd58
                 type = GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART;
650dd58
                 break;
c751d8e
@@ -3450,6 +3454,12 @@ disconnect_shell_dialog_signals (GsmManager *manager)
650dd58
                 manager->priv->shell_end_session_dialog_confirmed_reboot_id = 0;
650dd58
         }
650dd58
 
650dd58
+        if (manager->priv->shell_end_session_dialog_confirmed_reboot_to_boot_options_id != 0) {
650dd58
+                g_signal_handler_disconnect (manager->priv->shell,
650dd58
+                                             manager->priv->shell_end_session_dialog_confirmed_reboot_to_boot_options_id);
650dd58
+                manager->priv->shell_end_session_dialog_confirmed_reboot_to_boot_options_id = 0;
650dd58
+        }
650dd58
+
650dd58
         if (manager->priv->shell_end_session_dialog_open_failed_id != 0) {
650dd58
                 g_signal_handler_disconnect (manager->priv->shell,
650dd58
                                              manager->priv->shell_end_session_dialog_open_failed_id);
c751d8e
@@ -3512,6 +3522,14 @@ on_shell_end_session_dialog_confirmed_reboot (GsmShell   *shell,
650dd58
         disconnect_shell_dialog_signals (manager);
650dd58
 }
650dd58
 
650dd58
+static void
650dd58
+on_shell_end_session_dialog_confirmed_reboot_to_boot_options (GsmShell   *shell,
650dd58
+                                                           GsmManager *manager)
650dd58
+{
650dd58
+        _handle_end_session_dialog_response (manager, GSM_MANAGER_LOGOUT_REBOOT_TO_BOOT_OPTIONS);
650dd58
+        disconnect_shell_dialog_signals (manager);
650dd58
+}
650dd58
+
650dd58
 static void
650dd58
 connect_shell_dialog_signals (GsmManager *manager)
650dd58
 {
c751d8e
@@ -3547,6 +3565,12 @@ connect_shell_dialog_signals (GsmManager *manager)
650dd58
                                   "end-session-dialog-confirmed-reboot",
650dd58
                                   G_CALLBACK (on_shell_end_session_dialog_confirmed_reboot),
650dd58
                                   manager);
650dd58
+
650dd58
+        manager->priv->shell_end_session_dialog_confirmed_reboot_to_boot_options_id =
650dd58
+                g_signal_connect (manager->priv->shell,
650dd58
+                                  "end-session-dialog-confirmed-reboot-to-boot-options",
650dd58
+                                  G_CALLBACK (on_shell_end_session_dialog_confirmed_reboot_to_boot_options),
650dd58
+                                  manager);
650dd58
 }
650dd58
 
650dd58
 static void
c751d8e
@@ -3820,6 +3844,10 @@ do_query_end_session_exit (GsmManager *manager)
650dd58
         case GSM_MANAGER_LOGOUT_REBOOT_INTERACT:
650dd58
                 reboot = TRUE;
650dd58
                 break;
650dd58
+        case GSM_MANAGER_LOGOUT_REBOOT_TO_BOOT_OPTIONS:
650dd58
+                /* FIXME tell bootmanager to show menu on next boot */
650dd58
+                reboot = TRUE;
650dd58
+                break;
650dd58
         case GSM_MANAGER_LOGOUT_SHUTDOWN:
650dd58
         case GSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT:
650dd58
                 shutdown = TRUE;
650dd58
diff --git a/gnome-session/gsm-shell.c b/gnome-session/gsm-shell.c
650dd58
index 04cfa2f5..d727232d 100644
650dd58
--- a/gnome-session/gsm-shell.c
650dd58
+++ b/gnome-session/gsm-shell.c
650dd58
@@ -69,6 +69,7 @@ enum {
650dd58
         END_SESSION_DIALOG_CONFIRMED_LOGOUT,
650dd58
         END_SESSION_DIALOG_CONFIRMED_SHUTDOWN,
650dd58
         END_SESSION_DIALOG_CONFIRMED_REBOOT,
650dd58
+        END_SESSION_DIALOG_CONFIRMED_REBOOT_TO_BOOT_OPTIONS,
650dd58
         NUMBER_OF_SIGNALS
650dd58
 };
650dd58
 
650dd58
@@ -179,6 +180,14 @@ gsm_shell_class_init (GsmShellClass *shell_class)
650dd58
                               NULL, NULL, NULL,
650dd58
                               G_TYPE_NONE, 0);
650dd58
 
650dd58
+        signals [END_SESSION_DIALOG_CONFIRMED_REBOOT_TO_BOOT_OPTIONS] =
650dd58
+                g_signal_new ("end-session-dialog-confirmed-reboot-to-boot-options",
650dd58
+                              G_OBJECT_CLASS_TYPE (object_class),
650dd58
+                              G_SIGNAL_RUN_LAST,
650dd58
+                              G_STRUCT_OFFSET (GsmShellClass, end_session_dialog_confirmed_reboot_to_boot_options),
650dd58
+                              NULL, NULL, NULL,
650dd58
+                              G_TYPE_NONE, 0);
650dd58
+
650dd58
         g_type_class_add_private (shell_class, sizeof (GsmShellPrivate));
650dd58
 }
650dd58
 
650dd58
@@ -342,6 +351,7 @@ on_end_session_dialog_dbus_signal (GDBusProxy *proxy,
650dd58
                 { "Canceled", END_SESSION_DIALOG_CANCELED },
650dd58
                 { "ConfirmedLogout", END_SESSION_DIALOG_CONFIRMED_LOGOUT },
650dd58
                 { "ConfirmedReboot", END_SESSION_DIALOG_CONFIRMED_REBOOT },
650dd58
+                { "ConfirmedRebootToBootOptions", END_SESSION_DIALOG_CONFIRMED_REBOOT_TO_BOOT_OPTIONS },
650dd58
                 { "ConfirmedShutdown", END_SESSION_DIALOG_CONFIRMED_SHUTDOWN },
650dd58
                 { NULL, -1 }
650dd58
         };
650dd58
diff --git a/gnome-session/gsm-shell.h b/gnome-session/gsm-shell.h
650dd58
index e236493a..b1cdd457 100644
650dd58
--- a/gnome-session/gsm-shell.h
650dd58
+++ b/gnome-session/gsm-shell.h
650dd58
@@ -64,9 +64,10 @@ struct _GsmShellClass
650dd58
         void (* end_session_dialog_closed)        (GsmShell *shell);
650dd58
         void (* end_session_dialog_canceled)      (GsmShell *shell);
650dd58
 
650dd58
-        void (* end_session_dialog_confirmed_logout)   (GsmShell *shell);
650dd58
-        void (* end_session_dialog_confirmed_shutdown) (GsmShell *shell);
650dd58
-        void (* end_session_dialog_confirmed_reboot)   (GsmShell *shell);
650dd58
+        void (* end_session_dialog_confirmed_logout)                 (GsmShell *shell);
650dd58
+        void (* end_session_dialog_confirmed_shutdown)               (GsmShell *shell);
650dd58
+        void (* end_session_dialog_confirmed_reboot)                 (GsmShell *shell);
650dd58
+        void (* end_session_dialog_confirmed_reboot_to_boot_options) (GsmShell *shell);
650dd58
 
650dd58
 };
650dd58
 
650dd58
-- 
c751d8e
2.23.0
650dd58