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,

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