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);
}
/**
signature.asc
Description: OpenPGP digital signature
_______________________________________________ devkit-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/devkit-devel
