Ticket #29: screensaver-x11-1.1.diff

File screensaver-x11-1.1.diff, 4.7 KB (added by neil@…, 21 years ago)

(1.1) replacement patch using runtime detection

  • libs/libmyth/screensaver-x11.cpp

     
    11#define QT_CLEAN_NAMESPACE // no qt 1.x compatability, INT32 conflicts with X
     2
    23#include "screensaver-x11.h"
    34
     5#include <qdir.h>
     6#include <qfile.h>
     7
    48#include <X11/Xlib.h>
    59
     10
    611extern "C" {
    712#include <X11/extensions/dpms.h>
    813}
    914
    1015#include "mythcontext.h"
     16#include "util.h"
    1117
     18#include <iostream>
     19#include <qstring.h>
     20#include <qstringlist.h>
     21#include <qregexp.h>
     22
    1223class ScreenSaverX11Private
    1324{
    1425    struct
     
    1930        int preferblank;
    2031        int allowexposure;
    2132        bool dpmsdisabled;
     33        bool xscreensaverRunning;
    2234    } state;
    2335
    2436    friend class ScreenSaverX11;
    2537};
    2638
     39bool ScreenSaverX11::processRunning(const QString& pName)
     40{
     41    QDir procDir(QString("/proc"));
     42    procDir.setFilter(QDir::Dirs | QDir::Readable);
     43    if (procDir.exists())
     44    {
     45        QStringList processes = procDir.entryList();
     46        for (QStringList::iterator i = processes.begin(); i != processes.end(); i++)
     47        {
     48            QString process = *i;
     49            QRegExp rx( "^\\d+$" );
     50            if (rx.search(process) == 0)
     51            {
     52                QFile processStatFile(QString("/proc/%1/stat").arg(process));
     53                if (processStatFile.open(IO_ReadOnly))
     54                {
     55                    QTextStream stream(&processStatFile);
     56                    QString processName;
     57                    stream >> processName >> processName;
     58                    processStatFile.close();
     59                    if (QString("(%1)").arg(pName) == processName)
     60                    {
     61                        return true;
     62                    }
     63                }
     64            }
     65        }
     66    }
     67    return false;
     68}
     69
     70ScreenSaverXSSTimer::ScreenSaverXSSTimer()
     71{
     72    resetTimer = new QTimer();
     73    connect(resetTimer, SIGNAL(timeout()), this, SLOT(resetSlot()));
     74}
     75
     76ScreenSaverXSSTimer::~ScreenSaverXSSTimer()
     77{
     78    delete resetTimer;
     79}
     80
     81void ScreenSaverXSSTimer::resetXSS()
     82{
     83    myth_system(QString("xscreensaver-command -deactivate >&- 2>&- &"));
     84}
     85
     86void ScreenSaverXSSTimer::resetSlot()
     87{
     88    resetXSS();
     89}
     90
    2791ScreenSaverX11::ScreenSaverX11()
    2892{
    2993    d = new ScreenSaverX11Private();
     94    d->state.xscreensaverRunning = processRunning("xscreensaver");
     95    if (d->state.xscreensaverRunning)
     96    {
     97        t = new ScreenSaverXSSTimer();
     98        t->timeoutInterval = -1;
     99        VERBOSE(VB_GENERAL, QString("XScreenSaver support enabled"));
     100    }
    30101}
    31102
    32103ScreenSaverX11::~ScreenSaverX11()
    33104{
    34105    delete d;
     106    delete t;
    35107}
    36108
    37109void ScreenSaverX11::Disable(void)
     
    63135            VERBOSE(VB_GENERAL, "Disable DPMS");
    64136        }
    65137    }
     138
     139    if (d->state.xscreensaverRunning)
     140    {
     141        if (t->resetTimer)
     142        {
     143            t->resetTimer->stop();
     144        }
     145        if (t->timeoutInterval == -1)
     146        {
     147            t->timeoutInterval =
     148                gContext->GetNumSettingOnHost("xscreensaverInterval",
     149                                          gContext->GetHostName(),
     150                                          60) * 1000;
     151        }
     152        if (t->timeoutInterval > 0)
     153        {
     154            t->resetTimer->start(t->timeoutInterval, FALSE);
     155        }
     156    }
    66157}
    67158
    68159void ScreenSaverX11::Restore(void)
     
    84175            VERBOSE(VB_GENERAL, "Enable DPMS");
    85176        }
    86177    }
     178
     179    if (d->state.xscreensaverRunning)
     180    {
     181        if (t->resetTimer)
     182        {
     183            t->resetTimer->stop();
     184        }
     185    }
    87186}
    88187
    89188void ScreenSaverX11::Reset(void)
    90189{
    91190    XResetScreenSaver(qt_xdisplay());
     191    if (d->state.xscreensaverRunning)
     192    {
     193        t->resetXSS();
     194    }
    92195}
    93196
  • libs/libmyth/screensaver-x11.h

     
    33
    44#include "screensaver.h"
    55
     6#include <qobject.h>
     7#include <qtimer.h>
     8
     9class ScreenSaverXSSTimer : public QObject
     10{
     11    Q_OBJECT
     12public:
     13    ScreenSaverXSSTimer();
     14    ~ScreenSaverXSSTimer();
     15    void resetXSS(void);
     16    int timeoutInterval;
     17    QTimer *resetTimer;
     18       
     19private slots:
     20    void resetSlot();
     21
     22};
     23
    624class ScreenSaverX11 : public ScreenSaverControl
    725{
    826public:
     
    1230    void Disable(void);
    1331    void Restore(void);
    1432    void Reset(void);
    15 
     33   
     34private:
     35    bool processRunning(const QString& pName);
     36   
    1637protected:
    1738    class ScreenSaverX11Private *d;
     39    class ScreenSaverXSSTimer *t;
    1840};
    1941
    2042#endif // MYTH_SCREENSAVER_X11_H