diff -up lightdm-1.5.1/liblightdm-gobject/power.c.systemd_login1_power lightdm-1.5.1/liblightdm-gobject/power.c --- lightdm-1.5.1/liblightdm-gobject/power.c.systemd_login1_power 2013-03-05 20:40:10.000000000 -0600 +++ lightdm-1.5.1/liblightdm-gobject/power.c 2013-03-09 11:31:00.169897568 -0600 @@ -17,6 +17,7 @@ static GDBusProxy *upower_proxy = NULL; static GDBusProxy *ck_proxy = NULL; +static GDBusProxy *login1_proxy = NULL; static gboolean upower_call_function (const gchar *function, gboolean default_result, GError **error) @@ -147,6 +148,59 @@ ck_call_function (const gchar *function, return function_result; } +static gboolean +login1_call_function (const gchar *function, GVariant *parameters, gboolean default_result, GError **error) +{ + GVariant *result; + gboolean function_result = FALSE; + const gchar *true_result = "yes"; + gchar *str_result; + + if (!login1_proxy) + { + login1_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + NULL, + error); + if (!login1_proxy) + return FALSE; + } + + result = g_dbus_proxy_call_sync (login1_proxy, + function, + parameters, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + error); + + if (!result) + return default_result; + + if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)"))) + g_variant_get (result, "(s)", &function_result); + + /** + * CanReboot, CanPowerOff returns a string "yes", "no", or "challenge", not a boolean as ConsoleKit + **/ + if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(s)"))) { + g_variant_get (result, "(b)", str_result); + if(g_strcmp0(str_result,true_result) == 0) { + function_result = TRUE; + } + else { + function_result = default_result; + } + } + + g_variant_unref (result); + return function_result; +} + /** * lightdm_get_can_restart: * @@ -157,7 +211,11 @@ ck_call_function (const gchar *function, gboolean lightdm_get_can_restart (void) { - return ck_call_function ("CanRestart", FALSE, NULL); + gboolean function_result = FALSE; + function_result = login1_call_function ("CanReboot", NULL, FALSE, NULL); + if (!function_result) + function_result = ck_call_function ("CanRestart", FALSE, NULL); + return function_result; } /** @@ -171,7 +229,11 @@ lightdm_get_can_restart (void) gboolean lightdm_restart (GError **error) { - return ck_call_function ("Restart", TRUE, error); + gboolean function_result = FALSE; + function_result = login1_call_function ("Reboot", g_variant_new("(b)",0), TRUE, error); + if (!function_result) + function_result = ck_call_function ("Restart", TRUE, error); + return function_result; } /** @@ -184,7 +246,11 @@ lightdm_restart (GError **error) gboolean lightdm_get_can_shutdown (void) { - return ck_call_function ("CanStop", FALSE, NULL); + gboolean function_result = FALSE; + function_result = login1_call_function ("CanPowerOff", NULL, FALSE, NULL); + if (!function_result) + function_result = ck_call_function ("CanStop", FALSE, NULL); + return function_result; } /** @@ -198,5 +264,9 @@ lightdm_get_can_shutdown (void) gboolean lightdm_shutdown (GError **error) { - return ck_call_function ("Stop", TRUE, error); + gboolean function_result = FALSE; + function_result = login1_call_function ("PowerOff", g_variant_new("(b)",0), TRUE, error); + if (!function_result) + function_result = ck_call_function ("Stop", TRUE, error); + return function_result; } diff -up lightdm-1.5.1/liblightdm-qt/power.cpp.systemd_login1_power lightdm-1.5.1/liblightdm-qt/power.cpp --- lightdm-1.5.1/liblightdm-qt/power.cpp.systemd_login1_power 2013-03-05 20:40:10.000000000 -0600 +++ lightdm-1.5.1/liblightdm-qt/power.cpp 2013-03-09 11:36:47.140559838 -0600 @@ -15,6 +15,7 @@ #include #include #include +#include #include "config.h" @@ -26,11 +27,13 @@ public: PowerInterfacePrivate(); QScopedPointer powerManagementInterface; QScopedPointer consoleKitInterface; + QScopedPointer login1Interface; }; PowerInterface::PowerInterfacePrivate::PowerInterfacePrivate() : powerManagementInterface(new QDBusInterface("org.freedesktop.UPower","/org/freedesktop/UPower", "org.freedesktop.UPower", QDBusConnection::systemBus())), - consoleKitInterface(new QDBusInterface("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus())) + consoleKitInterface(new QDBusInterface("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus())), + login1Interface(new QDBusInterface("org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", QDBusConnection::systemBus())) { } @@ -80,34 +83,55 @@ void PowerInterface::hibernate() bool PowerInterface::canShutdown() { + + if ( d->login1Interface->isValid() ) { + QDBusReply reply1 = d->login1Interface->call("CanPowerOff"); + if (reply1.isValid()) { + return (reply1.value()=="yes"); + } + } + qWarning() << d->login1Interface->lastError(); + QDBusReply reply = d->consoleKitInterface->call("CanStop"); if (reply.isValid()) { return reply.value(); } - else { - return false; - } + + return false; } void PowerInterface::shutdown() { - d->consoleKitInterface->call("Stop"); + if ( d->login1Interface->isValid() ) + d->login1Interface->call("PowerOff",false); + else + d->consoleKitInterface->call("Stop"); } bool PowerInterface::canRestart() { + if ( d->login1Interface->isValid() ) { + QDBusReply reply1 = d->login1Interface->call("CanReboot"); + if (reply1.isValid()) { + return (reply1.value()=="yes"); + } + } + qWarning() << d->login1Interface->lastError(); + QDBusReply reply = d->consoleKitInterface->call("CanRestart"); if (reply.isValid()) { return reply.value(); } - else { - return false; - } + + return false; } void PowerInterface::restart() { - d->consoleKitInterface->call("Restart"); + if ( d->login1Interface->isValid() ) + d->login1Interface->call("Reboot",false); + else + d->consoleKitInterface->call("Restart"); } #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)