diff options
-rw-r--r-- | .bzrignore | 1 | ||||
-rw-r--r-- | src/Makefile.am | 9 | ||||
-rw-r--r-- | src/session-service.c | 34 | ||||
-rw-r--r-- | src/upower.xml | 309 |
4 files changed, 351 insertions, 2 deletions
@@ -57,3 +57,4 @@ indicator-session-[0-9].[0-9].tar.gz.asc src/consolekit-manager-client.h src/session-dbus-client.h src/session-dbus-server.h +src/upower-client.h diff --git a/src/Makefile.am b/src/Makefile.am index 3037a3b..db41db6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -33,6 +33,13 @@ users-service-client.h: $(srcdir)/users-service.xml --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 @@ BUILT_SOURCES = \ 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 @@ BUILT_SOURCES = \ EXTRA_DIST = \ consolekit-manager.xml \ session-dbus.xml \ + upower.xml \ users-service.xml \ users-service.list diff --git a/src/session-service.c b/src/session-service.c index 7ce4c0d..691734b 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -47,6 +47,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #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 DbusmenuMenuitem * shutdown_mi = NULL; 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 @@ up_changed_cb (DBusGProxy * proxy, gpointer user_data) 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 @@ setup_up (void) { /* 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; } @@ -567,14 +597,14 @@ rebuild_items (DbusmenuMenuitem *root, 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); diff --git a/src/upower.xml b/src/upower.xml new file mode 100644 index 0000000..a4066ff --- /dev/null +++ b/src/upower.xml @@ -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> |