diff --git a/configure.ac.in b/configure.ac.in index 633b340..7fba6ed 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -95,6 +95,8 @@ if test "x$ac_cv_enable_polkit" = "xno"; then polkit="no" else AC_MSG_RESULT([yes]) + XDT_CHECK_OPTIONAL_PACKAGE([SYSTEMD], [polkit-gobject-1], [0.100], + [systemd], [Systemd support (through polkit)]) AC_DEFINE(ENABLE_POLKIT, 1 , [PolicyKit support]) polkit="yes" fi diff --git a/src/Makefile.am b/src/Makefile.am index 0435bed..468e168 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,6 +39,12 @@ xfce4_power_manager_SOURCES = \ xfpm-errors.c \ xfpm-errors.h +if HAVE_SYSTEMD +xfce4_power_manager_SOURCES += \ + xfpm-systemd.c \ + xfpm-systemd.h +endif + xfce4_power_manager_CFLAGS = \ -I$(top_srcdir) \ -I$(top_srcdir)/common \ @@ -52,6 +58,7 @@ xfce4_power_manager_CFLAGS = \ $(LIBXFCE4UI_CFLAGS) \ $(XFCONF_CFLAGS) \ $(LIBNOTIFY_CFLAGS) \ + $(SYSTEMD_CFLAGS) \ $(XRANDR_CFLAGS) \ $(DPMS_CFLAGS) \ $(PLATFORM_CPPFLAGS) \ @@ -70,6 +77,7 @@ xfce4_power_manager_LDADD = \ $(LIBXFCE4UI_LIBS) \ $(XFCONF_LIBS) \ $(LIBNOTIFY_LIBS) \ + $(SYSTEMD_LIBS) \ $(XRANDR_LIBS) \ $(DPMS_LIBS) diff --git a/src/xfpm-manager.c b/src/xfpm-manager.c index 472ee3e..b14f554 100644 --- a/src/xfpm-manager.c +++ b/src/xfpm-manager.c @@ -58,6 +58,10 @@ #include "xfpm-enum-types.h" #include "xfpm-dbus-monitor.h" +#ifdef HAVE_SYSTEMD +#include "xfpm-systemd.h" +#endif + static void xfpm_manager_finalize (GObject *object); static void xfpm_manager_dbus_class_init (XfpmManagerClass *klass); @@ -80,6 +84,9 @@ struct XfpmManagerPrivate XfpmButton *button; XfpmXfconf *conf; XfpmBacklight *backlight; +#ifdef HAVE_SYSTEMD + XfpmSystemd *systemd; +#endif XfpmConsoleKit *console; XfpmDBusMonitor *monitor; XfpmDisks *disks; @@ -131,7 +138,12 @@ xfpm_manager_finalize (GObject *object) g_object_unref (manager->priv->button); g_object_unref (manager->priv->conf); g_object_unref (manager->priv->client); - g_object_unref (manager->priv->console); +#ifdef HAVE_SYSTEMD + if ( manager->priv->systemd != NULL ) + g_object_unref (manager->priv->systemd); +#endif + if ( manager->priv->console != NULL ) + g_object_unref (manager->priv->console); g_object_unref (manager->priv->monitor); g_object_unref (manager->priv->disks); g_object_unref (manager->priv->inhibit); @@ -201,6 +213,11 @@ static void xfpm_manager_shutdown (XfpmManager *manager) { GError *error = NULL; +#ifdef HAVE_SYSTEMD + if ( manager->priv->systemd != NULL ) + xfpm_systemd_shutdown (manager->priv->systemd, &error ); + else +#endif xfpm_console_kit_shutdown (manager->priv->console, &error ); if ( error ) @@ -517,10 +534,17 @@ void xfpm_manager_start (XfpmManager *manager) dbus_g_error_domain_register (XFPM_ERROR, NULL, XFPM_TYPE_ERROR); - + manager->priv->power = xfpm_power_get (); manager->priv->button = xfpm_button_new (); manager->priv->conf = xfpm_xfconf_new (); +#ifdef HAVE_SYSTEMD + manager->priv->console = NULL; + manager->priv->systemd = NULL; + if ( LOGIND_RUNNING () ) + manager->priv->systemd = xfpm_systemd_new (); + else +#endif manager->priv->console = xfpm_console_kit_new (); manager->priv->monitor = xfpm_dbus_monitor_new (); manager->priv->disks = xfpm_disks_new (); @@ -603,6 +627,13 @@ GHashTable *xfpm_manager_get_config (XfpmManager *manager) hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); +#ifdef HAVE_SYSTEMD + if ( manager->priv->systemd != NULL ) + g_object_get (G_OBJECT (manager->priv->systemd), + "can-shutdown", &can_shutdown, + NULL); + else +#endif g_object_get (G_OBJECT (manager->priv->console), "can-shutdown", &can_shutdown, NULL); diff --git a/src/xfpm-power.c b/src/xfpm-power.c index 796bef8..3c40d8b 100644 --- a/src/xfpm-power.c +++ b/src/xfpm-power.c @@ -51,6 +51,10 @@ #include "xfpm-enum-types.h" #include "egg-idletime.h" +#ifdef HAVE_SYSTEMD +#include "xfpm-systemd.h" +#endif + static void xfpm_power_finalize (GObject *object); static void xfpm_power_get_property (GObject *object, @@ -75,6 +79,9 @@ struct XfpmPowerPrivate GHashTable *hash; +#ifdef HAVE_SYSTEMD + XfpmSystemd *systemd; +#endif XfpmConsoleKit *console; XfpmInhibit *inhibit; XfpmXfconf *conf; @@ -680,10 +687,17 @@ xfpm_power_add_actions_to_notification (XfpmPower *power, NotifyNotification *n) { gboolean can_shutdown; +#ifdef HAVE_SYSTEMD + if ( power->priv->systemd != NULL ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-shutdown", &can_shutdown, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-shutdown", &can_shutdown, NULL); - + if ( power->priv->can_hibernate && power->priv->auth_hibernate ) { xfpm_notify_add_action_to_notification( @@ -756,10 +770,17 @@ xfpm_power_show_critical_action_gtk (XfpmPower *power) const gchar *message; gboolean can_shutdown; +#ifdef HAVE_SYSTEMD + if ( power->priv->systemd != NULL ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-shutdown", &can_shutdown, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-shutdown", &can_shutdown, NULL); - + message = _("System is running on low power. "\ "Save your work to avoid losing data"); @@ -1327,6 +1348,13 @@ xfpm_power_init (XfpmPower *power) power->priv->inhibit = xfpm_inhibit_new (); power->priv->notify = xfpm_notify_new (); power->priv->conf = xfpm_xfconf_new (); +#ifdef HAVE_SYSTEMD + power->priv->systemd = NULL; + power->priv->console = NULL; + if ( LOGIND_RUNNING () ) + power->priv->systemd = xfpm_systemd_new (); + else +#endif power->priv->console = xfpm_console_kit_new (); g_signal_connect_swapped (power->priv->conf, "notify::" SHOW_TRAY_ICON_CFG, @@ -1445,7 +1473,12 @@ xfpm_power_finalize (GObject *object) g_object_unref (power->priv->inhibit); g_object_unref (power->priv->notify); g_object_unref (power->priv->conf); - g_object_unref (power->priv->console); +#ifdef HAVE_SYSTEMD + if ( power->priv->systemd != NULL ) + g_object_unref (power->priv->systemd); +#endif + if ( power->priv->console != NULL ) + g_object_unref (power->priv->console); xfpm_power_hide_adapter_icon (power); @@ -1607,10 +1640,17 @@ static gboolean xfpm_power_dbus_shutdown (XfpmPower *power, { gboolean can_reboot; +#ifdef HAVE_SYSTEMD + if ( power->priv->systemd != NULL ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-shutdown", &can_reboot, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-shutdown", &can_reboot, NULL); - + if ( !can_reboot) { g_set_error (error, XFPM_ERROR, XFPM_ERROR_PERMISSION_DENIED, @@ -1618,6 +1658,11 @@ static gboolean xfpm_power_dbus_shutdown (XfpmPower *power, return FALSE; } +#ifdef HAVE_SYSTEMD + if ( power->priv->systemd != NULL ) + xfpm_systemd_shutdown (power->priv->systemd, error); + else +#endif xfpm_console_kit_shutdown (power->priv->console, error); return TRUE; @@ -1628,10 +1673,17 @@ static gboolean xfpm_power_dbus_reboot (XfpmPower *power, { gboolean can_reboot; +#ifdef HAVE_SYSTEMD + if ( power->priv->systemd != NULL ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-restart", &can_reboot, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-restart", &can_reboot, NULL); - + if ( !can_reboot) { g_set_error (error, XFPM_ERROR, XFPM_ERROR_PERMISSION_DENIED, @@ -1639,7 +1691,12 @@ static gboolean xfpm_power_dbus_reboot (XfpmPower *power, return FALSE; } +#ifdef HAVE_SYSTEMD + if ( power->priv->systemd != NULL ) + xfpm_systemd_reboot (power->priv->systemd, error); +#else xfpm_console_kit_reboot (power->priv->console, error); +#endif return TRUE; } @@ -1694,10 +1751,17 @@ static gboolean xfpm_power_dbus_can_reboot (XfpmPower * power, gboolean * OUT_can_reboot, GError ** error) { +#ifdef HAVE_SYSTEMD + if ( power->priv->systemd != NULL ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-reboot", OUT_can_reboot, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-reboot", OUT_can_reboot, NULL); - + return TRUE; } @@ -1705,9 +1769,17 @@ static gboolean xfpm_power_dbus_can_shutdown (XfpmPower * power, gboolean * OUT_can_shutdown, GError ** error) { +#ifdef HAVE_SYSTEMD + if ( power->priv->systemd != NULL ) + g_object_get (G_OBJECT (power->priv->systemd), + "can-shutdown", OUT_can_shutdown, + NULL); + else +#endif g_object_get (G_OBJECT (power->priv->console), "can-shutdown", OUT_can_shutdown, NULL); + return TRUE; }