[mythtv] [patch] screensaver DPMS support

Andrew Dennison andrew-lists at optusnet.com.au
Mon Dec 13 11:07:05 UTC 2004


This patch adds support to disable DPMS when myth disables the 
screensaver. Concept borrowed from mplayer, but I left out the hacks 
that work around bugs on older DPMS versions.

Only quirk is that I had to define QT_CLEAN_NAMESPACE to turn off 
"source compatibility with Qt 1.x" due to a clash with X headers. Maybe 
this could be moved to the main flags instead?

Andrew
-------------- next part --------------
Index: libs/libmyth/screensaver-x11.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmyth/screensaver-x11.cpp,v
retrieving revision 1.3
diff -u -b -B -w -p -r1.3 screensaver-x11.cpp
--- libs/libmyth/screensaver-x11.cpp	26 Aug 2004 23:57:55 -0000	1.3
+++ libs/libmyth/screensaver-x11.cpp	13 Dec 2004 10:49:49 -0000
@@ -1,7 +1,13 @@
+#define QT_CLEAN_NAMESPACE // no qt 1.x compatability, INT32 conflicts with X
 #include "screensaver.h"
+#include "mythcontext.h"
 
 #include <X11/Xlib.h>
 
+extern "C" {
+#include <X11/extensions/dpms.h>
+}
+
 class ScreenSaverPrivate 
 {
     struct 
@@ -11,6 +17,7 @@ class ScreenSaverPrivate 
         int interval;
         int preferblank;
         int allowexposure;
+        bool dpmsdisabled;
     } state;
 
     friend class ScreenSaverControl;
@@ -40,6 +47,22 @@ void ScreenSaverControl::Disable(void) 
 
     XResetScreenSaver(qt_xdisplay());
     XSetScreenSaver(qt_xdisplay(), 0, 0, 0, 0);
+
+    int nothing;
+
+    if (DPMSQueryExtension(qt_xdisplay(), &nothing, &nothing))
+    {
+        BOOL on;
+        CARD16 power_level;
+
+        DPMSInfo(qt_xdisplay(), &power_level, &on);
+        if (on)
+        {
+            d->state.dpmsdisabled = true;
+            DPMSDisable(qt_xdisplay());       // monitor powersave off
+            VERBOSE(VB_GENERAL, "Disable DPMS");
+        }
+    }
 }
 
 void ScreenSaverControl::Restore(void) 
@@ -50,6 +73,17 @@ void ScreenSaverControl::Restore(void) 
                     d->state.preferblank, 
                     d->state.allowexposure);
     d->state.saved = false;
+
+    if (d->state.dpmsdisabled)
+    {
+        int nothing;
+        d->state.dpmsdisabled = false;
+        if (DPMSQueryExtension(qt_xdisplay(), &nothing, &nothing))
+        {
+            DPMSEnable(qt_xdisplay());
+            VERBOSE(VB_GENERAL, "Enable DPMS");
+        }
+    }
 }
 
 void ScreenSaverControl::Reset(void) 


More information about the mythtv-dev mailing list