← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~ted/indicator-session/suspend-hibernate-allowed into lp:indicator-session

 

Ted Gould has proposed merging lp:~ted/indicator-session/suspend-hibernate-allowed into lp:indicator-session with lp:~ted/indicator-session/screensaver-gconf-key as a prerequisite.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)


Checks to see if PolicyKit is allowing the user to suspend and/or hibernate the system.
-- 
https://code.launchpad.net/~ted/indicator-session/suspend-hibernate-allowed/+merge/21407
Your team ayatana-commits is subscribed to branch lp:indicator-session.
=== modified file '.bzrignore'
--- .bzrignore	2010-03-12 20:00:20 +0000
+++ .bzrignore	2010-03-15 22:21:17 +0000
@@ -57,3 +57,4 @@
 src/consolekit-manager-client.h
 src/session-dbus-client.h
 src/session-dbus-server.h
+src/upower-client.h

=== modified file 'src/Makefile.am'
--- src/Makefile.am	2010-03-12 20:00:20 +0000
+++ src/Makefile.am	2010-03-15 22:21:17 +0000
@@ -33,6 +33,13 @@
 		--output=users-service-client.h \
 		$(srcdir)/users-service.xml
 
+upower-client.h: $(srcdir)/upower.xml
+	dbus-binding-tool \
+		--prefix=_upower_client \
+		--mode=glib-client \
+		--output=upower-client.h \
+		$(srcdir)/upower.xml
+
 session-dbus-client.h: $(srcdir)/session-dbus.xml
 	dbus-binding-tool \
 		--prefix=_session_dbus_client \
@@ -108,6 +115,7 @@
 	consolekit-manager-client.h \
 	session-dbus-client.h \
 	session-dbus-server.h \
+	upower-client.h \
 	users-service-client.h \
 	users-service-marshal.h \
 	users-service-marshal.c
@@ -115,6 +123,7 @@
 EXTRA_DIST = \
 	consolekit-manager.xml \
 	session-dbus.xml \
+	upower.xml \
 	users-service.xml \
 	users-service.list
 

=== modified file 'src/session-service.c'
--- src/session-service.c	2010-03-15 22:21:17 +0000
+++ src/session-service.c	2010-03-15 22:21:17 +0000
@@ -47,6 +47,7 @@
 #include "session-dbus.h"
 #include "users-service-dbus.h"
 #include "lock-helper.h"
+#include "upower-client.h"
 
 #define UP_ADDRESS    "org.freedesktop.UPower"
 #define UP_OBJECT     "/org/freedesktop/UPower"
@@ -91,6 +92,8 @@
 
 static gboolean can_hibernate = TRUE;
 static gboolean can_suspend = TRUE;
+static gboolean allow_hibernate = TRUE;
+static gboolean allow_suspend = TRUE;
 
 static GConfClient * gconf_client = NULL;
 
@@ -252,6 +255,25 @@
 	return;
 }
 
+/* Handle the callback from the allow functions to check and
+   see if we're changing the value, and if so, rebuilding the
+   menus based on that info. */
+static void
+allowed_cb (DBusGProxy *proxy, gboolean OUT_allowed, GError *error, gpointer userdata)
+{
+	if (error != NULL) {
+		g_warning("Unable to get information on what is allowed from UPower: %s", error->message);
+		return;
+	}
+
+	gboolean * can_do = (gboolean *)userdata;
+
+	if (OUT_allowed != *can_do) {
+		*can_do = OUT_allowed;
+		rebuild_items (root_menuitem, dbus_interface);
+	}
+}
+
 /* This function goes through and sets up what we need for
    DKp checking.  We're even setting up the calls for the props
    we need */
@@ -290,6 +312,14 @@
 	/* Force an original "changed" event */
 	up_changed_cb(up_main_proxy, NULL);
 
+	/* Check to see if these are getting blocked by PolicyKit */
+	org_freedesktop_UPower_suspend_allowed_async(up_main_proxy,
+	                                             allowed_cb,
+	                                             &allow_suspend);
+	org_freedesktop_UPower_hibernate_allowed_async(up_main_proxy,
+	                                               allowed_cb,
+	                                               &allow_hibernate);
+
 	return;
 }
 
