summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2011-10-03 16:19:23 +0100
committerRichard Hughes <richard@hughsie.com>2011-10-03 17:46:21 +0100
commit55daaf0972c0021a20624dcd16df5e14cca5d430 (patch)
treebe96886a989cecc0fb99639dc5232e18a7b373a1
parent9fd6e6a988eaeaccae4545a61bbbd9ae9682b48d (diff)
downloadgnome-desktop-55daaf0972c0021a20624dcd16df5e14cca5d430.tar.gz
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
-rw-r--r--libgnome-desktop/gnome-rr.c57
1 files changed, 53 insertions, 4 deletions
diff --git a/libgnome-desktop/gnome-rr.c b/libgnome-desktop/gnome-rr.c
index d5f0590e..465dee91 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;
}