2007-04-29 17:35:43 +00:00
/*****************************************************************
// vim: sw=4 sts=4 et tw=100
This file is part of the KDE project .
Copyright ( C ) 1999 , 2000 Daniel M . Duley < mosfet @ kde . org >
Copyright ( C ) 2003 Lubos Lunak < l . lunak @ kde . org >
Permission is hereby granted , free of charge , to any person obtaining a
copy of this software and associated documentation files ( the " Software " ) ,
to deal in the Software without restriction , including without limitation
the rights to use , copy , modify , merge , publish , distribute , sublicense ,
and / or sell copies of the Software , and to permit persons to whom the
Software is furnished to do so , subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software .
THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING
FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "kdecoration_plugins_p.h"
# include <kconfig.h>
# include <kdebug.h>
# include <klocale.h>
2010-11-10 16:42:52 +00:00
# include <klibrary.h>
2007-04-29 17:35:43 +00:00
# include <kconfiggroup.h>
# include <assert.h>
# include <QDir>
# include <QFile>
# include "kdecorationfactory.h"
KDecorationPlugins : : KDecorationPlugins ( const KSharedConfigPtr & cfg )
2011-01-30 14:34:42 +00:00
: create_ptr ( NULL ) ,
library ( NULL ) ,
fact ( NULL ) ,
old_library ( NULL ) ,
old_fact ( NULL ) ,
pluginStr ( " kwin3_undefined " ) ,
config ( cfg )
{
}
2007-04-29 17:35:43 +00:00
KDecorationPlugins : : ~ KDecorationPlugins ( )
2011-01-30 14:34:42 +00:00
{
if ( library ) {
assert ( fact ! = NULL ) ;
2007-04-29 17:35:43 +00:00
delete fact ;
2011-01-30 14:34:42 +00:00
library - > unload ( ) ;
}
if ( old_library ) {
assert ( old_fact ! = NULL ) ;
2007-04-29 17:35:43 +00:00
delete old_fact ;
2011-01-30 14:34:42 +00:00
old_library - > unload ( ) ;
2007-04-29 17:35:43 +00:00
}
2011-01-30 14:34:42 +00:00
}
2007-04-29 17:35:43 +00:00
2007-07-26 07:51:16 +00:00
QString KDecorationPlugins : : currentPlugin ( )
2011-01-30 14:34:42 +00:00
{
2007-07-26 07:51:16 +00:00
return pluginStr ;
2011-01-30 14:34:42 +00:00
}
2007-07-26 07:51:16 +00:00
2011-01-30 14:34:42 +00:00
bool KDecorationPlugins : : reset ( unsigned long changed )
{
2007-04-29 17:35:43 +00:00
QString oldPlugin = pluginStr ;
config - > reparseConfiguration ( ) ;
bool ret = false ;
2011-01-30 14:34:42 +00:00
if ( ( ! loadPlugin ( " " ) & & library ) // "" = read the one in cfg file
| | oldPlugin = = pluginStr ) {
// no new plugin loaded, reset the old one
// assert( fact != NULL );
if ( fact ! = NULL ) {
ret = fact - > reset ( changed ) ;
2007-04-29 17:35:43 +00:00
}
2011-01-30 14:34:42 +00:00
2007-04-29 17:35:43 +00:00
}
2011-01-30 14:34:42 +00:00
return ret | | oldPlugin ! = pluginStr ;
}
2007-04-29 17:35:43 +00:00
KDecorationFactory * KDecorationPlugins : : factory ( )
2011-01-30 14:34:42 +00:00
{
2007-04-29 17:35:43 +00:00
return fact ;
2011-01-30 14:34:42 +00:00
}
2007-04-29 17:35:43 +00:00
// convenience
2011-01-30 14:34:42 +00:00
KDecoration * KDecorationPlugins : : createDecoration ( KDecorationBridge * bridge )
{
if ( fact ! = NULL )
return fact - > createDecoration ( bridge ) ;
2007-04-29 17:35:43 +00:00
return NULL ;
2011-01-30 14:34:42 +00:00
}
2007-04-29 17:35:43 +00:00
// returns true if plugin was loaded successfully
2011-01-30 14:34:42 +00:00
bool KDecorationPlugins : : loadPlugin ( QString nameStr )
{
2011-04-28 13:56:50 +00:00
KConfigGroup group ( config , QString ( " Style " ) ) ;
2011-01-30 14:34:42 +00:00
if ( nameStr . isEmpty ( ) ) {
nameStr = group . readEntry ( " PluginLib " , defaultPlugin ) ;
}
2011-04-28 13:56:50 +00:00
if ( group . readEntry < bool > ( " NoPlugin " , false ) ) {
error ( i18n ( " Loading of window decoration plugin library disabled in configuration. " ) ) ;
return false ;
}
2007-04-29 17:35:43 +00:00
KLibrary * oldLibrary = library ;
KDecorationFactory * oldFactory = fact ;
2010-11-10 16:42:52 +00:00
KLibrary libToFind ( nameStr ) ;
QString path = libToFind . fileName ( ) ;
2011-01-30 14:34:42 +00:00
kDebug ( 1212 ) < < " kwin : path " < < path < < " for " < < nameStr ;
2007-04-29 17:35:43 +00:00
// If the plugin was not found, try to find the default
2011-01-30 14:34:42 +00:00
if ( path . isEmpty ( ) ) {
2007-04-29 17:35:43 +00:00
nameStr = defaultPlugin ;
2010-11-10 16:42:52 +00:00
KLibrary libToFind ( nameStr ) ;
path = libToFind . fileName ( ) ;
2011-01-30 14:34:42 +00:00
}
2007-04-29 17:35:43 +00:00
// If no library was found, exit kwin with an error message
2011-01-30 14:34:42 +00:00
if ( path . isEmpty ( ) ) {
error ( i18n ( " No window decoration plugin library was found. " ) ) ;
2007-04-29 17:35:43 +00:00
return false ;
2011-01-30 14:34:42 +00:00
}
2007-04-29 17:35:43 +00:00
// Check if this library is not already loaded.
2011-01-30 14:34:42 +00:00
if ( pluginStr = = nameStr )
return true ;
2007-04-29 17:35:43 +00:00
// Try loading the requested plugin
2009-10-05 07:58:12 +00:00
library = new KLibrary ( path ) ;
2007-04-29 17:35:43 +00:00
// If that fails, fall back to the default plugin
2010-01-28 04:11:13 +00:00
trydefaultlib :
2011-01-30 14:34:42 +00:00
if ( ! library ) {
kDebug ( 1212 ) < < " could not load library, try default plugin again " ;
2007-04-29 17:35:43 +00:00
nameStr = defaultPlugin ;
2011-01-30 14:34:42 +00:00
if ( pluginStr = = nameStr )
return true ;
2010-11-10 16:42:52 +00:00
KLibrary libToFind ( nameStr ) ;
path = libToFind . fileName ( ) ;
2011-01-30 14:34:42 +00:00
if ( ! path . isEmpty ( ) )
2009-10-05 07:58:12 +00:00
library = new KLibrary ( path ) ;
2011-01-30 14:34:42 +00:00
}
2007-04-29 17:35:43 +00:00
2011-01-30 14:34:42 +00:00
if ( ! library ) {
error ( i18n ( " The default decoration plugin is corrupt "
" and could not be loaded. " ) ) ;
2007-04-29 17:35:43 +00:00
return false ;
2011-01-30 14:34:42 +00:00
}
2007-04-29 17:35:43 +00:00
create_ptr = NULL ;
2012-05-17 21:25:22 +00:00
version_ptr = 0 ;
KLibrary : : void_function_ptr version_func = library - > resolveFunction ( " decoration_version " ) ;
if ( version_func ) {
// TODO for the moment we let unversioned decos through
// later on this function shall become mandatory!
version_ptr = ( int ( * ) ( ) ) version_func ;
const int deco_version = version_ptr ( ) ;
if ( deco_version ! = KWIN_DECORATION_API_VERSION ) {
if ( nameStr ! = defaultPlugin ) {
kWarning ( 1212 ) < < i18n ( " The library %1 has wrong API version %2 " , path , deco_version ) ;
library - > unload ( ) ;
library = NULL ;
goto trydefaultlib ;
}
}
} else {
kWarning ( 1212 ) < < i18n ( " ****** \n \n The library %1 has no API version \n Please use the KWIN_DECORATION or future versions of kwin will no longer load this decoration! \n ******* " , path ) ;
}
2007-04-29 17:35:43 +00:00
KLibrary : : void_function_ptr create_func = library - > resolveFunction ( " create_factory " ) ;
2011-01-30 14:34:42 +00:00
if ( create_func )
create_ptr = ( KDecorationFactory * ( * ) ( ) ) create_func ;
if ( ! create_ptr ) {
if ( nameStr ! = defaultPlugin ) {
kDebug ( 1212 ) < < i18n ( " The library %1 is not a KWin plugin. " , path ) ;
2010-01-28 04:11:13 +00:00
library - > unload ( ) ;
library = NULL ;
goto trydefaultlib ;
2011-01-30 14:34:42 +00:00
}
error ( i18n ( " The library %1 is not a KWin plugin. " , path ) ) ;
2007-04-29 17:35:43 +00:00
library - > unload ( ) ;
return false ;
2011-01-30 14:34:42 +00:00
}
2007-04-29 17:35:43 +00:00
fact = create_ptr ( ) ;
2011-01-30 14:34:42 +00:00
fact - > checkRequirements ( this ) ; // let it check what is supported
2007-04-29 17:35:43 +00:00
pluginStr = nameStr ;
// For clients in kdeartwork
QString catalog = nameStr ;
2011-01-30 14:34:42 +00:00
catalog . replace ( " kwin3_ " , " kwin_ " ) ;
KGlobal : : locale ( ) - > insertCatalog ( catalog ) ;
2007-04-29 17:35:43 +00:00
// For KCommonDecoration based clients
2011-02-20 15:02:33 +00:00
KGlobal : : locale ( ) - > insertCatalog ( " libkdecorations " ) ;
2007-04-29 17:35:43 +00:00
// For clients in kdebase
2011-01-30 14:34:42 +00:00
KGlobal : : locale ( ) - > insertCatalog ( " kwin_clients " ) ;
2007-04-29 17:35:43 +00:00
// For clients in kdeartwork
2011-01-30 14:34:42 +00:00
KGlobal : : locale ( ) - > insertCatalog ( " kwin_art_clients " ) ;
2007-04-29 17:35:43 +00:00
old_library = oldLibrary ; // save for delayed destroying
old_fact = oldFactory ;
return true ;
}
void KDecorationPlugins : : destroyPreviousPlugin ( )
{
// Destroy the old plugin
2011-01-30 14:34:42 +00:00
if ( old_library ) {
2007-04-29 17:35:43 +00:00
delete old_fact ;
old_fact = NULL ;
2011-01-30 14:34:42 +00:00
old_library - > unload ( ) ;
2007-04-29 17:35:43 +00:00
old_library = NULL ;
2011-01-30 14:34:42 +00:00
}
2007-04-29 17:35:43 +00:00
}
2011-01-30 14:34:42 +00:00
void KDecorationPlugins : : error ( const QString & )
{
}