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 );
}