summaryrefslogtreecommitdiff
path: root/community/lightdm/lightdm-1.5.1-systemd_login1_power.patch
diff options
context:
space:
mode:
Diffstat (limited to 'community/lightdm/lightdm-1.5.1-systemd_login1_power.patch')
-rwxr-xr-xcommunity/lightdm/lightdm-1.5.1-systemd_login1_power.patch211
1 files changed, 211 insertions, 0 deletions
diff --git a/community/lightdm/lightdm-1.5.1-systemd_login1_power.patch b/community/lightdm/lightdm-1.5.1-systemd_login1_power.patch
new file mode 100755
index 000000000..0bcb24589
--- /dev/null
+++ b/community/lightdm/lightdm-1.5.1-systemd_login1_power.patch
@@ -0,0 +1,211 @@
+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 <QtCore/QVariant>
+ #include <QtDBus/QDBusInterface>
+ #include <QtDBus/QDBusReply>
++#include <QDebug>
+
+ #include "config.h"
+
+@@ -26,11 +27,13 @@ public:
+ PowerInterfacePrivate();
+ QScopedPointer<QDBusInterface> powerManagementInterface;
+ QScopedPointer<QDBusInterface> consoleKitInterface;
++ QScopedPointer<QDBusInterface> 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<QString> reply1 = d->login1Interface->call("CanPowerOff");
++ if (reply1.isValid()) {
++ return (reply1.value()=="yes");
++ }
++ }
++ qWarning() << d->login1Interface->lastError();
++
+ QDBusReply<bool> 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<QString> reply1 = d->login1Interface->call("CanReboot");
++ if (reply1.isValid()) {
++ return (reply1.value()=="yes");
++ }
++ }
++ qWarning() << d->login1Interface->lastError();
++
+ QDBusReply<bool> 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)