Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37846803
en ru br
Репозитории ALT

Группа :: Graphical desktop/MATE
Пакет: mate-session

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: mate-session-manager-1.6.1-login1.patch
Скачать


diff -up mate-session-manager-1.6.1/mate-session/gsm-logout-dialog.c.login1 mate-session-manager-1.6.1/mate-session/gsm-logout-dialog.c
--- mate-session-manager-1.6.1/mate-session/gsm-logout-dialog.c.login1	2013-07-25 10:35:06.000000000 -0500
+++ mate-session-manager-1.6.1/mate-session/gsm-logout-dialog.c	2013-09-10 08:25:55.450880450 -0500
@@ -200,13 +200,29 @@ gsm_logout_dialog_destroy (GsmLogoutDial
 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 -up mate-session-manager-1.6.1/mate-session/gsm-manager.c.login1 mate-session-manager-1.6.1/mate-session/gsm-manager.c
--- mate-session-manager-1.6.1/mate-session/gsm-manager.c.login1	2013-07-25 10:35:06.000000000 -0500
+++ mate-session-manager-1.6.1/mate-session/gsm-manager.c	2013-09-10 08:39:41.199847380 -0500
@@ -1101,6 +1101,20 @@ manager_attempt_hibernate (GsmManager *m
         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) {
 
@@ -1115,6 +1129,9 @@ manager_attempt_hibernate (GsmManager *m
                         g_error_free (error);
                 }
         }
+#ifdef HAVE_SYSTEMD
+        }
+#endif
 }
 
 static void
@@ -1124,6 +1141,20 @@ manager_attempt_suspend (GsmManager *man
         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) {
 
@@ -1138,6 +1169,9 @@ manager_attempt_suspend (GsmManager *man
                         g_error_free (error);
                 }
         }
+#ifdef HAVE_SYSTEMD
+        }
+#endif
 }
 
 static void
diff -up mate-session-manager-1.6.1/mate-session/gsm-systemd.c.login1 mate-session-manager-1.6.1/mate-session/gsm-systemd.c
--- mate-session-manager-1.6.1/mate-session/gsm-systemd.c.login1	2013-07-25 10:35:06.000000000 -0500
+++ mate-session-manager-1.6.1/mate-session/gsm-systemd.c	2013-09-10 08:51:06.174857597 -0500
@@ -725,6 +725,141 @@ gsm_systemd_can_stop (GsmSystemd *manage
     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 -up mate-session-manager-1.6.1/mate-session/gsm-systemd.h.login1 mate-session-manager-1.6.1/mate-session/gsm-systemd.h
--- mate-session-manager-1.6.1/mate-session/gsm-systemd.h.login1	2013-07-25 10:35:06.000000000 -0500
+++ mate-session-manager-1.6.1/mate-session/gsm-systemd.h	2013-09-10 08:39:15.689107516 -0500
@@ -89,10 +89,18 @@ gboolean         gsm_systemd_can_stop
 
 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);
 
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin