You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/konqueror/preloader/preloader.cc

152 lines
4.5 KiB

/* This file is part of the KDE project
Copyright (C) 2002 Lubos Lunak <l.lunak@kde.org>
This library 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 library 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 library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "preloader.h"
#include "konq_settingsxt.h"
#include <kconfig.h>
#include <dcopref.h>
#include <kapplication.h>
#include <dcopclient.h>
#include <kdebug.h>
KonqyPreloader::KonqyPreloader( const TQCString& obj )
: KDEDModule( obj )
{
reconfigure();
connect( kapp->dcopClient(), TQT_SIGNAL( applicationRemoved( const TQCString& )),
TQT_SLOT( appRemoved( const TQCString& )));
connect( &check_always_preloaded_timer, TQT_SIGNAL( timeout()),
TQT_SLOT( checkAlwaysPreloaded()));
}
KonqyPreloader::~KonqyPreloader()
{
updateCount();
}
bool KonqyPreloader::registerPreloadedKonqy( TQCString id, int screen )
{
if( instances.count() >= (uint)KonqSettings::maxPreloadCount() )
return false;
instances.append( KonqyData( id, screen ));
return true;
}
TQCString KonqyPreloader::getPreloadedKonqy( int screen )
{
if( instances.count() == 0 )
return "";
for( InstancesList::Iterator it = instances.begin();
it != instances.end();
++it )
{
if( (*it).screen == screen )
{
TQCString ret = (*it).id;
instances.remove( it );
check_always_preloaded_timer.start( 5000, true );
return ret;
}
}
return "";
}
void KonqyPreloader::unregisterPreloadedKonqy( TQCString id_P )
{
for( InstancesList::Iterator it = instances.begin();
it != instances.end();
++it )
if( (*it).id == id_P )
{
instances.remove( it );
return;
}
}
void KonqyPreloader::appRemoved( const TQCString& id )
{
unregisterPreloadedKonqy( id );
}
void KonqyPreloader::reconfigure()
{
KonqSettings::self()->readConfig();
updateCount();
// Ignore "PreloadOnStartup" here, it's used by the .desktop file
// in the autostart folder, which will do 'konqueror --preload' in autostart
// phase 2. This will also cause activation of this kded module.
}
void KonqyPreloader::updateCount()
{
while( instances.count() > (uint)KonqSettings::maxPreloadCount() )
{
KonqyData konqy = instances.first();
instances.pop_front();
DCOPRef ref( konqy.id, "KonquerorIface" );
ref.send( "terminatePreloaded" );
}
if( KonqSettings::alwaysHavePreloaded() &&
KonqSettings::maxPreloadCount() > 0 &&
instances.count() == 0 )
{
if( !check_always_preloaded_timer.isActive())
{
if( kapp->kdeinitExec( TQString::fromLatin1( "konqueror" ),
TQStringList() << TQString::fromLatin1( "--preload" ), NULL, NULL, "0" ) == 0 )
{
kdDebug( 1202 ) << "Preloading Konqueror instance" << endl;
check_always_preloaded_timer.start( 5000, true );
}
// else do nothing, the launching failed
}
}
}
// have 5s interval between attempts to preload a new konqy
// in order not to start many of them at the same time
void KonqyPreloader::checkAlwaysPreloaded()
{
// TODO here should be detection whether the system is too busy,
// and delaying preloading another konqy in such case
// but I have no idea how to do it
updateCount();
}
void KonqyPreloader::unloadAllPreloaded()
{
while( instances.count() > 0 )
{
KonqyData konqy = instances.first();
instances.pop_front();
DCOPRef ref( konqy.id, "KonquerorIface" );
ref.send( "terminatePreloaded" );
}
// ignore 'always_have_preloaded' here
}
extern "C"
KDE_EXPORT KDEDModule *create_konqy_preloader( const TQCString& obj )
{
return new KonqyPreloader( obj );
}
#include "preloader.moc"