kwin Library API Documentation

kwindecoration.cpp

00001 /*
00002     $Id: kwindecoration.cpp,v 1.52 2004/01/11 14:30:10 zander Exp $
00003 
00004     This is the new kwindecoration kcontrol module
00005 
00006     Copyright (c) 2001
00007         Karol Szwed <gallium@kde.org>
00008         http://gallium.n3.net/
00009 
00010     Supports new kwin configuration plugins, and titlebar button position
00011     modification via dnd interface.
00012 
00013     Based on original "kwintheme" (Window Borders)
00014     Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
00015 
00016     This program is free software; you can redistribute it and/or modify
00017     it under the terms of the GNU General Public License as published by
00018     the Free Software Foundation; either version 2 of the License, or
00019     (at your option) any later version.
00020   
00021     This program is distributed in the hope that it will be useful,
00022     but WITHOUT ANY WARRANTY; without even the implied warranty of
00023     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00024     GNU General Public License for more details.
00025   
00026     You should have received a copy of the GNU General Public License
00027     along with this program; if not, write to the Free Software
00028     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00029 
00030 */
00031 
00032 #include <assert.h>
00033 #include <qdir.h>
00034 #include <qfileinfo.h>
00035 #include <qlayout.h>
00036 #include <qwhatsthis.h>
00037 #include <qgroupbox.h>
00038 #include <qcheckbox.h>
00039 #include <qtabwidget.h>
00040 #include <qvbox.h>
00041 #include <qlabel.h>
00042 #include <qfile.h>
00043 #include <qslider.h>
00044 
00045 #include <kapplication.h>
00046 #include <kcombobox.h>
00047 #include <kdebug.h>
00048 #include <kdesktopfile.h>
00049 #include <kstandarddirs.h>
00050 #include <kglobal.h>
00051 #include <klocale.h>
00052 #include <kdialog.h>
00053 #include <kgenericfactory.h>
00054 #include <kaboutdata.h>
00055 #include <dcopclient.h>
00056 
00057 #include "kwindecoration.h"
00058 #include "preview.h"
00059 #include <kdecoration_plugins_p.h>
00060 #include <kdecorationfactory.h>
00061 
00062 // KCModule plugin interface
00063 // =========================
00064 typedef KGenericFactory<KWinDecorationModule, QWidget> KWinDecoFactory;
00065 K_EXPORT_COMPONENT_FACTORY( kcm_kwindecoration, KWinDecoFactory("kcmkwindecoration") )
00066 
00067 KWinDecorationModule::KWinDecorationModule(QWidget* parent, const char* name, const QStringList &)
00068     : DCOPObject("KWinClientDecoration"),
00069       KCModule(KWinDecoFactory::instance(), parent, name),
00070           kwinConfig("kwinrc"),
00071           pluginObject(0)
00072 {
00073     kwinConfig.setGroup("Style");
00074         plugins = new KDecorationPreviewPlugins( &kwinConfig );
00075 
00076     QVBoxLayout* layout = new QVBoxLayout(this);
00077     tabWidget = new QTabWidget( this );
00078     layout->addWidget( tabWidget );
00079 
00080     // Page 1 (General Options)
00081     QWidget *pluginPage = new QWidget( tabWidget );
00082 
00083     QHBox *hbox = new QHBox(pluginPage);
00084     hbox->setSpacing(KDialog::spacingHint());
00085 //  QLabel *lbl = new QLabel( i18n("&Decoration:"), hbox );
00086     decorationList = new KComboBox( hbox );
00087 //  lbl->setBuddy(decorationList);
00088     QString whatsThis = i18n("Select the window decoration. This is the look and feel of both "
00089                              "the window borders and the window handle.");
00090 //  QWhatsThis::add(lbl, whatsThis);
00091     QWhatsThis::add(decorationList, whatsThis);
00092 
00093     QVBoxLayout* pluginLayout = new QVBoxLayout(pluginPage, KDialog::marginHint(), KDialog::spacingHint());
00094     pluginLayout->addWidget(hbox);
00095 
00096 // Save this for later...
00097 //  cbUseMiniWindows = new QCheckBox( i18n( "Render mini &titlebars for all windows"), checkGroup );
00098 //  QWhatsThis::add( cbUseMiniWindows, i18n( "Note that this option is not available on all styles yet!" ) );
00099 
00100     QFrame* preview_frame = new QFrame( pluginPage );
00101     preview_frame->setFrameShape( QFrame::NoFrame );
00102     QVBoxLayout* preview_layout = new QVBoxLayout( preview_frame, 0 );
00103     preview = new KDecorationPreview( preview_frame );
00104     preview_layout->addWidget( preview );
00105     pluginLayout->addWidget( preview_frame );
00106     pluginLayout->setStretchFactor( preview_frame, 10 );
00107 
00108     pluginSettingsGrp = new QGroupBox( i18n("Decoration Options"), pluginPage );
00109     pluginSettingsGrp->setColumnLayout( 0, Vertical );
00110     pluginSettingsGrp->setFlat( true );
00111     pluginSettingsGrp->layout()->setMargin( 0 );
00112     pluginSettingsGrp->layout()->setSpacing( KDialog::spacingHint() );
00113     pluginLayout->addWidget( pluginSettingsGrp );
00114 
00115     pluginConfigWidget = new QVBox(pluginSettingsGrp);
00116     pluginSettingsGrp->layout()->add( pluginConfigWidget );
00117 
00118     // Page 2 (Button Selector)
00119     QVBox* buttonPage = new QVBox( tabWidget );
00120     buttonPage->setSpacing( KDialog::spacingHint() );
00121     buttonPage->setMargin( KDialog::marginHint() );
00122 
00123     cbShowToolTips = new QCheckBox(
00124             i18n("&Show window button tooltips"), buttonPage );
00125     QWhatsThis::add( cbShowToolTips,
00126             i18n(  "Enabling this checkbox will show window button tooltips. "
00127                    "If this checkbox is off, no window button tooltips will be shown."));
00128 
00129         lBorder = new QLabel( buttonPage );
00130         slBorder = new QSlider( Horizontal, buttonPage );
00131         slBorder->setPageStep(1);
00132         QWhatsThis::add( slBorder, i18n( "This slider shows all border sizes supported by this decoration." ));
00133         lBorder->setBuddy( slBorder );
00134         lBorder->hide();
00135         slBorder->hide();
00136 
00137     cbUseCustomButtonPositions = new QCheckBox(
00138             i18n("Use custom titlebar button &positions"), buttonPage );
00139     QWhatsThis::add( cbUseCustomButtonPositions,
00140             i18n(  "The appropriate settings can be found in the \"Buttons\" Tab. "
00141                    "Please note that this option is not available on all styles yet!" ) );
00142 
00143     buttonBox = new QGroupBox( 1, Qt::Horizontal,
00144             i18n("Titlebar Button Positions"), buttonPage );
00145 
00146     // Add nifty dnd button modification widgets
00147     QLabel* label = new QLabel( buttonBox );
00148     dropSite = new ButtonDropSite( buttonBox );
00149     label->setAlignment( int( QLabel::WordBreak ) );
00150     label->setText( i18n( "To add or remove titlebar buttons, simply <i>drag</i> items "
00151         "between the available item list and the titlebar preview. Similarly, "
00152         "drag items within the titlebar preview to re-position them.") );
00153     buttonSource = new ButtonSource( buttonBox );
00154 
00155     // Load all installed decorations into memory
00156     // Set up the decoration lists and other UI settings
00157     findDecorations();
00158     createDecorationList();
00159     readConfig( &kwinConfig );
00160     resetPlugin( &kwinConfig );
00161 
00162     tabWidget->insertTab( pluginPage, i18n("&Window Decoration") );
00163     tabWidget->insertTab( buttonPage, i18n("&Buttons") );
00164 
00165     connect( dropSite, SIGNAL(buttonAdded(char)), buttonSource, SLOT(hideButton(char)) );
00166     connect( dropSite, SIGNAL(buttonRemoved(char)), buttonSource, SLOT(showButton(char)) );
00167     connect( buttonSource, SIGNAL(buttonDropped()), dropSite, SLOT(removeClickedButton()) );
00168     connect( dropSite, SIGNAL(changed()), this, SLOT(slotSelectionChanged()) );
00169     connect( buttonSource, SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged()) );
00170     connect( decorationList, SIGNAL(activated(const QString&)), SLOT(slotSelectionChanged()) );
00171     connect( decorationList, SIGNAL(activated(const QString&)),
00172                                 SLOT(slotChangeDecoration(const QString&)) );
00173     connect( cbUseCustomButtonPositions, SIGNAL(clicked()), SLOT(slotSelectionChanged()) );
00174     connect(cbUseCustomButtonPositions, SIGNAL(toggled(bool)), buttonBox, SLOT(setEnabled(bool)));
00175     connect( cbShowToolTips, SIGNAL(clicked()), SLOT(slotSelectionChanged()) );
00176         connect( slBorder, SIGNAL( valueChanged( int )), SLOT( slotBorderChanged( int )));
00177 //  connect( cbUseMiniWindows, SIGNAL(clicked()), SLOT(slotSelectionChanged()) );
00178 
00179     // Allow kwin dcop signal to update our selection list
00180     connectDCOPSignal("kwin", 0, "dcopResetAllClients()", "dcopUpdateClientList()", false);
00181 }
00182 
00183 
00184 KWinDecorationModule::~KWinDecorationModule()
00185 {
00186         delete preview; // needs to be destroyed before plugins
00187         delete plugins;
00188 }
00189 
00190 
00191 // Find all theme desktop files in all 'data' dirs owned by kwin.
00192 // And insert these into a DecorationInfo structure
00193 void KWinDecorationModule::findDecorations()
00194 {
00195     QStringList dirList = KGlobal::dirs()->findDirs("data", "kwin");
00196     QStringList::ConstIterator it;
00197 
00198     for (it = dirList.begin(); it != dirList.end(); it++)
00199     {
00200         QDir d(*it);
00201         if (d.exists())
00202             for (QFileInfoListIterator it(*d.entryInfoList()); it.current(); ++it)
00203             {
00204                 QString filename(it.current()->absFilePath());
00205                 if (KDesktopFile::isDesktopFile(filename))
00206                 {
00207                     KDesktopFile desktopFile(filename);
00208                     QString libName = desktopFile.readEntry("X-KDE-Library");
00209 
00210                     if (!libName.isEmpty() && libName.startsWith( "kwin3_" ))
00211                     {
00212                         DecorationInfo di;
00213                         di.name = desktopFile.readName();
00214                         di.libraryName = libName;
00215                         decorations.append( di );
00216                     }
00217                 }
00218             }
00219     }
00220 }
00221 
00222 
00223 // Fills the decorationList with a list of available kwin decorations
00224 void KWinDecorationModule::createDecorationList()
00225 {
00226     QValueList<DecorationInfo>::ConstIterator it;
00227 
00228     // Sync with kwin hardcoded KDE2 style which has no desktop item
00229     QStringList decorationNames;
00230     decorationNames.append( i18n("KDE 2") );
00231     for (it = decorations.begin(); it != decorations.end(); ++it)
00232     {
00233         decorationNames.append((*it).name);
00234     }
00235     decorationNames.sort();
00236     decorationList->insertStringList(decorationNames);
00237 }
00238 
00239 
00240 // Reset the decoration plugin to what the user just selected
00241 void KWinDecorationModule::slotChangeDecoration( const QString & text)
00242 {
00243     KConfig kwinConfig("kwinrc");
00244     kwinConfig.setGroup("Style");
00245 
00246     // Let the user see config options for the currently selected decoration
00247     resetPlugin( &kwinConfig, text );
00248 }
00249 
00250 
00251 // This is the selection handler setting
00252 void KWinDecorationModule::slotSelectionChanged()
00253 {
00254     emit KCModule::changed(true);
00255 }
00256 
00257 static const char* const border_names[ KDecorationDefines::BordersCount ] =
00258     {
00259     I18N_NOOP( "Border size: Tiny" ),
00260     I18N_NOOP( "Border size: Normal" ),
00261     I18N_NOOP( "Border size: Large" ),
00262     I18N_NOOP( "Border size: Very Large" ),
00263     I18N_NOOP( "Border size: Huge" ),
00264     I18N_NOOP( "Border size: Very Huge" ),
00265     I18N_NOOP( "Border size: Oversized" )
00266     };
00267 
00268 int KWinDecorationModule::borderSizeToIndex( BorderSize size, QValueList< BorderSize > sizes )
00269 {
00270         int pos = 0;
00271         for( QValueList< BorderSize >::ConstIterator it = sizes.begin();
00272              it != sizes.end();
00273              ++it, ++pos )
00274             if( size <= *it )
00275                 break;
00276         return pos;
00277 }
00278 
00279 KDecorationDefines::BorderSize KWinDecorationModule::indexToBorderSize( int index,
00280     QValueList< BorderSize > sizes )
00281 {
00282         QValueList< BorderSize >::ConstIterator it = sizes.begin();
00283         for(;
00284              it != sizes.end();
00285              ++it, --index )
00286             if( index == 0 )
00287                 break;
00288         return *it;
00289 }
00290 
00291 void KWinDecorationModule::slotBorderChanged( int size )
00292 {
00293         if( lBorder->isHidden())
00294             return;
00295         emit KCModule::changed( true );
00296         QValueList< BorderSize > sizes;
00297         if( plugins->factory() != NULL )
00298             sizes = plugins->factory()->borderSizes();
00299         assert( sizes.count() >= 2 );
00300         border_size = indexToBorderSize( size, sizes );
00301         lBorder->setText( i18n( border_names[ border_size ] ));
00302 }
00303 
00304 QString KWinDecorationModule::decorationName( QString& libName )
00305 {
00306     QString decoName;
00307 
00308     QValueList<DecorationInfo>::Iterator it;
00309     for( it = decorations.begin(); it != decorations.end(); ++it )
00310         if ( (*it).libraryName == libName )
00311         {
00312             decoName = (*it).name;
00313             break;
00314         }
00315 
00316     return decoName;
00317 }
00318 
00319 
00320 QString KWinDecorationModule::decorationLibName( const QString& name )
00321 {
00322     QString libName;
00323 
00324     // Find the corresponding library name to that of
00325     // the current plugin name
00326     QValueList<DecorationInfo>::Iterator it;
00327     for( it = decorations.begin(); it != decorations.end(); ++it )
00328         if ( (*it).name == name )
00329         {
00330             libName = (*it).libraryName;
00331             break;
00332         }
00333 
00334     if (libName.isEmpty())
00335         libName = "kwin_default";   // KDE 2
00336 
00337     return libName;
00338 }
00339 
00340 
00341 // Loads/unloads and inserts the decoration config plugin into the
00342 // pluginConfigWidget, allowing for dynamic configuration of decorations
00343 void KWinDecorationModule::resetPlugin( KConfig* conf, const QString& currentDecoName )
00344 {
00345     // Config names are "kwin_icewm_config"
00346     // for "kwin3_icewm" kwin client
00347 
00348     QString oldName = styleToConfigLib( oldLibraryName );
00349 
00350     QString currentName;
00351     if (!currentDecoName.isEmpty())
00352         currentName = decorationLibName( currentDecoName ); // Use what the user selected
00353     else
00354         currentName = currentLibraryName; // Use what was read from readConfig()
00355 
00356         if( plugins->loadPlugin( currentName )
00357             && preview->recreateDecoration( plugins ))
00358             preview->enablePreview();
00359         else
00360             preview->disablePreview();
00361         plugins->destroyPreviousPlugin();
00362 
00363         checkSupportedBorderSizes();
00364 
00365     currentName = styleToConfigLib( currentName );
00366 
00367     // Delete old plugin widget if it exists
00368     delete pluginObject;
00369     pluginObject = 0;
00370 
00371     // Use klibloader for library manipulation
00372     KLibLoader* loader = KLibLoader::self();
00373 
00374     // Free the old library if possible
00375     if (!oldLibraryName.isNull())
00376         loader->unloadLibrary( QFile::encodeName(oldName) );
00377 
00378     KLibrary* library = loader->library( QFile::encodeName(currentName) );
00379     if (library != NULL)
00380     {
00381         void* alloc_ptr = library->symbol("allocate_config");
00382 
00383         if (alloc_ptr != NULL)
00384         {
00385             allocatePlugin = (QObject* (*)(KConfig* conf, QWidget* parent))alloc_ptr;
00386             pluginObject = (QObject*)(allocatePlugin( conf, pluginConfigWidget ));
00387 
00388             // connect required signals and slots together...
00389             connect( pluginObject, SIGNAL(changed()), this, SLOT(slotSelectionChanged()) );
00390             connect( this, SIGNAL(pluginLoad(KConfig*)), pluginObject, SLOT(load(KConfig*)) );
00391             connect( this, SIGNAL(pluginSave(KConfig*)), pluginObject, SLOT(save(KConfig*)) );
00392             connect( this, SIGNAL(pluginDefaults()), pluginObject, SLOT(defaults()) );
00393             pluginSettingsGrp->show();
00394             return;
00395         }
00396     }
00397 
00398     pluginSettingsGrp->hide();
00399 }
00400 
00401 
00402 // Reads the kwin config settings, and sets all UI controls to those settings
00403 // Updating the config plugin if required
00404 void KWinDecorationModule::readConfig( KConfig* conf )
00405 {
00406     // General tab
00407     // ============
00408     cbShowToolTips->setChecked( conf->readBoolEntry("ShowToolTips", true ));
00409 //  cbUseMiniWindows->setChecked( conf->readBoolEntry("MiniWindowBorders", false));
00410 
00411     // Find the corresponding decoration name to that of
00412     // the current plugin library name
00413 
00414     oldLibraryName = currentLibraryName;
00415     currentLibraryName = conf->readEntry("PluginLib",
00416                     ((QPixmap::defaultDepth() > 8) ? "kwin_keramik" : "kwin_quartz"));
00417     QString decoName = decorationName( currentLibraryName );
00418 
00419     // If we are using the "default" kde client, use the "default" entry.
00420     if (decoName.isEmpty())
00421         decoName = i18n("KDE 2");
00422 
00423     int numDecos = decorationList->count();
00424     for (int i = 0; i < numDecos; ++i)
00425     {
00426          if (decorationList->text(i) == decoName)
00427          {
00428                  decorationList->setCurrentItem(i);
00429                  break;
00430          }
00431     }
00432 
00433     // Buttons tab
00434     // ============
00435     bool customPositions = conf->readBoolEntry("CustomButtonPositions", false);
00436     cbUseCustomButtonPositions->setChecked( customPositions );
00437     buttonBox->setEnabled( customPositions );
00438     // Menu and onAllDesktops buttons are default on LHS
00439     dropSite->buttonsLeft  = conf->readEntry("ButtonsOnLeft", "MS");
00440     // Help, Minimize, Maximize and Close are default on RHS
00441     dropSite->buttonsRight = conf->readEntry("ButtonsOnRight", "HIAX");
00442     dropSite->repaint(false);
00443 
00444     buttonSource->showAllButtons();
00445 
00446     // Step through the button lists, and hide the dnd button source items
00447     unsigned int i;
00448     for(i = 0; i < dropSite->buttonsLeft.length(); i++)
00449         buttonSource->hideButton( dropSite->buttonsLeft[i].latin1() );
00450     for(i = 0; i < dropSite->buttonsRight.length(); i++)
00451         buttonSource->hideButton( dropSite->buttonsRight[i].latin1() );
00452 
00453         int bsize = conf->readNumEntry( "BorderSize", BorderNormal );
00454         if( bsize >= BorderTiny && bsize < BordersCount )
00455             border_size = static_cast< BorderSize >( bsize );
00456         else
00457             border_size = BorderNormal;
00458         checkSupportedBorderSizes();
00459 
00460     emit KCModule::changed(false);
00461 }
00462 
00463 
00464 // Writes the selected user configuration to the kwin config file
00465 void KWinDecorationModule::writeConfig( KConfig* conf )
00466 {
00467     QString name = decorationList->currentText();
00468     QString libName = decorationLibName( name );
00469 
00470     KConfig kwinConfig("kwinrc");
00471     kwinConfig.setGroup("Style");
00472 
00473     // General settings
00474     conf->writeEntry("PluginLib", libName);
00475     conf->writeEntry("CustomButtonPositions", cbUseCustomButtonPositions->isChecked());
00476     conf->writeEntry("ShowToolTips", cbShowToolTips->isChecked());
00477 //  conf->writeEntry("MiniWindowBorders", cbUseMiniWindows->isChecked());
00478 
00479     // Button settings
00480     conf->writeEntry("ButtonsOnLeft", dropSite->buttonsLeft );
00481     conf->writeEntry("ButtonsOnRight", dropSite->buttonsRight );
00482         conf->writeEntry("BorderSize", border_size );
00483 
00484     oldLibraryName = currentLibraryName;
00485     currentLibraryName = libName;
00486 
00487     // We saved, so tell kcmodule that there have been  no new user changes made.
00488     emit KCModule::changed(false);
00489 }
00490 
00491 
00492 void KWinDecorationModule::dcopUpdateClientList()
00493 {
00494     // Changes the current active ListBox item, and
00495     // Loads a new plugin configuration tab if required.
00496     KConfig kwinConfig("kwinrc");
00497     kwinConfig.setGroup("Style");
00498 
00499     readConfig( &kwinConfig );
00500     resetPlugin( &kwinConfig );
00501 }
00502 
00503 
00504 // Virutal functions required by KCModule
00505 void KWinDecorationModule::load()
00506 {
00507     KConfig kwinConfig("kwinrc");
00508     kwinConfig.setGroup("Style");
00509 
00510     // Reset by re-reading the config
00511     // The plugin doesn't need changing, as we have not saved
00512     readConfig( &kwinConfig );
00513     emit pluginLoad( &kwinConfig );
00514 }
00515 
00516 
00517 void KWinDecorationModule::save()
00518 {
00519     KConfig kwinConfig("kwinrc");
00520     kwinConfig.setGroup("Style");
00521 
00522     writeConfig( &kwinConfig );
00523     emit pluginSave( &kwinConfig );
00524 
00525     kwinConfig.sync();
00526     resetKWin();
00527     // resetPlugin() will get called via the above DCOP function
00528 }
00529 
00530 
00531 void KWinDecorationModule::defaults()
00532 {
00533     // Set the KDE defaults
00534     cbUseCustomButtonPositions->setChecked( false );
00535     buttonBox->setEnabled( false );
00536     cbShowToolTips->setChecked( true );
00537 //  cbUseMiniWindows->setChecked( false);
00538 // Don't set default for now
00539 //  decorationList->setSelected(
00540 //      decorationList->findItem( i18n("KDE 2") ), true );  // KDE classic client
00541 
00542     dropSite->buttonsLeft = "MS";
00543     dropSite->buttonsRight= "HIAX";
00544     dropSite->repaint(false);
00545 
00546     buttonSource->showAllButtons();
00547     buttonSource->hideButton('M');
00548     buttonSource->hideButton('S');
00549     buttonSource->hideButton('H');
00550     buttonSource->hideButton('I');
00551     buttonSource->hideButton('A');
00552     buttonSource->hideButton('X');
00553 
00554         border_size = BorderNormal;
00555         checkSupportedBorderSizes();
00556 
00557     // Set plugin defaults
00558     emit pluginDefaults();
00559 }
00560 
00561 void KWinDecorationModule::checkSupportedBorderSizes()
00562 {
00563         QValueList< BorderSize > sizes;
00564         slBorder->hide();
00565         lBorder->hide();
00566         if( plugins->factory() != NULL )
00567             sizes = plugins->factory()->borderSizes();
00568         if( sizes.count() < 2 )
00569             return;
00570         slBorder->setRange( 0, sizes.count() - 1 );
00571         int pos = borderSizeToIndex( border_size, sizes );
00572         lBorder->show();
00573         slBorder->show();
00574         slBorder->setValue( pos );
00575         slotBorderChanged( pos );
00576 }
00577 
00578 QString KWinDecorationModule::styleToConfigLib( QString& styleLib )
00579 {
00580         if( styleLib.startsWith( "kwin3_" ))
00581             return "kwin_" + styleLib.mid( 6 ) + "_config";
00582         else
00583             return styleLib + "_config";
00584 }
00585 
00586 QString KWinDecorationModule::quickHelp() const
00587 {
00588     return i18n( "<h1>Window Manager Decoration</h1>"
00589         "<p>This module allows you to choose the window border decorations, "
00590         "as well as titlebar button positions and custom decoration options.</p>"
00591         "To choose a theme for your window decoration click on its name and apply your choice by clicking the \"Apply\" button below."
00592         " If you don't want to apply your choice you can click the \"Reset\" button to discard your changes."
00593         "<p>You can configure each theme in the \"Configure [...]\" tab. There are different options specific for each theme.</p>"
00594         "<p>In \"General Options (if available)\" you can activate the \"Buttons\" tab by checking the \"Use custom titlebar button positions\" box."
00595         " In the \"Buttons\" tab you can change the positions of the buttons to your liking.</p>" );
00596 }
00597 
00598 
00599 const KAboutData* KWinDecorationModule::aboutData() const
00600 {
00601     KAboutData* about =
00602         new KAboutData(I18N_NOOP("kcmkwindecoration"),
00603                 I18N_NOOP("Window Decoration Control Module"),
00604                 0, 0, KAboutData::License_GPL,
00605                 I18N_NOOP("(c) 2001 Karol Szwed"));
00606     about->addAuthor("Karol Szwed", 0, "gallium@kde.org");
00607     return about;
00608 }
00609 
00610 
00611 void KWinDecorationModule::resetKWin()
00612 {
00613     bool ok = kapp->dcopClient()->send("kwin", "KWinInterface",
00614                         "reconfigure()", QByteArray());
00615     if (!ok)
00616         kdDebug() << "kcmkwindecoration: Could not reconfigure kwin" << endl;
00617 }
00618 
00619 #include "kwindecoration.moc"
00620 // vim: ts=4
00621 
KDE Logo
This file is part of the documentation for kwin Library Version 3.2.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Mar 5 04:41:14 2004 by doxygen 1.3.6-20040222 written by Dimitri van Heesch, © 1997-2003