summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@fedoraproject.org>2008-01-25 20:35:06 +0000
committerWilliam Jon McCann <mccann@fedoraproject.org>2008-01-25 20:35:06 +0000
commitef62569f2c1c796cca44c2299f2a0aecd7488f8f (patch)
tree481ff4d094e872f8205547f988ecf0fe1cbc935d
parent4f11e7cfeb86aaa47a5c9827d59153f5a8fcdc78 (diff)
downloadgnome-panel-ef62569f2c1c796cca44c2299f2a0aecd7488f8f.tar.gz
gnome-panel-ef62569f2c1c796cca44c2299f2a0aecd7488f8f.tar.xz
gnome-panel-ef62569f2c1c796cca44c2299f2a0aecd7488f8f.zip
- Add ConsoleKit restart/shutdown supportgnome-panel-2_21_5-2_fc9
-rw-r--r--gnome-panel-2.21.5-ck-shutdown.patch920
-rw-r--r--gnome-panel.spec9
2 files changed, 928 insertions, 1 deletions
diff --git a/gnome-panel-2.21.5-ck-shutdown.patch b/gnome-panel-2.21.5-ck-shutdown.patch
new file mode 100644
index 0000000..314861f
--- /dev/null
+++ b/gnome-panel-2.21.5-ck-shutdown.patch
@@ -0,0 +1,920 @@
+Index: gnome-panel/gnome-panel/panel-consolekit.c
+===================================================================
+--- gnome-panel/gnome-panel/panel-consolekit.c (revision 0)
++++ gnome-panel/gnome-panel/panel-consolekit.c (revision 0)
+@@ -0,0 +1,597 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
++ *
++ * Copyright (C) 2008 Jon McCann <jmccann@redhat.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
++ * 02111-1307, USA.
++ */
++
++#include "config.h"
++
++#include <errno.h>
++#include <string.h>
++#include <unistd.h>
++
++#include <glib.h>
++#include <glib-object.h>
++#include <glib/gi18n.h>
++
++#include <dbus/dbus-glib.h>
++
++#ifdef HAVE_POLKIT
++#include <polkit-gnome/polkit-gnome.h>
++#endif
++
++#include "panel-consolekit.h"
++
++#define CK_NAME "org.freedesktop.ConsoleKit"
++#define CK_PATH "/org/freedesktop/ConsoleKit"
++#define CK_INTERFACE "org.freedesktop.ConsoleKit"
++
++#define CK_MANAGER_PATH "/org/freedesktop/ConsoleKit/Manager"
++#define CK_MANAGER_INTERFACE "org.freedesktop.ConsoleKit.Manager"
++#define CK_SEAT_INTERFACE "org.freedesktop.ConsoleKit.Seat"
++#define CK_SESSION_INTERFACE "org.freedesktop.ConsoleKit.Session"
++
++#define PANEL_CONSOLEKIT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PANEL_TYPE_CONSOLEKIT, PanelConsolekitPrivate))
++
++struct _PanelConsolekitPrivate {
++ DBusGConnection *dbus_connection;
++ DBusGProxy *bus_proxy;
++ DBusGProxy *ck_proxy;
++ guint32 is_connected : 1;
++};
++
++enum {
++ PROP_0 = 0,
++ PROP_IS_CONNECTED
++};
++
++enum {
++ REQUEST_COMPLETED = 0,
++ LAST_SIGNAL
++};
++
++static guint signals [LAST_SIGNAL];
++
++static void panel_consolekit_class_init (PanelConsolekitClass *klass);
++static void panel_consolekit_init (PanelConsolekit *ck);
++static void panel_consolekit_finalize (GObject *object);
++static void panel_consolekit_on_name_owner_changed (DBusGProxy *bus_proxy,
++ const char *name,
++ const char *prev_owner,
++ const char *new_owner,
++ PanelConsolekit *manager);
++
++G_DEFINE_TYPE (PanelConsolekit, panel_consolekit, G_TYPE_OBJECT);
++
++static void
++panel_consolekit_get_property (GObject *object,
++ guint prop_id,
++ GValue *value,
++ GParamSpec *pspec)
++{
++ PanelConsolekit *manager = PANEL_CONSOLEKIT (object);
++
++ switch (prop_id) {
++ case PROP_IS_CONNECTED:
++ g_value_set_boolean (value,
++ manager->priv->is_connected);
++ break;
++
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
++ prop_id,
++ pspec);
++ }
++}
++
++static void
++panel_consolekit_class_init (PanelConsolekitClass *manager_class)
++{
++ GObjectClass *object_class;
++ GParamSpec *param_spec;
++
++ object_class = G_OBJECT_CLASS (manager_class);
++
++ object_class->finalize = panel_consolekit_finalize;
++ object_class->get_property = panel_consolekit_get_property;
++
++ param_spec = g_param_spec_boolean ("is-connected",
++ "Is connected",
++ "Whether the panel is connected to ConsoleKit",
++ FALSE,
++ G_PARAM_READABLE);
++ g_object_class_install_property (object_class, PROP_IS_CONNECTED,
++ param_spec);
++
++ signals [REQUEST_COMPLETED] =
++ g_signal_new ("request-completed",
++ G_OBJECT_CLASS_TYPE (object_class),
++ G_SIGNAL_RUN_LAST,
++ G_STRUCT_OFFSET (PanelConsolekitClass, request_completed),
++ NULL,
++ NULL,
++ g_cclosure_marshal_VOID__POINTER,
++ G_TYPE_NONE,
++ 1, G_TYPE_POINTER);
++
++ g_type_class_add_private (manager_class,
++ sizeof (PanelConsolekitPrivate));
++}
++
++static gboolean
++panel_consolekit_ensure_ck_connection (PanelConsolekit *manager,
++ GError **error)
++{
++ GError *connection_error;
++ gboolean is_connected;
++
++ connection_error = NULL;
++ if (manager->priv->dbus_connection == NULL) {
++ manager->priv->dbus_connection = dbus_g_bus_get (DBUS_BUS_SYSTEM,
++ &connection_error);
++
++ if (manager->priv->dbus_connection == NULL) {
++ g_propagate_error (error, connection_error);
++ is_connected = FALSE;
++ goto out;
++ }
++ }
++
++ if (manager->priv->bus_proxy == NULL) {
++ manager->priv->bus_proxy =
++ dbus_g_proxy_new_for_name_owner (manager->priv->dbus_connection,
++ DBUS_SERVICE_DBUS,
++ DBUS_PATH_DBUS,
++ DBUS_INTERFACE_DBUS,
++ &connection_error);
++
++ if (manager->priv->bus_proxy == NULL) {
++ g_propagate_error (error, connection_error);
++ is_connected = FALSE;
++ goto out;
++ }
++
++ dbus_g_proxy_add_signal (manager->priv->bus_proxy,
++ "NameOwnerChanged",
++ G_TYPE_STRING,
++ G_TYPE_STRING,
++ G_TYPE_STRING,
++ G_TYPE_INVALID);
++ dbus_g_proxy_connect_signal (manager->priv->bus_proxy,
++ "NameOwnerChanged",
++ G_CALLBACK (panel_consolekit_on_name_owner_changed),
++ manager, NULL);
++ }
++
++ if (manager->priv->ck_proxy == NULL) {
++ manager->priv->ck_proxy =
++ dbus_g_proxy_new_for_name_owner (manager->priv->dbus_connection,
++ "org.freedesktop.ConsoleKit",
++ "/org/freedesktop/ConsoleKit/Manager",
++ "org.freedesktop.ConsoleKit.Manager",
++ &connection_error);
++
++ if (manager->priv->ck_proxy == NULL) {
++ g_propagate_error (error, connection_error);
++ is_connected = FALSE;
++ goto out;
++ }
++ }
++ is_connected = TRUE;
++
++out:
++ if (manager->priv->is_connected != is_connected) {
++ manager->priv->is_connected = is_connected;
++ g_object_notify (G_OBJECT (manager), "is-connected");
++ }
++
++ if (!is_connected) {
++ if (manager->priv->dbus_connection == NULL) {
++ if (manager->priv->bus_proxy != NULL) {
++ g_object_unref (manager->priv->bus_proxy);
++ manager->priv->bus_proxy = NULL;
++ }
++
++ if (manager->priv->ck_proxy != NULL) {
++ g_object_unref (manager->priv->ck_proxy);
++ manager->priv->ck_proxy = NULL;
++ }
++ } else if (manager->priv->bus_proxy == NULL) {
++ if (manager->priv->ck_proxy != NULL) {
++ g_object_unref (manager->priv->ck_proxy);
++ manager->priv->ck_proxy = NULL;
++ }
++ }
++ }
++
++ return is_connected;
++}
++
++static void
++panel_consolekit_on_name_owner_changed (DBusGProxy *bus_proxy,
++ const char *name,
++ const char *prev_owner,
++ const char *new_owner,
++ PanelConsolekit *manager)
++{
++ if (strcmp (name, "org.freedesktop.ConsoleKit") != 0)
++ return;
++
++ if (manager->priv->ck_proxy != NULL) {
++ g_object_unref (manager->priv->ck_proxy);
++ manager->priv->ck_proxy = NULL;
++ }
++
++ panel_consolekit_ensure_ck_connection (manager, NULL);
++}
++
++static void
++panel_consolekit_init (PanelConsolekit *manager)
++{
++ GError *error;
++
++ manager->priv = PANEL_CONSOLEKIT_GET_PRIVATE (manager);
++
++ error = NULL;
++ if (!panel_consolekit_ensure_ck_connection (manager, &error)) {
++ g_message ("Could not connect to ConsoleKit: %s",
++ error->message);
++ g_error_free (error);
++ }
++}
++
++static void
++panel_consolekit_finalize (GObject *object)
++{
++ PanelConsolekit *manager;
++ GObjectClass *parent_class;
++
++ manager = PANEL_CONSOLEKIT (object);
++
++ parent_class = G_OBJECT_CLASS (panel_consolekit_parent_class);
++
++ if (parent_class->finalize != NULL)
++ parent_class->finalize (object);
++}
++
++GQuark
++panel_consolekit_error_quark (void)
++{
++ static GQuark error_quark = 0;
++
++ if (error_quark == 0)
++ error_quark = g_quark_from_static_string ("panel-consolekit-error");
++
++ return error_quark;
++}
++
++PanelConsolekit *
++panel_consolekit_new (void)
++{
++ PanelConsolekit *manager;
++
++ manager = g_object_new (PANEL_TYPE_CONSOLEKIT, NULL);
++
++ return manager;
++}
++
++static gboolean
++try_system_stop (DBusGConnection *connection,
++ GError **error)
++{
++ DBusGProxy *proxy;
++ gboolean res;
++
++ proxy = dbus_g_proxy_new_for_name (connection,
++ CK_NAME,
++ CK_MANAGER_PATH,
++ CK_MANAGER_INTERFACE);
++ res = dbus_g_proxy_call_with_timeout (proxy,
++ "Stop",
++ INT_MAX,
++ error,
++ /* parameters: */
++ G_TYPE_INVALID,
++ /* return values: */
++ G_TYPE_INVALID);
++ return res;
++}
++
++static gboolean
++try_system_restart (DBusGConnection *connection,
++ GError **error)
++{
++ DBusGProxy *proxy;
++ gboolean res;
++
++ proxy = dbus_g_proxy_new_for_name (connection,
++ CK_NAME,
++ CK_MANAGER_PATH,
++ CK_MANAGER_INTERFACE);
++ res = dbus_g_proxy_call_with_timeout (proxy,
++ "Restart",
++ INT_MAX,
++ error,
++ /* parameters: */
++ G_TYPE_INVALID,
++ /* return values: */
++ G_TYPE_INVALID);
++ return res;
++}
++
++static void
++emit_restart_complete (PanelConsolekit *manager,
++ GError *error)
++{
++ GError *call_error;
++
++ call_error = NULL;
++
++ if (error != NULL) {
++ call_error = g_error_new_literal (PANEL_CONSOLEKIT_ERROR,
++ PANEL_CONSOLEKIT_ERROR_RESTARTING,
++ error->message);
++ }
++
++ g_signal_emit (G_OBJECT (manager),
++ signals [REQUEST_COMPLETED],
++ 0, call_error);
++ if (call_error != NULL) {
++ g_error_free (call_error);
++ }
++}
++
++static void
++emit_stop_complete (PanelConsolekit *manager,
++ GError *error)
++{
++ GError *call_error;
++
++ call_error = NULL;
++
++ if (error != NULL) {
++ call_error = g_error_new_literal (PANEL_CONSOLEKIT_ERROR,
++ PANEL_CONSOLEKIT_ERROR_STOPPING,
++ error->message);
++ }
++
++ g_signal_emit (G_OBJECT (manager),
++ signals [REQUEST_COMPLETED],
++ 0, call_error);
++ if (call_error != NULL) {
++ g_error_free (call_error);
++ }
++}
++
++#ifdef HAVE_POLKIT
++static void
++system_restart_auth_cb (PolKitAction *action,
++ gboolean gained_privilege,
++ GError *error,
++ PanelConsolekit *manager)
++{
++ GError *local_error;
++ gboolean res;
++
++ if (! gained_privilege) {
++ if (error != NULL) {
++ g_warning ("system restart error: %s", error->message);
++ emit_restart_complete (manager, error);
++ }
++ return;
++ }
++
++ local_error = NULL;
++ res = try_system_restart (manager->priv->dbus_connection, &local_error);
++ if (! res) {
++ g_warning ("Unable to restart system: %s", local_error->message);
++ emit_restart_complete (manager, local_error);
++ g_error_free (local_error);
++ return;
++ }
++}
++
++static void
++system_stop_auth_cb (PolKitAction *action,
++ gboolean gained_privilege,
++ GError *error,
++ PanelConsolekit *manager)
++{
++ GError *local_error;
++ gboolean res;
++
++ if (! gained_privilege) {
++ if (error != NULL) {
++ g_warning ("system restart error: %s", error->message);
++ emit_restart_complete (manager, error);
++ }
++ return;
++ }
++
++ local_error = NULL;
++ res = try_system_restart (manager->priv->dbus_connection, &local_error);
++ if (! res) {
++ g_warning ("Unable to restart system: %s", local_error->message);
++ emit_restart_complete (manager, local_error);
++ g_error_free (local_error);
++ return;
++ }
++}
++
++static PolKitAction *
++get_action_from_error (GError *error)
++{
++ PolKitAction *action;
++ const char *paction;
++
++ action = polkit_action_new ();
++
++ paction = NULL;
++ if (g_str_has_prefix (error->message, "Not privileged for action: ")) {
++ paction = error->message + strlen ("Not privileged for action: ");
++ }
++ polkit_action_set_action_id (action, paction);
++
++ return action;
++}
++#endif /* HAVE_POLKIT */
++
++static void
++request_restart_priv (PanelConsolekit *manager,
++ GError *error)
++{
++ gboolean res = FALSE;
++#ifdef HAVE_POLKIT
++ PolKitAction *action;
++ guint xid;
++ pid_t pid;
++
++ action = get_action_from_error (error);
++
++ xid = 0;
++ pid = getpid ();
++
++ g_error_free (error);
++ error = NULL;
++ res = polkit_gnome_auth_obtain (action,
++ xid,
++ pid,
++ (PolKitGnomeAuthCB) system_restart_auth_cb,
++ manager,
++ &error);
++ polkit_action_unref (action);
++#endif /* HAVE POLKIT */
++ if (! res) {
++ emit_restart_complete (manager, error);
++ g_error_free (error);
++ }
++}
++
++static void
++request_stop_priv (PanelConsolekit *manager,
++ GError *error)
++{
++ gboolean res = FALSE;
++#ifdef HAVE_POLKIT
++ PolKitAction *action;
++ guint xid;
++ pid_t pid;
++
++ action = get_action_from_error (error);
++
++ xid = 0;
++ pid = getpid ();
++
++ g_error_free (error);
++ error = NULL;
++ res = polkit_gnome_auth_obtain (action,
++ xid,
++ pid,
++ (PolKitGnomeAuthCB) system_stop_auth_cb,
++ manager,
++ &error);
++ polkit_action_unref (action);
++#endif /* HAVE POLKIT */
++ if (! res) {
++ emit_stop_complete (manager, error);
++ g_error_free (error);
++ }
++}
++
++void
++panel_consolekit_attempt_restart (PanelConsolekit *manager)
++{
++ gboolean res;
++ GError *error;
++
++ error = NULL;
++
++ if (!panel_consolekit_ensure_ck_connection (manager, &error)) {
++ g_warning ("Could not connect to ConsoleKit: %s",
++ error->message);
++ g_error_free (error);
++ return;
++ }
++
++ res = try_system_restart (manager->priv->dbus_connection, &error);
++ if (! res) {
++ if (dbus_g_error_has_name (error, "org.freedesktop.ConsoleKit.Manager.NotPrivileged")) {
++ request_restart_priv (manager, error);
++ } else {
++ emit_restart_complete (manager, error);
++ g_error_free (error);
++ }
++ }
++
++}
++
++void
++panel_consolekit_attempt_stop (PanelConsolekit *manager)
++{
++ gboolean res;
++ GError *error;
++
++ error = NULL;
++
++ if (!panel_consolekit_ensure_ck_connection (manager, &error)) {
++ g_warning ("Could not connect to ConsoleKit: %s",
++ error->message);
++ g_error_free (error);
++ return;
++ }
++
++ res = try_system_stop (manager->priv->dbus_connection, &error);
++ if (! res) {
++ if (dbus_g_error_has_name (error, "org.freedesktop.ConsoleKit.Manager.NotPrivileged")) {
++ request_stop_priv (manager, error);
++ } else {
++ emit_stop_complete (manager, error);
++ g_error_free (error);
++ }
++ }
++}
++
++gboolean
++panel_consolekit_can_restart (PanelConsolekit *manager)
++{
++#ifdef HAVE_POLKIT
++ return TRUE;
++#else
++ return FALSE;
++#endif
++}
++
++gboolean
++panel_consolekit_can_stop (PanelConsolekit *manager)
++{
++#ifdef HAVE_POLKIT
++ return TRUE;
++#else
++ return FALSE;
++#endif
++}
++
++PanelConsolekit *
++panel_get_consolekit (void)
++{
++ static PanelConsolekit *manager = NULL;
++
++ if (manager == NULL)
++ manager = panel_consolekit_new ();
++
++ return g_object_ref (manager);
++}
+Index: gnome-panel/gnome-panel/panel-consolekit.h
+===================================================================
+--- gnome-panel/gnome-panel/panel-consolekit.h (revision 0)
++++ gnome-panel/gnome-panel/panel-consolekit.h (revision 0)
+@@ -0,0 +1,77 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
++ *
++ * Copyright (C) 2008 Jon McCann <jmccann@redhat.com>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
++ * 02111-1307, USA.
++ *
++ * Authors:
++ * Jon McCann <jmccann@redhat.com>
++ */
++
++#ifndef PANEL_CONSOLEKIT_H
++#define PANEL_CONSOLEKIT_H
++
++#include <glib.h>
++#include <glib-object.h>
++
++G_BEGIN_DECLS
++
++#define PANEL_TYPE_CONSOLEKIT (panel_consolekit_get_type ())
++#define PANEL_CONSOLEKIT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PANEL_TYPE_CONSOLEKIT, PanelConsolekit))
++#define PANEL_CONSOLEKIT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANEL_TYPE_CONSOLEKIT, PanelConsolekitClass))
++#define PANEL_IS_CONSOLEKIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PANEL_TYPE_CONSOLEKIT))
++#define PANEL_IS_CONSOLEKIT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANEL_TYPE_CONSOLEKIT))
++#define PANEL_CONSOLEKIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PANEL_TYPE_CONSOLEKIT, PanelConsolekitClass))
++#define PANEL_CONSOLEKIT_ERROR (panel_consolekit_error_quark ())
++
++typedef struct _PanelConsolekit PanelConsolekit;
++typedef struct _PanelConsolekitClass PanelConsolekitClass;
++typedef struct _PanelConsolekitPrivate PanelConsolekitPrivate;
++typedef enum _PanelConsolekitError PanelConsolekitError;
++
++struct _PanelConsolekit {
++ GObject parent;
++ PanelConsolekitPrivate *priv;
++};
++
++struct _PanelConsolekitClass {
++ GObjectClass parent_class;
++
++ void (* request_completed) (PanelConsolekit *manager,
++ GError *error);
++};
++
++enum _PanelConsolekitError {
++ PANEL_CONSOLEKIT_ERROR_RESTARTING = 0,
++ PANEL_CONSOLEKIT_ERROR_STOPPING
++};
++
++GType panel_consolekit_get_type (void);
++GQuark panel_consolekit_error_quark (void);
++
++PanelConsolekit *panel_consolekit_new (void) G_GNUC_MALLOC;
++
++gboolean panel_consolekit_can_stop (PanelConsolekit *manager);
++gboolean panel_consolekit_can_restart (PanelConsolekit *manager);
++
++void panel_consolekit_attempt_stop (PanelConsolekit *manager);
++void panel_consolekit_attempt_restart (PanelConsolekit *manager);
++
++PanelConsolekit *panel_get_consolekit (void);
++
++G_END_DECLS
++
++#endif /* PANEL_CONSOLEKIT_H */
+Index: gnome-panel/gnome-panel/panel-logout.c
+===================================================================
+--- gnome-panel/gnome-panel/panel-logout.c (revision 10754)
++++ gnome-panel/gnome-panel/panel-logout.c (working copy)
+@@ -1,4 +1,5 @@
+-/*
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
++ *
+ * panel-logout.c:
+ *
+ * Copyright (C) 2006 Vincent Untz
+@@ -33,6 +34,7 @@
+ #include "panel-logout.h"
+ #include "panel-gdm.h"
+ #include "panel-power-manager.h"
++#include "panel-consolekit.h"
+ #include "panel-session.h"
+ #include "panel-icon-names.h"
+
+@@ -53,6 +55,7 @@ struct _PanelLogoutDialogPrivate {
+ PanelLogoutDialogType type;
+
+ PanelPowerManager *power_manager;
++ PanelConsolekit *consolekit;
+
+ int timeout;
+ unsigned int timeout_id;
+@@ -74,7 +77,7 @@ enum {
+ };
+ G_DEFINE_TYPE (PanelLogoutDialog, panel_logout, GTK_TYPE_MESSAGE_DIALOG);
+
+-static void
++static void
+ panel_logout_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+@@ -89,7 +92,7 @@ panel_logout_set_property (GObject
+ }
+ }
+
+-static void
++static void
+ panel_logout_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+@@ -142,6 +145,7 @@ panel_logout_init (PanelLogoutDialog *lo
+ gtk_window_stick (GTK_WINDOW (logout_dialog));
+
+ logout_dialog->priv->power_manager = panel_get_power_manager ();
++ logout_dialog->priv->consolekit = panel_get_consolekit ();
+
+ g_signal_connect (logout_dialog, "destroy",
+ G_CALLBACK (panel_logout_destroy), NULL);
+@@ -159,37 +163,91 @@ panel_logout_destroy (PanelLogoutDialog
+
+ g_object_unref (logout_dialog->priv->power_manager);
+ logout_dialog->priv->power_manager = NULL;
++ g_object_unref (logout_dialog->priv->consolekit);
++ logout_dialog->priv->consolekit = NULL;
+
+ current_dialog = NULL;
+ }
+
++static gboolean
++panel_logout_supports_reboot (PanelLogoutDialog *logout_dialog)
++{
++ gboolean ret;
++
++ ret = panel_consolekit_can_restart (logout_dialog->priv->consolekit);
++ if (! ret) {
++ ret = gdm_supports_logout_action (GDM_LOGOUT_ACTION_REBOOT);
++ }
++ return ret;
++}
++
++static gboolean
++panel_logout_supports_shutdown (PanelLogoutDialog *logout_dialog)
++{
++ gboolean ret;
++
++ ret = panel_consolekit_can_stop (logout_dialog->priv->consolekit);
++ if (! ret) {
++ ret = gdm_supports_logout_action (GDM_LOGOUT_ACTION_SHUTDOWN);
++ }
++ return ret;
++}
++
++static void
++do_request_logout (PanelConsolekit *consolekit)
++{
++ gdm_set_logout_action (GDM_LOGOUT_ACTION_NONE);
++ panel_session_request_logout ();
++}
++
++static void
++do_request_reboot (PanelConsolekit *consolekit)
++{
++ if (panel_consolekit_can_restart (consolekit)) {
++ panel_consolekit_attempt_restart (consolekit);
++ } else {
++ gdm_set_logout_action (GDM_LOGOUT_ACTION_REBOOT);
++ panel_session_request_logout ();
++ }
++}
++
++static void
++do_request_shutdown (PanelConsolekit *consolekit)
++{
++ if (panel_consolekit_can_stop (consolekit)) {
++ panel_consolekit_attempt_stop (consolekit);
++ } else {
++ gdm_set_logout_action (GDM_LOGOUT_ACTION_SHUTDOWN);
++ panel_session_request_logout ();
++ }
++}
++
+ static void
+ panel_logout_response (PanelLogoutDialog *logout_dialog,
+ guint response_id,
+ gpointer data)
+ {
+ PanelPowerManager *power_manager;
++ PanelConsolekit *consolekit;
+
+ power_manager = g_object_ref (logout_dialog->priv->power_manager);
++ consolekit = g_object_ref (logout_dialog->priv->consolekit);
+ gtk_widget_destroy (GTK_WIDGET (logout_dialog));
+
+ switch (response_id) {
+ case GTK_RESPONSE_CANCEL:
+ break;
+ case PANEL_LOGOUT_RESPONSE_LOGOUT:
+- gdm_set_logout_action (GDM_LOGOUT_ACTION_NONE);
+- panel_session_request_logout ();
++ do_request_logout (consolekit);
+ break;
+ case PANEL_LOGOUT_RESPONSE_SWITCH_USER:
+ gdm_new_login ();
+ break;
+ case PANEL_LOGOUT_RESPONSE_SHUTDOWN:
+- gdm_set_logout_action (GDM_LOGOUT_ACTION_SHUTDOWN);
+- panel_session_request_logout ();
++ do_request_shutdown (consolekit);
+ break;
+ case PANEL_LOGOUT_RESPONSE_REBOOT:
+- gdm_set_logout_action (GDM_LOGOUT_ACTION_REBOOT);
+- panel_session_request_logout ();
++ do_request_reboot (consolekit);
+ break;
+ case PANEL_LOGOUT_RESPONSE_STD:
+ if (panel_power_manager_can_hibernate (power_manager))
+@@ -206,6 +264,7 @@ panel_logout_response (PanelLogoutDialog
+ g_assert_not_reached ();
+ }
+ g_object_unref (power_manager);
++ g_object_unref (consolekit);
+ }
+
+ static gboolean
+@@ -357,7 +416,7 @@ panel_logout_new (PanelLogoutDialogType
+ _("_Hibernate"),
+ PANEL_LOGOUT_RESPONSE_STD);
+
+- if (gdm_supports_logout_action (GDM_LOGOUT_ACTION_REBOOT))
++ if (panel_logout_supports_reboot (logout_dialog))
+ gtk_dialog_add_button (GTK_DIALOG (logout_dialog),
+ _("_Restart"),
+ PANEL_LOGOUT_RESPONSE_REBOOT);
+@@ -366,7 +425,7 @@ panel_logout_new (PanelLogoutDialogType
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL);
+
+- if (gdm_supports_logout_action (GDM_LOGOUT_ACTION_SHUTDOWN))
++ if (panel_logout_supports_shutdown (logout_dialog))
+ gtk_dialog_add_button (GTK_DIALOG (logout_dialog),
+ _("_Shut Down"),
+ PANEL_LOGOUT_RESPONSE_SHUTDOWN);
+Index: gnome-panel/gnome-panel/panel-action-button.c
+===================================================================
+--- gnome-panel/gnome-panel/panel-action-button.c (revision 10754)
++++ gnome-panel/gnome-panel/panel-action-button.c (working copy)
+@@ -46,7 +46,6 @@
+ #include "panel-lockdown.h"
+ #include "panel-logout.h"
+ #include "panel-compatibility.h"
+-#include "panel-gdm.h"
+ #include "panel-icon-names.h"
+
+ G_DEFINE_TYPE (PanelActionButton, panel_action_button, BUTTON_TYPE_WIDGET);
+@@ -182,9 +181,7 @@ panel_action_shutdown (GtkWidget *widget
+ static gboolean
+ panel_action_shutdown_reboot_is_disabled (void)
+ {
+- return (panel_lockdown_get_disable_log_out() ||
+- (!gdm_supports_logout_action (GDM_LOGOUT_ACTION_SHUTDOWN) &&
+- !gdm_supports_logout_action (GDM_LOGOUT_ACTION_REBOOT)));
++ return (panel_lockdown_get_disable_log_out());
+ }
+
+ /* Run Application
+Index: gnome-panel/gnome-panel/Makefile.am
+===================================================================
+--- gnome-panel/gnome-panel/Makefile.am (revision 10754)
++++ gnome-panel/gnome-panel/Makefile.am (working copy)
+@@ -16,6 +16,7 @@ INCLUDES = \
+ $(STANDARD_PROPERTIES_CFLAGS) \
+ $(PANEL_CFLAGS) \
+ $(PANELCONFIG_CFLAGS) \
++ $(POLKIT_GNOME_CFLAGS) \
+ $(WARN_CFLAGS) \
+ $(NULL)
+
+@@ -98,6 +99,7 @@ panel_sources = \
+ panel-logout.c \
+ panel-gdm.c \
+ panel-power-manager.c \
++ panel-consolekit.c \
+ panel-ditem-editor.c \
+ $(NULL)
+
+@@ -147,6 +149,7 @@ panel_headers = \
+ panel-logout.h \
+ panel-gdm.h \
+ panel-power-manager.h \
++ panel-consolekit.h \
+ panel-ditem-editor.h \
+ panel-icon-names.h \
+ $(NULL)
+@@ -159,6 +162,7 @@ gnome_panel_SOURCES = \
+
+ gnome_panel_LDADD = \
+ $(PANEL_LIBS) \
++ $(POLKIT_GNOME_LIBS) \
+ $(X_LIBS)
+
+ gnome_panel_LDFLAGS = -export-dynamic
diff --git a/gnome-panel.spec b/gnome-panel.spec
index 70e966c..5947636 100644
--- a/gnome-panel.spec
+++ b/gnome-panel.spec
@@ -22,7 +22,7 @@
Summary: GNOME panel
Name: gnome-panel
Version: 2.21.5
-Release: 1%{?dist}
+Release: 2%{?dist}
URL: http://www.gnome.org
Source0: http://download.gnome.org/sources/gnome-panel/2.21/%{name}-%{version}.tar.bz2
@@ -115,6 +115,9 @@ Patch12: more-sharp-icons.patch
# fix problems with the intlclock integration in 2.21.5
Patch13: glue.patch
+# fix problems with the intlclock integration in 2.21.5
+Patch14: gnome-panel-2.21.5-ck-shutdown.patch
+
Conflicts: gnome-power-manager < 2.15.3
%description
@@ -162,6 +165,7 @@ Panel Applets using the libpanel-applet library.
%patch11 -p1 -b .applet-error
%patch12 -p1 -b .more-sharp-icons
%patch13 -p1 -b .glue
+%patch14 -p1 -b .ck-shutdown
. %{SOURCE6}
@@ -345,6 +349,9 @@ fi
%{_datadir}/gtk-doc/html/*
%changelog
+* Fri Jan 25 2008 Jon McCann <jmccann@redhat.com> - 2.21.5-2
+- Add ConsoleKit restart/shutdown support
+
* Wed Jan 16 2008 Matthias Clasen <mclasen@redhat.com> - 2.21.5-1
- Update to 2.21.5
- Drop separate intlclock