//----------------------------------------------------------------------------- // // 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 <sys/stat.h> #include <tqbuttongroup.h> #include <tqcheckbox.h> #include <tqheader.h> #include <tqlabel.h> #include <tqlayout.h> #include <tqlistview.h> #include <tqpushbutton.h> #include <tqslider.h> #include <tqtimer.h> #include <tqfileinfo.h> #include <tqwhatsthis.h> #include <dcopclient.h> #include <tdeaboutdata.h> #include <tdeapplication.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 <ksimpleconfig.h> #include <X11/Xlib.h> #include "scrnsave.h" #include <fixx11h.h> #define OPEN_TDMCONFIG_AND_SET_GROUP \ if( stat( KDE_CONFDIR "/tdm/tdmdistrc" , &st ) == 0) { \ mTDMConfig = new KSimpleConfig( TQString::fromLatin1( KDE_CONFDIR "/tdm/tdmdistrc" )); \ } \ else { \ mTDMConfig = new KSimpleConfig( TQString::fromLatin1( KDE_CONFDIR "/tdm/tdmrc" )); \ } \ mTDMConfig->setGroup("X-:*-Greeter"); template class TQPtrList<SaverConfig>; const uint widgetEventMask = // X event mask (uint)( ExposureMask | PropertyChangeMask | StructureNotifyMask ); //=========================================================================== // DLL Interface for kcontrol typedef KGenericFactory<KScreenSaver, TQWidget > KSSFactory; K_EXPORT_COMPONENT_FACTORY (kcm_screensaver, KSSFactory("kcmscreensaver") ) static TQString findExe(const TQString &exe) { TQString result = locate("exe", exe); if (result.isEmpty()) result = TDEStandardDirs::findExe(exe); return result; } KScreenSaver::KScreenSaver(TQWidget *parent, const char *name, const TQStringList&) : TDECModule(KSSFactory::instance(), parent, name) { mSetupProc = 0; mPreviewProc = 0; mTestWin = 0; mTestProc = 0; mPrevSelected = -2; mMonitor = 0; mTesting = false; struct stat st; OPEN_TDMCONFIG_AND_SET_GROUP // Add non-TDE path TDEGlobal::dirs()->addResourceType("scrsav", TDEGlobal::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( TDECModule::Help | TDECModule::Default | TDECModule::Apply ); // Add KDE specific screensaver path TQString relPath="System/ScreenSavers/"; KServiceGroup::Ptr servGroup = KServiceGroup::baseGroup( "screensavers" ); if (servGroup) { relPath=servGroup->relPath(); kdDebug() << "relPath=" << relPath << endl; } TDEGlobal::dirs()->addResourceType("scrsav", TDEGlobal::dirs()->kde_default("apps") + relPath); readSettings( false ); mSetupProc = new TDEProcess; connect(mSetupProc, TQT_SIGNAL(processExited(TDEProcess *)), this, TQT_SLOT(slotSetupDone(TDEProcess *))); mPreviewProc = new TDEProcess; connect(mPreviewProc, TQT_SIGNAL(processExited(TDEProcess *)), this, TQT_SLOT(slotPreviewExited(TDEProcess *))); TQBoxLayout *topLayout = new TQHBoxLayout(this, 0, KDialog::spacingHint()); // left column TQVBoxLayout *leftColumnLayout = new TQVBoxLayout(topLayout, KDialog::spacingHint()); TQBoxLayout *vLayout = new TQVBoxLayout(leftColumnLayout, KDialog::spacingHint()); mSaverGroup = new TQGroupBox(i18n("Screen Saver"), this ); mSaverGroup->setColumnLayout( 0, Qt::Horizontal ); vLayout->addWidget(mSaverGroup); vLayout->setStretchFactor( mSaverGroup, 10 ); TQBoxLayout *groupLayout = new TQVBoxLayout( mSaverGroup->layout(), KDialog::spacingHint() ); mSaverListView = new TQListView( mSaverGroup ); mSaverListView->setMinimumHeight( 120 ); mSaverListView->setSizePolicy(TQSizePolicy::Preferred, TQSizePolicy::Expanding); mSaverListView->addColumn(""); mSaverListView->header()->hide(); mSelected = -1; groupLayout->addWidget( mSaverListView, 10 ); connect( mSaverListView, TQT_SIGNAL(doubleClicked ( TQListViewItem *)), this, TQT_SLOT( slotSetup())); TQWhatsThis::add( mSaverListView, i18n("Select the screen saver to use.") ); TQBoxLayout* hlay = new TQHBoxLayout(groupLayout, KDialog::spacingHint()); mSetupBt = new TQPushButton( i18n("&Setup..."), mSaverGroup ); connect( mSetupBt, TQT_SIGNAL( clicked() ), TQT_SLOT( slotSetup() ) ); mSetupBt->setEnabled(false); hlay->addWidget( mSetupBt ); TQWhatsThis::add( mSetupBt, i18n("Configure the screen saver's options, if any.") ); mTestBt = new TQPushButton( i18n("&Test"), mSaverGroup ); connect( mTestBt, TQT_SIGNAL( clicked() ), TQT_SLOT( slotTest() ) ); mTestBt->setEnabled(false); hlay->addWidget( mTestBt ); TQWhatsThis::add( mTestBt, i18n("Show a full screen preview of the screen saver.") ); mSettingsGroup = new TQGroupBox( i18n("Settings"), this ); mSettingsGroup->setColumnLayout( 0, Qt::Vertical ); leftColumnLayout->addWidget( mSettingsGroup ); TQGridLayout *settingsGroupLayout = new TQGridLayout( mSettingsGroup->layout(), 5, 2, KDialog::spacingHint() ); mEnabledCheckBox = new TQCheckBox(i18n("Start a&utomatically"), mSettingsGroup); mEnabledCheckBox->setChecked(mEnabled); TQWhatsThis::add( mEnabledCheckBox, i18n("Automatically start the screen saver after a period of inactivity.") ); connect(mEnabledCheckBox, TQT_SIGNAL(toggled(bool)), this, TQT_SLOT(slotEnable(bool))); settingsGroupLayout->addWidget(mEnabledCheckBox, 0, 0); TQBoxLayout *hbox = new TQHBoxLayout(); settingsGroupLayout->addLayout(hbox, 1, 0); hbox->addSpacing(30); mActivateLbl = new TQLabel(i18n("After:"), mSettingsGroup); mActivateLbl->setEnabled(mEnabled); hbox->addWidget(mActivateLbl); mWaitEdit = new TQSpinBox(mSettingsGroup); mWaitEdit->setSteps(1, 10); mWaitEdit->setRange(1, INT_MAX); mWaitEdit->setSuffix(i18n(" min")); mWaitEdit->setValue(mTimeout/60); mWaitEdit->setEnabled(mEnabled); connect(mWaitEdit, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(slotTimeoutChanged(int))); mActivateLbl->setBuddy(mWaitEdit); hbox->addWidget(mWaitEdit); hbox->addStretch(1); TQString wtstr = i18n("The period of inactivity after which the screen saver should start."); TQWhatsThis::add( mActivateLbl, wtstr ); TQWhatsThis::add( mWaitEdit, wtstr ); mLockCheckBox = new TQCheckBox( i18n("&Require password to stop"), mSettingsGroup ); mLockCheckBox->setEnabled( mEnabled ); mLockCheckBox->setChecked( mLock ); connect( mLockCheckBox, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( slotLock( bool ) ) ); settingsGroupLayout->addWidget(mLockCheckBox, 2, 0); TQWhatsThis::add( mLockCheckBox, i18n("Prevent potential unauthorized use by requiring a password to stop the screen saver.") ); hbox = new TQHBoxLayout(); settingsGroupLayout->addLayout(hbox, 3, 0); hbox->addSpacing(30); mLockLbl = new TQLabel(i18n("After:"), mSettingsGroup); mLockLbl->setEnabled(mEnabled && mLock); TQWhatsThis::add( mLockLbl, i18n("The amount of time, after the screen saver has started, to ask for the unlock password.") ); hbox->addWidget(mLockLbl); mWaitLockEdit = new TQSpinBox(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, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(slotLockTimeoutChanged(int))); mLockLbl->setBuddy(mWaitLockEdit); hbox->addWidget(mWaitLockEdit); hbox->addStretch(1); TQString wltstr = i18n("Choose the period after which the display will be locked. "); TQWhatsThis::add( mLockLbl, wltstr ); TQWhatsThis::add( mWaitLockEdit, wltstr ); mDelaySaverStartCheckBox = new TQCheckBox( i18n("&Delay saver start after lock"), mSettingsGroup ); mDelaySaverStartCheckBox->setEnabled( true ); mDelaySaverStartCheckBox->setChecked( mDelaySaverStart ); connect( mDelaySaverStartCheckBox, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( slotDelaySaverStart( bool ) ) ); settingsGroupLayout->addWidget(mDelaySaverStartCheckBox, 0, 1); TQWhatsThis::add( mDelaySaverStartCheckBox, i18n("When manually locking the screen, wait to start the screen saver until the configured start delay has elapsed.") ); mUseTSAKCheckBox = new TQCheckBox( i18n("&Use Secure Attention Key"), mSettingsGroup ); mUseTSAKCheckBox->setEnabled( true ); mUseTSAKCheckBox->setChecked( mUseTSAK ); connect( mUseTSAKCheckBox, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( slotUseTSAK( bool ) ) ); settingsGroupLayout->addWidget(mUseTSAKCheckBox, 1, 1); TQWhatsThis::add( mUseTSAKCheckBox, i18n("Require Secure Attention Key prior to displaying the unlock dialog.") ); mUseUnmanagedLockWindowsCheckBox = new TQCheckBox( i18n("Use &legacy lock windows"), mSettingsGroup ); mUseUnmanagedLockWindowsCheckBox->setEnabled( true ); mUseUnmanagedLockWindowsCheckBox->setChecked( mUseUnmanagedLockWindows ); connect( mUseUnmanagedLockWindowsCheckBox, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( slotUseUnmanagedLockWindows( bool ) ) ); settingsGroupLayout->addWidget(mUseUnmanagedLockWindowsCheckBox, 2, 1); TQWhatsThis::add( mUseUnmanagedLockWindowsCheckBox, i18n("Use old-style unmanaged X11 lock windows.") ); mHideActiveWindowsFromSaverCheckBox = new TQCheckBox( i18n("Hide active &windows from saver"), mSettingsGroup ); mHideActiveWindowsFromSaverCheckBox->setEnabled( true ); mHideActiveWindowsFromSaverCheckBox->setChecked( mHideActiveWindowsFromSaver ); connect( mHideActiveWindowsFromSaverCheckBox, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( slotHideActiveWindowsFromSaver( bool ) ) ); settingsGroupLayout->addWidget(mHideActiveWindowsFromSaverCheckBox, 3, 1); TQWhatsThis::add( mHideActiveWindowsFromSaverCheckBox, i18n("Hide all active windows from the screen saver and use the desktop background as the screen saver input.") ); mHideCancelButtonCheckBox = new TQCheckBox( i18n("Hide &cancel button"), mSettingsGroup ); mHideCancelButtonCheckBox->setEnabled( true ); mHideCancelButtonCheckBox->setChecked( mHideCancelButton ); connect( mHideCancelButtonCheckBox, TQT_SIGNAL(toggled(bool)), this, TQT_SLOT(slotHideCancelButton(bool)) ); settingsGroupLayout->addWidget(mHideCancelButtonCheckBox, 4, 1); TQWhatsThis::add(mHideCancelButtonCheckBox, i18n("Hide Cancel button from the \"Desktop Session Locked\" dialog.")); // right column TQBoxLayout* rightColumnLayout = new TQVBoxLayout(topLayout, KDialog::spacingHint()); mMonitorLabel = new TQLabel( this ); mMonitorLabel->setAlignment( AlignCenter ); mMonitorLabel->setPixmap( TQPixmap(locate("data", "kcontrol/pics/monitor.png"))); rightColumnLayout->addWidget(mMonitorLabel, 0); TQWhatsThis::add( mMonitorLabel, i18n("A preview of the selected screen saver.") ); TQBoxLayout* advancedLayout = new TQHBoxLayout( rightColumnLayout, 3 ); advancedLayout->addWidget( new TQWidget( this ) ); TQPushButton* advancedBt = new TQPushButton( i18n( "Advanced &Options" ), this, "advancedBtn" ); advancedBt->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed) ); connect( advancedBt, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotAdvanced() ) ); advancedLayout->addWidget( advancedBt ); advancedLayout->addWidget( new TQWidget( 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 TQTimer( this ); connect( mLoadTimer, TQT_SIGNAL(timeout()), TQT_SLOT(findSavers()) ); mLoadTimer->start( 100 ); mChanged = false; emit changed(false); TDEAboutData *about = new TDEAboutData(I18N_NOOP("kcmscreensaver"), I18N_NOOP("TDE Screen Saver Control Module"), 0, 0, TDEAboutData::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); processLockouts(); } //--------------------------------------------------------------------------- // void KScreenSaver::resizeEvent( TQResizeEvent * ) { if (mMonitor) { mMonitor->setGeometry( (mMonitorLabel->width()-200)/2+23, (mMonitorLabel->height()-186)/2+14, 151, 115 ); } } //--------------------------------------------------------------------------- // void KScreenSaver::mousePressEvent( TQMouseEvent *) { if ( mTesting ) slotStopTest(); } //--------------------------------------------------------------------------- // void KScreenSaver::keyPressEvent( TQKeyEvent *) { 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; delete mTDMConfig; } //--------------------------------------------------------------------------- // 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; TQListViewItem *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 ) { TDEConfig *config = new TDEConfig( "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); mDelaySaverStart = config->readBoolEntry("DelaySaverStart", true); mUseTSAK = config->readBoolEntry("UseTDESAK", true); mUseUnmanagedLockWindows = config->readBoolEntry("UseUnmanagedLockWindows", false); mHideActiveWindowsFromSaver = config->readBoolEntry("HideActiveWindowsFromSaver", true); mHideCancelButton = config->readBoolEntry("HideCancelButton", 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; TDEConfig *config = new TDEConfig( "kdesktoprc"); config->setGroup( "ScreenSaver" ); config->writeEntry("Enabled", mEnabled); config->writeEntry("Timeout", mTimeout); config->writeEntry("LockGrace", mLockTimeout); config->writeEntry("Lock", mLock); config->writeEntry("DelaySaverStart", mDelaySaverStart); config->writeEntry("UseTDESAK", mUseTSAK); config->writeEntry("UseUnmanagedLockWindows", mUseUnmanagedLockWindows); config->writeEntry("HideActiveWindowsFromSaver", mHideActiveWindowsFromSaver); config->writeEntry("HideCancelButton", mHideCancelButton); 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()", TQString("")); mChanged = false; emit changed(false); } //--------------------------------------------------------------------------- // void KScreenSaver::findSavers() { if ( !mNumLoaded ) { mSaverFileList = TDEGlobal::dirs()->findAllResources("scrsav", "*.desktop", false, true); new TQListViewItem ( mSaverListView, i18n("Loading...") ); if ( mSaverFileList.isEmpty() ) mLoadTimer->stop(); else mLoadTimer->start( 50 ); } for ( int i = 0; i < 5 && (unsigned)mNumLoaded < mSaverFileList.count(); i++, mNumLoaded++ ) { TQString file = mSaverFileList[mNumLoaded]; SaverConfig *saver = new SaverConfig; if (saver->read(file)) { TQString saverexec = TQString("%1/%2").arg(XSCREENSAVER_HACKS_DIR).arg(saver->exec()); // find the xscreensaver executable //work around a TDEStandardDirs::findExe() "feature" where it looks in $TDEDIR/bin first no matter what and sometimes finds the wrong executable TQFileInfo checkExe; checkExe.setFile(saverexec); if (checkExe.exists() && checkExe.isExecutable() && checkExe.isFile()) { mSaverList.append(saver); } else { // Executable not present in XScreenSaver directory! // Try standard paths if (TDEStandardDirs::findExe(saver->exec()) != TQString::null) { mSaverList.append(saver); } else { delete saver; } } } else { delete saver; } } if ( (unsigned)mNumLoaded == mSaverFileList.count() ) { TQListViewItem *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()) { TQListViewItem *item; if (s->category().isEmpty()) item = new TQListViewItem ( mSaverListView, s->name(), "2" + s->name() ); else { TQListViewItem *categoryItem = mSaverListView->findItem( s->category(), 0 ); if ( !categoryItem ) { categoryItem = new TQListViewItem ( mSaverListView, s->category(), "1" + s->category() ); categoryItem->setPixmap ( 0, SmallIcon ( "tdescreensaver" ) ); } item = new TQListViewItem ( categoryItem, s->name(), s->name() ); categoryCount++; } if (s->file() == mSaver) { mSelected = indx; selectedItem = item; } indx++; } // Delete categories with only one item TQListViewItemIterator it ( mSaverListView ); for ( ; it.current(); it++ ) if ( it.current()->childCount() == 1 ) { TQListViewItem *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, TQT_SIGNAL( currentChanged( TQListViewItem * ) ), this, TQT_SLOT( slotScreenSaver( TQListViewItem * ) ) ); 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(TDEProcess *) { // 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(tqt_xdisplay(), mMonitor->winId(), widgetEventMask ); if (mSelected >= 0) { mPreviewProc->clearArguments(); TQString saver = mSaverList.at(mSelected)->saver(); TQTextStream ts(&saver, IO_ReadOnly); TQString word; ts >> word; TQString 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; processLockouts(); mChanged = true; emit changed(true); } //--------------------------------------------------------------------------- // void KScreenSaver::processLockouts() { bool useSAK = mTDMConfig->readBoolEntry("UseSAK", false); mActivateLbl->setEnabled( mEnabled ); mWaitEdit->setEnabled( mEnabled ); mLockCheckBox->setEnabled( mEnabled ); if (mEnabled && !mUseUnmanagedLockWindows) { mDelaySaverStartCheckBox->setEnabled( true ); mDelaySaverStartCheckBox->setChecked( mDelaySaverStart ); } else { mDelaySaverStartCheckBox->setEnabled( false ); mDelaySaverStartCheckBox->setChecked( false ); } if (!mUseUnmanagedLockWindows && useSAK) { mUseTSAKCheckBox->setEnabled( true ); mUseTSAKCheckBox->setChecked( mUseTSAK ); } else { mUseTSAKCheckBox->setEnabled( false ); mUseTSAKCheckBox->setChecked( false ); } if (!mUseUnmanagedLockWindows) { mHideActiveWindowsFromSaverCheckBox->setEnabled( true ); mHideActiveWindowsFromSaverCheckBox->setChecked( mHideActiveWindowsFromSaver ); } else { mHideActiveWindowsFromSaverCheckBox->setEnabled( false ); mHideActiveWindowsFromSaverCheckBox->setChecked( false ); } if (mUseUnmanagedLockWindows || (useSAK && mUseTSAK)) { mHideCancelButtonCheckBox->setEnabled( false ); mHideCancelButtonCheckBox->setChecked( false ); } else { mHideCancelButtonCheckBox->setEnabled( true ); mHideCancelButtonCheckBox->setChecked( mHideCancelButton ); } mLockLbl->setEnabled( mEnabled && mLock ); mWaitLockEdit->setEnabled( mEnabled && mLock ); } //--------------------------------------------------------------------------- // void KScreenSaver::slotScreenSaver(TQListViewItem *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(); TQString saver = mSaverList.at(mSelected)->setup(); if( saver.isEmpty()) return; TQTextStream ts(&saver, IO_ReadOnly); TQString word; ts >> word; bool kxsconfig = word == "kxsconfig"; TQString 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 = "tdescreensaver"; (*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 TDEProcess; } mTestProc->clearArguments(); TQString saver = mSaverList.at(mSelected)->saver(); TQTextStream ts(&saver, IO_ReadOnly); TQString word; ts >> word; TQString path = findExe(word); if (!path.isEmpty()) { (*mTestProc) << path; if (!mTestWin) { mTestWin = new TestWin(); mTestWin->setBackgroundMode(TQWidget::NoBackground); mTestWin->setGeometry(0, 0, kapp->desktop()->width(), kapp->desktop()->height()); } mTestWin->show(); mTestWin->raise(); mTestWin->setFocus(); // So that hacks can XSelectInput ButtonPressMask XSelectInput(tqt_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(TDEProcess::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::slotDelaySaverStart( bool d ) { if (mDelaySaverStartCheckBox->isEnabled()) mDelaySaverStart = d; processLockouts(); mChanged = true; emit changed(true); } //--------------------------------------------------------------------------- // void KScreenSaver::slotUseTSAK( bool u ) { if (mUseTSAKCheckBox->isEnabled()) mUseTSAK = u; processLockouts(); mChanged = true; emit changed(true); } //--------------------------------------------------------------------------- // void KScreenSaver::slotUseUnmanagedLockWindows( bool u ) { if (mUseUnmanagedLockWindowsCheckBox->isEnabled()) mUseUnmanagedLockWindows = u; processLockouts(); mChanged = true; emit changed(true); } //--------------------------------------------------------------------------- // void KScreenSaver::slotHideActiveWindowsFromSaver( bool h ) { if (mHideActiveWindowsFromSaverCheckBox->isEnabled()) mHideActiveWindowsFromSaver = h; processLockouts(); mChanged = true; emit changed(true); } //--------------------------------------------------------------------------- // void KScreenSaver::slotHideCancelButton( bool h ) { if (mHideCancelButtonCheckBox->isEnabled()) mHideCancelButton = h; processLockouts(); mChanged = true; emit changed(true); } //--------------------------------------------------------------------------- // void KScreenSaver::slotSetupDone(TDEProcess *) { mPrevSelected = -1; // see ugly hack in slotPreviewExited() setMonitor(); mSetupBt->setEnabled( true ); emit changed(true); } #include "scrnsave.moc"