diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 4aed2c8219774f5d797760606b8489a92ddc5163 (patch) | |
tree | 3f8c130f7d269626bf6a9447407ef6c35954426a /kcontrol/screensaver/scrnsave.cpp | |
download | tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.tar.gz tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kcontrol/screensaver/scrnsave.cpp')
-rw-r--r-- | kcontrol/screensaver/scrnsave.cpp | 862 |
1 files changed, 862 insertions, 0 deletions
diff --git a/kcontrol/screensaver/scrnsave.cpp b/kcontrol/screensaver/scrnsave.cpp new file mode 100644 index 000000000..a40c51919 --- /dev/null +++ b/kcontrol/screensaver/scrnsave.cpp @@ -0,0 +1,862 @@ +//----------------------------------------------------------------------------- +// +// KDE Display screen saver setup module +// +// Copyright (c) Martin R. Jones 1996,1999,2002 +// +// Converted to a kcc module by Matthias Hoelzer 1997 +// + + +#include <config.h> +#include <stdio.h> +#include <stdlib.h> +#include <signal.h> +#include <unistd.h> + +#include <sys/types.h> +#include <sys/wait.h> + +#include <qbuttongroup.h> +#include <qcheckbox.h> +#include <qheader.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qlistview.h> +#include <qpushbutton.h> +#include <qslider.h> +#include <qtimer.h> +#include <qwhatsthis.h> + +#include <dcopclient.h> + +#include <kaboutdata.h> +#include <kapplication.h> +#include <kdebug.h> +#include <kdialog.h> +#include <kdialogbase.h> +#include <kgenericfactory.h> +#include <kiconloader.h> +#include <knuminput.h> +#include <kprocess.h> +#include <kservicegroup.h> +#include <kstandarddirs.h> + +#include <X11/Xlib.h> + +#include "scrnsave.h" + +#include <fixx11h.h> + +template class QPtrList<SaverConfig>; + +const uint widgetEventMask = // X event mask +(uint)( + ExposureMask | + PropertyChangeMask | + StructureNotifyMask + ); + +//=========================================================================== +// DLL Interface for kcontrol +typedef KGenericFactory<KScreenSaver, QWidget > KSSFactory; +K_EXPORT_COMPONENT_FACTORY (kcm_screensaver, KSSFactory("kcmscreensaver") ) + + +static QString findExe(const QString &exe) { + QString result = locate("exe", exe); + if (result.isEmpty()) + result = KStandardDirs::findExe(exe); + return result; +} + +KScreenSaver::KScreenSaver(QWidget *parent, const char *name, const QStringList&) + : KCModule(KSSFactory::instance(), parent, name) +{ + mSetupProc = 0; + mPreviewProc = 0; + mTestWin = 0; + mTestProc = 0; + mPrevSelected = -2; + mMonitor = 0; + mTesting = false; + + // Add non-KDE path + KGlobal::dirs()->addResourceType("scrsav", + KGlobal::dirs()->kde_default("apps") + + "apps/ScreenSavers/"); + + setQuickHelp( i18n("<h1>Screen Saver</h1> This module allows you to enable and" + " configure a screen saver. Note that you can enable a screen saver" + " even if you have power saving features enabled for your display.<p>" + " Besides providing an endless variety of entertainment and" + " preventing monitor burn-in, a screen saver also gives you a simple" + " way to lock your display if you are going to leave it unattended" + " for a while. If you want the screen saver to lock the session, make sure you enable" + " the \"Require password\" feature of the screen saver; if you do not, you can still" + " explicitly lock the session using the desktop's \"Lock Session\" action.")); + + setButtons( KCModule::Help | KCModule::Default | KCModule::Apply ); + + // Add KDE specific screensaver path + QString relPath="System/ScreenSavers/"; + KServiceGroup::Ptr servGroup = KServiceGroup::baseGroup( "screensavers" ); + if (servGroup) + { + relPath=servGroup->relPath(); + kdDebug() << "relPath=" << relPath << endl; + } + + KGlobal::dirs()->addResourceType("scrsav", + KGlobal::dirs()->kde_default("apps") + + relPath); + + readSettings( false ); + + mSetupProc = new KProcess; + connect(mSetupProc, SIGNAL(processExited(KProcess *)), + this, SLOT(slotSetupDone(KProcess *))); + + mPreviewProc = new KProcess; + connect(mPreviewProc, SIGNAL(processExited(KProcess *)), + this, SLOT(slotPreviewExited(KProcess *))); + + QBoxLayout *topLayout = new QHBoxLayout(this, 0, KDialog::spacingHint()); + + // left column + QVBoxLayout *leftColumnLayout = + new QVBoxLayout(topLayout, KDialog::spacingHint()); + QBoxLayout *vLayout = + new QVBoxLayout(leftColumnLayout, KDialog::spacingHint()); + + mSaverGroup = new QGroupBox(i18n("Screen Saver"), this ); + mSaverGroup->setColumnLayout( 0, Qt::Horizontal ); + vLayout->addWidget(mSaverGroup); + vLayout->setStretchFactor( mSaverGroup, 10 ); + QBoxLayout *groupLayout = new QVBoxLayout( mSaverGroup->layout(), + KDialog::spacingHint() ); + + mSaverListView = new QListView( mSaverGroup ); + mSaverListView->setMinimumHeight( 120 ); + mSaverListView->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); + mSaverListView->addColumn(""); + mSaverListView->header()->hide(); + mSelected = -1; + groupLayout->addWidget( mSaverListView, 10 ); + connect( mSaverListView, SIGNAL(doubleClicked ( QListViewItem *)), this, SLOT( slotSetup())); + QWhatsThis::add( mSaverListView, i18n("Select the screen saver to use.") ); + + QBoxLayout* hlay = new QHBoxLayout(groupLayout, KDialog::spacingHint()); + mSetupBt = new QPushButton( i18n("&Setup..."), mSaverGroup ); + connect( mSetupBt, SIGNAL( clicked() ), SLOT( slotSetup() ) ); + mSetupBt->setEnabled(false); + hlay->addWidget( mSetupBt ); + QWhatsThis::add( mSetupBt, i18n("Configure the screen saver's options, if any.") ); + + mTestBt = new QPushButton( i18n("&Test"), mSaverGroup ); + connect( mTestBt, SIGNAL( clicked() ), SLOT( slotTest() ) ); + mTestBt->setEnabled(false); + hlay->addWidget( mTestBt ); + QWhatsThis::add( mTestBt, i18n("Show a full screen preview of the screen saver.") ); + + mSettingsGroup = new QGroupBox( i18n("Settings"), this ); + mSettingsGroup->setColumnLayout( 0, Qt::Vertical ); + leftColumnLayout->addWidget( mSettingsGroup ); + groupLayout = new QVBoxLayout( mSettingsGroup->layout(), + KDialog::spacingHint() ); + + mEnabledCheckBox = new QCheckBox(i18n( + "Start a&utomatically"), mSettingsGroup); + mEnabledCheckBox->setChecked(mEnabled); + QWhatsThis::add( mEnabledCheckBox, i18n( + "Automatically start the screen saver after a period of inactivity.") ); + connect(mEnabledCheckBox, SIGNAL(toggled(bool)), + this, SLOT(slotEnable(bool))); + groupLayout->addWidget(mEnabledCheckBox); + + QBoxLayout *hbox = new QHBoxLayout(); + groupLayout->addLayout(hbox); + hbox->addSpacing(30); + mActivateLbl = new QLabel(i18n("After:"), mSettingsGroup); + mActivateLbl->setEnabled(mEnabled); + hbox->addWidget(mActivateLbl); + mWaitEdit = new QSpinBox(mSettingsGroup); + mWaitEdit->setSteps(1, 10); + mWaitEdit->setRange(1, INT_MAX); + mWaitEdit->setSuffix(i18n(" min")); + mWaitEdit->setValue(mTimeout/60); + mWaitEdit->setEnabled(mEnabled); + connect(mWaitEdit, SIGNAL(valueChanged(int)), + this, SLOT(slotTimeoutChanged(int))); + mActivateLbl->setBuddy(mWaitEdit); + hbox->addWidget(mWaitEdit); + hbox->addStretch(1); + QString wtstr = i18n( + "The period of inactivity " + "after which the screen saver should start."); + QWhatsThis::add( mActivateLbl, wtstr ); + QWhatsThis::add( mWaitEdit, wtstr ); + + mLockCheckBox = new QCheckBox( i18n( + "&Require password to stop"), mSettingsGroup ); + mLockCheckBox->setEnabled( mEnabled ); + mLockCheckBox->setChecked( mLock ); + connect( mLockCheckBox, SIGNAL( toggled( bool ) ), + this, SLOT( slotLock( bool ) ) ); + groupLayout->addWidget(mLockCheckBox); + QWhatsThis::add( mLockCheckBox, i18n( + "Prevent potential unauthorized use by requiring a password" + " to stop the screen saver.") ); + hbox = new QHBoxLayout(); + groupLayout->addLayout(hbox); + hbox->addSpacing(30); + mLockLbl = new QLabel(i18n("After:"), mSettingsGroup); + mLockLbl->setEnabled(mEnabled && mLock); + QWhatsThis::add( mLockLbl, i18n( + "The amount of time, after the screen saver has started, to ask for the unlock password.") ); + hbox->addWidget(mLockLbl); + mWaitLockEdit = new QSpinBox(mSettingsGroup); + mWaitLockEdit->setSteps(1, 10); + mWaitLockEdit->setRange(1, 300); + mWaitLockEdit->setSuffix(i18n(" sec")); + mWaitLockEdit->setValue(mLockTimeout/1000); + mWaitLockEdit->setEnabled(mEnabled && mLock); + if ( mWaitLockEdit->sizeHint().width() < + mWaitEdit->sizeHint().width() ) { + mWaitLockEdit->setFixedWidth( mWaitEdit->sizeHint().width() ); + mWaitEdit->setFixedWidth( mWaitEdit->sizeHint().width() ); + } + else { + mWaitEdit->setFixedWidth( mWaitLockEdit->sizeHint().width() ); + mWaitLockEdit->setFixedWidth( mWaitLockEdit->sizeHint().width() ); + } + connect(mWaitLockEdit, SIGNAL(valueChanged(int)), + this, SLOT(slotLockTimeoutChanged(int))); + mLockLbl->setBuddy(mWaitLockEdit); + hbox->addWidget(mWaitLockEdit); + hbox->addStretch(1); + QString wltstr = i18n( + "Choose the period " + "after which the display will be locked. "); + QWhatsThis::add( mLockLbl, wltstr ); + QWhatsThis::add( mWaitLockEdit, wltstr ); + + // right column + QBoxLayout* rightColumnLayout = + new QVBoxLayout(topLayout, KDialog::spacingHint()); + + mMonitorLabel = new QLabel( this ); + mMonitorLabel->setAlignment( AlignCenter ); + mMonitorLabel->setPixmap( QPixmap(locate("data", + "kcontrol/pics/monitor.png"))); + rightColumnLayout->addWidget(mMonitorLabel, 0); + QWhatsThis::add( mMonitorLabel, i18n("A preview of the selected screen saver.") ); + + QBoxLayout* advancedLayout = new QHBoxLayout( rightColumnLayout, 3 ); + advancedLayout->addWidget( new QWidget( this ) ); + QPushButton* advancedBt = new QPushButton( + i18n( "Advanced &Options" ), this, "advancedBtn" ); + advancedBt->setSizePolicy( QSizePolicy( + QSizePolicy::Fixed, QSizePolicy::Fixed) ); + connect( advancedBt, SIGNAL( clicked() ), + this, SLOT( slotAdvanced() ) ); + advancedLayout->addWidget( advancedBt ); + advancedLayout->addWidget( new QWidget( this ) ); + + rightColumnLayout->addStretch(); + + if (mImmutable) + { + setButtons(buttons() & ~Default); + mSettingsGroup->setEnabled(false); + mSaverGroup->setEnabled(false); + } + + // finding the savers can take some time, so defer loading until + // we've started up. + mNumLoaded = 0; + mLoadTimer = new QTimer( this ); + connect( mLoadTimer, SIGNAL(timeout()), SLOT(findSavers()) ); + mLoadTimer->start( 100 ); + mChanged = false; + emit changed(false); + + KAboutData *about = + new KAboutData(I18N_NOOP("kcmscreensaver"), I18N_NOOP("KDE Screen Saver Control Module"), + 0, 0, KAboutData::License_GPL, + I18N_NOOP("(c) 1997-2002 Martin R. Jones\n" + "(c) 2003-2004 Chris Howells")); + about->addAuthor("Chris Howells", 0, "howells@kde.org"); + about->addAuthor("Martin R. Jones", 0, "jones@kde.org"); + + setAboutData( about ); + + mSaverList.setAutoDelete(true); +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::resizeEvent( QResizeEvent * ) +{ + + if (mMonitor) + { + mMonitor->setGeometry( (mMonitorLabel->width()-200)/2+23, + (mMonitorLabel->height()-186)/2+14, 151, 115 ); + } +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::mousePressEvent( QMouseEvent *) +{ + if ( mTesting ) + slotStopTest(); +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::keyPressEvent( QKeyEvent *) +{ + if ( mTesting ) + slotStopTest(); +} +//--------------------------------------------------------------------------- +// +KScreenSaver::~KScreenSaver() +{ + if (mPreviewProc) + { + if (mPreviewProc->isRunning()) + { + int pid = mPreviewProc->pid(); + mPreviewProc->kill( ); + waitpid(pid, (int *) 0,0); + } + delete mPreviewProc; + } + + delete mTestProc; + delete mSetupProc; + delete mTestWin; +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::load() +{ + load( false ); +} + +void KScreenSaver::load( bool useDefaults ) +{ + readSettings( useDefaults); + +//with the following line, the Test and Setup buttons are not enabled correctly +//if no saver was selected, the "Reset" and the "Enable screensaver", it is only called when starting and when pressing reset, aleXXX +// mSelected = -1; + int i = 0; + QListViewItem *selectedItem = 0; + for (SaverConfig* saver = mSaverList.first(); saver != 0; saver = mSaverList.next()) { + if (saver->file() == mSaver) + { + selectedItem = mSaverListView->findItem ( saver->name(), 0 ); + if (selectedItem) { + mSelected = i; + break; + } + } + i++; + } + if ( selectedItem ) + { + mSaverListView->setSelected( selectedItem, true ); + mSaverListView->setCurrentItem( selectedItem ); + slotScreenSaver( selectedItem ); + } + + updateValues(); + mChanged = useDefaults; + emit changed( useDefaults ); +} + +//------------------------------------------------------------After--------------- +// +void KScreenSaver::readSettings( bool useDefaults ) +{ + KConfig *config = new KConfig( "kdesktoprc"); + + config->setReadDefaults( useDefaults ); + + mImmutable = config->groupIsImmutable("ScreenSaver"); + + config->setGroup( "ScreenSaver" ); + + mEnabled = config->readBoolEntry("Enabled", false); + mTimeout = config->readNumEntry("Timeout", 300); + mLockTimeout = config->readNumEntry("LockGrace", 60000); + mLock = config->readBoolEntry("Lock", false); + mSaver = config->readEntry("Saver"); + + if (mTimeout < 60) mTimeout = 60; + if (mLockTimeout < 0) mLockTimeout = 0; + if (mLockTimeout > 300000) mLockTimeout = 300000; + + mChanged = false; + delete config; +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::updateValues() +{ + if (mEnabled) + { + mWaitEdit->setValue(mTimeout/60); + } + else + { + mWaitEdit->setValue(0); + } + + mWaitLockEdit->setValue(mLockTimeout/1000); + mLockCheckBox->setChecked(mLock); +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::defaults() +{ + load( true ); +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::save() +{ + if ( !mChanged ) + return; + + KConfig *config = new KConfig( "kdesktoprc"); + config->setGroup( "ScreenSaver" ); + + config->writeEntry("Enabled", mEnabled); + config->writeEntry("Timeout", mTimeout); + config->writeEntry("LockGrace", mLockTimeout); + config->writeEntry("Lock", mLock); + + if ( !mSaver.isEmpty() ) + 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); +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::findSavers() +{ + if ( !mNumLoaded ) { + mSaverFileList = KGlobal::dirs()->findAllResources("scrsav", + "*.desktop", false, true); + new QListViewItem ( mSaverListView, i18n("Loading...") ); + if ( mSaverFileList.isEmpty() ) + mLoadTimer->stop(); + else + mLoadTimer->start( 50 ); + } + + for ( int i = 0; i < 5 && + (unsigned)mNumLoaded < mSaverFileList.count(); + i++, mNumLoaded++ ) { + QString file = mSaverFileList[mNumLoaded]; + SaverConfig *saver = new SaverConfig; + if (saver->read(file)) { + mSaverList.append(saver); + } else + delete saver; + } + + if ( (unsigned)mNumLoaded == mSaverFileList.count() ) { + QListViewItem *selectedItem = 0; + int categoryCount = 0; + int indx = 0; + + mLoadTimer->stop(); + delete mLoadTimer; + mSaverList.sort(); + + mSelected = -1; + mSaverListView->clear(); + for ( SaverConfig *s = mSaverList.first(); s != 0; s = mSaverList.next()) + { + QListViewItem *item; + if (s->category().isEmpty()) + item = new QListViewItem ( mSaverListView, s->name(), "2" + s->name() ); + else + { + QListViewItem *categoryItem = mSaverListView->findItem( s->category(), 0 ); + if ( !categoryItem ) { + categoryItem = new QListViewItem ( mSaverListView, s->category(), "1" + s->category() ); + categoryItem->setPixmap ( 0, SmallIcon ( "kscreensaver" ) ); + } + item = new QListViewItem ( categoryItem, s->name(), s->name() ); + categoryCount++; + } + if (s->file() == mSaver) { + mSelected = indx; + selectedItem = item; + } + indx++; + } + + // Delete categories with only one item + QListViewItemIterator it ( mSaverListView ); + for ( ; it.current(); it++ ) + if ( it.current()->childCount() == 1 ) { + QListViewItem *item = it.current()->firstChild(); + it.current()->takeItem( item ); + mSaverListView->insertItem ( item ); + delete it.current(); + categoryCount--; + } + + mSaverListView->setRootIsDecorated ( categoryCount > 0 ); + mSaverListView->setSorting ( 1 ); + + if ( mSelected > -1 ) + { + mSaverListView->setSelected(selectedItem, true); + mSaverListView->setCurrentItem(selectedItem); + mSaverListView->ensureItemVisible(selectedItem); + mSetupBt->setEnabled(!mSaverList.at(mSelected)->setup().isEmpty()); + mTestBt->setEnabled(true); + } + + connect( mSaverListView, SIGNAL( currentChanged( QListViewItem * ) ), + this, SLOT( slotScreenSaver( QListViewItem * ) ) ); + + setMonitor(); + } +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::setMonitor() +{ + if (mPreviewProc->isRunning()) + // CC: this will automatically cause a "slotPreviewExited" + // when the viewer exits + mPreviewProc->kill(); + else + slotPreviewExited(mPreviewProc); +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::slotPreviewExited(KProcess *) +{ + // Ugly hack to prevent continual respawning of savers that crash + if (mSelected == mPrevSelected) + return; + + if ( mSaverList.isEmpty() ) // safety check + return; + + // Some xscreensaver hacks do something nasty to the window that + // requires a new one to be created (or proper investigation of the + // problem). + delete mMonitor; + + mMonitor = new KSSMonitor(mMonitorLabel); + mMonitor->setBackgroundColor(black); + mMonitor->setGeometry((mMonitorLabel->width()-200)/2+23, + (mMonitorLabel->height()-186)/2+14, 151, 115); + mMonitor->show(); + // So that hacks can XSelectInput ButtonPressMask + XSelectInput(qt_xdisplay(), mMonitor->winId(), widgetEventMask ); + + if (mSelected >= 0) { + mPreviewProc->clearArguments(); + + QString saver = mSaverList.at(mSelected)->saver(); + QTextStream ts(&saver, IO_ReadOnly); + + QString word; + ts >> word; + QString path = 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; +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::slotEnable(bool e) +{ + mEnabled = e; + mActivateLbl->setEnabled( e ); + mWaitEdit->setEnabled( e ); + mLockCheckBox->setEnabled( e ); + mLockLbl->setEnabled( e && mLock ); + mWaitLockEdit->setEnabled( e && mLock ); + mChanged = true; + emit changed(true); +} + + +//--------------------------------------------------------------------------- +// +void KScreenSaver::slotScreenSaver(QListViewItem *item) +{ + if (!item) + return; + + int i = 0, indx = -1; + for (SaverConfig* saver = mSaverList.first(); saver != 0; saver = mSaverList.next()) { + if ( item->parent() ) + { + if ( item->parent()->text( 0 ) == saver->category() && saver->name() == item->text (0)) + { + indx = i; + break; + } + } + else + { + if ( saver->name() == item->text (0) ) + { + indx = i; + break; + } + } + i++; + } + if (indx == -1) { + mSelected = -1; + return; + } + + bool bChanged = (indx != mSelected); + + if (!mSetupProc->isRunning()) + mSetupBt->setEnabled(!mSaverList.at(indx)->setup().isEmpty()); + mTestBt->setEnabled(true); + mSaver = mSaverList.at(indx)->file(); + + mSelected = indx; + setMonitor(); + if (bChanged) + { + mChanged = true; + emit changed(true); + } +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::slotSetup() +{ + if ( mSelected < 0 ) + return; + + if (mSetupProc->isRunning()) + return; + + mSetupProc->clearArguments(); + + QString saver = mSaverList.at(mSelected)->setup(); + if( saver.isEmpty()) + return; + QTextStream ts(&saver, IO_ReadOnly); + + QString word; + ts >> word; + bool kxsconfig = word == "kxsconfig"; + QString path = findExe(word); + + if (!path.isEmpty()) + { + (*mSetupProc) << path; + + // Add caption and icon to about dialog + if (!kxsconfig) { + word = "-caption"; + (*mSetupProc) << word; + word = mSaverList.at(mSelected)->name(); + (*mSetupProc) << word; + word = "-icon"; + (*mSetupProc) << word; + word = "kscreensaver"; + (*mSetupProc) << word; + } + + while (!ts.atEnd()) + { + ts >> word; + (*mSetupProc) << word; + } + + // Pass translated name to kxsconfig + if (kxsconfig) { + word = mSaverList.at(mSelected)->name(); + (*mSetupProc) << word; + } + + mSetupBt->setEnabled( false ); + kapp->flushX(); + + mSetupProc->start(); + } +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::slotAdvanced() +{ + KScreenSaverAdvancedDialog dlg( topLevelWidget() ); + if ( dlg.exec() ) { + mChanged = true; + emit changed(true); + } +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::slotTest() +{ + if ( mSelected == -1 ) + return; + + if (!mTestProc) { + mTestProc = new KProcess; + } + + mTestProc->clearArguments(); + QString saver = mSaverList.at(mSelected)->saver(); + QTextStream ts(&saver, IO_ReadOnly); + + QString word; + ts >> word; + QString path = 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()); + } + + mTestWin->show(); + mTestWin->raise(); + mTestWin->setFocus(); + // So that hacks can XSelectInput ButtonPressMask + XSelectInput(qt_xdisplay(), mTestWin->winId(), widgetEventMask ); + + grabMouse(); + grabKeyboard(); + + mTestBt->setEnabled( FALSE ); + mPreviewProc->kill(); + + while (!ts.atEnd()) + { + ts >> word; + if (word == "%w") + { + word = word.setNum(mTestWin->winId()); + } + (*mTestProc) << word; + } + + mTesting = true; + mTestProc->start(KProcess::NotifyOnExit); + } +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::slotStopTest() +{ + if (mTestProc->isRunning()) { + mTestProc->kill(); + } + releaseMouse(); + releaseKeyboard(); + mTestWin->hide(); + mTestBt->setEnabled(true); + mPrevSelected = -1; + setMonitor(); + mTesting = false; +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::slotTimeoutChanged(int to ) +{ + mTimeout = to * 60; + mChanged = true; + emit changed(true); +} + +//----------------------------------------------------------------------- +// +void KScreenSaver::slotLockTimeoutChanged(int to ) +{ + mLockTimeout = to * 1000; + mChanged = true; + emit changed(true); +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::slotLock( bool l ) +{ + mLock = l; + mLockLbl->setEnabled( l ); + mWaitLockEdit->setEnabled( l ); + mChanged = true; + emit changed(true); +} + +//--------------------------------------------------------------------------- +// +void KScreenSaver::slotSetupDone(KProcess *) +{ + mPrevSelected = -1; // see ugly hack in slotPreviewExited() + setMonitor(); + mSetupBt->setEnabled( true ); + emit changed(true); +} + +#include "scrnsave.moc" |