diff options
author | Richard Hughes <richard@hughsie.com> | 2011-10-03 16:19:23 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2011-10-03 17:46:21 +0100 |
commit | 55daaf0972c0021a20624dcd16df5e14cca5d430 (patch) | |
tree | be96886a989cecc0fb99639dc5232e18a7b373a1 | |
parent | 9fd6e6a988eaeaccae4545a61bbbd9ae9682b48d (diff) | |
download | gnome-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.c | 57 |
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, ¤t_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; } |