2 * Copyright (C) 2001 Stefan Schimanski <1Stein@gmx.de>
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this program; if not, write to the Free
16 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
28 #include <q3valuelist.h>
29 #include <qpushbutton.h>
30 #include <qradiobutton.h>
32 #include <qcheckbox.h>
38 #include <kapplication.h>
40 #include <klibloader.h>
42 #include <kfiledialog.h>
44 #include <kparts/part.h>
45 #include <kparts/componentfactory.h>
46 #include <kio/jobclasses.h>
48 #include <kmimetype.h>
50 #include <kscreensaver.h>
52 #include "configwidget.h"
53 #include "kpartsaver.h"
54 #include <kiconloader.h>
58 Q3PtrList
<KPartSaver
> g_savers
;
59 bool g_inited
= false;
62 class KPartSaverInterface
: public KScreenSaverInterface
67 virtual KAboutData
* aboutData() {
68 return new KAboutData( "kpartsaver", I18N_NOOP( "KPart Screen Saver" ), "1.0", I18N_NOOP( "KPart Screen Saver" ) );
72 virtual KScreenSaver
* create( WId d
)
74 KGlobal::locale()->insertCatalog("kpartsaver");
75 return new KPartSaver( d
);
78 virtual QDialog
* setup()
80 KGlobal::locale()->insertCatalog("kpartsaver");
81 return new SaverConfig
;
85 int main( int argc
, char *argv
[] )
87 KPartSaverInterface kss
;
88 return kScreenSaverMain( argc
, argv
, kss
);
92 void exitHandler( int )
94 kDebug() << "exitHandler" << endl
;
96 KLibLoader::self()->cleanUp();
101 KPartSaver::KPartSaver( WId id
)
102 : KScreenSaver( id
), m_timer(), m_part(0), m_current(-1), m_back(0)
104 // install signal handlers to make sure that nspluginviewer is shutdown correctly
105 // move this into the nspluginviewer kpart code
108 g_savers
.setAutoDelete( true );
112 // install signal handler
113 signal( SIGINT
, exitHandler
); // Ctrl-C will cause a clean exit...
114 signal( SIGTERM
, exitHandler
); // "kill"...
115 signal( SIGHUP
, exitHandler
); // "kill -HUP" (hangup)...
116 signal( SIGKILL
, exitHandler
); // "kill -KILL"
117 //atexit( ( void (*)(void) ) exitHandler );
120 g_savers
.append( this );
125 KConfig
*cfg
= KGlobal::config();
126 cfg
->setGroup( "Misc" );
128 m_single
= cfg
->readBoolEntry( "Single", true );
129 m_delay
= cfg
->readNumEntry( "Delay", 60 );
130 m_random
= cfg
->readBoolEntry( "Random", false );
131 m_files
= cfg
->readListEntry( "Files" );
133 if( m_files
.count()==0 ) {
135 // create background widget
136 m_back
= new QLabel( i18n("The screen saver is not configured yet."), this );
138 m_back
->setAlignment( Qt::AlignCenter
);
145 for( int n
=0; n
<m_files
.count(); n
++ )
146 queue( KUrl::fromPathOrUrl( m_files
[n
] ) );
153 QTimer::singleShot( m_delay
*1000, this, SLOT(timeout()) );
159 KPartSaver::~KPartSaver()
161 g_savers
.take( g_savers
.findRef( this ));
166 void KPartSaver::closeURL()
176 bool KPartSaver::openURL( KUrl url
)
182 QString mime
= KMimeType::findByURL( url
)->name();
185 m_part
= KParts::ComponentFactory::createPartInstanceFromQuery
<KParts::ReadOnlyPart
>(
186 mime
, QString(), this, this );
189 kDebug() << "Part for " << url
<< " can't be constructed" << endl
;
193 embed( m_part
->widget() );
200 m_part
->widget()->show();
203 if( !m_part
->openURL( url
) ) {
204 kDebug() << "Can't load " << url
.url() << endl
;
215 void KPartSaver::queue( KUrl url
)
219 medium
.failed
= false;
220 m_media
.append( medium
);
224 void KPartSaver::timeout()
227 QTimer::singleShot( m_delay
*1000, this, SLOT(timeout()) );
231 void KPartSaver::next( bool random
)
233 // try to find working media
234 while( m_media
.count()>0 ) {
237 m_current
= rand() % m_media
.count();
241 if( m_current
>=(int)m_media
.count() )
244 kDebug() << "Trying medium " << m_media
[m_current
].url
.url() << endl
;
246 // either start immediately or start mimejob first
247 if( !openURL( m_media
[m_current
].url
) ) {
248 m_media
.remove( m_media
.at(m_current
) );
255 // create background widget
256 m_back
= new QLabel( i18n("All of your files are unsupported"), this );
258 m_back
->setAlignment( Qt::AlignCenter
);
262 // nothing found, set to invalid
267 /*******************************************************************************/
270 SaverConfig::SaverConfig( QWidget
* parent
, const char* name
)
271 : ConfigWidget( parent
, name
, true )
273 connect( m_ok
, SIGNAL(clicked()), SLOT(apply()) );
274 connect( m_ok
, SIGNAL(clicked()), SLOT(accept()) );
275 connect( m_cancel
, SIGNAL(clicked()), SLOT(reject()) );
277 connect( m_multiple
, SIGNAL(toggled(bool)), m_delayLabel
, SLOT(setEnabled(bool)) );
278 connect( m_multiple
, SIGNAL(toggled(bool)), m_delay
, SLOT(setEnabled(bool)) );
279 connect( m_multiple
, SIGNAL(toggled(bool)), m_secondsLabel
, SLOT(setEnabled(bool)) );
280 connect( m_multiple
, SIGNAL(toggled(bool)), m_random
, SLOT(setEnabled(bool)) );
282 connect( m_files
, SIGNAL(selectionChanged()), SLOT(select()) );
283 connect( m_add
, SIGNAL(clicked()), SLOT(add()) );
284 connect( m_remove
, SIGNAL(clicked()), SLOT(remove()) );
285 connect( m_up
, SIGNAL(clicked()), SLOT(up()) );
286 connect( m_down
, SIGNAL(clicked()), SLOT(down()) );
288 m_up
->setIcon( SmallIconSet("up") );
289 m_down
->setIcon( SmallIconSet("down") );
292 KConfig
*cfg
= KGlobal::config();
293 cfg
->setGroup( "Misc" );
295 bool single
= cfg
->readBoolEntry( "Single", true );
296 m_single
->setChecked( single
);
297 m_multiple
->setChecked( !single
);
298 m_delay
->setMinimum( 1 );
299 m_delay
->setMaximum( 10000 );
300 m_delay
->setValue( cfg
->readNumEntry( "Delay", 60 ) );
301 m_random
->setChecked( cfg
->readBoolEntry( "Random", false ) );
302 m_files
->insertStringList( cfg
->readListEntry( "Files" ) );
309 SaverConfig::~SaverConfig()
314 void SaverConfig::apply()
316 kDebug() << "apply" << endl
;
318 KConfig
*cfg
= KGlobal::config();
319 cfg
->setGroup( "Misc" );
321 cfg
->writeEntry( "Single", m_single
->isChecked() );
322 cfg
->writeEntry( "Delay", m_delay
->value() );
323 cfg
->writeEntry( "Random", m_random
->isChecked() );
325 int num
= m_files
->count();
327 for( int n
=0; n
<num
; n
++ )
328 files
<< m_files
->text(n
);
330 cfg
->writeEntry( "Files", files
);
336 void SaverConfig::add()
338 KUrl::List files
= KFileDialog::getOpenUrls( KUrl(), QString::null
,
339 this, i18n("Select Media Files") );
340 for( int n
=0; n
<files
.count(); n
++ )
341 m_files
->insertItem( files
[n
].prettyUrl(), -1 );
345 void SaverConfig::remove()
347 int current
= m_files
->currentItem();
349 m_files
->removeItem( current
);
353 void SaverConfig::select()
355 bool enabled
= m_files
->currentItem()!=-1;
356 m_remove
->setEnabled( enabled
);
357 m_up
->setEnabled( enabled
&& m_files
->currentItem()!=0 );
358 m_down
->setEnabled( enabled
&& m_files
->currentItem()!=(int)m_files
->count()-1 );
362 void SaverConfig::up()
364 int current
= m_files
->currentItem();
366 QString txt
= m_files
->currentText();
367 m_files
->removeItem( current
);
368 m_files
->insertItem( txt
, current
-1 );
369 m_files
->setCurrentItem( current
-1 );
374 void SaverConfig::down()
376 int current
= m_files
->currentItem();
377 if ( current
!=-1 && current
<(int)m_files
->count()-1 ) {
378 QString txt
= m_files
->currentText();
379 m_files
->removeItem( current
);
380 m_files
->insertItem( txt
, current
+1 );
381 m_files
->setCurrentItem( current
+1 );
385 #include "kpartsaver.moc"