diff options
author | Nicolás Reynolds <fauno@endefensadelsl.org> | 2014-01-17 03:43:05 +0000 |
---|---|---|
committer | Nicolás Reynolds <fauno@endefensadelsl.org> | 2014-01-17 03:43:05 +0000 |
commit | 953eead14ccfe47904e73cee9cea6e1255f57356 (patch) | |
tree | 8727303ca854032eb046995d052805c969755f30 /community/mate-session-manager/f0b5b1ab78879d64f80117415aacf029359afea5.diff | |
parent | b296a78e1469d58c52acc47586bd5bb84f25fc0f (diff) |
Fri Jan 17 03:37:47 UTC 2014
Diffstat (limited to 'community/mate-session-manager/f0b5b1ab78879d64f80117415aacf029359afea5.diff')
-rw-r--r-- | community/mate-session-manager/f0b5b1ab78879d64f80117415aacf029359afea5.diff | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/community/mate-session-manager/f0b5b1ab78879d64f80117415aacf029359afea5.diff b/community/mate-session-manager/f0b5b1ab78879d64f80117415aacf029359afea5.diff new file mode 100644 index 000000000..ffbe19a5d --- /dev/null +++ b/community/mate-session-manager/f0b5b1ab78879d64f80117415aacf029359afea5.diff @@ -0,0 +1,271 @@ +diff --git a/mate-session/gsm-logout-dialog.c b/mate-session/gsm-logout-dialog.c +index 2d2947c..1a79875 100644 +--- a/mate-session/gsm-logout-dialog.c ++++ b/mate-session/gsm-logout-dialog.c +@@ -200,13 +200,29 @@ enum { + 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 +diff --git a/mate-session/gsm-manager.c b/mate-session/gsm-manager.c +index 8143d1f..b4986ac 100644 +--- a/mate-session/gsm-manager.c ++++ b/mate-session/gsm-manager.c +@@ -1109,6 +1109,20 @@ enum { + 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) { + +@@ -1123,6 +1137,9 @@ enum { + g_error_free (error); + } + } ++#ifdef HAVE_SYSTEMD ++ } ++#endif + } + + static void +@@ -1132,6 +1149,20 @@ enum { + 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) { + +@@ -1146,6 +1177,9 @@ enum { + g_error_free (error); + } + } ++#ifdef HAVE_SYSTEMD ++ } ++#endif + } + + static void +diff --git a/mate-session/gsm-systemd.c b/mate-session/gsm-systemd.c +index 377f026..dbe8ea0 100644 +--- a/mate-session/gsm-systemd.c ++++ b/mate-session/gsm-systemd.c +@@ -725,6 +725,141 @@ static void gsm_systemd_on_name_owner_changed (DBusGProxy *bus_proxy, + 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) + { +diff --git a/mate-session/gsm-systemd.h b/mate-session/gsm-systemd.h +index 8e886ba..e0e21c4 100644 +--- a/mate-session/gsm-systemd.h ++++ b/mate-session/gsm-systemd.h +@@ -89,10 +89,18 @@ enum _GsmSystemdError { + + 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); + |