Source Code (Use browser search to find items of interest.)

Class Index

kcontrol'KScreenSaver (./kdebase/kcontrol/display/scrnsave.h:83)

class KScreenSaver : public KCModule
{
    Q_OBJECT
public:
    KScreenSaver(QWidget *parent, const char *name);
    ~KScreenSaver();

    virtual void load();
    virtual void save();
    virtual void defaults();

    int buttons();
    void updateValues();
    void readSettings();

signals:
    void changed(bool);

protected slots:
    void slotEnable( bool );
    void slotScreenSaver( int );
    void slotSetup();
    void slotTest();
    void slotStopTest();
    void slotTimeoutChanged(int);
    void slotLock( bool );
    void slotStars( bool );
    void slotPriorityChanged( int val );
    void slotSetupDone(KProcess*);
    // when selecting a new screensaver, the old preview will
    // be killed. -- This callback is responsible for restarting the
    // new preview
    void slotPreviewExited(KProcess *);

protected:
    void writeSettings();
    void findSavers();
    void getSaverNames();
    void setMonitor();
    void setDefaults();
    void resizeEvent( QResizeEvent * );

protected:
    TestWin     *mTestWin;
    KProcess    *mTestProc;
    KProcess    *mSetupProc;
    KProcess    *mPreviewProc;
    KSSMonitor  *mMonitor;
    QPushButton *mSetupBt;
    QPushButton *mTestBt;
    QListBox    *mSaverListBox;
    QSpinBox	*mWaitEdit;
    QSlider     *mPrioritySlider;
    QCheckBox   *mLockCheckBox;
    QCheckBox   *mStarsCheckBox;
    QCheckBox   *mEnableCheckBox;
    QLabel      *mMonitorLabel;
    SaverList   mSaverList;

    int         mSelected;
    int         mPrevSelected;
    bool        mChanged;

    // Settings
    int         mTimeout;
    int         mPriority;
    bool        mLock;
    bool        mEnabled;
    bool        mPasswordStars;
    QString     mSaver;
};

kcontrol'KScreenSaver::KScreenSaver() (./kdebase/kcontrol/display/scrnsave.cpp:132)

