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 },