[Xfce4-commits] <xfce4-power-manager:devkit-power> Re-add hibernate/Suspend functionality via devicekit power and make sure that xfpm is not inhibited in case of no urgent sleep request.
Ali Abdallah
noreply at xfce.org
Thu Nov 5 10:08:01 CET 2009
Updating branch refs/heads/devkit-power
to 44f74bccaf9cedbf1e245d372152055f487e52ad (commit)
from c4bab4c1be603614ace33b914d155c12223e762e (commit)
commit 44f74bccaf9cedbf1e245d372152055f487e52ad
Author: Ali Abdallah <ali at ali-xfce.org>
Date: Wed Nov 4 09:26:41 2009 +0100
Re-add hibernate/Suspend functionality via devicekit power and make
sure that xfpm is not inhibited in case of no urgent sleep request.
src/xfpm-dkp.c | 101 ++++++++++++++++++++++++++++++++++++--------
src/xfpm-dkp.h | 10 ++++-
src/xfpm-manager.c | 87 +++++++++++++++++++++++++------------
src/xfpm-network-manager.c | 2 +
src/xfpm-xfconf.c | 2 +-
5 files changed, 153 insertions(+), 49 deletions(-)
diff --git a/src/xfpm-dkp.c b/src/xfpm-dkp.c
index 9d150e7..1a7a0b5 100644
--- a/src/xfpm-dkp.c
+++ b/src/xfpm-dkp.c
@@ -35,11 +35,14 @@
#include "xfpm-dkp.h"
#include "xfpm-dbus.h"
#include "xfpm-battery.h"
+#include "xfpm-xfconf.h"
#include "xfpm-notify.h"
#include "xfpm-inhibit.h"
#include "xfpm-polkit.h"
+#include "xfpm-network-manager.h"
#include "xfpm-icons.h"
#include "xfpm-common.h"
+#include "xfpm-config.h"
static void xfpm_dkp_finalize (GObject *object);
@@ -69,6 +72,7 @@ struct XfpmDkpPrivate
GHashTable *hash;
XfpmInhibit *inhibit;
+ XfpmXfconf *conf;
gboolean inhibited;
XfpmNotify *notify;
@@ -103,6 +107,8 @@ enum
ON_BATTERY_CHANGED,
LOW_BATTERY_CHANGED,
LID_CHANGED,
+ WAKING_UP,
+ SLEEPING,
LAST_SIGNAL
};
@@ -299,9 +305,38 @@ xfpm_dkp_report_error (XfpmDkp *dkp, const gchar *error, const gchar *icon_name)
}
static void
-xfpm_dkp_sleep (XfpmDkp *dkp, const gchar *sleep)
+xfpm_dkp_sleep (XfpmDkp *dkp, const gchar *sleep, gboolean force)
{
GError *error = NULL;
+ gboolean lock_screen;
+
+ if ( dkp->priv->inhibited && force == FALSE)
+ {
+ gboolean ret;
+
+ ret = xfce_dialog_confirm (NULL,
+ GTK_STOCK_YES,
+ "Yes",
+ _("An application is currently disabling the automatic sleep,"
+ " doing this action now may damage the working state of this application,"
+ " are you sure you want to hibernate the system?"),
+ NULL);
+
+ if ( !ret )
+ return;
+ }
+
+ xfpm_send_message_to_network_manager ("sleep");
+
+ g_object_get (G_OBJECT (dkp->priv->conf),
+ LOCK_SCREEN_ON_SLEEP, &lock_screen,
+ NULL);
+
+ if ( lock_screen )
+ {
+ g_usleep (2000000); /* 2 seconds */
+ xfpm_lock_screen ();
+ }
dbus_g_proxy_call (dkp->priv->proxy, sleep, &error,
G_TYPE_INVALID,
@@ -309,28 +344,37 @@ xfpm_dkp_sleep (XfpmDkp *dkp, const gchar *sleep)
if ( error )
{
- const gchar *icon_name;
- if ( !g_strcmp0 (sleep, "Hibernate") )
- icon_name = XFPM_HIBERNATE_ICON;
+ if ( g_error_matches (error, DBUS_GERROR, DBUS_GERROR_NO_REPLY) )
+ {
+ g_debug ("D-Bus time out, but should be harmless");
+ }
else
- icon_name = XFPM_SUSPEND_ICON;
+ {
+ const gchar *icon_name;
+ if ( !g_strcmp0 (sleep, "Hibernate") )
+ icon_name = XFPM_HIBERNATE_ICON;
+ else
+ icon_name = XFPM_SUSPEND_ICON;
- xfpm_dkp_report_error (dkp, error->message, icon_name);
- g_error_free (error);
+ xfpm_dkp_report_error (dkp, error->message, icon_name);
+ g_error_free (error);
+ }
}
+
+ g_signal_emit (G_OBJECT (dkp), signals [WAKING_UP], 0);
+ xfpm_send_message_to_network_manager ("wake");
}
static void
-xfpm_dkp_hibernate_cb (XfpmDkp *dkp, GtkStatusIcon *icon)
+xfpm_dkp_hibernate_cb (GtkStatusIcon *icon, XfpmDkp *dkp)
{
- xfpm_dkp_sleep (dkp, "Hibernate");
+ xfpm_dkp_sleep (dkp, "Hibernate", FALSE);
}
static void
-xfpm_dkp_suspend_cb (XfpmDkp *dkp, GtkStatusIcon *icon)
+xfpm_dkp_suspend_cb (GtkStatusIcon *icon, XfpmDkp *dkp)
{
- xfpm_dkp_sleep (dkp, "Suspend");
-
+ xfpm_dkp_sleep (dkp, "Suspend", FALSE);
}
static void
@@ -376,8 +420,8 @@ xfpm_dkp_show_tray_menu (XfpmDkp *dkp,
if ( dkp->priv->can_hibernate && dkp->priv->auth_hibernate)
{
gtk_widget_set_sensitive (mi, TRUE);
- g_signal_connect(G_OBJECT (mi), "activate",
- G_CALLBACK (xfpm_dkp_hibernate_cb), icon);
+ g_signal_connect (G_OBJECT (mi), "activate",
+ G_CALLBACK (xfpm_dkp_hibernate_cb), dkp);
}
gtk_widget_show (mi);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
@@ -393,7 +437,7 @@ xfpm_dkp_show_tray_menu (XfpmDkp *dkp,
{
gtk_widget_set_sensitive (mi, TRUE);
g_signal_connect (mi, "activate",
- G_CALLBACK (xfpm_dkp_suspend_cb), icon);
+ G_CALLBACK (xfpm_dkp_suspend_cb), dkp);
}
gtk_widget_show (mi);
@@ -673,6 +717,24 @@ xfpm_dkp_class_init (XfpmDkpClass *klass)
g_cclosure_marshal_VOID__BOOLEAN,
G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+ signals [WAKING_UP] =
+ g_signal_new ("waking-up",
+ XFPM_TYPE_DKP,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(XfpmDkpClass, waking_up),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0, G_TYPE_NONE);
+
+ signals [SLEEPING] =
+ g_signal_new ("sleeping",
+ XFPM_TYPE_DKP,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(XfpmDkpClass, sleeping),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0, G_TYPE_NONE);
+
g_object_class_install_property (object_class,
PROP_ON_BATTERY,
g_param_spec_boolean ("on-battery",
@@ -739,6 +801,7 @@ xfpm_dkp_init (XfpmDkp *dkp)
dkp->priv->inhibit = xfpm_inhibit_new ();
dkp->priv->notify = xfpm_notify_new ();
+ dkp->priv->conf = xfpm_xfconf_new ();
#ifdef HAVE_POLKIT
dkp->priv->polkit = xfpm_polkit_get ();
g_signal_connect_swapped (dkp->priv->polkit, "auth-changed",
@@ -867,6 +930,7 @@ xfpm_dkp_finalize (GObject *object)
g_object_unref (dkp->priv->inhibit);
g_object_unref (dkp->priv->notify);
+ g_object_unref (dkp->priv->conf);
dbus_g_connection_unref (dkp->priv->bus);
@@ -913,13 +977,14 @@ xfpm_dkp_get (void)
return XFPM_DKP (xfpm_dkp_object);
}
-void xfpm_dkp_suspend (XfpmDkp *dkp)
+void xfpm_dkp_suspend (XfpmDkp *dkp, gboolean force)
{
+ xfpm_dkp_sleep (dkp, "Suspend", force);
}
-void xfpm_dkp_hibernate (XfpmDkp *dkp)
+void xfpm_dkp_hibernate (XfpmDkp *dkp, gboolean force)
{
-
+ xfpm_dkp_sleep (dkp, "Hibernate", force);
}
gboolean xfpm_dkp_has_battery (XfpmDkp *dkp)
diff --git a/src/xfpm-dkp.h b/src/xfpm-dkp.h
index 5f3173e..f99a1a9 100644
--- a/src/xfpm-dkp.h
+++ b/src/xfpm-dkp.h
@@ -82,6 +82,10 @@ typedef struct
void (*lid_changed) (XfpmDkp *dkp,
gboolean lid_is_closed);
+
+ void (*waking_up) (XfpmDkp *dkp);
+
+ void (*sleeping) (XfpmDkp *dkp);
} XfpmDkpClass;
@@ -89,9 +93,11 @@ GType xfpm_dkp_get_type (void) G_GNUC_CONST;
XfpmDkp *xfpm_dkp_get (void);
-void xfpm_dkp_suspend (XfpmDkp *dkp);
+void xfpm_dkp_suspend (XfpmDkp *dkp,
+ gboolean force);
-void xfpm_dkp_hibernate (XfpmDkp *dkp);
+void xfpm_dkp_hibernate (XfpmDkp *dkp,
+ gboolean force);
gboolean xfpm_dkp_has_battery (XfpmDkp *dkp);
diff --git a/src/xfpm-manager.c b/src/xfpm-manager.c
index 068c4b7..d1c0720 100644
--- a/src/xfpm-manager.c
+++ b/src/xfpm-manager.c
@@ -43,7 +43,6 @@
#include "xfpm-dpms.h"
#include "xfpm-manager.h"
#include "xfpm-button.h"
-#include "xfpm-inhibit.h"
#include "xfpm-brightness.h"
#include "xfpm-config.h"
#include "xfpm-debug.h"
@@ -64,6 +63,8 @@ static gboolean xfpm_manager_quit (XfpmManager *manager);
#define XFPM_MANAGER_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), XFPM_TYPE_MANAGER, XfpmManagerPrivate))
+#define SLEEP_KEY_TIMEOUT 6.0f
+
struct XfpmManagerPrivate
{
DBusGConnection *session_bus;
@@ -72,12 +73,12 @@ struct XfpmManagerPrivate
XfpmDkp *dkp;
XfpmButton *button;
- XfpmInhibit *inhibit;
XfpmXfconf *conf;
XfpmBrightness *brightness;
#ifdef HAVE_DPMS
XfpmDpms *dpms;
#endif
+ GTimer *timer;
gboolean inhibited;
gboolean session_managed;
@@ -99,9 +100,8 @@ static void
xfpm_manager_init (XfpmManager *manager)
{
manager->priv = XFPM_MANAGER_GET_PRIVATE(manager);
+ manager->priv->timer = g_timer_new ();
- manager->priv->inhibited = FALSE;
-
notify_init ("xfce4-power-manager");
}
@@ -117,9 +117,9 @@ xfpm_manager_finalize (GObject *object)
g_object_unref (manager->priv->dkp);
g_object_unref (manager->priv->button);
- g_object_unref (manager->priv->inhibit);
g_object_unref (manager->priv->conf);
g_object_unref (manager->priv->client);
+ g_timer_destroy (manager->priv->timer);
#ifdef HAVE_DPMS
g_object_unref (manager->priv->dpms);
@@ -170,21 +170,46 @@ xfpm_manager_reserve_names (XfpmManager *manager)
}
static void
+xfpm_manager_sleep_request (XfpmManager *manager, XfpmShutdownRequest req, gboolean force)
+{
+ switch (req)
+ {
+ case XFPM_DO_NOTHING:
+ break;
+ case XFPM_DO_SUSPEND:
+ xfpm_dkp_suspend (manager->priv->dkp, force);
+ break;
+ case XFPM_DO_HIBERNATE:
+ xfpm_dkp_hibernate (manager->priv->dkp, force);
+ break;
+ case XFPM_DO_SHUTDOWN:
+ /*FIXME ConsoleKit*/
+ break;
+ case XFPM_ASK:
+ xfce_sm_client_request_shutdown (manager->priv->client, XFCE_SM_CLIENT_SHUTDOWN_HINT_ASK);
+ break;
+ default:
+ g_warn_if_reached ();
+ break;
+ }
+}
+
+static void
+xfpm_manager_reset_sleep_timer (XfpmManager *manager)
+{
+ g_timer_reset (manager->priv->timer);
+}
+
+static void
xfpm_manager_button_pressed_cb (XfpmButton *bt, XfpmButtonKey type, XfpmManager *manager)
{
XfpmShutdownRequest req = XFPM_DO_NOTHING;
XFPM_DEBUG_ENUM ("Received button press event", type, XFPM_TYPE_BUTTON_KEY);
- if ( manager->priv->inhibited )
- {
- TRACE("Power manager automatic sleep is currently disabled");
- return;
- }
-
if ( type == BUTTON_MON_BRIGHTNESS_DOWN || type == BUTTON_MON_BRIGHTNESS_UP )
return;
-
+
if ( type == BUTTON_POWER_OFF )
{
g_object_get (G_OBJECT (manager->priv->conf),
@@ -212,16 +237,15 @@ xfpm_manager_button_pressed_cb (XfpmButton *bt, XfpmButtonKey type, XfpmManager
if ( req == XFPM_ASK && manager->priv->session_managed )
xfce_sm_client_request_shutdown (manager->priv->client, XFCE_SM_CLIENT_SHUTDOWN_HINT_ASK);
- /*
else
- xfpm_engine_shutdown_request (engine, req, FALSE);
- */
-}
-
-static void
-xfpm_manager_inhibit_changed_cb (XfpmInhibit *inhibit, gboolean is_inhibit, XfpmManager *manager)
-{
- manager->priv->inhibited = is_inhibit;
+ {
+ if ( g_timer_elapsed (manager->priv->timer, NULL) > SLEEP_KEY_TIMEOUT )
+ {
+ g_timer_reset (manager->priv->timer);
+ xfpm_manager_sleep_request (manager, req, FALSE);
+ }
+ }
+
}
static void
@@ -252,10 +276,16 @@ xfpm_manager_lid_changed_cb (XfpmDkp *dkp, gboolean lid_is_closed, XfpmManager *
if ( !xfpm_is_multihead_connected () )
xfpm_lock_screen ();
}
- /*
else
- xfpm_engine_shutdown_request (engine, action, FALSE);
- */
+ {
+ /*
+ * Force sleep here as lid is closed and no point of asking the
+ * user for confirmation in case of an application is inhibiting
+ * the power manager.
+ */
+ xfpm_manager_sleep_request (manager, action, TRUE);
+ }
+
}
else
{
@@ -321,7 +351,6 @@ void xfpm_manager_start (XfpmManager *manager)
manager->priv->dkp = xfpm_dkp_get ();
manager->priv->button = xfpm_button_new ();
- manager->priv->inhibit = xfpm_inhibit_new ();
manager->priv->conf = xfpm_xfconf_new ();
manager->priv->brightness = xfpm_brightness_new ();
@@ -339,12 +368,14 @@ void xfpm_manager_start (XfpmManager *manager)
g_signal_connect (manager->priv->button, "button_pressed",
G_CALLBACK (xfpm_manager_button_pressed_cb), manager);
- g_signal_connect (manager->priv->inhibit, "has-inhibit-changed",
- G_CALLBACK (xfpm_manager_inhibit_changed_cb), manager);
-
g_signal_connect (manager->priv->dkp, "lid-changed",
G_CALLBACK (xfpm_manager_lid_changed_cb), manager);
+ g_signal_connect_swapped (manager->priv->dkp, "waking-up",
+ G_CALLBACK (xfpm_manager_reset_sleep_timer), manager);
+
+ g_signal_connect_swapped (manager->priv->dkp, "sleeping",
+ G_CALLBACK (xfpm_manager_reset_sleep_timer), manager);
out:
;
}
diff --git a/src/xfpm-network-manager.c b/src/xfpm-network-manager.c
index 57d20f0..21e2d36 100644
--- a/src/xfpm-network-manager.c
+++ b/src/xfpm-network-manager.c
@@ -63,6 +63,8 @@ gboolean xfpm_send_message_to_network_manager (const gchar *message)
g_object_unref (G_OBJECT(proxy));
dbus_g_connection_unref (bus);
+ g_usleep (2000000);
+
#endif /* WITH_NETWORK_MANAGER */
return TRUE;
}
diff --git a/src/xfpm-xfconf.c b/src/xfpm-xfconf.c
index 700988d..9356269 100644
--- a/src/xfpm-xfconf.c
+++ b/src/xfpm-xfconf.c
@@ -514,7 +514,7 @@ xfpm_xfconf_finalize(GObject *object)
}
XfpmXfconf *
-xfpm_xfconf_new(void)
+xfpm_xfconf_new (void)
{
static gpointer xfpm_xfconf_object = NULL;
More information about the Xfce4-commits
mailing list