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 devkit-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/devkit-devel