Index: libs/libmyth/screensaver-x11.cpp
===================================================================
--- libs/libmyth/screensaver-x11.cpp	(revision 6733)
+++ libs/libmyth/screensaver-x11.cpp	(working copy)
@@ -1,14 +1,25 @@
 #define QT_CLEAN_NAMESPACE // no qt 1.x compatability, INT32 conflicts with X
+
 #include "screensaver-x11.h"
 
+#include <qdir.h>
+#include <qfile.h>
+
 #include <X11/Xlib.h>
 
+
 extern "C" {
 #include <X11/extensions/dpms.h>
 }
 
 #include "mythcontext.h"
+#include "util.h"
 
+#include <iostream>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qregexp.h>
+
 class ScreenSaverX11Private 
 {
     struct 
@@ -19,19 +30,80 @@
         int preferblank;
         int allowexposure;
         bool dpmsdisabled;
+        bool xscreensaverRunning;
     } state;
 
     friend class ScreenSaverX11;
 };
 
+bool ScreenSaverX11::processRunning(const QString& pName)
+{
+    QDir procDir(QString("/proc"));
+    procDir.setFilter(QDir::Dirs | QDir::Readable);
+    if (procDir.exists())
+    {
+        QStringList processes = procDir.entryList();
+        for (QStringList::iterator i = processes.begin(); i != processes.end(); i++)
+        {
+            QString process = *i;
+            QRegExp rx( "^\\d+$" );
+            if (rx.search(process) == 0)
+            {
+                QFile processStatFile(QString("/proc/%1/stat").arg(process));
+                if (processStatFile.open(IO_ReadOnly))
+                {
+                    QTextStream stream(&processStatFile);
+                    QString processName;
+                    stream >> processName >> processName;
+                    processStatFile.close();
+                    if (QString("(%1)").arg(pName) == processName)
+                    {
+                        return true;
+                    }
+                }
+            }
+        }
+    } 
+    return false;
+}
+
+ScreenSaverXSSTimer::ScreenSaverXSSTimer() 
+{
+    resetTimer = new QTimer();
+    connect(resetTimer, SIGNAL(timeout()), this, SLOT(resetSlot()));
+}
+
+ScreenSaverXSSTimer::~ScreenSaverXSSTimer() 
+{
+    delete resetTimer;
+}
+
+void ScreenSaverXSSTimer::resetXSS() 
+{
+    myth_system(QString("xscreensaver-command -deactivate >&- 2>&- &")); 
+}
+
+void ScreenSaverXSSTimer::resetSlot() 
+{
+    resetXSS();
+}
+
 ScreenSaverX11::ScreenSaverX11() 
 {
     d = new ScreenSaverX11Private();
+    d->state.xscreensaverRunning = processRunning("xscreensaver");
+    if (d->state.xscreensaverRunning) 
+    {
+        t = new ScreenSaverXSSTimer();
+        t->timeoutInterval = -1;
+        VERBOSE(VB_GENERAL, QString("XScreenSaver support enabled"));
+    }
 }
 
 ScreenSaverX11::~ScreenSaverX11() 
 {
     delete d;
+    delete t; 
 }
 
 void ScreenSaverX11::Disable(void) 
@@ -63,6 +135,25 @@
             VERBOSE(VB_GENERAL, "Disable DPMS");
         }
     }
+
+    if (d->state.xscreensaverRunning)
+    {
+        if (t->resetTimer)
+        {
+            t->resetTimer->stop();
+        }
+        if (t->timeoutInterval == -1)
+        {
+            t->timeoutInterval = 
+                gContext->GetNumSettingOnHost("xscreensaverInterval",
+                                          gContext->GetHostName(),
+                                          60) * 1000;
+        }
+        if (t->timeoutInterval > 0)
+        {
+            t->resetTimer->start(t->timeoutInterval, FALSE);
+        }
+    }
 }
 
 void ScreenSaverX11::Restore(void) 
@@ -84,10 +175,22 @@
             VERBOSE(VB_GENERAL, "Enable DPMS");
         }
     }
+
+    if (d->state.xscreensaverRunning)
+    {
+        if (t->resetTimer)
+        {
+            t->resetTimer->stop();
+        }
+    }
 }
 
 void ScreenSaverX11::Reset(void) 
 {
     XResetScreenSaver(qt_xdisplay());
+    if (d->state.xscreensaverRunning)
+    {
+        t->resetXSS();
+    }
 }
 
Index: libs/libmyth/screensaver-x11.h
===================================================================
--- libs/libmyth/screensaver-x11.h	(revision 6733)
+++ libs/libmyth/screensaver-x11.h	(working copy)
@@ -3,6 +3,24 @@
 
 #include "screensaver.h"
 
+#include <qobject.h> 
+#include <qtimer.h> 
+
+class ScreenSaverXSSTimer : public QObject
+{
+    Q_OBJECT
+public:
+    ScreenSaverXSSTimer();
+    ~ScreenSaverXSSTimer();
+    void resetXSS(void);
+    int timeoutInterval;
+    QTimer *resetTimer;
+        
+private slots:
+    void resetSlot();
+
+};
+
 class ScreenSaverX11 : public ScreenSaverControl
 {
 public:
@@ -12,9 +30,13 @@
     void Disable(void);
     void Restore(void);
     void Reset(void);
-
+    
+private:
+    bool processRunning(const QString& pName);
+    
 protected:
     class ScreenSaverX11Private *d;
+    class ScreenSaverXSSTimer *t;
 };
 
 #endif // MYTH_SCREENSAVER_X11_H