@@ -566,14 +596,14 @@
 	dbusmenu_menuitem_child_append(root, logout_mi);
 	g_signal_connect(G_OBJECT(logout_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "logout");
 
-	if (can_suspend) {
+	if (can_suspend && allow_suspend) {
 		suspend_mi = dbusmenu_menuitem_new();
 		dbusmenu_menuitem_property_set(suspend_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Sleep"));
 		dbusmenu_menuitem_child_append(root, suspend_mi);
 		g_signal_connect(G_OBJECT(suspend_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(machine_sleep), "Suspend");
 	}
 
-	if (can_hibernate) {
+	if (can_hibernate && allow_hibernate) {
 		hibernate_mi = dbusmenu_menuitem_new();
 		dbusmenu_menuitem_property_set(hibernate_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Hibernate"));
 		dbusmenu_menuitem_child_append(root, hibernate_mi);

=== added file 'src/upower.xml'
--- src/upower.xml	1970-01-01 00:00:00 +0000
+++ src/upower.xml	2010-03-15 22:21:17 +0000
@@ -0,0 +1,309 @@
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd";>
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd";>
+
+  <interface name="org.freedesktop.UPower">
+    <doc:doc>
+      <doc:description>
+        <doc:para>
+          The DeviceKit-power service is available via the system message
+          bus. To access the service, use
+          the <doc:tt>org.freedesktop.UPower</doc:tt> interface on
+          the <doc:tt>/org/freedesktop/UPower</doc:tt> object on
+          the D-Bus system bus service with the well-known
+          name <doc:tt>org.freedesktop.UPower</doc:tt>.
+        </doc:para>
+        <doc:para>
+          <doc:example language="shell" title="simple example">
+            <doc:code>
+$ dbus-send --print-reply \
+            --system \
+            --dest=org.freedesktop.UPower \
+            /org/freedesktop/UPower \
+            org.freedesktop.UPower.EnumerateDevices
+
+method return sender=:1.386 -> dest=:1.451 reply_serial=2
+   array [
+      object path "/org/freedesktop/UPower/devices/line_power_AC"
+      object path "/org/freedesktop/UPower/devices/battery_BAT0"
+   ]
+            </doc:code>
+          </doc:example>
+        </doc:para>
+      </doc:description>
+    </doc:doc>
+
+    <!-- ************************************************************ -->
+
+    <method name="EnumerateDevices">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg name="devices" direction="out" type="ao">
+        <doc:doc><doc:summary>An array of object paths for devices.</doc:summary></doc:doc>
+      </arg>
+
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Enumerate all power objects on the system.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
+    <!-- ************************************************************ -->
+
+    <signal name="DeviceAdded">
+      <arg name="device" type="o">
+        <doc:doc><doc:summary>Object path of device that was added.</doc:summary></doc:doc>
+      </arg>
+
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Emitted when a device is added.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </signal>
+
+    <!-- ************************************************************ -->
+
+    <signal name="DeviceRemoved">
+      <arg name="device" type="o">
+        <doc:doc><doc:summary>Object path of device that was removed.</doc:summary></doc:doc>
+      </arg>
+
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Emitted when a device is removed.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </signal>
+
+    <!-- ************************************************************ -->
+
+    <signal name="DeviceChanged">
+      <arg name="device" type="o">
+        <doc:doc><doc:summary>Object path of device that was changed.</doc:summary></doc:doc>
+      </arg>
+
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Emitted when a device changed.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </signal>
+
+    <!-- ************************************************************ -->
+
+    <signal name="Changed">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Emitted when one or more properties on the object changes.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </signal>
+
+    <!-- ************************************************************ -->
+
+    <signal name="Sleeping">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This signal is sent when the session is about to be suspended or
+            hibernated.
+            Session and system programs have one second to do anything required
+            before the sleep action is taken (such as sending out Avahi or
+            Jabber messages).
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </signal>
+
+    <!-- ************************************************************ -->
+
+    <signal name="Resuming">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This signal is sent when the session has just returned from
+            Suspend() or Hibernate().
+            Session and system programs can then do anything required (such as
+            sending out Avahi or Jabber messages).
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </signal>
+
+    <!-- ************************************************************ -->
+
+    <method name="AboutToSleep">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This method tells UPower that the Suspend() or Hibernate() method
+            is about to be called.
+            This allows UPower to emit the Suspending signal whilst
+            session activities are happening that have to be done before the
+            suspend process is started.
+          </doc:para>
+          <doc:para>
+            This method would typically be called by the session power
+            management daemon, before it locks the screen and waits for the
+            screen to fade to black.
+            The session power management component would then call Suspend() or
+            Hibernate() when these syncronous tasks have completed.
+          </doc:para>
+          <doc:para>
+            If this method is not called than nothing bad will happen and
+            Suspend() or Hibernate() will block for the required second.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
+    <!-- ************************************************************ -->
+
+    <method name="Suspend">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Suspends the computer into a low power state.
+            System state is not preserved if the power is lost.
+          </doc:para>
+          <doc:para>
+            If AboutToRequestSleep() has not been called then UPower will send
+            the Sleeping() signal and block for one second.
+          </doc:para>
+          <doc:para>
+            If AboutToRequestSleep() has been called less than one second
+            before this method is called then UPower will block for the
+            remaining time to complete one second of delay.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
+    <!-- ************************************************************ -->
+
+    <method name="SuspendAllowed">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg name="allowed" direction="out" type="b">
+        <doc:doc><doc:summary>TRUE if allowed, otherwise FALSE</doc:summary></doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Check if the caller has (or can get) the PolicyKit privilege to call
+            <doc:ref type="method" to="Power.Suspend">Suspend</doc:ref>.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
+    <!-- ************************************************************ -->
+
+    <method name="Hibernate">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Hibernates the computer into a low power state.
+            System state is preserved if the power is lost.
+          </doc:para>
+          <doc:para>
+            If AboutToRequestSleep() has not been called then UPower will send
+            the Sleeping() signal and block for one second.
+          </doc:para>
+          <doc:para>
+            If AboutToRequestSleep() has been called less than one second
+            before this method is called then UPower will block for the
+            remaining time to complete one second of delay.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
+    <!-- ************************************************************ -->
+
+    <method name="HibernateAllowed">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg name="allowed" direction="out" type="b">
+        <doc:doc><doc:summary>TRUE if allowed, otherwise FALSE</doc:summary></doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Check if the caller has (or can get) the PolicyKit privilege to call
+            <doc:ref type="method" to="Power.Hibernate">Hibernate</doc:ref>.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
+    <!-- ************************************************************ -->
+
+    <property name="DaemonVersion" type="s" access="read">
+      <doc:doc><doc:description><doc:para>
+            Version of the running daemon, e.g. <doc:tt>002</doc:tt>.
+      </doc:para></doc:description></doc:doc>
+    </property>
+
+    <property name="CanSuspend" type="b" access="read">
+      <doc:doc><doc:description><doc:para>
+            Whether the system is able to suspend.
+      </doc:para></doc:description></doc:doc>
+    </property>
+
+    <property name="CanHibernate" type="b" access="read">
+      <doc:doc><doc:description><doc:para>
+            Whether the system is able to hibernate.
+      </doc:para></doc:description></doc:doc>
+    </property>
+
+    <property name="OnBattery" type="b" access="read">
+      <doc:doc><doc:description><doc:para>
+            Indicates whether the system is running on battery power.
+            This property is provided for convenience.
+      </doc:para></doc:description></doc:doc>
+    </property>
+
+    <property name="OnLowBattery" type="b" access="read">
+      <doc:doc><doc:description><doc:para>
+            Indicates whether the system is running on battery power and if the battery is critically low.
+            This property is provided for convenience.
+      </doc:para></doc:description></doc:doc>
+    </property>
+
+    <property name="LidIsClosed" type="b" access="read">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            Indicates if the laptop lid is closed where the display cannot be seen.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </property>
+
+    <property name="LidIsPresent" type="b" access="read">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            If the system has a lid device.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </property>
+
+  </interface>
+
+</node>


Follow ups