[gnome-desktop/gnome-3-2] When setting the DPMS mode manually, clear the timeouts



commit 55daaf0972c0021a20624dcd16df5e14cca5d430
Author: Richard Hughes <richard hughsie com>
Date:   Mon Oct 3 16:19:23 2011 +0100

    When setting the DPMS mode manually, clear the timeouts
    
    Based on a patch from Michael Vogt, many thanks.
    
    Resolves https://bugzilla.gnome.org/show_bug.cgi?id=660482

 libgnome-desktop/gnome-rr.c |   57 ++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 53 insertions(+), 4 deletions(-)
---
diff --git a/libgnome-desktop/gnome-rr.c b/libgnome-desktop/gnome-rr.c
index d5f0590..465dee9 100644
--- a/libgnome-desktop/gnome-rr.c
+++ b/libgnome-desktop/gnome-rr.c
@@ -1234,7 +1234,36 @@ out:
 }
 
 /**
+ * gnome_rr_screen_clear_dpms_timeouts:
+ **/
+static gboolean
+gnome_rr_screen_clear_dpms_timeouts (GnomeRRScreen *screen,
+                                     GError **error)
+{
+    gboolean ret = TRUE;
+    gint rc;
+
+    gdk_error_trap_push ();
+    rc = DPMSSetTimeouts (screen->priv->xdisplay, 0, 0, 0);
+    if (gdk_error_trap_pop ())
+        ret = FALSE;
+
+    if (!ret || rc != Success) {
+        ret = FALSE;
+        g_set_error_literal (error,
+                             GNOME_RR_ERROR,
+                             GNOME_RR_ERROR_UNKNOWN,
+                             "Could not set DPMS timeouts");
+        goto out;
+    }
+out:
+    return ret;
+}
+
+/**
  * gnome_rr_screen_set_dpms_mode:
+ *
+ * This method also disables the DPMS timeouts.
  **/
 gboolean
 gnome_rr_screen_set_dpms_mode (GnomeRRScreen *screen,
@@ -1243,6 +1272,7 @@ gnome_rr_screen_set_dpms_mode (GnomeRRScreen *screen,
 {
     CARD16 state = 0;
     gboolean ret;
+    gint rc;
     GnomeRRDpmsMode current_mode;
 
     g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -1251,8 +1281,10 @@ gnome_rr_screen_set_dpms_mode (GnomeRRScreen *screen,
     ret = gnome_rr_screen_get_dpms_mode (screen, &current_mode, error);
     if (!ret)
         goto out;
-    if (current_mode == mode)
+    if (current_mode == mode) {
+        ret = gnome_rr_screen_clear_dpms_timeouts (screen, error);
         goto out;
+    }
 
     switch (mode) {
     case GNOME_RR_DPMS_ON:
@@ -1273,12 +1305,11 @@ gnome_rr_screen_set_dpms_mode (GnomeRRScreen *screen,
     }
 
     gdk_error_trap_push ();
-    ret = DPMSForceLevel (screen->priv->xdisplay, state);
-    gdk_flush ();
+    rc = DPMSForceLevel (screen->priv->xdisplay, state);
     if (gdk_error_trap_pop ())
         ret = FALSE;
 
-    if (!ret) {
+    if (!ret || rc != Success) {
         ret = FALSE;
         g_set_error_literal (error,
                              GNOME_RR_ERROR,
@@ -1286,6 +1317,24 @@ gnome_rr_screen_set_dpms_mode (GnomeRRScreen *screen,
                              "Could not change DPMS mode");
         goto out;
     }
+
+    gdk_error_trap_push ();
+    rc = DPMSSetTimeouts (screen->priv->xdisplay, 0, 0, 0);
+    if (gdk_error_trap_pop ())
+        ret = FALSE;
+
+    if (!ret || rc != Success) {
+        ret = FALSE;
+        g_set_error_literal (error,
+                             GNOME_RR_ERROR,
+                             GNOME_RR_ERROR_UNKNOWN,
+                             "Could not set DPMS timeouts");
+        goto out;
+    }
+
+    ret = gnome_rr_screen_clear_dpms_timeouts (screen, error);
+    if (!ret)
+        goto out;
 out:
     return ret;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]