[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