KScreenSaver::KScreenSaver(QWidget *parent, const char *name)
	: KCModule(parent, name)
{
    mSetupProc = 0;
    mPreviewProc = 0;
    mTestWin = 0;
    mTestProc = 0;
    mPrevSelected = -1;
    mMonitor = 0;
     
    // Add non-KDE path
    KGlobal::dirs()->addResourceType("scrsav",
                                     KGlobal::dirs()->kde_default("apps") +
                                     "apps/ScreenSavers/");
    
    // Add KDE specific screensaver path
    KGlobal::dirs()->addResourceType("scrsav",
                                     KGlobal::dirs()->kde_default("apps") +
                                     "System/ScreenSavers/");
    
    readSettings();
	
    mSetupProc = new KProcess;
    connect(mSetupProc, SIGNAL(processExited(KProcess *)),
            this, SLOT(slotSetupDone(KProcess *)));
    
    mPreviewProc = new KProcess;
    connect(mPreviewProc, SIGNAL(processExited(KProcess *)),
            this, SLOT(slotPreviewExited(KProcess *)));
    
    findSavers();
    
    QBoxLayout *topLayout = new QHBoxLayout(this, 10, 10);

    // left column
    QBoxLayout *vLayout = new QVBoxLayout(this, 0, 10);
    topLayout->addLayout(vLayout);

    mEnableCheckBox = new QCheckBox( i18n("&Enable screensaver"), this );
    mEnableCheckBox->setChecked( mEnabled );
    connect( mEnableCheckBox, SIGNAL( toggled( bool ) ), 
	     this, SLOT( slotEnable( bool ) ) );
    vLayout->addWidget(mEnableCheckBox);
    
    QGroupBox *group = new QGroupBox(i18n("Screen Saver"), this );
    vLayout->addWidget(group);
    QBoxLayout *groupLayout = new QVBoxLayout( group, 10 );
    groupLayout->addSpacing(10);		
    
    mSaverListBox = new QListBox( group );
    /* mSaverListBox->setFixedHeight(120); */

    SaverConfig *saver;
    mSelected = 0;
    for (saver = mSaverList.first(); saver != 0; saver = mSaverList.next())
    {
        mSaverListBox->insertItem(saver->name());
        if (saver->file() == mSaver) 
            mSelected = mSaverListBox->count()-1;
    }

    mSaverListBox->setCurrentItem(mSelected);
    mSaverListBox->setTopItem(mSaverListBox->currentItem());
    mSaverListBox->setEnabled(mEnabled);
    mSelected = mSaverListBox->currentItem();
    connect( mSaverListBox, SIGNAL( highlighted( int ) ),
             this, SLOT( slotScreenSaver( int ) ) );
    groupLayout->addWidget( mSaverListBox, 10 );

    QBoxLayout* hlay = new QHBoxLayout(groupLayout, 10);
    mSetupBt = new QPushButton(  i18n("&Setup ..."), group );
    connect( mSetupBt, SIGNAL( clicked() ), SLOT( slotSetup() ) );
    mSetupBt->setEnabled(mEnabled &&
                         !mSaverList.at(mSelected)->setup().isEmpty());
    hlay->addWidget( mSetupBt );
    
    mTestBt = new QPushButton(  i18n("&Test"), group );
    connect( mTestBt, SIGNAL( clicked() ), SLOT( slotTest() ) );
    mTestBt->setEnabled(mEnabled);
    hlay->addWidget( mTestBt );

    // right column
    vLayout = new QVBoxLayout(this, 0, 10);
    topLayout->addLayout(vLayout);

    mMonitorLabel = new QLabel( this );
    mMonitorLabel->setAlignment( AlignCenter );
    mMonitorLabel->setPixmap( QPixmap(locate("data",
					     "kcontrol/pics/monitor.png"))); 
    vLayout->addWidget(mMonitorLabel, 0);

    group = new QGroupBox( i18n("Settings"), this );
    vLayout->addWidget( group );
    groupLayout = new QVBoxLayout( group, 10, 10 );
    groupLayout->addSpacing(10);

    QBoxLayout *hbox = new QHBoxLayout();
    groupLayout->addLayout(hbox);
    QLabel *lbl = new QLabel(i18n("&Wait for"), group);
    hbox->addWidget(lbl);
    mWaitEdit = new QSpinBox(group);
    mWaitEdit->setSteps(1, 10);
    mWaitEdit->setRange(1, 120);
    mWaitEdit->setSuffix(i18n(" min."));
    mWaitEdit->setValue(mTimeout/60);
    mWaitEdit->setEnabled(mEnabled);
    connect(mWaitEdit, SIGNAL(valueChanged(int)), SLOT(slotTimeoutChanged(int)));
    lbl->setBuddy(mWaitEdit);
    hbox->addWidget(mWaitEdit);

    mLockCheckBox = new QCheckBox( i18n("&Require password"), group );
    mLockCheckBox->setChecked( mLock );
    mLockCheckBox->setEnabled( mEnabled );
    connect( mLockCheckBox, SIGNAL( toggled( bool ) ), 
	     this, SLOT( slotLock( bool ) ) );
    groupLayout->addWidget(mLockCheckBox);

    mStarsCheckBox = new QCheckBox( i18n("Show p&assword as stars"), group );
    mStarsCheckBox->setChecked(mPasswordStars);
    mStarsCheckBox->setEnabled(mEnabled);
    connect( mStarsCheckBox, SIGNAL( toggled( bool ) ), 
	     this, SLOT( slotStars( bool ) ) );
    groupLayout->addWidget(mStarsCheckBox);

    hbox = new QHBoxLayout();
    groupLayout->addLayout(hbox);
    
    lbl = new QLabel(i18n("&Priority"), group);
    hbox->addWidget(lbl);
    hbox->addSpacing(20);

    mPrioritySlider = new QSlider(QSlider::Horizontal, group);
    mPrioritySlider->setRange(0, 19);
    mPrioritySlider->setSteps(1, 5);
    mPrioritySlider->setValue(19 - mPriority);
    mPrioritySlider->setEnabled( mEnabled );
    connect(mPrioritySlider, SIGNAL( valueChanged(int)),
	    SLOT(slotPriorityChanged(int)));
    lbl->setBuddy(mPrioritySlider);
    hbox->addWidget(mPrioritySlider);

#ifndef HAVE_SETPRIORITY
    lbl->setEnabled(false);
    mPrioritySlider->setEnabled(false);
#endif
    
    lbl = new QLabel(i18n("High"), group);
    hbox->addWidget(lbl);
    
#ifndef HAVE_SETPRIORITY
    lbl->setEnabled(false);
#endif

    topLayout->activate();

    setMonitor();
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::resizeEvent() (./kdebase/kcontrol/display/scrnsave.cpp:292)

void KScreenSaver::resizeEvent( QResizeEvent * )
{
  
  if (mMonitor)
    {
      mMonitor->setGeometry( (mMonitorLabel->width()-200)/2+20,
			     (mMonitorLabel->height()-160)/2+10, 157, 111 );
    }
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::buttons() (./kdebase/kcontrol/display/scrnsave.cpp:304)

int KScreenSaver::buttons()
{
    return KCModule::Help | KCModule::Default | KCModule::Reset |
	   KCModule::Cancel | KCModule::Apply | KCModule::Ok;
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::~KScreenSaver() (./kdebase/kcontrol/display/scrnsave.cpp:312)

KScreenSaver::~KScreenSaver()
{
    if (mPreviewProc)
    {
        if (mPreviewProc->isRunning())
        {
            int pid = mPreviewProc->getPid();  
            mPreviewProc->kill( );
            waitpid(pid, (int *) 0,0);
        }
        delete mPreviewProc;
    }

    delete mTestProc;
    delete mSetupProc;
    delete mTestWin;
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::load() (./kdebase/kcontrol/display/scrnsave.cpp:332)

void KScreenSaver::load()
{
    readSettings();

    SaverConfig *saver;
    mSelected = 0;
    for (saver = mSaverList.first(); saver != 0; saver = mSaverList.next()) {
        if (saver->file() == mSaver) 
            mSelected = mSaverListBox->count()-1;
    }
    mSaverListBox->setCurrentItem(mSelected);
    slotScreenSaver(mSelected);

    updateValues();
    emit changed(false);
}
    
//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::readSettings() (./kdebase/kcontrol/display/scrnsave.cpp:351)

void KScreenSaver::readSettings()
{
    KConfig *config = new KConfig( "kdesktoprc");
    config->setGroup( "ScreenSaver" );

    mEnabled = config->readBoolEntry("Enabled", false);
    mLock = config->readBoolEntry("Lock", false);
    mTimeout = config->readNumEntry("Timeout", 300);
    mPriority = config->readNumEntry("Priority", 0);
    mPasswordStars = config->readBoolEntry("PasswordAsStars", true);
    mSaver = config->readEntry("Saver");

    if (mPriority < 0) mPriority = 0;
    if (mPriority > 19) mPriority = 19;
    if (mTimeout < 60) mTimeout = 60;

    mChanged = false;
    delete config;
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::updateValues() (./kdebase/kcontrol/display/scrnsave.cpp:373)

void KScreenSaver::updateValues()
{
    mWaitEdit->setValue(mTimeout/60);
    mLockCheckBox->setChecked(mLock);
    mStarsCheckBox->setChecked(mPasswordStars);
    mPrioritySlider->setValue(mPriority);
    mEnableCheckBox->setChecked( mEnabled );
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::defaults() (./kdebase/kcontrol/display/scrnsave.cpp:384)

void KScreenSaver::defaults()
{
    slotScreenSaver( 0 );
    mSaverListBox->setCurrentItem( 0 );
    mSaverListBox->centerCurrentItem();
    slotEnable( false );
    slotTimeoutChanged( 1 );
    slotPriorityChanged( 0 );
    slotLock( false );
    slotStars( true );
    updateValues();

    emit changed(true);
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::save() (./kdebase/kcontrol/display/scrnsave.cpp:401)

void KScreenSaver::save()
{
    if ( !mChanged )
	return;

    KConfig *config = new KConfig( "kdesktoprc");
    config->setGroup( "ScreenSaver" );

    config->writeEntry("Enabled", mEnabled);
    config->writeEntry("Timeout", mTimeout);
    config->writeEntry("Lock", mLock);
    config->writeEntry("Priority", mPriority);
    config->writeEntry("PasswordAsStars", mPasswordStars);
    config->writeEntry("Saver", mSaver);
    config->sync();
    delete config;

    // TODO (GJ): When you changed anything, these two lines will give a segfault 
    // on exit. I don't know why yet.

    DCOPClient *client = kapp->dcopClient();
    client->send("kdesktop", "KScreensaverIface", "configure()", "");

    mChanged = false;
    emit changed(false);
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::findSavers() (./kdebase/kcontrol/display/scrnsave.cpp:430)

void KScreenSaver::findSavers()
{
    QStringList saverFileList = KGlobal::dirs()->findAllResources("scrsav",
						"*.desktop", false, true);

    QStringList::Iterator it = saverFileList.begin();
    for ( ; it != saverFileList.end(); ++it ) {
	SaverConfig *saver = new SaverConfig;
	if (saver->read(*it))
	    mSaverList.append(saver);
	else 
	    delete saver;
    }

    mSaverList.sort();
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::setMonitor() (./kdebase/kcontrol/display/scrnsave.cpp:449)

void KScreenSaver::setMonitor()
{
    if (mPreviewProc->isRunning())
	// CC: this will automatically cause a "slotPreviewExited"
	// when the viewer exits
	mPreviewProc->kill();
    else
	slotPreviewExited(mPreviewProc);
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::slotPreviewExited() (./kdebase/kcontrol/display/scrnsave.cpp:461)

void KScreenSaver::slotPreviewExited(KProcess *)
{
    // Ugly hack to prevent continual respawning of savers that crash
    if (mSelected == mPrevSelected)
        return;

    // Some xscreensaver hacks do something nasty to the window that
    // requires a new one to be created (or proper investigation of the
    // problem).
    if (mMonitor)
        delete mMonitor;

    mMonitor = new KSSMonitor(mMonitorLabel);
    mMonitor->setBackgroundColor(black);
    mMonitor->setGeometry((mMonitorLabel->width()-200)/2+20,
                          (mMonitorLabel->height()-160)/2+10, 157, 111);
    mMonitor->show();

    if (mEnabled) {
        mPreviewProc->clearArguments();
        
        QString saver = mSaverList.at(mSelected)->saver();
        QTextStream ts(&saver, IO_ReadOnly);
        
        QString word;
        ts >> word;
        QString path = KStandardDirs::findExe(word);

        if (!path.isEmpty())
        {
            (*mPreviewProc) << path;

            while (!ts.atEnd())
            {
                ts >> word;
                if (word == "%w")
                {
                    word = word.setNum(mMonitor->winId());
                }
                (*mPreviewProc) << word;
            }

            mPreviewProc->start();
        }
    }

    mPrevSelected = mSelected;
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::slotEnable() (./kdebase/kcontrol/display/scrnsave.cpp:512)

void KScreenSaver::slotEnable(bool e)
{
    if ( !e ) {
	mSetupBt->setEnabled( false );
	mEnabled = false;
    } else {
	if (!mSetupProc->isRunning())
	    mSetupBt->setEnabled(!mSaverList.at(mSelected)->setup().isEmpty());
	mEnabled = true;
    }

    mSaverListBox->setEnabled( e );
    mTestBt->setEnabled( e );
    mWaitEdit->setEnabled( e );
    mLockCheckBox->setEnabled( e );
    mStarsCheckBox->setEnabled( e );
#ifdef HAVE_SETPRIORITY
    mPrioritySlider->setEnabled( e );
#endif

    mPrevSelected = -1;  // see ugly hack in slotPreviewExited()
    setMonitor();
    mChanged = true;
    emit changed(true);
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::slotScreenSaver() (./kdebase/kcontrol/display/scrnsave.cpp:540)

void KScreenSaver::slotScreenSaver(int indx)
{
    if (!mEnabled)
        return;

    if (!mSetupProc->isRunning())
        mSetupBt->setEnabled(!mSaverList.at(indx)->setup().isEmpty());
    mTestBt->setEnabled(true);
    mSaver = mSaverList.at(indx)->file();
    mEnabled = true;
    
    mSelected = indx;
    
    setMonitor();
    mChanged = true;
    emit changed(true);
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::slotSetup() (./kdebase/kcontrol/display/scrnsave.cpp:560)

void KScreenSaver::slotSetup()
{
    if ( !mEnabled )
	return;

    if (mSetupProc->isRunning())
	return;
	
    mSetupProc->clearArguments();

    QString saver = mSaverList.at(mSelected)->setup();
    QTextStream ts(&saver, IO_ReadOnly);

    QString word;
    ts >> word;
    QString path = KStandardDirs::findExe(word);

    if (!path.isEmpty())
    {
        (*mSetupProc) << path;

        while (!ts.atEnd())
        {
            ts >> word;
            (*mSetupProc) << word;
        }

        mSetupBt->setEnabled( FALSE );
        kapp->flushX();

        mSetupProc->start();
    }
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::slotTest() (./kdebase/kcontrol/display/scrnsave.cpp:596)

void KScreenSaver::slotTest()
{
    if (!mTestProc) {
	    mTestProc = new KProcess;
    }

    mTestProc->clearArguments();
    QString saver = mSaverList.at(mSelected)->saver();
    QTextStream ts(&saver, IO_ReadOnly);

    QString word;
    ts >> word;
    QString path = KStandardDirs::findExe(word);

    if (!path.isEmpty())
    {
        (*mTestProc) << path;

        if (!mTestWin)
        {
            mTestWin = new TestWin();
            mTestWin->setBackgroundMode(QWidget::NoBackground);
            mTestWin->setGeometry(0, 0, kapp->desktop()->width(),
                                    kapp->desktop()->height());
            connect(mTestWin, SIGNAL(stopTest()), SLOT(slotStopTest()));
        }

        mTestWin->show();
        mTestWin->raise();
        mTestWin->setFocus();
        mTestWin->grabKeyboard();

        mTestBt->setEnabled( FALSE );

        while (!ts.atEnd())
        {
            ts >> word;
            if (word == "%w")
            {
                word = word.setNum(mTestWin->winId());
            }
            (*mTestProc) << word;
        }

        mTestProc->start(KProcess::DontCare);
    }
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::slotStopTest() (./kdebase/kcontrol/display/scrnsave.cpp:646)

void KScreenSaver::slotStopTest()
{
    if (mTestProc->isRunning()) {
        mTestProc->kill();
    }
    mTestWin->releaseKeyboard();
    mTestWin->hide();
    mTestBt->setEnabled(true);
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::slotTimeoutChanged() (./kdebase/kcontrol/display/scrnsave.cpp:658)

void KScreenSaver::slotTimeoutChanged(int to )
{
    mTimeout = to * 60;
    mChanged = true;
    emit changed(true);
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::slotLock() (./kdebase/kcontrol/display/scrnsave.cpp:667)

void KScreenSaver::slotLock( bool l )
{
    mLock = l;
    mChanged = true;
    emit changed(true);
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::slotStars() (./kdebase/kcontrol/display/scrnsave.cpp:676)

void KScreenSaver::slotStars( bool s )
{
    mPasswordStars = s;
    mChanged = true;
    emit changed(true);
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::slotPriorityChanged() (./kdebase/kcontrol/display/scrnsave.cpp:685)

void KScreenSaver::slotPriorityChanged( int val )
{
    if (val == mPriority)
	return;
    
    mPriority = 19 - val;
    if (mPriority > 19)
	mPriority = 19;
    else if (mPriority < 0)
	mPriority = 0;

    mChanged = true;
    emit changed(true);
}

//---------------------------------------------------------------------------
//

kcontrol'KScreenSaver::slotSetupDone() (./kdebase/kcontrol/display/scrnsave.cpp:702)

void KScreenSaver::slotSetupDone(KProcess *)
{
    mPrevSelected = -1;  // see ugly hack in slotPreviewExited()
    setMonitor();
    mSetupBt->setEnabled( true );
}