From 8b2aa1b5301ab60368a03e36df4ff5216726e87d Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: 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/kdeartwork@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kscreensaver/kpartsaver/kpartsaver.cpp | 387 +++++++++++++++++++++++++++++++++ 1 file changed, 387 insertions(+) create mode 100644 kscreensaver/kpartsaver/kpartsaver.cpp (limited to 'kscreensaver/kpartsaver/kpartsaver.cpp') diff --git a/kscreensaver/kpartsaver/kpartsaver.cpp b/kscreensaver/kpartsaver/kpartsaver.cpp new file mode 100644 index 00000000..5a1c09c7 --- /dev/null +++ b/kscreensaver/kpartsaver/kpartsaver.cpp @@ -0,0 +1,387 @@ +/* + * Copyright (C) 2001 Stefan Schimanski <1Stein@gmx.de> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "configwidget.h" +#include "kpartsaver.h" +#include + + +QPtrList g_savers; +bool g_inited = false; + + +extern "C" +{ + KDE_EXPORT const char *kss_applicationName = "kpartsaver"; + KDE_EXPORT const char *kss_description = I18N_NOOP( "KPart Screen Saver" ); + KDE_EXPORT const char *kss_version = "1.0"; + + KDE_EXPORT KScreenSaver *kss_create( WId d ) + { + KGlobal::locale()->insertCatalogue("kpartsaver"); + return new KPartSaver( d ); + } + + KDE_EXPORT QDialog *kss_setup() + { + kdDebug() << "kss_setup" << endl; + KGlobal::locale()->insertCatalogue("kpartsaver"); + return new SaverConfig; + } +} + + +void exitHandler( int ) +{ + kdDebug() << "exitHandler" << endl; + g_savers.clear(); + KLibLoader::self()->cleanUp(); + exit(0); +} + + +KPartSaver::KPartSaver( WId id ) + : KScreenSaver( id ), m_timer(), m_part(0), m_current(-1), m_back(0) +{ + // install signal handlers to make sure that nspluginviewer is shutdown correctly + // move this into the nspluginviewer kpart code + if( !g_inited ) { + g_inited = true; + g_savers.setAutoDelete( true ); + + srand( time(0) ); + + // install signal handler + signal( SIGINT, exitHandler ); // Ctrl-C will cause a clean exit... + signal( SIGTERM, exitHandler ); // "kill"... + signal( SIGHUP, exitHandler ); // "kill -HUP" (hangup)... + signal( SIGKILL, exitHandler ); // "kill -KILL" + //atexit( ( void (*)(void) ) exitHandler ); + } + + g_savers.append( this ); + + closeURL(); + + // load config + KConfig *cfg = kapp->config(); + cfg->setGroup( "Misc" ); + + m_single = cfg->readBoolEntry( "Single", true ); + m_delay = cfg->readNumEntry( "Delay", 60 ); + m_random = cfg->readBoolEntry( "Random", false ); + m_files = cfg->readListEntry( "Files" ); + + if( m_files.count()==0 ) { + + // create background widget + m_back = new QLabel( i18n("The screen saver is not configured yet."), this ); + + m_back->setAlignment( AlignCenter ); + embed( m_back ); + m_back->show(); + + } else { + + // queue files + for( unsigned int n=0; nstart( m_delay*1000, true ); + connect( m_timer, SIGNAL(timeout()), SLOT(timeout()) ); + } + } +} + + +KPartSaver::~KPartSaver() +{ + g_savers.take( g_savers.findRef( this )); + closeURL(); +} + + +void KPartSaver::closeURL() +{ + if( m_part ) { + m_part->closeURL(); + delete m_part; + m_part = 0; + } +} + + +bool KPartSaver::openURL( KURL url ) +{ + closeURL(); + + // find mime type + QString mime = KMimeType::findByURL( url )->name(); + + // find fitting kparts + KTrader::OfferList offers; + offers = KTrader::self()->query( mime, "'KParts/ReadOnlyPart' in ServiceTypes" ); + if( offers.count()==0 ) { + kdDebug() << "Can't find proper kpart for " << mime << endl; + return false; + } + + // load kpart library + QString lib = offers.first()->library(); + KLibFactory *factory = KLibLoader::self()->factory( lib.latin1() ); + if( !factory ) { + kdDebug() << "Library " << lib << " not found." << endl; + return false; + } + + // create kpart + m_part = (KParts::ReadOnlyPart *)factory->create( this, "kpart", "KParts::ReadOnlyPart" ); + if( !m_part ) { + kdDebug() << "Part for " << url.url() << " can't be constructed" << endl; + return false; + } else + embed( m_part->widget() ); + + // show kpart + delete m_back; + m_back = 0; + + show(); + m_part->widget()->show(); + + // load url + if( !m_part->openURL( url ) ) { + kdDebug() << "Can't load " << url.url() << endl; + closeURL(); + return false; + } + + + + return true; +} + + +void KPartSaver::queue( KURL url ) +{ + Medium medium; + medium.url = url; + medium.failed = false; + m_media.append( medium ); +} + + +void KPartSaver::timeout() +{ + next( m_random ); + m_timer->start( m_delay*1000, true ); +} + + +void KPartSaver::next( bool random ) +{ + // try to find working media + while( m_media.count()>0 ) { + + if( random ) + m_current = rand() % m_media.count(); + else + m_current++; + + if( m_current>=(int)m_media.count() ) + m_current = 0; + + kdDebug() << "Trying medium " << m_media[m_current].url.url() << endl; + + // either start immediately or start mimejob first + if( !openURL( m_media[m_current].url ) ) { + m_media.remove( m_media.at(m_current) ); + m_current--; + } else + return; + + } + + // create background widget + m_back = new QLabel( i18n("All of your files are unsupported"), this ); + + m_back->setAlignment( AlignCenter ); + embed( m_back ); + m_back->show(); + + // nothing found, set to invalid + m_current = -1; +} + + +/*******************************************************************************/ + + +SaverConfig::SaverConfig( QWidget* parent, const char* name ) + : ConfigWidget( parent, name, true ) +{ + connect( m_ok, SIGNAL(clicked()), SLOT(apply()) ); + connect( m_ok, SIGNAL(clicked()), SLOT(accept()) ); + connect( m_cancel, SIGNAL(clicked()), SLOT(reject()) ); + + connect( m_multiple, SIGNAL(toggled(bool)), m_delayLabel, SLOT(setEnabled(bool)) ); + connect( m_multiple, SIGNAL(toggled(bool)), m_delay, SLOT(setEnabled(bool)) ); + connect( m_multiple, SIGNAL(toggled(bool)), m_secondsLabel, SLOT(setEnabled(bool)) ); + connect( m_multiple, SIGNAL(toggled(bool)), m_random, SLOT(setEnabled(bool)) ); + + connect( m_files, SIGNAL(selectionChanged()), SLOT(select()) ); + connect( m_add, SIGNAL(clicked()), SLOT(add()) ); + connect( m_remove, SIGNAL(clicked()), SLOT(remove()) ); + connect( m_up, SIGNAL(clicked()), SLOT(up()) ); + connect( m_down, SIGNAL(clicked()), SLOT(down()) ); + + m_up->setIconSet( SmallIconSet("up") ); + m_down->setIconSet( SmallIconSet("down") ); + + // load config + KConfig *cfg = kapp->config(); + cfg->setGroup( "Misc" ); + + bool single = cfg->readBoolEntry( "Single", true ); + m_single->setChecked( single ); + m_multiple->setChecked( !single ); + m_delay->setMinValue( 1 ); + m_delay->setMaxValue( 10000 ); + m_delay->setValue( cfg->readNumEntry( "Delay", 60 ) ); + m_random->setChecked( cfg->readBoolEntry( "Random", false ) ); + m_files->insertStringList( cfg->readListEntry( "Files" ) ); + + // update buttons + select(); +} + + +SaverConfig::~SaverConfig() +{ +} + + +void SaverConfig::apply() +{ + kdDebug() << "apply" << endl; + + KConfig *cfg = kapp->config(); + cfg->setGroup( "Misc" ); + + cfg->writeEntry( "Single", m_single->isChecked() ); + cfg->writeEntry( "Delay", m_delay->value() ); + cfg->writeEntry( "Random", m_random->isChecked() ); + + int num = m_files->count(); + QStringList files; + for( int n=0; ntext(n); + + cfg->writeEntry( "Files", files ); + + cfg->sync(); +} + + +void SaverConfig::add() +{ + KURL::List files = KFileDialog::getOpenURLs( QString::null, QString::null, + this, i18n("Select Media Files") ); + for( unsigned int n=0; ninsertItem( files[n].prettyURL(), -1 ); +} + + +void SaverConfig::remove() +{ + int current = m_files->currentItem(); + if( current!=-1 ) + m_files->removeItem( current ); +} + + +void SaverConfig::select() +{ + bool enabled = m_files->currentItem()!=-1; + m_remove->setEnabled( enabled ); + m_up->setEnabled( enabled && m_files->currentItem()!=0 ); + m_down->setEnabled( enabled && m_files->currentItem()!=(int)m_files->count()-1 ); +} + + +void SaverConfig::up() +{ + int current = m_files->currentItem(); + if ( current>0 ) { + QString txt = m_files->currentText(); + m_files->removeItem( current ); + m_files->insertItem( txt, current-1 ); + m_files->setCurrentItem( current-1 ); + } +} + + +void SaverConfig::down() +{ + int current = m_files->currentItem(); + if ( current!=-1 && current<(int)m_files->count()-1 ) { + QString txt = m_files->currentText(); + m_files->removeItem( current ); + m_files->insertItem( txt, current+1 ); + m_files->setCurrentItem( current+1 ); + } +} + +#include "kpartsaver.moc" -- cgit v1.2.1