1 /* This file is part of the KDE project
2 Copyright (C) 2002 Lubos Lunak <l.lunak@kde.org>
4 This library 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 library 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 License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 Boston, MA 02110-1301, USA.
20 #include "preloader.h"
21 #include "konqsettingsxt.h"
22 #include "preloaderadaptor.h"
25 #include <ktoolinvocation.h>
27 #include <kpluginfactory.h>
28 #include <kpluginloader.h>
30 K_PLUGIN_FACTORY(KonqyPreloaderFactory
,
31 registerPlugin
<KonqyPreloader
>();
33 K_EXPORT_PLUGIN(KonqyPreloaderFactory("konqypreloader"))
35 KonqyPreloader::KonqyPreloader(QObject
* parent
, const QList
<QVariant
>&)
40 (void)new PreloaderAdaptor(this);
42 connect( QDBusConnection::sessionBus().interface(),
43 SIGNAL( serviceOwnerChanged( const QString
&, const QString
&, const QString
& )),
44 SLOT ( appChanged( const QString
&, const QString
&, const QString
& )));
45 check_always_preloaded_timer
.setSingleShot( true );
46 connect( &check_always_preloaded_timer
, SIGNAL( timeout()),
47 SLOT( checkAlwaysPreloaded()));
50 KonqyPreloader::~KonqyPreloader()
55 bool KonqyPreloader::registerPreloadedKonqy( const QString
&id
, int screen
)
57 if( instances
.count() >= KonqSettings::maxPreloadCount() )
59 instances
.append( KonqyData( id
, screen
));
63 QString
KonqyPreloader::getPreloadedKonqy( int screen
)
65 if( instances
.count() == 0 )
67 for( InstancesList::Iterator it
= instances
.begin();
68 it
!= instances
.end();
71 if( (*it
).screen
== screen
)
73 QString ret
= (*it
).id
;
74 instances
.erase( it
);
75 check_always_preloaded_timer
.start( 5000 );
82 void KonqyPreloader::unregisterPreloadedKonqy( const QString
&id_P
)
84 for( InstancesList::Iterator it
= instances
.begin();
85 it
!= instances
.end();
87 if( (*it
).id
== id_P
)
89 instances
.erase( it
);
94 void KonqyPreloader::appChanged( const QString
& /*id*/, const QString
&oldOwner
, const QString
&newOwner
)
96 if ( oldOwner
.isEmpty() || !newOwner
.isEmpty() )
99 unregisterPreloadedKonqy( oldOwner
);
102 void KonqyPreloader::reconfigure()
104 KonqSettings::self()->readConfig();
106 // Ignore "PreloadOnStartup" here, it's used by the .desktop file
107 // in the autostart folder, which will do 'konqueror --preload' in autostart
108 // phase 2. This will also cause activation of this kded module.
111 void KonqyPreloader::updateCount()
113 while( instances
.count() > KonqSettings::maxPreloadCount() )
115 KonqyData konqy
= instances
.first();
116 instances
.pop_front();
117 QDBusInterface
ref( konqy
.id
, "/", "org.kde.Konqueror.Main" );
118 ref
.call( "terminatePreloaded" );
120 if( KonqSettings::alwaysHavePreloaded() &&
121 KonqSettings::maxPreloadCount() > 0 &&
122 instances
.count() == 0 )
124 if( !check_always_preloaded_timer
.isActive())
126 if( KToolInvocation::kdeinitExec( QLatin1String( "konqueror" ),
127 QStringList() << QLatin1String( "--preload" ), NULL
, NULL
, "0" ) == 0 )
129 kDebug( 1202 ) << "Preloading Konqueror instance";
130 check_always_preloaded_timer
.start( 5000 );
132 // else do nothing, the launching failed
137 // have 5s interval between attempts to preload a new konqy
138 // in order not to start many of them at the same time
139 void KonqyPreloader::checkAlwaysPreloaded()
141 // TODO here should be detection whether the system is too busy,
142 // and delaying preloading another konqy in such case
143 // but I have no idea how to do it
147 void KonqyPreloader::unloadAllPreloaded()
149 while( instances
.count() > 0 )
151 KonqyData konqy
= instances
.first();
152 instances
.pop_front();
153 QDBusInterface
ref( konqy
.id
, "/", "org.kde.Konqueror.Main" );
154 ref
.call( "terminatePreloaded" );
156 // ignore 'always_have_preloaded' here
159 #include "preloader.moc"