From ef62569f2c1c796cca44c2299f2a0aecd7488f8f Mon Sep 17 00:00:00 2001 From: William Jon McCann Date: Jan 25 2008 20:35:06 +0000 Subject: - Add ConsoleKit restart/shutdown support --- 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 ++ * ++ * 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 ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++ ++#ifdef HAVE_POLKIT ++#include ++#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 ++ * ++ * 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 ++ */ ++ ++#ifndef PANEL_CONSOLEKIT_H ++#define PANEL_CONSOLEKIT_H ++ ++#include ++#include ++ ++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 - 2.21.5-2 +- Add ConsoleKit restart/shutdown support + * Wed Jan 16 2008 Matthias Clasen - 2.21.5-1 - Update to 2.21.5 - Drop separate intlclock