16966N/Adiff -uprN gnome-session-2.27.5/configure.in gnome-session-2.27.5-new/configure.in
16966N/A--- gnome-session-2.27.5/configure.in 2009-07-29 09:51:22.000000000 +0800
16966N/A+++ gnome-session-2.27.5-new/configure.in 2009-07-31 13:47:56.969379645 +0800
16966N/A@@ -62,7 +62,6 @@ PKG_CHECK_MODULES(GNOME_SESSION,
16966N/A gio-2.0 >= $GLIB_REQUIRED
16966N/A gtk+-2.0 >= $GTK_REQUIRED
16966N/A dbus-glib-1 >= $DBUS_GLIB_REQUIRED
16966N/A- devkit-power-gobject >= $DEVKIT_POWER_REQUIRED
16966N/A )
13859N/A
16966N/A PKG_CHECK_MODULES(SESSION_PROPERTIES,
16966N/Adiff -uprN gnome-session-2.27.5/gnome-session/Makefile.am gnome-session-2.27.5-new/gnome-session/Makefile.am
16966N/A--- gnome-session-2.27.5/gnome-session/Makefile.am 2009-07-29 09:51:22.000000000 +0800
16966N/A+++ gnome-session-2.27.5-new/gnome-session/Makefile.am 2009-07-31 13:47:56.974952168 +0800
16966N/A@@ -75,6 +76,8 @@ gnome_session_SOURCES = \
16966N/A gsm-logout-dialog.c \
16966N/A gsm-inhibit-dialog.h \
16966N/A gsm-inhibit-dialog.c \
16966N/A+ gsm-power-manager.h \
16966N/A+ gsm-power-manager.c \
16966N/A gs-idle-monitor.h \
16966N/A gs-idle-monitor.c \
16966N/A gsm-presence.h \
16966N/Adiff -uprN gnome-session-2.27.5/gnome-session/gsm-logout-dialog.c gnome-session-2.27.5-new/gnome-session/gsm-logout-dialog.c
16966N/A--- gnome-session-2.27.5/gnome-session/gsm-logout-dialog.c 2009-07-29 09:51:22.000000000 +0800
16966N/A+++ gnome-session-2.27.5-new/gnome-session/gsm-logout-dialog.c 2009-07-31 13:59:10.277503827 +0800
16966N/A@@ -24,11 +24,14 @@
16966N/A
16966N/A #include <config.h>
16966N/A
16966N/A+#include <pwd.h>
16966N/A+#include <auth_attr.h>
16966N/A+#include <secdb.h>
13859N/A #include <glib/gi18n.h>
13859N/A #include <gtk/gtk.h>
13859N/A+#include <gdk/gdkx.h>
13859N/A
16966N/A-#include <devkit-power-gobject/devicekit-power.h>
16966N/A-
16966N/A+#include "gsm-power-manager.h"
13859N/A #include "gsm-logout-dialog.h"
16966N/A #include "gsm-consolekit.h"
16966N/A #include "gdm.h"
16966N/A@@ -50,7 +53,6 @@ struct _GsmLogoutDialogPrivate
16966N/A {
16966N/A GsmDialogLogoutType type;
16966N/A
16966N/A- DkpClient *dkp_client;
16966N/A GsmConsolekit *consolekit;
16966N/A
16966N/A int timeout;
16966N/A@@ -142,8 +144,6 @@ gsm_logout_dialog_init (GsmLogoutDialog
16966N/A gtk_window_set_keep_above (GTK_WINDOW (logout_dialog), TRUE);
16966N/A gtk_window_stick (GTK_WINDOW (logout_dialog));
16966N/A
16966N/A- logout_dialog->priv->dkp_client = dkp_client_new ();
16966N/A-
16966N/A logout_dialog->priv->consolekit = gsm_get_consolekit ();
16966N/A
16966N/A g_signal_connect (logout_dialog,
16966N/A@@ -166,11 +166,6 @@ gsm_logout_dialog_destroy (GsmLogoutDial
16966N/A logout_dialog->priv->timeout_id = 0;
16966N/A }
16966N/A
16966N/A- if (logout_dialog->priv->dkp_client) {
16966N/A- g_object_unref (logout_dialog->priv->dkp_client);
16966N/A- logout_dialog->priv->dkp_client = NULL;
16966N/A- }
16966N/A-
16966N/A if (logout_dialog->priv->consolekit) {
16966N/A g_object_unref (logout_dialog->priv->consolekit);
16966N/A logout_dialog->priv->consolekit = NULL;
17682N/A@@ -182,20 +177,28 @@ gsm_logout_dialog_destroy (GsmLogoutDial
16966N/A static gboolean
16966N/A gsm_logout_supports_system_suspend (GsmLogoutDialog *logout_dialog)
16966N/A {
16966N/A- gboolean ret;
16966N/A- g_object_get (logout_dialog->priv->dkp_client,
16966N/A- "can-suspend", &ret,
16966N/A- NULL);
16966N/A- return ret;
16966N/A+ GsmPowerManager *power_manager;
16966N/A+ gboolean ret;
16966N/A+
16966N/A+ power_manager = gsm_get_power_manager ();
16966N/A+
16966N/A+ ret= gsm_power_manager_can_suspend (power_manager);
16966N/A+ g_object_unref (power_manager);
16966N/A+
16966N/A+ return ret;
16966N/A }
16966N/A
16966N/A static gboolean
16966N/A gsm_logout_supports_system_hibernate (GsmLogoutDialog *logout_dialog)
16966N/A {
16966N/A- gboolean ret;
16966N/A- g_object_get (logout_dialog->priv->dkp_client,
16966N/A- "can-hibernate", &ret,
16966N/A- NULL);
16966N/A+ GsmPowerManager *power_manager;
16966N/A+ gboolean ret;
16966N/A+
16966N/A+ power_manager = gsm_get_power_manager ();
16966N/A+
16966N/A+ ret= gsm_power_manager_can_hibernate (power_manager);
16966N/A+ g_object_unref (power_manager);
16966N/A+
16966N/A return ret;
13859N/A }
13859N/A
13859N/A static gboolean
17902N/Adiff -uprN gnome-session-2.27.5/gnome-session/gsm-power-manager.c gnome-session-2.27.5-new/gnome-session/gsm-power-manager.c
17902N/A--- gnome-session-2.27.5/gnome-session/gsm-power-manager.c 1970-01-01 08:00:00.000000000 +0800
17902N/A+++ gnome-session-2.27.5-new/gnome-session/gsm-power-manager.c 2009-07-31 13:47:56.972276386 +0800
17902N/A@@ -0,0 +1,573 @@
16966N/A+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
16966N/A+ *
16966N/A+ * power-manager.h: functions for powering down, restarting, and
16966N/A+ * suspending the computer
16966N/A+ * Copyright (C) 2006 Ray Strode <rstrode@redhat.com>
16966N/A+ *
16966N/A+ * This program is free software; you can redistribute it and/or modify
16966N/A+ * it under the terms of the GNU General Public License as published by
16966N/A+ * the Free Software Foundation; either version 2, or (at your option)
16966N/A+ * any later version.
16966N/A+ *
16966N/A+ * This program is distributed in the hope that it will be useful,
16966N/A+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16966N/A+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16966N/A+ * GNU General Public License for more details.
16966N/A+ *
16966N/A+ * You should have received a copy of the GNU General Public License
16966N/A+ * along with this program; if not, write to the Free Software
16966N/A+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
16966N/A+ * 02111-1307, USA.
16966N/A+ */
16966N/A+
16966N/A+#ifdef HAVE_CONFIG_H
16966N/A+#include "config.h"
16966N/A+#endif
16966N/A+
16966N/A+#include "gsm-power-manager.h"
16966N/A+
16966N/A+#include <errno.h>
16966N/A+#include <string.h>
16966N/A+
16966N/A+#include <glib.h>
16966N/A+#include <glib-object.h>
16966N/A+#include <glib/gi18n.h>
16966N/A+
16966N/A+#include <dbus/dbus-glib.h>
16966N/A+
16966N/A+struct _GsmPowerManagerPrivate
16966N/A+{
16966N/A+ DBusGConnection *dbus_connection;
16966N/A+ DBusGProxy *bus_proxy;
17902N/A+ DBusGProxy *gpm_proxy;
16966N/A+ guint32 is_connected : 1;
16966N/A+};
16966N/A+
16966N/A+static void gsm_power_manager_finalize (GObject *object);
16966N/A+
16966N/A+static void gsm_power_manager_class_install_signals (GsmPowerManagerClass *manager_class);
16966N/A+
16966N/A+static void gsm_power_manager_class_install_properties (GsmPowerManagerClass *manager_class);
16966N/A+
16966N/A+static void gsm_power_manager_get_property (GObject *object,
16966N/A+ guint prop_id,
16966N/A+ GValue *value,
16966N/A+ GParamSpec *pspec);
16966N/A+
16966N/A+static gboolean ensure_gpm_connection (GsmPowerManager *manager,
16966N/A+ GError **error);
16966N/A+
16966N/A+enum {
16966N/A+ PROP_0 = 0,
16966N/A+ PROP_IS_CONNECTED
16966N/A+};
16966N/A+
16966N/A+enum {
16966N/A+ REQUEST_FAILED = 0,
16966N/A+ LAST_SIGNAL
16966N/A+};
16966N/A+
16966N/A+static guint signals[LAST_SIGNAL];
16966N/A+
16966N/A+G_DEFINE_TYPE (GsmPowerManager, gsm_power_manager, G_TYPE_OBJECT);
16966N/A+
16966N/A+static void
16966N/A+gsm_power_manager_class_init (GsmPowerManagerClass *manager_class)
16966N/A+{
16966N/A+ GObjectClass *object_class;
16966N/A+
16966N/A+ object_class = G_OBJECT_CLASS (manager_class);
16966N/A+
16966N/A+ object_class->finalize = gsm_power_manager_finalize;
16966N/A+
16966N/A+ gsm_power_manager_class_install_properties (manager_class);
16966N/A+ gsm_power_manager_class_install_signals (manager_class);
16966N/A+
16966N/A+ g_type_class_add_private (manager_class,
16966N/A+ sizeof (GsmPowerManagerPrivate));
16966N/A+}
16966N/A+
16966N/A+static void
16966N/A+gsm_power_manager_class_install_signals (GsmPowerManagerClass *manager_class)
16966N/A+{
16966N/A+ GObjectClass *object_class;
16966N/A+
16966N/A+ object_class = G_OBJECT_CLASS (manager_class);
16966N/A+
16966N/A+ signals[REQUEST_FAILED] =
16966N/A+ g_signal_new ("request-failed",
16966N/A+ G_OBJECT_CLASS_TYPE (object_class),
16966N/A+ G_SIGNAL_RUN_LAST,
16966N/A+ G_STRUCT_OFFSET (GsmPowerManagerClass, request_failed),
16966N/A+ NULL,
16966N/A+ NULL,
16966N/A+ g_cclosure_marshal_VOID__POINTER,
16966N/A+ G_TYPE_NONE,
16966N/A+ 1, G_TYPE_POINTER);
16966N/A+
16966N/A+ manager_class->request_failed = NULL;
16966N/A+}
16966N/A+
16966N/A+static void
16966N/A+gsm_power_manager_class_install_properties (GsmPowerManagerClass *manager_class)
16966N/A+{
16966N/A+ GObjectClass *object_class;
16966N/A+ GParamSpec *param_spec;
16966N/A+
16966N/A+ object_class = G_OBJECT_CLASS (manager_class);
16966N/A+ object_class->get_property = gsm_power_manager_get_property;
16966N/A+
16966N/A+ param_spec = g_param_spec_boolean ("is-connected",
16966N/A+ "Is connected",
16966N/A+ "Whether the session is connected to "
16966N/A+ "the power manager",
16966N/A+ FALSE,
16966N/A+ G_PARAM_READABLE);
16966N/A+
16966N/A+ g_object_class_install_property (object_class, PROP_IS_CONNECTED,
16966N/A+ param_spec);
16966N/A+}
16966N/A+
16966N/A+static void
16966N/A+on_name_owner_changed (DBusGProxy *bus_proxy,
16966N/A+ const char *name,
16966N/A+ const char *prev_owner,
16966N/A+ const char *new_owner,
16966N/A+ GsmPowerManager *manager)
16966N/A+{
16966N/A+ if (strcmp (name, "org.freedesktop.PowerManagement") != 0) {
16966N/A+ return;
16966N/A+ }
16966N/A+
17902N/A+ if (manager->priv->gpm_proxy != NULL) {
17902N/A+ g_object_unref (manager->priv->gpm_proxy);
17902N/A+ manager->priv->gpm_proxy = NULL;
16966N/A+ }
16966N/A+
16966N/A+ ensure_gpm_connection (manager, NULL);
16966N/A+}
16966N/A+
16966N/A+static gboolean
16966N/A+ensure_gpm_connection (GsmPowerManager *manager,
16966N/A+ GError **error)
16966N/A+{
16966N/A+ GError *connection_error;
16966N/A+ gboolean is_connected;
16966N/A+
16966N/A+ connection_error = NULL;
16966N/A+ if (manager->priv->dbus_connection == NULL) {
17902N/A+ manager->priv->dbus_connection = dbus_g_bus_get (DBUS_BUS_SESSION,
16966N/A+ &connection_error);
16966N/A+
16966N/A+ if (manager->priv->dbus_connection == NULL) {
16966N/A+ g_propagate_error (error, connection_error);
16966N/A+ is_connected = FALSE;
16966N/A+ goto out;
16966N/A+ }
16966N/A+ }
16966N/A+
16966N/A+ if (manager->priv->bus_proxy == NULL) {
16966N/A+ manager->priv->bus_proxy =
16966N/A+ dbus_g_proxy_new_for_name_owner (manager->priv->dbus_connection,
16966N/A+ DBUS_SERVICE_DBUS,
16966N/A+ DBUS_PATH_DBUS,
16966N/A+ DBUS_INTERFACE_DBUS,
16966N/A+ &connection_error);
16966N/A+
16966N/A+ if (manager->priv->bus_proxy == NULL) {
16966N/A+ g_propagate_error (error, connection_error);
16966N/A+ is_connected = FALSE;
16966N/A+ goto out;
16966N/A+ }
16966N/A+
16966N/A+ dbus_g_proxy_add_signal (manager->priv->bus_proxy,
16966N/A+ "NameOwnerChanged",
16966N/A+ G_TYPE_STRING,
16966N/A+ G_TYPE_STRING,
16966N/A+ G_TYPE_STRING,
16966N/A+ G_TYPE_INVALID);
16966N/A+
16966N/A+ dbus_g_proxy_connect_signal (manager->priv->bus_proxy,
16966N/A+ "NameOwnerChanged",
16966N/A+ G_CALLBACK (on_name_owner_changed),
16966N/A+ manager, NULL);
16966N/A+ }
16966N/A+
17902N/A+ if (manager->priv->gpm_proxy == NULL) {
17902N/A+ manager->priv->gpm_proxy =
16966N/A+ dbus_g_proxy_new_for_name_owner (
16966N/A+ manager->priv->dbus_connection,
17902N/A+ "org.freedesktop.PowerManagement",
17902N/A+ "/org/freedesktop/PowerManagement",
17902N/A+ "org.freedesktop.PowerManagement",
16966N/A+ &connection_error);
16966N/A+
17902N/A+ if (manager->priv->gpm_proxy == NULL) {
16966N/A+ g_propagate_error (error, connection_error);
16966N/A+ is_connected = FALSE;
16966N/A+ goto out;
16966N/A+ }
16966N/A+ }
16966N/A+
16966N/A+ is_connected = TRUE;
16966N/A+
16966N/A+ out:
16966N/A+ if (manager->priv->is_connected != is_connected) {
16966N/A+ manager->priv->is_connected = is_connected;
16966N/A+ g_object_notify (G_OBJECT (manager), "is-connected");
16966N/A+ }
16966N/A+
16966N/A+ if (!is_connected) {
16966N/A+ if (manager->priv->dbus_connection == NULL) {
16966N/A+ if (manager->priv->bus_proxy != NULL) {
16966N/A+ g_object_unref (manager->priv->bus_proxy);
16966N/A+ manager->priv->bus_proxy = NULL;
16966N/A+ }
16966N/A+
17902N/A+ if (manager->priv->gpm_proxy != NULL) {
17902N/A+ g_object_unref (manager->priv->gpm_proxy);
17902N/A+ manager->priv->gpm_proxy = NULL;
16966N/A+ }
16966N/A+ } else if (manager->priv->bus_proxy == NULL) {
17902N/A+ if (manager->priv->gpm_proxy != NULL) {
17902N/A+ g_object_unref (manager->priv->gpm_proxy);
17902N/A+ manager->priv->gpm_proxy = NULL;
16966N/A+ }
16966N/A+ }
16966N/A+ }
16966N/A+
16966N/A+ return is_connected;
16966N/A+}
16966N/A+
16966N/A+static void
16966N/A+gsm_power_manager_init (GsmPowerManager *manager)
16966N/A+{
16966N/A+ GError *error;
16966N/A+
16966N/A+ manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager,
16966N/A+ GSM_TYPE_POWER_MANAGER,
16966N/A+ GsmPowerManagerPrivate);
16966N/A+
16966N/A+ manager->priv->dbus_connection = NULL;
16966N/A+ manager->priv->bus_proxy = NULL;
17902N/A+ manager->priv->gpm_proxy = NULL;
16966N/A+ manager->priv->is_connected = FALSE;
16966N/A+
16966N/A+ error = NULL;
16966N/A+
16966N/A+ if (!ensure_gpm_connection (manager, &error)) {
16966N/A+ g_message ("Could not connect to power manager: %s",
16966N/A+ error->message);
16966N/A+ g_error_free (error);
16966N/A+ }
16966N/A+}
16966N/A+
16966N/A+static void
16966N/A+gsm_power_manager_finalize (GObject *object)
16966N/A+{
16966N/A+ GsmPowerManager *manager;
16966N/A+ GObjectClass *parent_class;
16966N/A+
16966N/A+ manager = GSM_POWER_MANAGER (object);
16966N/A+
16966N/A+ parent_class = G_OBJECT_CLASS (gsm_power_manager_parent_class);
16966N/A+
16966N/A+ if (parent_class->finalize != NULL) {
16966N/A+ parent_class->finalize (object);
16966N/A+ }
16966N/A+}
16966N/A+
16966N/A+static void
16966N/A+gsm_power_manager_get_property (GObject *object,
16966N/A+ guint prop_id,
16966N/A+ GValue *value,
16966N/A+ GParamSpec *pspec)
16966N/A+{
16966N/A+ GsmPowerManager *manager = GSM_POWER_MANAGER (object);
16966N/A+
16966N/A+ switch (prop_id) {
16966N/A+ case PROP_IS_CONNECTED:
16966N/A+ g_value_set_boolean (value,
16966N/A+ manager->priv->is_connected);
16966N/A+ break;
16966N/A+
16966N/A+ default:
16966N/A+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
16966N/A+ prop_id,
16966N/A+ pspec);
16966N/A+ }
16966N/A+}
16966N/A+
16966N/A+GQuark
16966N/A+gsm_power_manager_error_quark (void)
16966N/A+{
16966N/A+ static GQuark error_quark = 0;
16966N/A+
16966N/A+ if (error_quark == 0)
16966N/A+ error_quark = g_quark_from_static_string ("gsm-power-manager-error");
16966N/A+
16966N/A+ return error_quark;
16966N/A+}
16966N/A+
16966N/A+GsmPowerManager *
16966N/A+gsm_power_manager_new (void)
16966N/A+{
16966N/A+ GsmPowerManager *manager;
16966N/A+
16966N/A+ manager = g_object_new (GSM_TYPE_POWER_MANAGER, NULL);
16966N/A+
16966N/A+ return manager;
16966N/A+}
16966N/A+
16966N/A+gboolean
16966N/A+gsm_power_manager_can_suspend (GsmPowerManager *manager)
16966N/A+{
16966N/A+ GError *error;
16966N/A+ gboolean can_suspend;
16966N/A+
16966N/A+ error = NULL;
16966N/A+
16966N/A+ if (!ensure_gpm_connection (manager, &error)) {
16966N/A+ g_message ("Could not connect to power manager: %s",
16966N/A+ error->message);
16966N/A+
16966N/A+ g_error_free (error);
16966N/A+
16966N/A+ return FALSE;
16966N/A+ }
16966N/A+
16966N/A+ can_suspend = FALSE;
16966N/A+
17902N/A+ if (!dbus_g_proxy_call (manager->priv->gpm_proxy, "CanSuspend",
16966N/A+ &error,
17902N/A+ G_TYPE_INVALID,
16966N/A+ G_TYPE_BOOLEAN, &can_suspend, G_TYPE_INVALID)) {
16966N/A+ if (error != NULL) {
16966N/A+ g_message ("Could not ask power manager if user can suspend: %s",
16966N/A+ error->message);
16966N/A+
16966N/A+ g_error_free (error);
16966N/A+ }
16966N/A+
16966N/A+ can_suspend = FALSE;
16966N/A+ }
16966N/A+
16966N/A+ return can_suspend;
16966N/A+}
16966N/A+
16966N/A+gboolean
16966N/A+gsm_power_manager_can_hibernate (GsmPowerManager *manager)
16966N/A+{
16966N/A+ GError *error;
16966N/A+ gboolean can_hibernate;
16966N/A+
16966N/A+ error = NULL;
16966N/A+
16966N/A+ if (!ensure_gpm_connection (manager, &error)) {
16966N/A+ g_message ("Could not connect to power manager: %s",
16966N/A+ error->message);
16966N/A+
16966N/A+ g_error_free (error);
16966N/A+
16966N/A+ return FALSE;
16966N/A+ }
16966N/A+
16966N/A+ can_hibernate = FALSE;
16966N/A+
17902N/A+ if (!dbus_g_proxy_call (manager->priv->gpm_proxy, "CanHibernate",
16966N/A+ &error,
17902N/A+ G_TYPE_INVALID,
16966N/A+ G_TYPE_BOOLEAN, &can_hibernate, G_TYPE_INVALID)) {
16966N/A+ if (error != NULL) {
16966N/A+ g_message ("Could not ask power manager if user can suspend: %s",
16966N/A+ error->message);
16966N/A+
16966N/A+ g_error_free (error);
16966N/A+ }
16966N/A+
16966N/A+ can_hibernate = FALSE;
16966N/A+ }
16966N/A+
16966N/A+ return can_hibernate;
16966N/A+}
16966N/A+
16911N/A+#include <pwd.h>
16911N/A+
16911N/A+gboolean
16911N/A+gsm_power_manager_can_reboot (GsmPowerManager *manager)
16911N/A+{
16966N/A+ uid_t uid;
16966N/A+ struct passwd *pw;
16911N/A+
16966N/A+ uid = getuid ();
16966N/A+ if ((pw = getpwuid (uid)) != NULL) {
16966N/A+ return (gboolean)chkauthattr ("solaris.system.shutdown", pw->pw_name);
16966N/A+ }
16911N/A+
16966N/A+ return FALSE;
16911N/A+}
16911N/A+
16911N/A+gboolean
16911N/A+gsm_power_manager_can_shutdown (GsmPowerManager *manager)
16911N/A+{
16966N/A+ return gsm_power_manager_can_reboot (manager);
16911N/A+}
16911N/A+
16911N/A+void
16966N/A+gsm_power_manager_attempt_suspend (GsmPowerManager *manager)
16966N/A+{
16966N/A+ GError *error;
16966N/A+
16966N/A+ error = NULL;
16966N/A+
16966N/A+ if (!ensure_gpm_connection (manager, &error)) {
16966N/A+ g_warning ("Could not connect to power manager: %s",
16966N/A+ error->message);
16966N/A+ g_error_free (error);
16966N/A+ return;
16966N/A+ }
16966N/A+
17902N/A+ if (!dbus_g_proxy_call (manager->priv->gpm_proxy, "Suspend",
17902N/A+ &error,
17902N/A+ G_TYPE_INVALID, G_TYPE_INVALID) &&
17902N/A+ error != NULL) {
16966N/A+ GError *call_error;
16966N/A+
16966N/A+ g_warning ("Could not ask power manager to suspend: %s",
16966N/A+ error->message);
16966N/A+
16966N/A+ call_error = g_error_new_literal (GSM_POWER_MANAGER_ERROR,
16966N/A+ GSM_POWER_MANAGER_ERROR_SUSPENDING,
16966N/A+ error->message);
16966N/A+
16966N/A+ g_error_free (error);
16966N/A+
16966N/A+ g_signal_emit (G_OBJECT (manager),
16966N/A+ signals[REQUEST_FAILED],
16966N/A+ 0, call_error);
16966N/A+
16966N/A+ g_error_free (call_error);
16966N/A+ }
16966N/A+}
16966N/A+
16966N/A+void
16966N/A+gsm_power_manager_attempt_hibernate (GsmPowerManager *manager)
16911N/A+{
16911N/A+ GError *error;
16911N/A+
16911N/A+ error = NULL;
16911N/A+ if (!ensure_gpm_connection (manager, &error)) {
16911N/A+ g_warning ("Could not connect to power manager: %s",
16911N/A+ error->message);
16911N/A+
16911N/A+ g_error_free (error);
16911N/A+
16911N/A+ return;
16911N/A+ }
16911N/A+
17902N/A+ if (!dbus_g_proxy_call (manager->priv->gpm_proxy, "Hibernate",
17902N/A+ &error,
17902N/A+ G_TYPE_INVALID, G_TYPE_INVALID) &&
17902N/A+ error != NULL) {
16911N/A+ GError *call_error;
16911N/A+
16966N/A+ g_warning ("Could not ask power manager to hibernate: %s",
16911N/A+ error->message);
16911N/A+
16911N/A+ call_error = g_error_new_literal (GSM_POWER_MANAGER_ERROR,
16966N/A+ GSM_POWER_MANAGER_ERROR_HIBERNATING,
16911N/A+ error->message);
16911N/A+
16911N/A+ g_error_free (error);
16911N/A+
16911N/A+ g_signal_emit (G_OBJECT (manager),
16911N/A+ signals[REQUEST_FAILED],
16911N/A+ 0, call_error);
16911N/A+
16911N/A+ g_error_free (call_error);
16911N/A+ }
16911N/A+}
16911N/A+
16911N/A+void
16966N/A+gsm_power_manager_attempt_reboot (GsmPowerManager *manager)
16966N/A+{
16966N/A+ GError *error;
16966N/A+
16966N/A+ error = NULL;
16966N/A+ if (!ensure_gpm_connection (manager, &error)) {
16966N/A+ g_warning ("Could not connect to power manager: %s",
16966N/A+ error->message);
16966N/A+
16966N/A+ g_error_free (error);
16966N/A+
16966N/A+ return;
16966N/A+ }
16966N/A+
17902N/A+ if (!dbus_g_proxy_call (manager->priv->gpm_proxy, "Reboot", &error,
17902N/A+ G_TYPE_INVALID, G_TYPE_INVALID) && error != NULL) {
16966N/A+ GError *call_error;
16966N/A+
16966N/A+ g_warning ("Could not ask power manager to reboot: %s",
16966N/A+ error->message);
16966N/A+
16966N/A+ call_error = g_error_new_literal (GSM_POWER_MANAGER_ERROR,
16966N/A+ GSM_POWER_MANAGER_ERROR_REBOOTING,
16966N/A+ error->message);
16966N/A+
16966N/A+ g_error_free (error);
16966N/A+
16966N/A+ g_signal_emit (G_OBJECT (manager),
16966N/A+ signals[REQUEST_FAILED],
16966N/A+ 0, call_error);
16966N/A+
16966N/A+ g_error_free (call_error);
16966N/A+ }
16966N/A+}
16966N/A+
16966N/A+void
16911N/A+gsm_power_manager_attempt_shutdown (GsmPowerManager *manager)
16911N/A+{
16966N/A+ GError *error;
16966N/A+
16966N/A+ error = NULL;
16966N/A+ if (!ensure_gpm_connection (manager, &error)) {
16966N/A+ g_warning ("Could not connect to power manager: %s",
16966N/A+ error->message);
16966N/A+
16966N/A+ g_error_free (error);
16966N/A+
16966N/A+ return;
16966N/A+ }
16966N/A+
17902N/A+ if (!dbus_g_proxy_call (manager->priv->gpm_proxy, "Shutdown", &error,
17902N/A+ G_TYPE_INVALID, G_TYPE_INVALID) && error != NULL) {
16966N/A+ GError *call_error;
16966N/A+
16966N/A+ g_warning ("Could not ask power manager to shutdown: %s",
16966N/A+ error->message);
16911N/A+
16966N/A+ call_error = g_error_new_literal (GSM_POWER_MANAGER_ERROR,
16966N/A+ GSM_POWER_MANAGER_ERROR_SHUTDOWNING,
16966N/A+ error->message);
16966N/A+
16966N/A+ g_error_free (error);
16966N/A+
16966N/A+ g_signal_emit (G_OBJECT (manager),
16966N/A+ signals[REQUEST_FAILED],
16966N/A+ 0, call_error);
16911N/A+
16966N/A+ g_error_free (call_error);
16966N/A+ }
16966N/A+}
16911N/A+
16966N/A+GsmPowerManager *
16966N/A+gsm_get_power_manager (void)
16966N/A+{
16966N/A+ static GsmPowerManager *manager = NULL;
16966N/A+
16966N/A+ if (manager == NULL) {
16966N/A+ manager = gsm_power_manager_new ();
16911N/A+ }
16911N/A+
16966N/A+ return g_object_ref (manager);
16966N/A+}
16966N/Adiff -uprN gnome-session-2.27.5/gnome-session/gsm-power-manager.h gnome-session-2.27.5-new/gnome-session/gsm-power-manager.h
16966N/A--- gnome-session-2.27.5/gnome-session/gsm-power-manager.h 1970-01-01 08:00:00.000000000 +0800
16966N/A+++ gnome-session-2.27.5-new/gnome-session/gsm-power-manager.h 2009-07-31 13:47:56.972479714 +0800
16966N/A@@ -0,0 +1,93 @@
16966N/A+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
16966N/A+ *
16966N/A+ * power-manager.h: functions for powering down, restarting, and
16966N/A+ * suspending the computer
16966N/A+ * Copyright (C) 2006 Ray Strode <rstrode@redhat.com>
16966N/A+ *
16966N/A+ * This program is free software; you can redistribute it and/or modify
16966N/A+ * it under the terms of the GNU General Public License as published by
16966N/A+ * the Free Software Foundation; either version 2, or (at your option)
16966N/A+ * any later version.
16966N/A+ *
16966N/A+ * This program is distributed in the hope that it will be useful,
16966N/A+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16966N/A+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16966N/A+ * GNU General Public License for more details.
16966N/A+ *
16966N/A+ * You should have received a copy of the GNU General Public License
16966N/A+ * along with this program; if not, write to the Free Software
16966N/A+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
16966N/A+ * 02111-1307, USA.
16966N/A+ */
16911N/A+
16966N/A+#ifndef __GSM_POWER_MANAGER_H__
16966N/A+#define __GSM_POWER_MANAGER_H__
16911N/A+
16966N/A+#include <glib.h>
16966N/A+#include <glib-object.h>
16911N/A+
16966N/A+G_BEGIN_DECLS
16966N/A+
16966N/A+#define GSM_TYPE_POWER_MANAGER (gsm_power_manager_get_type ())
16966N/A+#define GSM_POWER_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSM_TYPE_POWER_MANAGER, GsmPowerManager))
16966N/A+#define GSM_POWER_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSM_TYPE_POWER_MANAGER, GsmPowerManagerClass))
16966N/A+#define GSM_IS_POWER_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSM_TYPE_POWER_MANAGER))
16966N/A+#define GSM_IS_POWER_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSM_TYPE_POWER_MANAGER))
16966N/A+#define GSM_POWER_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GSM_TYPE_POWER_MANAGER, GsmPowerManagerClass))
16966N/A+#define GSM_POWER_MANAGER_ERROR (gsm_power_manager_error_quark ())
16966N/A+
16966N/A+typedef struct _GsmPowerManager GsmPowerManager;
16966N/A+typedef struct _GsmPowerManagerClass GsmPowerManagerClass;
16966N/A+typedef struct _GsmPowerManagerPrivate GsmPowerManagerPrivate;
16966N/A+typedef enum _GsmPowerManagerError GsmPowerManagerError;
16911N/A+
16966N/A+struct _GsmPowerManager
16966N/A+{
16966N/A+ GObject parent;
16966N/A+
16966N/A+ GsmPowerManagerPrivate *priv;
16966N/A+};
16966N/A+
16966N/A+struct _GsmPowerManagerClass
16966N/A+{
16966N/A+ GObjectClass parent_class;
16966N/A+
16966N/A+ void (* request_failed) (GsmPowerManager *manager,
16966N/A+ GError *error);
16966N/A+};
16966N/A+
16966N/A+enum _GsmPowerManagerError
16966N/A+{
16966N/A+ GSM_POWER_MANAGER_ERROR_SUSPENDING = 0,
16911N/A+ GSM_POWER_MANAGER_ERROR_REBOOTING,
16911N/A+ GSM_POWER_MANAGER_ERROR_SHUTDOWNING,
16966N/A+ GSM_POWER_MANAGER_ERROR_HIBERNATING
16966N/A+};
16966N/A+
16966N/A+GType gsm_power_manager_get_type (void) G_GNUC_CONST;
16966N/A+
16966N/A+GQuark gsm_power_manager_error_quark (void);
16966N/A+
16966N/A+GsmPowerManager *gsm_power_manager_new (void) G_GNUC_MALLOC;
16966N/A+
16966N/A+GsmPowerManager *gsm_get_power_manager (void);
16966N/A+
16966N/A+gboolean gsm_power_manager_can_suspend (GsmPowerManager *manager);
16966N/A+
16966N/A+gboolean gsm_power_manager_can_hibernate (GsmPowerManager *manager);
16966N/A+
16911N/A+gboolean gsm_power_manager_can_shutdown (GsmPowerManager *manager);
16966N/A+
16911N/A+gboolean gsm_power_manager_can_reboot (GsmPowerManager *manager);
16966N/A+
16966N/A+void gsm_power_manager_attempt_suspend (GsmPowerManager *manager);
16966N/A+
16966N/A+void gsm_power_manager_attempt_hibernate (GsmPowerManager *manager);
16966N/A+
16911N/A+void gsm_power_manager_attempt_shutdown (GsmPowerManager *manager);
16911N/A+
16911N/A+void gsm_power_manager_attempt_reboot (GsmPowerManager *manager);
16911N/A+
16966N/A+G_END_DECLS
16966N/A+
16966N/A+#endif /* __GSM_POWER_MANAGER_H__ */
17394N/A--- gnome-session-2.28.0/gnome-session/gsm-manager.c.ori 2009-09-24 07:49:08.707481415 +0100
17394N/A+++ gnome-session-2.28.0/gnome-session/gsm-manager.c 2009-09-24 08:11:00.235106050 +0100
17394N/A@@ -38,8 +38,6 @@
17394N/A #include <dbus/dbus-glib.h>
17394N/A #include <dbus/dbus-glib-lowlevel.h>
17394N/A
17394N/A-#include <devkit-power-gobject/devicekit-power.h>
17394N/A-
17394N/A #include <gtk/gtk.h> /* for logout dialog */
17394N/A #include <gconf/gconf-client.h>
17394N/A
17394N/A@@ -61,6 +59,7 @@
17394N/A #include "gsm-inhibit-dialog.h"
17394N/A #include "gsm-consolekit.h"
17394N/A #include "gsm-session-save.h"
17394N/A+#include "gsm-power-manager.h"
17394N/A
17394N/A #define GSM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_MANAGER, GsmManagerPrivate))
17394N/A
17394N/A@@ -133,9 +132,6 @@
17394N/A
17394N/A DBusGProxy *bus_proxy;
17394N/A DBusGConnection *connection;
17394N/A-
17394N/A- /* Interface with other parts of the system */
17394N/A- DkpClient *dkp_client;
17394N/A };
17394N/A
17394N/A enum {
17394N/A@@ -987,53 +983,27 @@
17394N/A static void
17394N/A manager_attempt_hibernate (GsmManager *manager)
17394N/A {
17394N/A- gboolean can_hibernate;
17394N/A- GError *error;
17394N/A- gboolean ret;
17394N/A+ GsmPowerManager *power_manager;
17394N/A
17394N/A- g_object_get (manager->priv->dkp_client,
17394N/A- "can-hibernate", &can_hibernate,
17394N/A- NULL);
17394N/A-
17394N/A- if (can_hibernate) {
17394N/A-
17394N/A- /* lock the screen before we suspend */
17394N/A- manager_perhaps_lock (manager);
17394N/A-
17394N/A- error = NULL;
17394N/A- ret = dkp_client_hibernate (manager->priv->dkp_client, &error);
17394N/A- if (!ret) {
17394N/A- g_warning ("Unexpected hibernate failure: %s",
17394N/A- error->message);
17394N/A- g_error_free (error);
17394N/A- }
17394N/A+ power_manager = gsm_get_power_manager ();
17394N/A+ if (gsm_power_manager_can_hibernate (power_manager)) {
17394N/A+ gsm_power_manager_attempt_hibernate (power_manager);
17394N/A }
17394N/A+
17394N/A+ g_object_unref (power_manager);
17394N/A }
17394N/A
17394N/A static void
17394N/A manager_attempt_suspend (GsmManager *manager)
17394N/A {
17394N/A- gboolean can_suspend;
17394N/A- GError *error;
17394N/A- gboolean ret;
17394N/A+ GsmPowerManager *power_manager;
17394N/A
17394N/A- g_object_get (manager->priv->dkp_client,
17394N/A- "can-suspend", &can_suspend,
17394N/A- NULL);
17394N/A-
17394N/A- if (can_suspend) {
17394N/A-
17394N/A- /* lock the screen before we suspend */
17394N/A- manager_perhaps_lock (manager);
17394N/A-
17394N/A- error = NULL;
17394N/A- ret = dkp_client_suspend (manager->priv->dkp_client, &error);
17394N/A- if (!ret) {
17394N/A- g_warning ("Unexpected suspend failure: %s",
17394N/A- error->message);
17394N/A- g_error_free (error);
17394N/A- }
17394N/A+ power_manager = gsm_get_power_manager ();
17394N/A+ if (gsm_power_manager_can_suspend (power_manager)) {
17394N/A+ gsm_power_manager_attempt_suspend (power_manager);
17394N/A }
17394N/A+
17394N/A+ g_object_unref (power_manager);
17394N/A }
17394N/A
17394N/A static void
17394N/A@@ -2216,11 +2186,6 @@
17394N/A manager->priv->gconf_client = NULL;
17394N/A }
17394N/A
17394N/A- if (manager->priv->dkp_client != NULL) {
17394N/A- g_object_unref (manager->priv->dkp_client);
17394N/A- manager->priv->dkp_client = NULL;
17394N/A- }
17394N/A-
17394N/A G_OBJECT_CLASS (gsm_manager_parent_class)->dispose (object);
17394N/A }
17394N/A
17394N/A@@ -2449,8 +2414,6 @@
17394N/A G_CALLBACK (on_presence_status_changed),
17394N/A manager);
17394N/A
17394N/A- manager->priv->dkp_client = dkp_client_new ();
17394N/A-
17394N/A /* GConf setup */
17394N/A gconf_client_add_dir (manager->priv->gconf_client,
17394N/A KEY_DESKTOP_DIR,
17682N/A@@ -2970,13 +2881,6 @@
17394N/A GError **error)
17394N/A {
17394N/A GsmConsolekit *consolekit;
17394N/A- gboolean can_suspend;
17394N/A- gboolean can_hibernate;
17394N/A-
17394N/A- g_object_get (manager->priv->dkp_client,
17394N/A- "can-suspend", &can_suspend,
17394N/A- "can-hibernate", &can_hibernate,
17394N/A- NULL);
17394N/A
17394N/A g_debug ("GsmManager: CanShutdown called");
17394N/A
17682N/A@@ -2958,9 +2953,7 @@ gsm_manager_can_shutdown (GsmManager *ma
17394N/A
17394N/A consolekit = gsm_get_consolekit ();
17394N/A *shutdown_available = gsm_consolekit_can_stop (consolekit)
17682N/A- || gsm_consolekit_can_restart (consolekit)
17394N/A- || can_suspend
17394N/A- || can_hibernate;
17682N/A+ || gsm_consolekit_can_restart (consolekit);
17394N/A g_object_unref (consolekit);
17394N/A
17394N/A return TRUE;