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 ef5be625972b3a52e557f28a98d1e68b5e6b42f4..67453d390be194e3f30252ce35ba395cdac1ec71 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 9748608a7f242683a6dca9e1b837ae92c0cd3493..f34c24d4f7d4d08cf99f23f79897dca606c1a2cb 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 801a13bef8049e8ab87ce417f5512d57d6460136..e8690e2e17410dc76cd4add30acbb143eff44390 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 c8f084c83732344a0ec1149f93f4e9651e368704..fe097c75c43dd4ca49a8a153c5d24cd438279f48 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 },