On 03/11/2011 05:34 AM, Richard Hughes wrote: > I think a string would be better, as then it's self documenting. With > regard to the signal emmission, DBus-glib (the precursor to GDBus) > automatically sends out a DBus signal when the local GOBject sends a > signal. It's all a bit magic.
I went to do a string at first, but when I got into the g-p-m code, it already had signals set up using an int. In the interest of simplicity and conformity, I decided to stick with an int rather than parse strings and convert when reflecting the signal. Attaching patches to both upower and g-p-m.
From: Phillip Susi <ps...@cfl.rr.com> Last-Update: 2011-03-18 Description: g-p-m used to handle requests to sleep and had config options to lock the screen when suspending and/or hibernating. The functionality of actually performing the suspend or hibernate has since been moved to upower. Because of this, g-p-m no longer had the chance to lock the screen when the system was manually suspended ( as opposed to g-p-m deciding to suspend the system due to idle time or lid switch ). This patch moves this code from the gpm control object suspend and hibernate methods to its SLEEPING and RESUMING signals instead, and ties those signals to upower via dbus. Index: b/src/gpm-control.c =================================================================== --- a/src/gpm-control.c +++ b/src/gpm-control.c @@ -57,6 +57,9 @@ { GConfClient *conf; UpClient *client; + guint32 throttle_cookie; + GpmScreensaver *screensaver; + DBusGProxy *proxy; }; enum { @@ -130,71 +133,91 @@ return do_lock; } -/** - * gpm_control_suspend: - **/ -gboolean -gpm_control_suspend (GpmControl *control, GError **error) +static void gpm_control_sleep(GpmControl *control, + GpmControlAction action) { - gboolean allowed; - gboolean ret = FALSE; + gboolean lock_gnome_keyring; gboolean do_lock; gboolean nm_sleep; - gboolean lock_gnome_keyring; GnomeKeyringResult keyres; - GpmScreensaver *screensaver; - guint32 throttle_cookie = 0; - - screensaver = gpm_screensaver_new (); - g_object_get (control->priv->client, - "can-suspend", &allowed, - NULL); - if (!allowed) { - egg_debug ("cannot suspend as not allowed from policy"); - g_set_error_literal (error, GPM_CONTROL_ERROR, GPM_CONTROL_ERROR_GENERAL, "Cannot suspend"); - goto out; + control->priv->screensaver = gpm_screensaver_new (); + if (action == GPM_CONTROL_ACTION_HIBERNATE) { + do_lock = gpm_control_get_lock_policy (control, GPM_CONF_LOCK_ON_HIBERNATE); + lock_gnome_keyring = gconf_client_get_bool (control->priv->conf, GPM_CONF_LOCK_GNOME_KEYRING_HIBERNATE, NULL); + } + else { // GPM_CONTROL_ACTION_SUSPEND + do_lock = gpm_control_get_lock_policy (control, GPM_CONF_LOCK_ON_SUSPEND); + lock_gnome_keyring = gconf_client_get_bool (control->priv->conf, GPM_CONF_LOCK_GNOME_KEYRING_SUSPEND, NULL); } /* 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); + if (action == GPM_CONTROL_ACTION_HIBERNATE) + control->priv->throttle_cookie = gpm_screensaver_add_throttle (control->priv->screensaver, "hibernate"); + else control->priv->throttle_cookie = gpm_screensaver_add_throttle (control->priv->screensaver, "suspend"); + gpm_screensaver_lock (control->priv->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); - - ret = up_client_suspend_sync (control->priv->client, NULL, error); +static void gpm_control_resume(GpmControl *control, + GpmControlAction action) +{ - egg_debug ("emitting resume"); - g_signal_emit (control, signals [RESUME], 0, GPM_CONTROL_ACTION_SUSPEND); + gboolean lock_gnome_keyring; + gboolean do_lock; + gboolean nm_sleep; - if (do_lock) { - gpm_screensaver_poke (screensaver); - if (throttle_cookie) - gpm_screensaver_remove_throttle (screensaver, throttle_cookie); + if (action == GPM_CONTROL_ACTION_HIBERNATE) { + do_lock = gpm_control_get_lock_policy (control, GPM_CONF_LOCK_ON_HIBERNATE); + lock_gnome_keyring = gconf_client_get_bool (control->priv->conf, GPM_CONF_LOCK_GNOME_KEYRING_HIBERNATE, NULL); + } + else { + do_lock = gpm_control_get_lock_policy (control, GPM_CONF_LOCK_ON_SUSPEND); + lock_gnome_keyring = gconf_client_get_bool (control->priv->conf, GPM_CONF_LOCK_GNOME_KEYRING_SUSPEND, NULL); } nm_sleep = gconf_client_get_bool (control->priv->conf, GPM_CONF_NETWORKMANAGER_SLEEP, NULL); if (nm_sleep) gpm_networkmanager_wake (); + g_object_unref (control->priv->screensaver); + control->priv->screensaver = NULL; +} + +/** + * 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, + NULL); + if (!allowed) { + egg_debug ("cannot suspend as not allowed from policy"); + g_set_error_literal (error, GPM_CONTROL_ERROR, GPM_CONTROL_ERROR_GENERAL, "Cannot suspend"); + goto out; + } + + /* Do the suspend */ + + ret = up_client_suspend_sync (control->priv->client, NULL, error); + out: - g_object_unref (screensaver); return ret; } @@ -243,14 +266,8 @@ if (nm_sleep) gpm_networkmanager_sleep (); - egg_debug ("emitting sleep"); - g_signal_emit (control, signals [SLEEP], 0, GPM_CONTROL_ACTION_HIBERNATE); - ret = up_client_hibernate_sync (control->priv->client, NULL, error); - egg_debug ("emitting resume"); - g_signal_emit (control, signals [RESUME], 0, GPM_CONTROL_ACTION_HIBERNATE); - if (do_lock) { gpm_screensaver_poke (screensaver); if (throttle_cookie) @@ -280,6 +297,7 @@ g_object_unref (control->priv->conf); g_object_unref (control->priv->client); + g_object_unref (control->priv->proxy); g_return_if_fail (control->priv != NULL); G_OBJECT_CLASS (gpm_control_parent_class)->finalize (object); @@ -293,6 +311,8 @@ { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = gpm_control_finalize; + klass->sleep = gpm_control_sleep; + klass->resume = gpm_control_resume; signals [RESUME] = g_signal_new ("resume", @@ -316,6 +336,16 @@ g_type_class_add_private (klass, sizeof (GpmControlPrivate)); } +static void proxy_sleeping_cb (DBusGProxy *proxy, guint type, GpmControl *control) +{ + g_signal_emit (control, signals [SLEEP], 0, type); +} + +static void proxy_resuming_cb (DBusGProxy *proxy, guint type, GpmControl *control) +{ + g_signal_emit (control, signals [RESUME], 0, type); +} + /** * gpm_control_init: * @control: This control class instance @@ -323,10 +353,40 @@ static void gpm_control_init (GpmControl *control) { + DBusGConnection *connection; + GError *error = NULL; + + connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); + g_assert_no_error (error); control->priv = GPM_CONTROL_GET_PRIVATE (control); control->priv->client = up_client_new (); control->priv->conf = gconf_client_get_default (); + control->priv->proxy = dbus_g_proxy_new_for_name_owner (connection, + "org.freedesktop.UPower", + "/org/freedesktop/UPower", + "org.freedesktop.UPower", + &error); + g_assert_no_error (error); + dbus_g_proxy_add_signal (control->priv->proxy, + "Sleeping", + G_TYPE_UINT, + G_TYPE_INVALID); + dbus_g_proxy_connect_signal (control->priv->proxy, + "Sleeping", + G_CALLBACK (proxy_sleeping_cb), + control, + NULL); + dbus_g_proxy_add_signal (control->priv->proxy, + "Resuming", + G_TYPE_UINT, + G_TYPE_INVALID); + dbus_g_proxy_connect_signal (control->priv->proxy, + "Resuming", + G_CALLBACK (proxy_resuming_cb), + control, + NULL); + g_object_unref (connection); } /**
From: Phillip Susi <ps...@cfl.rr.com> Last-Updated: 2011-03-18 Description: Upower took over suspend/hibernate functionality from g-p-m. When it did so, it omitted the argument to the Sleeping and Resuming signals indicating whether the sleep is a suspend or hibernate. This patch adds that argument back. The reason for this is so that g-p-m can properly lock the screen and other activities it takes in response to suspending or hibernating. Index: b/src/org.freedesktop.UPower.xml =================================================================== --- a/src/org.freedesktop.UPower.xml +++ b/src/org.freedesktop.UPower.xml @@ -123,8 +123,12 @@ before the sleep action is taken (such as sending out Avahi or Jabber messages). </doc:para> + <doc:para> + The argument type specifies either 0 for Suspend or 1 for Hibernate + </doc:para> </doc:description> </doc:doc> + <arg type='u' name='type' /> </signal> <!-- ************************************************************ --> @@ -138,8 +142,12 @@ Session and system programs can then do anything required (such as sending out Avahi or Jabber messages). </doc:para> + <doc:para> + The argument type specifies either 0 for Suspend or 1 for Hibernate + </doc:para> </doc:description> </doc:doc> + <arg type='u' name='type' /> </signal> <!-- ************************************************************ --> Index: b/src/up-daemon.c =================================================================== --- a/src/up-daemon.c +++ b/src/up-daemon.c @@ -10,7 +10,7 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License @@ -91,6 +91,7 @@ guint about_to_sleep_id; guint conf_sleep_timeout; gboolean conf_allow_hibernate_encrypted_swap; + guint sleeptype; }; static void up_daemon_finalize (GObject *object); @@ -336,7 +337,7 @@ /* we've told the clients we're going down */ egg_debug ("emitting sleeping"); - g_signal_emit (daemon, signals[SIGNAL_SLEEPING], 0); + g_signal_emit (daemon, signals[SIGNAL_SLEEPING], 0, priv->sleeptype); g_timer_start (priv->about_to_sleep_timer); daemon->priv->sent_sleeping_signal = TRUE; @@ -381,7 +382,7 @@ /* emit signal for session components */ egg_debug ("emitting resuming"); - g_signal_emit (daemon, signals[SIGNAL_RESUMING], 0); + g_signal_emit (daemon, signals[SIGNAL_RESUMING], 0, priv->sleeptype); /* reset the about-to-sleep logic */ g_timer_reset (priv->about_to_sleep_timer); @@ -425,7 +426,7 @@ /* 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); + g_signal_emit (daemon, signals[SIGNAL_SLEEPING], 0, priv->sleeptype); priv->about_to_sleep_id = g_timeout_add (priv->conf_sleep_timeout, (GSourceFunc) up_daemon_deferred_sleep_cb, sleep); #if GLIB_CHECK_VERSION(2,25,8) @@ -464,6 +465,7 @@ const gchar *command; UpDaemonPrivate *priv = daemon->priv; + priv->sleeptype = 0; /* no kernel support */ if (!priv->kernel_can_suspend) { error = g_error_new (UP_DAEMON_ERROR, @@ -565,6 +567,7 @@ const gchar *command; UpDaemonPrivate *priv = daemon->priv; + priv->sleeptype = 1; /* no kernel support */ if (!priv->kernel_can_hibernate) { error = g_error_new (UP_DAEMON_ERROR, @@ -1188,16 +1191,16 @@ G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); signals[SIGNAL_RESUMING] = g_signal_new ("resuming", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); g_object_class_install_property (object_class, PROP_DAEMON_VERSION,
signature.asc
Description: OpenPGP digital signature
_______________________________________________ devkit-devel mailing list devkit-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/devkit-devel