Ticket #982: dpms_update.diff

File dpms_update.diff, 7.6 KB (added by skamithi, 13 years ago)

patch against latest rev

  • libs/libmyth/screensaver-osx.cpp

     
    6161    ScreenSaverOSXPrivate::timerCallback(NULL, NULL);
    6262}
    6363
     64bool ScreenSaverOSX::Asleep(void)
     65{
     66    return 0;
     67}
     68
  • libs/libmyth/screensaver-x11.cpp

     
    2020        int interval;
    2121        int preferblank;
    2222        int allowexposure;
    23         bool dpmsdisabled;
    2423        bool xscreensaverRunning;
     24        BOOL dpmsaware;
     25        BOOL dpmsenabled;
     26        bool dpmsdeactivated;
    2527    } state;
    2628
    2729    QTimer *resetTimer;
     
    4446        d->timeoutInterval = -1;
    4547        VERBOSE(VB_GENERAL, "XScreenSaver support enabled");
    4648    }
     49
     50    int dummy;
     51    if ((d->state.dpmsaware = DPMSQueryExtension(qt_xdisplay(),&dummy,&dummy)))
     52    {
     53        CARD16 power_level;
     54
     55            /* If someone runs into X server weirdness that goes away when
     56            * they externally disable DPMS, then the 'dpmsenabled' test should
     57            * be short circuited by a call to 'DPMSCapable()'. Be sure to
     58            * manually initialize dpmsenabled to false.
     59            */
     60
     61        DPMSInfo(qt_xdisplay(), &power_level, &(d->state.dpmsenabled));
     62
     63        if (d->state.dpmsenabled)
     64            VERBOSE(VB_GENERAL, "DPMS is active.");
     65        else
     66            VERBOSE(VB_GENERAL, "DPMS is disabled.");
     67
     68    } else {
     69        d->state.dpmsenabled = false;
     70        VERBOSE(VB_GENERAL, "DPMS is not supported.");
     71    }
     72
     73    d->state.dpmsdeactivated = false;
     74
    4775}
    4876
    4977ScreenSaverX11::~ScreenSaverX11()
    5078{
     79    /* Ensure DPMS gets left as it was found. */
     80    if (d->state.dpmsdeactivated)
     81        Restore();
     82
    5183    delete d;
    5284}
    5385
     
    6597    XResetScreenSaver(qt_xdisplay());
    6698    XSetScreenSaver(qt_xdisplay(), 0, 0, 0, 0);
    6799
    68     int nothing;
    69 
    70     if (DPMSQueryExtension(qt_xdisplay(), &nothing, &nothing))
     100    if (d->state.dpmsenabled)
    71101    {
    72         BOOL on;
    73         CARD16 power_level;
    74 
    75         DPMSInfo(qt_xdisplay(), &power_level, &on);
    76         if (on)
    77         {
    78             d->state.dpmsdisabled = true;
    79             DPMSDisable(qt_xdisplay());       // monitor powersave off
    80             VERBOSE(VB_GENERAL, "Disable DPMS");
    81         }
     102        d->state.dpmsdeactivated = true;
     103        DPMSDisable(qt_xdisplay());
     104        VERBOSE(VB_GENERAL, "DPMS Deactivated ");
    82105    }
    83106
    84107    if (d->state.xscreensaverRunning)
     
    109132                    d->state.allowexposure);
    110133    d->state.saved = false;
    111134
    112     if (d->state.dpmsdisabled)
     135    if (d->state.dpmsdeactivated)
    113136    {
    114         int nothing;
    115         d->state.dpmsdisabled = false;
    116         if (DPMSQueryExtension(qt_xdisplay(), &nothing, &nothing))
    117         {
    118             DPMSEnable(qt_xdisplay());
    119             VERBOSE(VB_GENERAL, "Enable DPMS");
    120         }
     137        d->state.dpmsdeactivated = false;
     138        DPMSEnable(qt_xdisplay());
     139        VERBOSE(VB_GENERAL, "DPMS Reactivated.");
    121140    }
    122141
    123142    if (d->state.xscreensaverRunning && d->resetTimer)
     
    130149    if (d->state.xscreensaverRunning)
    131150        resetSlot();
    132151
    133     int nothing;
    134     if (DPMSQueryExtension(qt_xdisplay(), &nothing, &nothing))
     152    if (Asleep())
    135153    {
    136         BOOL on;
    137         CARD16 power_level;
    138         if (!d->state.dpmsdisabled)
    139         {
    140             DPMSInfo(qt_xdisplay(), &power_level, &on);
    141             if (power_level != DPMSModeOn)
    142                 DPMSForceLevel(qt_xdisplay(), DPMSModeOn);
    143         }
     154        DPMSForceLevel(qt_xdisplay(), DPMSModeOn);
     155        // Calling XSync is necessary for the case when Myth executes
     156        // another application before the event loop regains control
     157        XSync(qt_xdisplay(), false);
    144158    }
    145159}
    146160
     161bool ScreenSaverX11::Asleep(void)
     162{
     163    if (!d->state.dpmsenabled)
     164        return 0;
     165
     166    if (d->state.dpmsdeactivated)
     167        return 0;
     168
     169    BOOL on;
     170    CARD16 power_level;
     171
     172    DPMSInfo(qt_xdisplay(), &power_level, &on);
     173
     174    return (power_level != DPMSModeOn);
     175}
     176
    147177void ScreenSaverX11::resetSlot()
    148178{
    149179    myth_system(QString("xscreensaver-command -deactivate >&- 2>&- &"));
  • libs/libmyth/screensaver-null.cpp

     
    1717void ScreenSaverNull::Reset(void)
    1818{
    1919}
     20
     21bool ScreenSaverNull::Asleep(void)
     22{
     23    return 0;
     24}
  • libs/libmyth/mythcontext.h

     
    405405
    406406    // get the current status
    407407    bool GetScreensaverEnabled(void);
     408    bool GetScreenIsAsleep(void);
    408409
    409410    void addPrivRequest(MythPrivRequest::Type t, void *data);
    410411    void waitPrivRequest() const;
  • libs/libmyth/screensaver.h

     
    3636    virtual void Disable(void) = 0;
    3737    virtual void Restore(void) = 0;
    3838    virtual void Reset(void) = 0;
     39
     40    virtual bool Asleep(void) = 0;
    3941};
    4042
    4143#endif // MYTH_SCREENSAVER_H
  • libs/libmyth/screensaver-null.h

     
    1212    void Disable(void);
    1313    void Restore(void);
    1414    void Reset(void);
     15
     16    bool Asleep(void);
    1517};
    1618
    1719#endif // MYTH_SCREENSAVER_NULL_H
  • libs/libmyth/mythcontext.cpp

     
    28522852    return currentLocation.last();
    28532853}
    28542854
     2855bool MythContext::GetScreenIsAsleep(void)
     2856{
     2857    if (!d->screensaver)
     2858        return false;
     2859    return d->screensaver->Asleep();
     2860}
     2861
    28552862/* vim: set expandtab tabstop=4 shiftwidth=4: */
  • libs/libmyth/screensaver-osx.h

     
    1313    void Restore(void);
    1414    void Reset(void);
    1515
     16    bool Asleep(void);
     17
    1618protected:
    1719    class ScreenSaverOSXPrivate *d;
    1820};
  • libs/libmyth/screensaver-x11.h

     
    1717    void Restore(void);
    1818    void Reset(void);
    1919
     20    bool Asleep(void);
     21
    2022  public slots:
    2123    void resetSlot();
    2224
  • libs/libmythui/mythmainwindow.cpp

     
    11861188        if (keycode)
    11871189        {
    11881190            gContext->ResetScreensaver();
     1191            if (gContext->GetScreenIsAsleep())
     1192                return;
    11891193
    11901194            int mod = keycode & MODIFIER_MASK;
    11911195            int k = keycode & ~MODIFIER_MASK; /* trim off the mod */
     
    12351239        if (keycode)
    12361240        {
    12371241            gContext->ResetScreensaver();
     1242            if (gContext->GetScreenIsAsleep())
     1243                return;
    12381244
    12391245            int mod = keycode & MODIFIER_MASK;
    12401246            int k = keycode & ~MODIFIER_MASK; /* trim off the mod */