diff options
Diffstat (limited to 'src/linux/up-backend.c')
-rw-r--r-- | src/linux/up-backend.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/linux/up-backend.c b/src/linux/up-backend.c index be01763..ddd4472 100644 --- a/src/linux/up-backend.c +++ b/src/linux/up-backend.c @@ -45,6 +45,17 @@ #include "up-device-idevice.h" #endif /* HAVE_IDEVICE */ +#include <dbus/dbus-glib.h> +#include <dbus/dbus-glib-lowlevel.h> + +#ifdef HAVE_SYSTEMD +#include <systemd/sd-daemon.h> + +#define SD_HIBERNATE_COMMAND "gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1 --method org.freedesktop.login1.Manager.Hibernate 'true'" +#define SD_SUSPEND_COMMAND "gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1 --method org.freedesktop.login1.Manager.Suspend 'true'" + +#endif + static void up_backend_class_init (UpBackendClass *klass); static void up_backend_init (UpBackend *backend); static void up_backend_finalize (GObject *object); @@ -59,11 +70,13 @@ struct UpBackendPrivate UpDeviceList *managed_devices; UpDock *dock; UpConfig *config; + DBusConnection *connection; }; enum { SIGNAL_DEVICE_ADDED, SIGNAL_DEVICE_REMOVED, + SIGNAL_RESUMING, SIGNAL_LAST }; @@ -564,6 +577,11 @@ out: const gchar * up_backend_get_suspend_command (UpBackend *backend) { +#ifdef HAVE_SYSTEMD + if (sd_booted ()) + return SD_SUSPEND_COMMAND; + else +#endif return UP_BACKEND_SUSPEND_COMMAND; } @@ -573,9 +591,24 @@ up_backend_get_suspend_command (UpBackend *backend) const gchar * up_backend_get_hibernate_command (UpBackend *backend) { +#ifdef HAVE_SYSTEMD + if (sd_booted ()) + return SD_HIBERNATE_COMMAND; + else +#endif return UP_BACKEND_HIBERNATE_COMMAND; } +gboolean +up_backend_emits_resuming (UpBackend *backend) +{ +#ifdef HAVE_SYSTEMD + return TRUE; +#else + return FALSE; +#endif +} + /** * up_backend_get_powersave_command: **/ @@ -609,10 +642,32 @@ up_backend_class_init (UpBackendClass *klass) G_STRUCT_OFFSET (UpBackendClass, device_removed), NULL, NULL, up_marshal_VOID__POINTER_POINTER, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); + signals [SIGNAL_RESUMING] = + g_signal_new ("resuming", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (UpBackendClass, resuming), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); g_type_class_add_private (klass, sizeof (UpBackendPrivate)); } +static DBusHandlerResult +message_filter (DBusConnection *connection, + DBusMessage *message, + void *user_data) +{ + UpBackend *backend = user_data; + + if (dbus_message_is_signal (message, "org.freedesktop.UPower", "Resuming")) { + g_debug ("received Resuming signal"); + g_signal_emit (backend, signals[SIGNAL_RESUMING], 0); + return DBUS_HANDLER_RESULT_HANDLED; + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + /** * up_backend_init: **/ @@ -624,6 +679,15 @@ up_backend_init (UpBackend *backend) backend->priv->daemon = NULL; backend->priv->device_list = NULL; backend->priv->managed_devices = up_device_list_new (); + +#ifdef HAVE_SYSTEMD + if (sd_booted ()) { + DBusGConnection *bus; + bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL); + backend->priv->connection = dbus_g_connection_get_connection (bus); + dbus_connection_add_filter (backend->priv->connection, message_filter, backend, NULL); + } +#endif } /** @@ -648,6 +712,9 @@ up_backend_finalize (GObject *object) g_object_unref (backend->priv->managed_devices); + if (backend->priv->connection) + dbus_connection_remove_filter (backend->priv->connection, message_filter, backend); + G_OBJECT_CLASS (up_backend_parent_class)->finalize (object); } |