Skip to content

Commit

Permalink
fix systemd-login1 support for hibernate/suspend
Browse files Browse the repository at this point in the history
  • Loading branch information
raveit65 committed Sep 12, 2013
1 parent f37bbe8 commit f0b5b1a
Show file tree
Hide file tree
Showing 4 changed files with 195 additions and 2 deletions.
20 changes: 18 additions & 2 deletions mate-session/gsm-logout-dialog.c
Expand Up @@ -200,13 +200,29 @@ gsm_logout_dialog_destroy (GsmLogoutDialog *logout_dialog,
static gboolean
gsm_logout_supports_system_suspend (GsmLogoutDialog *logout_dialog)
{
return up_client_get_can_suspend (logout_dialog->priv->up_client);
gboolean ret;
#ifdef HAVE_SYSTEMD
if (LOGIND_RUNNING())
ret = gsm_systemd_can_suspend (logout_dialog->priv->systemd);
else
#endif
ret = up_client_get_can_suspend (logout_dialog->priv->up_client);

return ret;
}

static gboolean
gsm_logout_supports_system_hibernate (GsmLogoutDialog *logout_dialog)
{
return up_client_get_can_hibernate (logout_dialog->priv->up_client);
gboolean ret;
#ifdef HAVE_SYSTEMD
if (LOGIND_RUNNING())
ret = gsm_systemd_can_hibernate (logout_dialog->priv->systemd);
else
#endif
ret = up_client_get_can_hibernate (logout_dialog->priv->up_client);

return ret;
}

static gboolean
Expand Down
34 changes: 34 additions & 0 deletions mate-session/gsm-manager.c
Expand Up @@ -1109,6 +1109,20 @@ manager_attempt_hibernate (GsmManager *manager)
GError *error;
gboolean ret;

#ifdef HAVE_SYSTEMD
if (LOGIND_RUNNING()) {

GsmSystemd *systemd;

systemd = gsm_get_systemd ();

/* lock the screen before we suspend */
manager_perhaps_lock (manager);

gsm_systemd_attempt_hibernate (systemd);
}
else {
#endif
can_hibernate = up_client_get_can_hibernate (manager->priv->up_client);
if (can_hibernate) {

Expand All @@ -1123,6 +1137,9 @@ manager_attempt_hibernate (GsmManager *manager)
g_error_free (error);
}
}
#ifdef HAVE_SYSTEMD
}
#endif
}

static void
Expand All @@ -1132,6 +1149,20 @@ manager_attempt_suspend (GsmManager *manager)
GError *error;
gboolean ret;

#ifdef HAVE_SYSTEMD
if (LOGIND_RUNNING()) {

GsmSystemd *systemd;

systemd = gsm_get_systemd ();

/* lock the screen before we suspend */
manager_perhaps_lock (manager);

gsm_systemd_attempt_suspend (systemd);
}
else {
#endif
can_suspend = up_client_get_can_suspend (manager->priv->up_client);
if (can_suspend) {

Expand All @@ -1146,6 +1177,9 @@ manager_attempt_suspend (GsmManager *manager)
g_error_free (error);
}
}
#ifdef HAVE_SYSTEMD
}
#endif
}

static void
Expand Down
135 changes: 135 additions & 0 deletions mate-session/gsm-systemd.c
Expand Up @@ -725,6 +725,141 @@ gsm_systemd_can_stop (GsmSystemd *manager)
return can_stop;
}

gboolean
gsm_systemd_can_hibernate (GsmSystemd *manager)
{
gboolean res;
gchar *value;
gboolean can_hibernate;
GError *error;

error = NULL;

if (!gsm_systemd_ensure_sd_connection (manager, &error)) {
g_warning ("Could not connect to Systemd: %s",
error->message);
g_error_free (error);
return FALSE;
}

res = dbus_g_proxy_call_with_timeout (manager->priv->sd_proxy,
"CanHibernate",
INT_MAX,
&error,
G_TYPE_INVALID,
G_TYPE_STRING, &value,
G_TYPE_INVALID);
if (res == FALSE) {
g_warning ("Could not make DBUS call: %s",
error->message);
g_error_free (error);
return FALSE;
}

can_hibernate = g_strcmp0 (value, "yes") == 0 ||
g_strcmp0 (value, "challenge") == 0;
g_free (value);
return can_hibernate;
}

gboolean
gsm_systemd_can_suspend (GsmSystemd *manager)
{
gboolean res;
gchar *value;
gboolean can_suspend;
GError *error;

error = NULL;

if (!gsm_systemd_ensure_sd_connection (manager, &error)) {
g_warning ("Could not connect to Systemd: %s",
error->message);
g_error_free (error);
return FALSE;
}

res = dbus_g_proxy_call_with_timeout (manager->priv->sd_proxy,
"CanSuspend",
INT_MAX,
&error,
G_TYPE_INVALID,
G_TYPE_STRING, &value,
G_TYPE_INVALID);
if (res == FALSE) {
g_warning ("Could not make DBUS call: %s",
error->message);
g_error_free (error);
return FALSE;
}

can_suspend = g_strcmp0 (value, "yes") == 0 ||
g_strcmp0 (value, "challenge") == 0;
g_free (value);
return can_suspend;
}

void
gsm_systemd_attempt_hibernate (GsmSystemd *manager)
{
gboolean res;
GError *error;

error = NULL;

if (!gsm_systemd_ensure_sd_connection (manager, &error)) {
g_warning ("Could not connect to Systemd: %s",
error->message);
g_error_free (error);
return FALSE;
}

res = dbus_g_proxy_call_with_timeout (manager->priv->sd_proxy,
"Hibernate",
INT_MAX,
&error,
G_TYPE_BOOLEAN, TRUE, /* interactive */
G_TYPE_INVALID,
G_TYPE_INVALID);
if (res == FALSE) {
g_warning ("Could not make DBUS call: %s",
error->message);
g_error_free (error);
return FALSE;
}

}

void
gsm_systemd_attempt_suspend (GsmSystemd *manager)
{
gboolean res;
GError *error;

error = NULL;

if (!gsm_systemd_ensure_sd_connection (manager, &error)) {
g_warning ("Could not connect to Systemd: %s",
error->message);
g_error_free (error);
return FALSE;
}

res = dbus_g_proxy_call_with_timeout (manager->priv->sd_proxy,
"Suspend",
INT_MAX,
&error,
G_TYPE_BOOLEAN, TRUE, /* interactive */
G_TYPE_INVALID,
G_TYPE_INVALID);
if (res == FALSE) {
g_warning ("Could not make DBUS call: %s",
error->message);
g_error_free (error);
return FALSE;
}
}

gchar *
gsm_systemd_get_current_session_type (GsmSystemd *manager)
{
Expand Down
8 changes: 8 additions & 0 deletions mate-session/gsm-systemd.h
Expand Up @@ -89,10 +89,18 @@ gboolean gsm_systemd_can_stop (GsmSystemd *manager);

gboolean gsm_systemd_can_restart (GsmSystemd *manager);

gboolean gsm_systemd_can_hibernate (GsmSystemd *manager);

gboolean gsm_systemd_can_suspend (GsmSystemd *manager);

void gsm_systemd_attempt_stop (GsmSystemd *manager);

void gsm_systemd_attempt_restart (GsmSystemd *manager);

void gsm_systemd_attempt_hibernate (GsmSystemd *manager);

void gsm_systemd_attempt_suspend (GsmSystemd *manager);

void gsm_systemd_set_session_idle (GsmSystemd *manager,
gboolean is_idle);

Expand Down

0 comments on commit f0b5b1a

Please sign in to comment.