From b36c93575f88bd5a045c36f3d8084608ae20879f Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Thu, 4 Jul 2013 23:11:54 +0200 Subject: drop --with-systemdsleep and move logind detection to runtime There is no need to bind the user to either systemd-logind or upower at build time. People can switch between init systems or run logind without systemd. --- src/gpm-button.c | 105 +++++++++++++-------------- src/gpm-button.h | 3 - src/gpm-common.h | 4 ++ src/gpm-control.c | 179 +++++++++++++++++++++++----------------------- src/gpm-prefs-core.c | 197 ++++++++++++++++++++++++++------------------------- 5 files changed, 242 insertions(+), 246 deletions(-) (limited to 'src') diff --git a/src/gpm-button.c b/src/gpm-button.c index 4f9f171..3c70ca1 100644 --- a/src/gpm-button.c +++ b/src/gpm-button.c @@ -249,53 +249,6 @@ gpm_button_class_init (GpmButtonClass *klass) G_TYPE_NONE, 1, G_TYPE_STRING); } -#ifdef WITH_SYSTEMD_SLEEP -gboolean gpm_button_get_lid_closed() -{ - - GDBusProxy *proxy; - GVariant *res, *inner; - gboolean lid; -GError *error = NULL; - proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, - NULL, - "org.freedesktop.UPower", - "/org/freedesktop/UPower", - "org.freedesktop.DBus.Properties", - NULL, - &error ); - if (proxy == NULL) { - egg_error("Error connecting to dbus - %s", error->message); - g_error_free (error); - return -1; - } - - res = g_dbus_proxy_call_sync (proxy, "Get", - g_variant_new( "(ss)", - "org.freedesktop.UPower", - "LidIsClosed"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error - ); - if (error == NULL && res != NULL) { - g_variant_get(res, "(v)", &inner ); - lid = g_variant_get_boolean(inner); - g_variant_unref (inner); - g_variant_unref (res); - return lid; - } else if (error != NULL ) { - egg_error ("Error in dbus - %s", error->message); - g_error_free (error); - } - g_object_unref(proxy); - - return FALSE; -} -#endif - /** * gpm_button_is_lid_closed: **/ @@ -303,11 +256,53 @@ gboolean gpm_button_is_lid_closed (GpmButton *button) { g_return_val_if_fail (GPM_IS_BUTTON (button), FALSE); -#ifdef WITH_SYSTEMD_SLEEP - return gpm_button_get_lid_closed(); -#else - return up_client_get_lid_is_closed (button->priv->client); -#endif + + GDBusProxy *proxy; + GVariant *res, *inner; + gboolean lid; + GError *error = NULL; + + if (LOGIND_RUNNING()) { + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, + "org.freedesktop.UPower", + "/org/freedesktop/UPower", + "org.freedesktop.DBus.Properties", + NULL, + &error ); + if (proxy == NULL) { + egg_error("Error connecting to dbus - %s", error->message); + g_error_free (error); + return -1; + } + + res = g_dbus_proxy_call_sync (proxy, "Get", + g_variant_new( "(ss)", + "org.freedesktop.UPower", + "LidIsClosed"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error + ); + if (error == NULL && res != NULL) { + g_variant_get(res, "(v)", &inner ); + lid = g_variant_get_boolean(inner); + g_variant_unref (inner); + g_variant_unref (res); + return lid; + } else if (error != NULL ) { + egg_error ("Error in dbus - %s", error->message); + g_error_free (error); + } + g_object_unref(proxy); + + return FALSE; + } + else { + return up_client_get_lid_is_closed (button->priv->client); + } } @@ -334,11 +329,7 @@ gpm_button_client_changed_cb (UpClient *client, GpmButton *button) gboolean lid_is_closed; /* get new state */ -#ifdef WITH_SYSTEMD_SLEEP - lid_is_closed = gpm_button_get_lid_closed(); -#else - lid_is_closed = up_client_get_lid_is_closed (button->priv->client); -#endif + lid_is_closed = gpm_button_is_lid_closed(button); /* same state */ if (button->priv->lid_is_closed == lid_is_closed) diff --git a/src/gpm-button.h b/src/gpm-button.h index 7d60334..8992007 100644 --- a/src/gpm-button.h +++ b/src/gpm-button.h @@ -66,9 +66,6 @@ typedef struct GType gpm_button_get_type (void); GpmButton *gpm_button_new (void); gboolean gpm_button_is_lid_closed (GpmButton *button); -#ifdef WITH_SYSTEMD_SLEEP -gboolean gpm_button_get_lid_closed (); -#endif gboolean gpm_button_reset_time (GpmButton *button); G_END_DECLS diff --git a/src/gpm-common.h b/src/gpm-common.h index ca4762c..6f712cb 100644 --- a/src/gpm-common.h +++ b/src/gpm-common.h @@ -24,8 +24,12 @@ #include +#include + G_BEGIN_DECLS +#define LOGIND_RUNNING() (access("/run/systemd/seats/", F_OK) >= 0) + #define GPM_DBUS_SERVICE "org.mate.PowerManager" #define GPM_DBUS_INTERFACE "org.mate.PowerManager" #define GPM_DBUS_INTERFACE_BACKLIGHT "org.mate.PowerManager.Backlight" diff --git a/src/gpm-control.c b/src/gpm-control.c index 71f857c..d0db730 100644 --- a/src/gpm-control.c +++ b/src/gpm-control.c @@ -166,23 +166,23 @@ gpm_control_suspend (GpmControl *control, GError **error) gboolean lock_mate_keyring; MateKeyringResult keyres; #endif /* WITH_KEYRING */ -#ifdef WITH_SYSTEMD_SLEEP + GError *dbus_error = NULL; DBusGProxy *proxy; GVariant *res; -#endif screensaver = gpm_screensaver_new (); -#ifndef WITH_SYSTEMD_SLEEP - g_object_get (control->priv->client, - "can-suspend", &allowed, - NULL); - if (!allowed) { - egg_debug ("cannot suspend as not allowed from policy"); - g_set_error_literal (error, GPM_CONTROL_ERROR, GPM_CONTROL_ERROR_GENERAL, "Cannot suspend"); - goto out; + + if (LOGIND_RUNNING()) { + g_object_get (control->priv->client, + "can-suspend", &allowed, + NULL); + if (!allowed) { + egg_debug ("cannot suspend as not allowed from policy"); + g_set_error_literal (error, GPM_CONTROL_ERROR, GPM_CONTROL_ERROR_GENERAL, "Cannot suspend"); + goto out; + } } -#endif #ifdef WITH_KEYRING /* we should perhaps lock keyrings when sleeping #375681 */ @@ -208,40 +208,41 @@ gpm_control_suspend (GpmControl *control, GError **error) egg_debug ("emitting sleep"); g_signal_emit (control, signals [SLEEP], 0, GPM_CONTROL_ACTION_SUSPEND); -#ifdef WITH_SYSTEMD_SLEEP - /* sleep via logind */ - proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, - NULL, - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - NULL, - &dbus_error ); - if (proxy == NULL) { - egg_error("Error connecting to dbus - %s", dbus_error->message); - g_error_free (dbus_error); - return -1; - } - g_dbus_proxy_call_sync (proxy, "Suspend", - g_variant_new( "(b)",FALSE), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &dbus_error - ); - if (dbus_error != NULL ) { - egg_debug ("Error in dbus - %s", dbus_error->message); - g_error_free (dbus_error); - ret = TRUE; - } - else { - ret = TRUE; - } - g_object_unref(proxy); -#else - ret = up_client_suspend_sync (control->priv->client, NULL, error); -#endif + if (LOGIND_RUNNING()) { + /* sleep via logind */ + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + NULL, + &dbus_error ); + if (proxy == NULL) { + egg_error("Error connecting to dbus - %s", dbus_error->message); + g_error_free (dbus_error); + return -1; + } + g_dbus_proxy_call_sync (proxy, "Suspend", + g_variant_new( "(b)",FALSE), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &dbus_error + ); + if (dbus_error != NULL ) { + egg_debug ("Error in dbus - %s", dbus_error->message); + g_error_free (dbus_error); + ret = TRUE; + } + else { + ret = TRUE; + } + g_object_unref(proxy); + } + else { + ret = up_client_suspend_sync (control->priv->client, NULL, error); + } egg_debug ("emitting resume"); g_signal_emit (control, signals [RESUME], 0, GPM_CONTROL_ACTION_SUSPEND); @@ -278,23 +279,21 @@ gpm_control_hibernate (GpmControl *control, GError **error) MateKeyringResult keyres; #endif /* WITH_KEYRING */ -#ifdef WITH_SYSTEMD_SLEEP GError *dbus_error = NULL; DBusGProxy *proxy; -#endif screensaver = gpm_screensaver_new (); -#ifndef WITH_SYSTEMD_SLEEP - g_object_get (control->priv->client, - "can-hibernate", &allowed, - NULL); - if (!allowed) { - egg_debug ("cannot hibernate as not allowed from policy"); - g_set_error_literal (error, GPM_CONTROL_ERROR, GPM_CONTROL_ERROR_GENERAL, "Cannot hibernate"); - goto out; + if (!LOGIND_RUNNING()) { + g_object_get (control->priv->client, + "can-hibernate", &allowed, + NULL); + if (!allowed) { + egg_debug ("cannot hibernate as not allowed from policy"); + g_set_error_literal (error, GPM_CONTROL_ERROR, GPM_CONTROL_ERROR_GENERAL, "Cannot hibernate"); + goto out; + } } -#endif #ifdef WITH_KEYRING /* we should perhaps lock keyrings when sleeping #375681 */ @@ -320,39 +319,41 @@ gpm_control_hibernate (GpmControl *control, GError **error) egg_debug ("emitting sleep"); g_signal_emit (control, signals [SLEEP], 0, GPM_CONTROL_ACTION_HIBERNATE); -#ifdef WITH_SYSTEMD_SLEEP - /* sleep via logind */ - proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, - NULL, - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - NULL, - &dbus_error ); - if (proxy == NULL) { - egg_error("Error connecting to dbus - %s", dbus_error->message); - g_error_free (dbus_error); - return -1; - } - g_dbus_proxy_call_sync (proxy, "Hibernate", - g_variant_new( "(b)",FALSE), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &dbus_error - ); - if (dbus_error != NULL ) { - egg_debug ("Error in dbus - %s", dbus_error->message); - g_error_free (dbus_error); - ret = TRUE; - } - else { - ret = TRUE; - } -#else - ret = up_client_hibernate_sync (control->priv->client, NULL, error); -#endif + if (LOGIND_RUNNING()) { + /* sleep via logind */ + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + NULL, + &dbus_error ); + if (proxy == NULL) { + egg_error("Error connecting to dbus - %s", dbus_error->message); + g_error_free (dbus_error); + return -1; + } + g_dbus_proxy_call_sync (proxy, "Hibernate", + g_variant_new( "(b)",FALSE), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &dbus_error + ); + if (dbus_error != NULL ) { + egg_debug ("Error in dbus - %s", dbus_error->message); + g_error_free (dbus_error); + ret = TRUE; + } + else { + ret = TRUE; + } + } + else { + ret = up_client_hibernate_sync (control->priv->client, NULL, error); + } + egg_debug ("emitting resume"); g_signal_emit (control, signals [RESUME], 0, GPM_CONTROL_ACTION_HIBERNATE); diff --git a/src/gpm-prefs-core.c b/src/gpm-prefs-core.c index e84d0b1..600b943 100644 --- a/src/gpm-prefs-core.c +++ b/src/gpm-prefs-core.c @@ -812,11 +812,10 @@ gpm_prefs_init (GpmPrefs *prefs) GpmBrightness *brightness; gboolean ret; guint i; -#ifdef WITH_SYSTEMD_SLEEP + GDBusProxy *proxy; GVariant *res, *inner; gchar * r; -#endif prefs->priv = GPM_PREFS_GET_PRIVATE (prefs); @@ -828,104 +827,108 @@ gpm_prefs_init (GpmPrefs *prefs) prefs->priv->can_shutdown = TRUE; egg_console_kit_can_stop (prefs->priv->console, &prefs->priv->can_shutdown, NULL); -#ifdef WITH_SYSTEMD_SLEEP - /* get values from logind */ - - prefs->priv->can_suspend = FALSE; - prefs->priv->can_hibernate = FALSE; - proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, - NULL, - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - NULL, - &error ); - if (proxy == NULL) { - egg_error("Error connecting to dbus - %s", error->message); - g_error_free (error); - return -1; - } - res = g_dbus_proxy_call_sync (proxy, "CanSuspend", - NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error - ); - if (error == NULL && res != NULL) { - g_variant_get(res,"(s)", &r); - prefs->priv->can_suspend = g_strcmp0(r,"yes")==0?TRUE:FALSE; - g_variant_unref (res); - } else if (error != NULL ) { - egg_error ("Error in dbus - %s", error->message); - g_error_free (error); - } - - res = g_dbus_proxy_call_sync (proxy, "CanHibernate", - NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error - ); - if (error == NULL && res != NULL) { - g_variant_get(res,"(s)", &r); - prefs->priv->can_hibernate = g_strcmp0(r,"yes")==0?TRUE:FALSE; - g_variant_unref (res); - } else if (error != NULL ) { - egg_error ("Error in dbus - %s", error->message); - g_error_free (error); - } - g_object_unref(proxy); -#else - /* get values from UpClient */ - prefs->priv->can_suspend = up_client_get_can_suspend (prefs->priv->client); - prefs->priv->can_hibernate = up_client_get_can_hibernate (prefs->priv->client); -#endif -#ifdef WITH_SYSTEMD_SLEEP - proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, - NULL, - "org.freedesktop.UPower", - "/org/freedesktop/UPower", - "org.freedesktop.DBus.Properties", - NULL, - &error ); - if (proxy == NULL) { - egg_error("Error connecting to dbus - %s", error->message); - g_error_free (error); - return -1; - } - - res = g_dbus_proxy_call_sync (proxy, "Get", - g_variant_new( "(ss)", - "org.freedesktop.UPower", - "LidIsPresent"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error - ); - if (error == NULL && res != NULL) { - g_variant_get(res, "(v)", &inner ); - prefs->priv->has_button_lid = g_variant_get_boolean(inner); - g_variant_unref (inner); - g_variant_unref (res); - } else if (error != NULL ) { - egg_error ("Error in dbus - %s", error->message); - g_error_free (error); - } - g_object_unref(proxy); -#else + if (LOGIND_RUNNING()) { + /* get values from logind */ + + prefs->priv->can_suspend = FALSE; + prefs->priv->can_hibernate = FALSE; + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + NULL, + &error ); + if (proxy == NULL) { + egg_error("Error connecting to dbus - %s", error->message); + g_error_free (error); + return -1; + } + res = g_dbus_proxy_call_sync (proxy, "CanSuspend", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error + ); + if (error == NULL && res != NULL) { + g_variant_get(res,"(s)", &r); + prefs->priv->can_suspend = g_strcmp0(r,"yes")==0?TRUE:FALSE; + g_variant_unref (res); + } else if (error != NULL ) { + egg_error ("Error in dbus - %s", error->message); + g_error_free (error); + } + + res = g_dbus_proxy_call_sync (proxy, "CanHibernate", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error + ); + if (error == NULL && res != NULL) { + g_variant_get(res,"(s)", &r); + prefs->priv->can_hibernate = g_strcmp0(r,"yes")==0?TRUE:FALSE; + g_variant_unref (res); + } else if (error != NULL ) { + egg_error ("Error in dbus - %s", error->message); + g_error_free (error); + } + g_object_unref(proxy); + } + else { + /* get values from UpClient */ + prefs->priv->can_suspend = up_client_get_can_suspend (prefs->priv->client); + prefs->priv->can_hibernate = up_client_get_can_hibernate (prefs->priv->client); + } + + if (LOGIND_RUNNING()) { + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, + "org.freedesktop.UPower", + "/org/freedesktop/UPower", + "org.freedesktop.DBus.Properties", + NULL, + &error ); + if (proxy == NULL) { + egg_error("Error connecting to dbus - %s", error->message); + g_error_free (error); + return -1; + } + + res = g_dbus_proxy_call_sync (proxy, "Get", + g_variant_new( "(ss)", + "org.freedesktop.UPower", + "LidIsPresent"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error + ); + if (error == NULL && res != NULL) { + g_variant_get(res, "(v)", &inner ); + prefs->priv->has_button_lid = g_variant_get_boolean(inner); + g_variant_unref (inner); + g_variant_unref (res); + } else if (error != NULL ) { + egg_error ("Error in dbus - %s", error->message); + g_error_free (error); + } + g_object_unref(proxy); + } + else { #if UP_CHECK_VERSION(0,9,2) - prefs->priv->has_button_lid = up_client_get_lid_is_present (prefs->priv->client); + prefs->priv->has_button_lid = up_client_get_lid_is_present (prefs->priv->client); #else - g_object_get (prefs->priv->client, - "lid-is-present", &prefs->priv->has_button_lid, - NULL); -#endif + g_object_get (prefs->priv->client, + "lid-is-present", &prefs->priv->has_button_lid, + NULL); #endif + } + prefs->priv->has_button_suspend = TRUE; /* find if we have brightness hardware */ -- cgit v1.2.1 From 352ad899ab041bce07f56a3bc4af0469844b4105 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Thu, 4 Jul 2013 23:39:48 +0200 Subject: drop --with-systemdinhibit and move logind detection to runtime There is no need to bind the user to either systemd-logind or upower at build time. People can switch between init systems or run logind without systemd. --- src/Makefile.am | 1 - src/gpm-manager.c | 43 ++++++++++++++++--------------------------- 2 files changed, 16 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index 5fda8ee..a10b98b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -194,7 +194,6 @@ mate_power_manager_LDADD = \ $(LIBNOTIFY_LIBS) \ $(GPM_EXTRA_LIBS) \ $(UPOWER_LIBS) \ - $(SYSTEMD_INHIBIT_LIBS) \ -lm mate_power_manager_CFLAGS = \ diff --git a/src/gpm-manager.c b/src/gpm-manager.c index 9b697b5..c99bd09 100644 --- a/src/gpm-manager.c +++ b/src/gpm-manager.c @@ -33,9 +33,6 @@ #ifdef HAVE_UNISTD_H #include #endif /* HAVE_UNISTD_H */ -#ifdef WITH_SYSTEMD_INHIBIT -#include -#endif /* WITH_SYSTEMD_INHIBIT */ #include #include @@ -103,10 +100,8 @@ struct GpmManagerPrivate NotifyNotification *notification_warning_low; NotifyNotification *notification_discharging; NotifyNotification *notification_fully_charged; -#ifdef WITH_SYSTEMD_INHIBIT gint32 systemd_inhibit; GDBusProxy *systemd_inhibit_proxy; -#endif }; typedef enum { @@ -1847,9 +1842,8 @@ gpm_manager_control_resume_cb (GpmControl *control, GpmControlAction action, Gpm g_timeout_add_seconds (1, gpm_manager_reset_just_resumed_cb, manager); } -#ifdef WITH_SYSTEMD_INHIBIT /** - * gpm_main_system_inhibit: + * gpm_main_systemd_inhibit: * * Return a fd to the to the inhibitor, that we can close on exit. * @@ -1917,7 +1911,6 @@ gpm_manager_systemd_inhibit (GDBusProxy *proxy) { egg_debug ("Inhibiting systemd sleep - success"); return r; } -#endif /** * gpm_manager_init: @@ -1929,20 +1922,17 @@ gpm_manager_init (GpmManager *manager) gboolean check_type_cpu; gint timeout; DBusGConnection *connection; - GDBusConnection *g_connection; + GDBusConnection *g_connection; GError *error = NULL; manager->priv = GPM_MANAGER_GET_PRIVATE (manager); connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); - g_connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); - -#ifdef WITH_SYSTEMD_INHIBIT - /* We want to inhibit the systemd suspend options, and take care of them ourselves */ - if (sd_booted() > 0) { - manager->priv->systemd_inhibit = gpm_manager_systemd_inhibit (manager->priv->systemd_inhibit_proxy); - } + g_connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); -#endif + /* We want to inhibit the systemd suspend options, and take care of them ourselves */ + if (LOGIND_RUNNING()) { + manager->priv->systemd_inhibit = gpm_manager_systemd_inhibit (manager->priv->systemd_inhibit_proxy); + } /* init to unthrottled */ manager->priv->screensaver_ac_throttle_id = 0; @@ -2101,16 +2091,15 @@ gpm_manager_finalize (GObject *object) g_object_unref (manager->priv->client); g_object_unref (manager->priv->status_icon); -#ifdef WITH_SYSTEMD_INHIBIT - /* Let systemd take over again ... */ - if (manager->priv->systemd_inhibit > 0) { - close(manager->priv->systemd_inhibit); - } - if (manager->priv->systemd_inhibit_proxy != NULL) { - g_object_unref (manager->priv->systemd_inhibit_proxy); - } - //g_object_unref (manager->priv->systemd_inhibit); -#endif + if (LOGIND_RUNNING()) { + /* Let systemd take over again ... */ + if (manager->priv->systemd_inhibit > 0) { + close(manager->priv->systemd_inhibit); + } + if (manager->priv->systemd_inhibit_proxy != NULL) { + g_object_unref (manager->priv->systemd_inhibit_proxy); + } + } G_OBJECT_CLASS (gpm_manager_parent_class)->finalize (object); } -- cgit v1.2.1 From c53504907c06e8f20272ad32ff8e516f36d92ddb Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Wed, 10 Jul 2013 13:32:33 +0200 Subject: gpm-prefs-core: fix can_shutdown when logind is in use --- src/gpm-prefs-core.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/gpm-prefs-core.c b/src/gpm-prefs-core.c index 600b943..ee63674 100644 --- a/src/gpm-prefs-core.c +++ b/src/gpm-prefs-core.c @@ -823,15 +823,13 @@ gpm_prefs_init (GpmPrefs *prefs) prefs->priv->console = egg_console_kit_new (); prefs->priv->settings = g_settings_new (GPM_SETTINGS_SCHEMA); - /* are we allowed to shutdown? */ - prefs->priv->can_shutdown = TRUE; - egg_console_kit_can_stop (prefs->priv->console, &prefs->priv->can_shutdown, NULL); + prefs->priv->can_shutdown = FALSE; + prefs->priv->can_suspend = FALSE; + prefs->priv->can_hibernate = FALSE; if (LOGIND_RUNNING()) { /* get values from logind */ - prefs->priv->can_suspend = FALSE; - prefs->priv->can_hibernate = FALSE; proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL, @@ -845,6 +843,23 @@ gpm_prefs_init (GpmPrefs *prefs) g_error_free (error); return -1; } + + res = g_dbus_proxy_call_sync (proxy, "CanPowerOff", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error + ); + if (error == NULL && res != NULL) { + g_variant_get(res,"(s)", &r); + prefs->priv->can_shutdown = g_strcmp0(r,"yes")==0?TRUE:FALSE; + g_variant_unref (res); + } else if (error != NULL ) { + egg_error ("Error in dbus - %s", error->message); + g_error_free (error); + } + res = g_dbus_proxy_call_sync (proxy, "CanSuspend", NULL, G_DBUS_CALL_FLAGS_NONE, @@ -879,6 +894,8 @@ gpm_prefs_init (GpmPrefs *prefs) g_object_unref(proxy); } else { + /* are we allowed to shutdown? */ + egg_console_kit_can_stop (prefs->priv->console, &prefs->priv->can_shutdown, NULL); /* get values from UpClient */ prefs->priv->can_suspend = up_client_get_can_suspend (prefs->priv->client); prefs->priv->can_hibernate = up_client_get_can_hibernate (prefs->priv->client); -- cgit v1.2.1 From c415be077de603ac1a5f4fafc6df649e12bc6118 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Wed, 10 Jul 2013 14:10:03 +0200 Subject: Add systemd Shutdown() API support to gpm-control.c --- src/gpm-control.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/gpm-control.c b/src/gpm-control.c index d0db730..d7ba36c 100644 --- a/src/gpm-control.c +++ b/src/gpm-control.c @@ -85,6 +85,50 @@ gpm_control_error_quark (void) return quark; } +/** + * gpm_manager_systemd_shutdown: + * + * Shutdown the system using systemd-logind. + * + * Return value: fd, -1 on error + **/ +static gboolean +gpm_control_systemd_shutdown (void) { + GError *error = NULL; + DBusGProxy *proxy; + + egg_debug ("Requesting systemd to shutdown"); + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + NULL, + &error ); + //append all our arguments + if (proxy == NULL) { + egg_error("Error connecting to dbus - %s", error->message); + g_error_free (error); + return FALSE; + } + + g_dbus_proxy_call_sync (proxy, "PowerOff", + g_variant_new( "(b)", FALSE), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error + ); + if (error != NULL) { + egg_error ("Error in dbus - %s", error->message); + g_error_free (error); + return FALSE; + } + + return TRUE; +} + /** * gpm_control_shutdown: * @control: This class instance @@ -96,9 +140,14 @@ gpm_control_shutdown (GpmControl *control, GError **error) { gboolean ret; EggConsoleKit *console; - console = egg_console_kit_new (); - ret = egg_console_kit_stop (console, error); - g_object_unref (console); + + if (LOGIND_RUNNING()) { + ret = gpm_control_systemd_shutdown (); + } else { + console = egg_console_kit_new (); + ret = egg_console_kit_stop (console, error); + g_object_unref (console); + } return ret; } -- cgit v1.2.1 From 247f3aeeffd20e0971641d8bb9ab1337f81991cd Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Wed, 10 Jul 2013 14:22:44 +0200 Subject: Fix gpm_prefs_init return values --- src/gpm-prefs-core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/gpm-prefs-core.c b/src/gpm-prefs-core.c index ee63674..d1795dd 100644 --- a/src/gpm-prefs-core.c +++ b/src/gpm-prefs-core.c @@ -841,7 +841,7 @@ gpm_prefs_init (GpmPrefs *prefs) if (proxy == NULL) { egg_error("Error connecting to dbus - %s", error->message); g_error_free (error); - return -1; + return; } res = g_dbus_proxy_call_sync (proxy, "CanPowerOff", @@ -913,7 +913,7 @@ gpm_prefs_init (GpmPrefs *prefs) if (proxy == NULL) { egg_error("Error connecting to dbus - %s", error->message); g_error_free (error); - return -1; + return; } res = g_dbus_proxy_call_sync (proxy, "Get", -- cgit v1.2.1