diff --git a/src/up-daemon.c b/src/up-daemon.c index 77ae399..e32a221 100644 --- a/src/up-daemon.c +++ b/src/up-daemon.c @@ -85,6 +85,7 @@ struct UpDaemonPrivate gboolean hibernate_has_swap_space; gboolean hibernate_has_encrypted_swap; gboolean during_coldplug; + gboolean sent_sleeping_signal; guint battery_poll_id; guint battery_poll_count; GTimer *about_to_sleep_timer; @@ -330,9 +331,11 @@ up_daemon_about_to_sleep (UpDaemon *daemon, DBusGMethodInvocation *context) if (!up_polkit_check_auth (priv->polkit, subject, "org.freedesktop.upower.suspend", context)) goto out; + /* we've told the clients we're going down */ egg_debug ("emitting sleeping"); g_signal_emit (daemon, signals[SIGNAL_SLEEPING], 0); g_timer_start (priv->about_to_sleep_timer); + daemon->priv->sent_sleeping_signal = TRUE; dbus_g_method_return (context, NULL); out: @@ -387,6 +390,7 @@ up_daemon_deferred_sleep_cb (UpDaemonDeferredSleep *sleep) out: /* clear timer */ priv->about_to_sleep_id = 0; + priv->sent_sleeping_signal = FALSE; g_free (stdout); g_free (stderr); @@ -415,13 +419,22 @@ up_daemon_deferred_sleep (UpDaemon *daemon, const gchar *command, DBusGMethodInv sleep->context = context; sleep->command = g_strdup (command); + /* we didn't use AboutToSleep() so send the signal for clients now */ + if (!priv->sent_sleeping_signal) { + egg_debug ("no AboutToSleep(), so emitting ::Sleeping()"); + g_signal_emit (daemon, signals[SIGNAL_SLEEPING], 0); + priv->about_to_sleep_id = g_timeout_add (priv->conf_sleep_timeout, + (GSourceFunc) up_daemon_deferred_sleep_cb, sleep); + return; + } + /* about to sleep */ elapsed = 1000.0f * g_timer_elapsed (priv->about_to_sleep_timer, NULL); egg_debug ("between AboutToSleep() and %s was %fms", sleep->command, elapsed); if (elapsed < priv->conf_sleep_timeout) { - /* we have to wait for a little bit */ + /* we have to wait for the difference in time */ priv->about_to_sleep_id = g_timeout_add (priv->conf_sleep_timeout - elapsed, - (GSourceFunc) up_daemon_deferred_sleep_cb, sleep); + (GSourceFunc) up_daemon_deferred_sleep_cb, sleep); } else { /* we can do this straight away */ priv->about_to_sleep_id = g_idle_add ((GSourceFunc) up_daemon_deferred_sleep_cb, sleep); @@ -930,6 +943,7 @@ up_daemon_init (UpDaemon *daemon) daemon->priv->on_battery = FALSE; daemon->priv->on_low_battery = FALSE; daemon->priv->during_coldplug = FALSE; + daemon->priv->sent_sleeping_signal = FALSE; daemon->priv->battery_poll_id = 0; daemon->priv->battery_poll_count = 0; daemon->priv->about_to_sleep_id = 0;