On 03/08/2011 06:43 AM, Richard Hughes wrote:
> Agreed. If you could prepare a patch I would be very grateful as I'm
> exceptionally busy with GNOME3 stuff.

Here's my first stab at it.  Seems to work, but I think I'm using a
different dbus api than the rest of the code.  It also applies the
suspend setting always since the argument indicating whether it is a
suspend or hibernate is still missing from UPowerd.

Index: b/src/gpm-control.c
===================================================================
--- a/src/gpm-control.c
+++ b/src/gpm-control.c
@@ -130,22 +130,69 @@
 	return do_lock;
 }
 
-/**
- * gpm_control_suspend:
- **/
-gboolean
-gpm_control_suspend (GpmControl *control, GError **error)
+/* Handle locking the screen and starting the screen saver */
+static void gpm_control_suspend_cb( GDBusConnection *connection,
+				    const gchar *sender_name,
+				    const gchar *object_path,
+				    const gchar *interface_name,
+				    const gchar *signal_name,
+				    GVariant *parameters,
+				    gpointer user_data)
 {
-	gboolean allowed;
-	gboolean ret = FALSE;
+	GpmScreensaver *screensaver;
 	gboolean do_lock;
 	gboolean nm_sleep;
 	gboolean lock_gnome_keyring;
 	GnomeKeyringResult keyres;
-	GpmScreensaver *screensaver;
 	guint32 throttle_cookie = 0;
+	GpmControl *control = (GpmControl *)user_data;
 
 	screensaver = gpm_screensaver_new ();
+	do_lock = gpm_control_get_lock_policy (control, GPM_CONF_LOCK_ON_SUSPEND);
+
+	if (strcmp(signal_name, "Sleeping"))
+	{
+		/* we should perhaps lock keyrings when sleeping #375681 */
+		lock_gnome_keyring = gconf_client_get_bool (control->priv->conf, GPM_CONF_LOCK_GNOME_KEYRING_SUSPEND, NULL);
+		if (lock_gnome_keyring) {
+			keyres = gnome_keyring_lock_all_sync ();
+			if (keyres != GNOME_KEYRING_RESULT_OK)
+				egg_warning ("could not lock keyring");
+		}
+
+		if (do_lock) {
+			throttle_cookie = gpm_screensaver_add_throttle (screensaver, "suspend");
+			gpm_screensaver_lock (screensaver);
+		}
+
+		nm_sleep = gconf_client_get_bool (control->priv->conf, GPM_CONF_NETWORKMANAGER_SLEEP, NULL);
+		if (nm_sleep)
+			gpm_networkmanager_sleep ();
+	}
+	if (strcmp(signal_name, "Resuming"))
+	{
+		if (do_lock) {
+			gpm_screensaver_poke (screensaver);
+			if (throttle_cookie)
+				gpm_screensaver_remove_throttle (screensaver, throttle_cookie);
+		}
+
+		nm_sleep = gconf_client_get_bool (control->priv->conf, GPM_CONF_NETWORKMANAGER_SLEEP, NULL);
+		if (nm_sleep)
+			gpm_networkmanager_wake ();
+
+	}
+	g_object_unref (screensaver);
+}
+
+/**
+ * gpm_control_suspend:
+ **/
+gboolean
+gpm_control_suspend (GpmControl *control, GError **error)
+{
+	gboolean allowed;
+	gboolean ret = FALSE;
 
 	g_object_get (control->priv->client,
 		      "can-suspend", &allowed,
@@ -156,24 +203,6 @@
 		goto out;
 	}
 
-	/* we should perhaps lock keyrings when sleeping #375681 */
-	lock_gnome_keyring = gconf_client_get_bool (control->priv->conf, GPM_CONF_LOCK_GNOME_KEYRING_SUSPEND, NULL);
-	if (lock_gnome_keyring) {
-		keyres = gnome_keyring_lock_all_sync ();
-		if (keyres != GNOME_KEYRING_RESULT_OK)
-			egg_warning ("could not lock keyring");
-	}
-
-	do_lock = gpm_control_get_lock_policy (control, GPM_CONF_LOCK_ON_SUSPEND);
-	if (do_lock) {
-		throttle_cookie = gpm_screensaver_add_throttle (screensaver, "suspend");
-		gpm_screensaver_lock (screensaver);
-	}
-
-	nm_sleep = gconf_client_get_bool (control->priv->conf, GPM_CONF_NETWORKMANAGER_SLEEP, NULL);
-	if (nm_sleep)
-		gpm_networkmanager_sleep ();
-
 	/* Do the suspend */
 	egg_debug ("emitting sleep");
 	g_signal_emit (control, signals [SLEEP], 0, GPM_CONTROL_ACTION_SUSPEND);
@@ -183,18 +212,7 @@
 	egg_debug ("emitting resume");
 	g_signal_emit (control, signals [RESUME], 0, GPM_CONTROL_ACTION_SUSPEND);
 
-	if (do_lock) {
-		gpm_screensaver_poke (screensaver);
-		if (throttle_cookie)
-			gpm_screensaver_remove_throttle (screensaver, throttle_cookie);
-	}
-
-	nm_sleep = gconf_client_get_bool (control->priv->conf, GPM_CONF_NETWORKMANAGER_SLEEP, NULL);
-	if (nm_sleep)
-		gpm_networkmanager_wake ();
-
 out:
-	g_object_unref (screensaver);
 	return ret;
 }
 
@@ -323,10 +341,24 @@
 static void
 gpm_control_init (GpmControl *control)
 {
+	GDBusConnection *connection;
+	GError *error = NULL;
+
+	connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
 	control->priv = GPM_CONTROL_GET_PRIVATE (control);
 
 	control->priv->client = up_client_new ();
 	control->priv->conf = gconf_client_get_default ();
+	g_dbus_connection_signal_subscribe (connection,
+					    "org.freedesktop.UPower",
+					    "org.freedesktop.UPower",
+					    NULL,
+					    "/org/freedesktop/UPower",
+					    NULL,
+					    0,
+					    gpm_control_suspend_cb,
+					    control,
+					    NULL);
 }
 
 /**

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
devkit-devel mailing list
devkit-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/devkit-devel

Reply via email to