From 6520724dcc1812181dbe994e8a7e25fb650ee1eb Mon Sep 17 00:00:00 2001 From: slaclau Date: Tue, 9 Apr 2024 11:06:42 +0100 Subject: [PATCH] schemas + media-keys: add reboot and shutdown shortcuts update media keys schema update header files to include REBOOT and SHUTDOWN keys implement reboot and shutdown keyboard shortcuts Prerequisite for https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/1151 Co-authored-by: Matthijs Velsink --- ...s-daemon.plugins.media-keys.gschema.xml.in | 10 ++ plugins/media-keys/gsd-media-keys-manager.c | 91 +++++++++++++++++++ plugins/media-keys/media-keys.h | 2 + plugins/media-keys/shortcuts-list.h | 2 + 4 files changed, 105 insertions(+) diff --git a/data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in b/data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in index ef5be6259..67453d390 100644 --- a/data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in +++ b/data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in @@ -56,6 +56,16 @@ Log out Binding to log out. + + '' + Log out + Binding to reboot. + + + '' + Shut Down + Binding to shut down. + 'XF86AudioPrev' Previous track diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c index 9748608a7..f34c24d4f 100644 --- a/plugins/media-keys/gsd-media-keys-manager.c +++ b/plugins/media-keys/gsd-media-keys-manager.c @@ -1082,6 +1082,89 @@ do_media_action (GsdMediaKeysManager *manager, } } +static void +gnome_session_logout_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GVariant *result; + GError *error = NULL; + + result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), + res, + &error); + if (result == NULL) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("Failed to call Logout on session manager: %s", + error->message); + g_error_free (error); + } else { + g_variant_unref (result); + } +} + +static void +gnome_session_logout (GsdMediaKeysManager *manager, + guint logout_mode) +{ + GsdMediaKeysManagerPrivate *priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager); + GDBusProxy *proxy; + + proxy = G_DBUS_PROXY (gnome_settings_bus_get_session_proxy ()); + + g_dbus_proxy_call (proxy, + "Logout", + g_variant_new ("(u)", logout_mode), + G_DBUS_CALL_FLAGS_NONE, + -1, + priv->bus_cancellable, + gnome_session_logout_cb, + NULL); + + g_object_unref (proxy); +} + +static void +gnome_session_reboot_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GVariant *result; + GError *error = NULL; + + result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), + res, + &error); + if (result == NULL) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("Failed to call Reboot on session manager: %s", + error->message); + g_error_free (error); + } else { + g_variant_unref (result); + } +} + +static void +gnome_session_reboot (GsdMediaKeysManager *manager) +{ + GsdMediaKeysManagerPrivate *priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager); + GDBusProxy *proxy; + + proxy = G_DBUS_PROXY (gnome_settings_bus_get_session_proxy ()); + + g_dbus_proxy_call (proxy, + "Reboot", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + priv->bus_cancellable, + gnome_session_reboot_cb, + NULL); + + g_object_unref (proxy); +} + static void gnome_session_shutdown_cb (GObject *source_object, GAsyncResult *res, @@ -2385,6 +2468,12 @@ do_action (GsdMediaKeysManager *manager, SOUND_ACTION_FLAG_IS_OUTPUT | SOUND_ACTION_FLAG_IS_PRECISE); break; case LOGOUT_KEY: + gnome_session_logout (manager, 0); + break; + case REBOOT_KEY: + gnome_session_reboot (manager); + break; + case SHUTDOWN_KEY: gnome_session_shutdown (manager); break; case EJECT_KEY: @@ -2971,6 +3060,8 @@ migrate_keybinding_settings (void) { "pause", "pause", map_keybinding }, { "play", "play", map_keybinding }, { "logout", "logout", map_keybinding }, + { "reboot", "reboot", map_keybinding }, + { "shutdown", "shutdown", map_keybinding }, { "previous", "previous", map_keybinding }, { "screensaver", "screensaver", map_keybinding }, { "search", "search", map_keybinding }, diff --git a/plugins/media-keys/media-keys.h b/plugins/media-keys/media-keys.h index 801a13bef..e8690e2e1 100644 --- a/plugins/media-keys/media-keys.h +++ b/plugins/media-keys/media-keys.h @@ -33,6 +33,8 @@ typedef enum { VOLUME_DOWN_PRECISE_KEY, VOLUME_UP_PRECISE_KEY, LOGOUT_KEY, + REBOOT_KEY, + SHUTDOWN_KEY, EJECT_KEY, HOME_KEY, MEDIA_KEY, diff --git a/plugins/media-keys/shortcuts-list.h b/plugins/media-keys/shortcuts-list.h index c8f084c83..fe097c75c 100644 --- a/plugins/media-keys/shortcuts-list.h +++ b/plugins/media-keys/shortcuts-list.h @@ -55,6 +55,8 @@ static struct { { VOLUME_DOWN_PRECISE_KEY, "volume-down-precise", TRUE, SHELL_ACTION_MODE_ALL }, { VOLUME_UP_PRECISE_KEY, "volume-up-precise", TRUE, SHELL_ACTION_MODE_ALL }, { LOGOUT_KEY, "logout", FALSE, GSD_ACTION_MODE_LAUNCHER, META_KEY_BINDING_IGNORE_AUTOREPEAT }, + { REBOOT_KEY, "reboot", FALSE, GSD_ACTION_MODE_LAUNCHER, META_KEY_BINDING_IGNORE_AUTOREPEAT }, + { SHUTDOWN_KEY, "shutdown", FALSE, GSD_ACTION_MODE_LAUNCHER, META_KEY_BINDING_IGNORE_AUTOREPEAT }, { EJECT_KEY, "eject", TRUE, SHELL_ACTION_MODE_ALL, META_KEY_BINDING_IGNORE_AUTOREPEAT }, { HOME_KEY, "home", TRUE, GSD_ACTION_MODE_LAUNCHER, META_KEY_BINDING_IGNORE_AUTOREPEAT }, { MEDIA_KEY, "media", TRUE, GSD_ACTION_MODE_LAUNCHER, META_KEY_BINDING_IGNORE_AUTOREPEAT }, -- GitLab