summaryrefslogtreecommitdiffstats
path: root/redhat/tdebase/tdebase-3.5.13.2-select_wm_gui.patch
diff options
context:
space:
mode:
Diffstat (limited to 'redhat/tdebase/tdebase-3.5.13.2-select_wm_gui.patch')
-rw-r--r--redhat/tdebase/tdebase-3.5.13.2-select_wm_gui.patch639
1 files changed, 639 insertions, 0 deletions
diff --git a/redhat/tdebase/tdebase-3.5.13.2-select_wm_gui.patch b/redhat/tdebase/tdebase-3.5.13.2-select_wm_gui.patch
new file mode 100644
index 000000000..464ef3f51
--- /dev/null
+++ b/redhat/tdebase/tdebase-3.5.13.2-select_wm_gui.patch
@@ -0,0 +1,639 @@
+--- ./ksmserver/startup.cpp.ori 2013-05-08 20:04:32.138717187 +0200
++++ ./ksmserver/startup.cpp 2013-05-08 20:14:12.550305958 +0200
+@@ -115,43 +115,40 @@
+ int count = config->readNumEntry( "count" );
+ appsToStart = count;
+
+- TQValueList<TQStringList> wmCommands;
+- if ( !wm.isEmpty() ) {
+- for ( int i = 1; i <= count; i++ ) {
+- TQString n = TQString::number(i);
+- if ( wm == config->readEntry( TQString("program")+n ) ) {
+- wmCommands << config->readListEntry( TQString("restartCommand")+n );
+- }
+- }
+- }
+- if ( wmCommands.isEmpty() )
+- wmCommands << ( TQStringList() << wm );
+-
+ publishProgress( appsToStart, true );
+ connectDCOPSignal( launcher, launcher, "autoStart0Done()",
+ "autoStart0Done()", true);
+ connectDCOPSignal( launcher, launcher, "autoStart1Done()",
+ "autoStart1Done()", true);
+ connectDCOPSignal( launcher, launcher, "autoStart2Done()",
+ "autoStart2Done()", true);
+ upAndRunning( "ksmserver" );
+
+- if ( !wmCommands.isEmpty() ) {
+- // when we have a window manager, we start it first and give
+- // it some time before launching other processes. Results in a
+- // visually more appealing startup.
+- for (uint i = 0; i < wmCommands.count(); i++)
+- startApplication( wmCommands[i] );
+- if ((showFancyLogin) && (!startupNotifierIPDlg)) {
+- startupNotifierIPDlg = KSMStartupIPDlg::showStartupIP();
+- }
+- TQTimer::singleShot( 4000, this, TQT_SLOT( autoStart0() ) );
+- } else {
+- if ((showFancyLogin) && (!startupNotifierIPDlg)) {
+- startupNotifierIPDlg = KSMStartupIPDlg::showStartupIP();
++ // find all commands to launch the wm in the session
++ TQValueList<QStringList> wmStartCommands;
++ if ( !wm.isEmpty() ) {
++ for ( int i = 1; i <= count; i++ ) {
++ TQString n = TQString::number(i);
++ // special hack for it, both kde3(=native) and kde4 kwin have the same program,
++ // but the command for kde4 kwin starts with the kde4 wrapper
++ if( config->readEntry( TQString("program")+n ) == "kwin" ) {
++ TQStringList command = config->readListEntry( TQString("restartCommand")+n );
++ if( wmCommands.count() > 1 && wmCommands[ 0 ].endsWith( "kde4" )
++ && command.count() > 1 && command[ 0 ].endsWith( "kde4" )) {
++ wmStartCommands << command; // kde4 wanted, kde4 found
++ } else if(!( wmCommands.count() > 1 && wmCommands[ 0 ].endsWith( "kde4" ))
++ && !( command.count() > 1 && command[ 0 ].endsWith( "kde4" ))) {
++ wmStartCommands << command; // native wanted, native found
++ }
++ } else if ( wm == config->readEntry( TQString("program")+n ) ) {
++ wmStartCommands << config->readListEntry( TQString("restartCommand")+n );
++ }
+ }
+- autoStart0();
++ }
++ if( wmStartCommands.isEmpty()) { // otherwise use the configured default
++ wmStartCommands << wmCommands;
+ }
++ launchWM( wmStartCommands );
+ }
+
+ /*!
+@@ -180,18 +177,57 @@
+ "autoStart1Done()", true);
+ connectDCOPSignal( launcher, launcher, "autoStart2Done()",
+ "autoStart2Done()", true);
+- startApplication( wm );
++ launchWM( TQValueList< TQStringList >() << wmCommands );
+ if ((showFancyLogin) && (!startupNotifierIPDlg)) {
+ startupNotifierIPDlg = KSMStartupIPDlg::showStartupIP();
+ }
++}
++
++void KSMServer::launchWM( const QValueList< QStringList >& wmStartCommands )
++{
++ assert( state == LaunchingWM );
++
++ // when we have a window manager, we start it first and give
++ // it some time before launching other processes. Results in a
++ // visually more appealing startup.
++ wmProcess = startApplication( wmStartCommands[ 0 ] );
++ connect( wmProcess, TQT_SIGNAL( processExited( KProcess* )), TQT_SLOT( wmProcessChange()));
++ // there can be possibly more wm's (because of forking for multihead),
++ // but in such case care only about the process of the first one
++ for (unsigned int i = 1; i < wmStartCommands.count(); i++) {
++ startApplication( wmStartCommands[i] );
++ }
+ TQTimer::singleShot( 4000, this, TQT_SLOT( autoStart0() ) );
+ }
+
+
+ void KSMServer::clientSetProgram( KSMClient* client )
+ {
+- if ( !wm.isEmpty() && client->program() == wm )
++ if ( client->program() == wm ) {
+ autoStart0();
++ }
++}
++
++void KSMServer::wmProcessChange()
++{
++ if( state != LaunchingWM )
++ { // don't care about the process when not in the wm-launching state anymore
++ wmProcess = NULL;
++ return;
++ }
++ if( !wmProcess->isRunning())
++ { // wm failed to launch for some reason, go with kwin instead
++ kdWarning( 1218 ) << "Window manager '" << wm << "' failed to launch" << endl;
++ if( wm == "kwin" ) {
++ return; // uhoh, kwin itself failed
++ }
++ kdDebug( 1218 ) << "Launching KWin" << endl;
++ wm = "kwin";
++ wmCommands = ( TQStringList() << "kwin" );
++ // launch it
++ launchWM( TQValueList< TQStringList >() << wmCommands );
++ return;
++ }
+ }
+
+ void KSMServer::autoStart0()
+--- ./ksmserver/server.h.ORI 2013-05-08 20:16:35.950487652 +0200
++++ ./ksmserver/server.h 2013-05-08 20:19:49.069692796 +0200
+@@ -30,6 +30,8 @@
+ #define SESSION_PREVIOUS_LOGOUT "saved at previous logout"
+ #define SESSION_BY_USER "saved by user"
+
++class KProcess;
++
+ typedef TQValueList<TQCString> QCStringList;
+ class KSMListener;
+ class KSMConnection;
+@@ -98,6 +100,8 @@
+ KApplication::ShutdownType sdtype,
+ KApplication::ShutdownMode sdmode );
+
++ void launchWM( const TQValueList< TQStringList >& wmStartCommands );
++
+ public slots:
+ void cleanUp();
+
+@@ -120,6 +124,7 @@
+ void autoStart2();
+ void tryRestoreNext();
+ void startupSuspendTimeout();
++ void wmProcessChange();
+
+ private:
+ void handlePendingInteractions();
+@@ -138,7 +143,7 @@
+ void startProtection();
+ void endProtection();
+
+- void startApplication( TQStringList command,
++ KProcess* startApplication( TQStringList command,
+ const TQString& clientMachine = TQString::null,
+ const TQString& userId = TQString::null );
+ void executeCommand( const TQStringList& command );
+@@ -149,6 +154,7 @@
+ bool isCM( const TQString& program ) const;
+ bool isNotifier( const KSMClient* client ) const;
+ bool isNotifier( const TQString& program ) const;
++ void selectWm( const TQString& kdewm );
+ bool defaultSession() const; // empty session
+ void setupXIOErrorHandler();
+
+@@ -231,6 +237,8 @@
+ TQString lastIdStarted;
+
+ TQStringList excludeApps;
++ TQStringList wmCommands;
++ KProcess* wmProcess;
+
+ WindowMap legacyWindows;
+ int initialClientCount;
+--- ./ksmserver/CMakeLists.txt.ORI 2013-05-08 20:21:11.420074784 +0200
++++ ./ksmserver/CMakeLists.txt 2013-05-08 20:22:16.602794164 +0200
+@@ -28,6 +28,8 @@
+ ${DBUS_TQT_LIBRARY_DIRS}
+ )
+
++add_subdirectory( windowmanagers )
++
+
+ ##### other data ################################
+
+--- ./ksmserver/main.cpp.ori 2013-05-08 20:22:52.841082235 +0200
++++ ./ksmserver/main.cpp 2013-05-08 20:23:11.717711399 +0200
+@@ -203,8 +203,6 @@
+ }
+
+ TQCString wm = args->getOption("windowmanager");
+- if ( wm.isEmpty() )
+- wm = "kwin";
+
+ bool only_local = args->isSet("local");
+ #ifndef HAVE__ICETRANSNOLISTEN
+--- ./ksmserver/server.cpp.ori 2013-05-08 20:24:02.870706512 +0200
++++ ./ksmserver/server.cpp 2013-05-08 20:35:02.808745909 +0200
+@@ -77,6 +77,8 @@
+ #include <kprocess.h>
+ #include <dcopclient.h>
+ #include <dcopref.h>
++#include <kdesktopfile.h>
++#include <kshell.h>
+
+ #include "server.h"
+ #include "global.h"
+@@ -98,11 +100,11 @@
+ /*! Utility function to execute a command on the local machine. Used
+ * to restart applications.
+ */
+-void KSMServer::startApplication( TQStringList command, const TQString& clientMachine,
++KProcess* KSMServer::startApplication( TQStringList command, const TQString& clientMachine,
+ const TQString& userId )
+ {
+ if ( command.isEmpty() )
+- return;
++ return NULL;
+ if ( !userId.isEmpty()) {
+ struct passwd* pw = getpwuid( getuid());
+ if( pw != NULL && userId != TQString::fromLocal8Bit( pw->pw_name )) {
+@@ -116,12 +118,13 @@
+ command.prepend( clientMachine );
+ command.prepend( xonCommand ); // "xon" by default
+ }
+- int n = command.count();
+- TQCString app = command[0].latin1();
+- TQValueList<TQCString> argList;
+- for ( int i=1; i < n; i++)
+- argList.append( TQCString(command[i].latin1()));
+- DCOPRef( launcher ).send( "exec_blind", app, DCOPArg( argList, "TQValueList<TQCString>" ) );
++ KProcess* process = new KProcess( this );
++ *process << command;
++ // make it auto-delete
++ connect( process, TQT_SIGNAL( processExited( KProcess* )), process, TQT_SLOT( deleteLater()));
++ process->start();
++ return process;
++
+ }
+
+ /*! Utility function to execute a command on the local machine. Used
+@@ -579,7 +582,7 @@
+ #endif
+
+ KSMServer::KSMServer( const TQString& windowManager, bool _only_local )
+- : DCOPObject("ksmserver"), sessionGroup( "" ), startupNotifierIPDlg(0), shutdownNotifierIPDlg(0)
++ : DCOPObject("ksmserver"), sessionGroup( "" ), startupNotifierIPDlg(0), shutdownNotifierIPDlg(0), wmProcess( NULL )
+ {
+ the_server = this;
+ clean = false;
+@@ -595,7 +598,10 @@
+ config->setGroup("General" );
+ clientInteracting = 0;
+ xonCommand = config->readEntry( "xonCommand", "xon" );
+-
++
++ KGlobal::dirs()->addResourceType( "windowmanagers", "share/apps/ksmserver/windowmanagers" );
++ selectWm( windowManager );
++
+ connect( &knotifyTimeoutTimer, TQT_SIGNAL( timeout()), TQT_SLOT( knotifyTimeout()));
+ connect( &startupSuspendTimeoutTimer, TQT_SIGNAL( timeout()), TQT_SLOT( startupSuspendTimeout()));
+ connect( &pendingShutdown, TQT_SIGNAL( timeout()), TQT_SLOT( pendingShutdownTimeout()));
+@@ -851,15 +857,15 @@
+ config->setGroup( sessionGroup );
+ count = 0;
+
+- if ( !wm.isEmpty() ) {
+- // put the wm first
+- for ( KSMClient* c = clients.first(); c; c = clients.next() )
+- if ( c->program() == wm ) {
+- clients.prepend( clients.take() );
+- break;
+- }
++ // put the wm first
++ for ( KSMClient* c = clients.first(); c; c = clients.next() ) {
++ if ( c->program() == wm ) {
++ clients.prepend( clients.take() );
++ break;
++ }
+ }
+
++
+ for ( KSMClient* c = clients.first(); c; c = clients.next() ) {
+ int restartHint = c->restartStyleHint();
+ if (restartHint == SmRestartNever)
+@@ -909,11 +915,7 @@
+
+ bool KSMServer::isWM( const TQString& program ) const
+ {
+- // KWin relies on ksmserver's special treatment in phase1,
+- // therefore make sure it's recognized even if ksmserver
+- // was initially started with different WM, and kwin replaced
+- // it later
+- return ((program == wm) || (program == "kwin"));
++ return program == wm;
+ }
+
+ bool KSMServer::isCM( const KSMClient* client ) const
+@@ -941,3 +943,62 @@
+ {
+ return sessionGroup.isEmpty();
+ }
++
++static bool noDisplay( KDesktopFile& f )
++{
++ KConfigGroup gr( &f, "Desktop Entry" );
++ if (gr.readBoolEntry("NoDisplay", false)) {
++ return true;
++ }
++ if (gr.hasKey("OnlyShowIn")) {
++ if (!gr.readListEntry("OnlyShowIn", ';').contains("KDE"))
++ return true;
++ }
++ if (gr.hasKey("NotShowIn")) {
++ if (gr.readListEntry("NotShowIn", ';').contains("KDE"))
++ return true;
++ }
++ return false;
++}
++
++// selection logic:
++// - $KDEWM is set - use that
++// - a wm is selected using the kcm - use that
++// - if that fails, just use KWin
++void KSMServer::selectWm( const TQString& kdewm )
++{
++ wm = "kwin"; // defaults
++ wmCommands = ( TQStringList() << "kwin" );
++ if( !kdewm.isEmpty())
++ {
++ wmCommands = ( TQStringList() << kdewm );
++ wm = kdewm;
++ return;
++ }
++ KConfigGroup config(KGlobal::config(), "General");
++ TQString cfgwm = config.readEntry( "windowManager", "kwin" );
++ KDesktopFile file( cfgwm + ".desktop", true, "windowmanagers" );
++ if( noDisplay( file )) {
++ return;
++ }
++ if( !file.tryExec()) {
++ return;
++ }
++ file.setDesktopGroup();
++ TQString testexec = file.readEntry( "X-KDE-WindowManagerTestExec" );
++ if( !testexec.isEmpty())
++ {
++ int ret = system( TQFile::encodeName( testexec ));
++ if( !WIFEXITED( ret ) || WEXITSTATUS( ret ) != 0 ) {
++ return;
++ }
++ }
++ TQStringList cfgWmCommands = KShell::splitArgs( file.readEntry( "Exec" ));
++ if( cfgWmCommands.isEmpty()) {
++ return;
++ }
++ TQString smname = file.readEntry( "X-KDE-WindowManagerId" );
++ // ok
++ wm = smname.isEmpty() ? cfgwm : smname;
++ wmCommands = cfgWmCommands;
++}
+Index: ksmserver/windowmanagers/CMakeLists.txt
+===================================================================
+--- /dev/null
++++ ./ksmserver/windowmanagers/CMakeLists.txt
+@@ -0,0 +1,4 @@
++install(
++ FILES compiz-custom.desktop compiz.desktop kwin4.desktop metacity.desktop openbox.desktop
++ DESTINATION ${DATA_INSTALL_DIR}/ksmserver/windowmanagers
++)
+Index: ksmserver/windowmanagers/openbox.desktop
+===================================================================
+--- /dev/null
++++ ./ksmserver/windowmanagers/openbox.desktop
+@@ -0,0 +1,5 @@
++[Desktop Entry]
++Name=Openbox
++Exec=openbox
++TryExec=openbox
++
+Index: ksmserver/windowmanagers/compiz.desktop
+===================================================================
+--- /dev/null
++++ ./ksmserver/windowmanagers/compiz.desktop
+@@ -0,0 +1,4 @@
++[Desktop Entry]
++Name=Compiz
++Exec=compiz ccp
++TryExec=compiz
+Index: ksmserver/windowmanagers/compiz-custom.desktop
+===================================================================
+--- /dev/null
++++ ./ksmserver/windowmanagers/compiz-custom.desktop
+@@ -0,0 +1,5 @@
++[Desktop Entry]
++Name=Compiz custom (create wrapper script 'compiz-kde-launcher' to launch it)
++Exec=compiz-kde-launcher
++TryExec=compiz
++X-KDE-WindowManagerId=compiz
+Index: ksmserver/windowmanagers/kwin4.desktop
+===================================================================
+--- /dev/null
++++ ./ksmserver/windowmanagers/kwin4.desktop
+@@ -0,0 +1,6 @@
++[Desktop Entry]
++Name=KWin (KDE4)
++Exec=kde4 /usr/bin/kwin
++TryExec=/usr/bin/kwin
++X-KDE-WindowManagerId=kwin
++
+Index: ksmserver/windowmanagers/metacity.desktop
+===================================================================
+--- /dev/null
++++ ./ksmserver/windowmanagers/metacity.desktop
+@@ -0,0 +1,4 @@
++[Desktop Entry]
++Name=Metacity (GNOME)
++Exec=metacity
++TryExec=metacity
+--- ./kcontrol/smserver/smserverconfigdlg.ui.ori 2013-05-08 20:42:59.226232919 +0200
++++ ./kcontrol/smserver/smserverconfigdlg.ui 2013-05-08 20:45:53.648749758 +0200
+@@ -1,4 +1,4 @@
+-<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
++<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+ <class>SMServerConfigDlg</class>
+ <widget class="TQWidget">
+ <property name="name">
+@@ -8,8 +8,8 @@
+ <rect>
+ <x>0</x>
+ <y>0</y>
+- <width>325</width>
+- <height>366</height>
++ <width>334</width>
++ <height>476</height>
+ </rect>
+ </property>
+ <property name="caption">
+@@ -173,6 +173,24 @@
+ </widget>
+ </vbox>
+ </widget>
++ <widget class="TQGroupBox">
++ <property name="name">
++ <cstring>windowManagerGroup</cstring>
++ </property>
++ <property name="title">
++ <string>Window Manager</string>
++ </property>
++ <hbox>
++ <property name="name">
++ <cstring>unnamed</cstring>
++ </property>
++ <widget class="TQComboBox">
++ <property name="name">
++ <cstring>windowManagerCombo</cstring>
++ </property>
++ </widget>
++ </hbox>
++ </widget>
+ <widget class="TQButtonGroup">
+ <property name="name">
+ <cstring>advancedGroup</cstring>
+@@ -279,6 +297,12 @@
+ <receiver>SMServerConfigDlg</receiver>
+ <slot>configChanged()</slot>
+ </connection>
++ <connection>
++ <sender>windowManagerCombo</sender>
++ <signal>activated(int)</signal>
++ <receiver>SMServerConfigDlg</receiver>
++ <slot>configChanged()</slot>
++ </connection>
+ </connections>
+ <includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+--- ./kcontrol/smserver/kcmsmserver.cpp.ORI 2013-05-08 20:47:16.855088794 +0200
++++ ./kcontrol/smserver/kcmsmserver.cpp 2013-05-08 20:57:27.009783724 +0200
+@@ -22,6 +22,8 @@
+ #include <tqcheckbox.h>
+ #include <tqlayout.h>
+ #include <tqradiobutton.h>
++#include <tqcombobox.h>
++#include <tqfile.h>
+
+ #include <dcopclient.h>
+
+@@ -29,6 +31,12 @@
+ #include <kconfig.h>
+ #include <kgenericfactory.h>
+ #include <klineedit.h>
++#include <kstandarddirs.h>
++#include <tqregexp.h>
++#include <kdesktopfile.h>
++#include <kdebug.h>
++#include <kprocess.h>
++#include <kmessagebox.h>
+
+ #include "kcmsmserver.h"
+ #include "smserverconfigimpl.h"
+@@ -52,6 +60,7 @@
+
+ dialog->show();
+ topLayout->add(dialog);
++ KGlobal::dirs()->addResourceType( "windowmanagers", "share/apps/ksmserver/windowmanagers" );
+ load();
+
+ }
+@@ -90,6 +99,7 @@
+ dialog->logoutRadio->setChecked(true);
+ break;
+ }
++ loadWMs(c->readEntry("windowManager", "kwin"));
+ dialog->excludeLineedit->setText( c->readEntry("excludeApps"));
+
+ c->setGroup("Logout");
+@@ -121,6 +131,7 @@
+ dialog->rebootRadio->isChecked() ?
+ int(KApplication::ShutdownTypeReboot) :
+ int(KApplication::ShutdownTypeNone));
++ c->writeEntry("windowManager", currentWM());
+ c->writeEntry("excludeApps", dialog->excludeLineedit->text());
+ c->setGroup("Logout");
+ c->writeEntry( "showLogoutStatusDlg", dialog->showLogoutStatusDialog->isChecked());
+@@ -131,6 +142,12 @@
+ // update the k menu if necessary
+ TQByteArray data;
+ kapp->dcopClient()->send( "kicker", "kicker", "configure()", data );
++ if( oldwm != currentWM())
++ { // TODO switch it already in the session instead and tell ksmserver
++ KMessageBox::information( this,
++ i18n( "The new window manager will be used when TDE is started the next time." ),
++ i18n( "Window manager change" ), "windowmanagerchange" );
++ }
+ }
+
+ void SMServerConfig::defaults()
+@@ -138,5 +155,79 @@
+ load( true );
+ }
+
++static bool noDisplay( KDesktopFile& f )
++{
++ KConfigGroup gr( &f, "Desktop Entry" );
++ if (gr.readBoolEntry("NoDisplay", false)) {
++ return true;
++ }
++ if (gr.hasKey("OnlyShowIn")) {
++ if (!gr.readListEntry("OnlyShowIn", ';').contains("KDE"))
++ return true;
++ }
++ if (gr.hasKey("NotShowIn")) {
++ if (gr.readListEntry("NotShowIn", ';').contains("KDE"))
++ return true;
++ }
++ return false;
++}
++
++void SMServerConfig::loadWMs( const TQString& current )
++{
++ TQString kwinname = i18n( "KWin (KDE default)" );
++ dialog->windowManagerCombo->insertItem( kwinname );
++ dialog->windowManagerCombo->setCurrentItem( 0 );
++ wms[ kwinname ] = "kwin";
++ oldwm = "kwin";
++ TQStringList list = KGlobal::dirs()->findAllResources( "windowmanagers", TQString(), false, true );
++ TQRegExp reg( ".*/([^/\\.]*)\\.[^/\\.]*" );
++ for( TQStringList::ConstIterator it = list.begin();
++ it != list.end();
++ ++it )
++ {
++ TQString wmfile = *it;
++ KDesktopFile file( wmfile );
++ if( noDisplay( file )) {
++ continue;
++ }
++ if( !file.tryExec()) {
++ continue;
++ }
++ file.setDesktopGroup();
++ TQString testexec = file.readEntry( "X-KDE-WindowManagerTestExec" );
++ if( !testexec.isEmpty())
++ {
++ int ret = system( TQFile::encodeName( testexec ));
++ if( !WIFEXITED( ret ) || WEXITSTATUS( ret ) != 0 ) {
++ continue;
++ }
++ }
++ TQString name = file.readName();
++ if( name.isEmpty()) {
++ continue;
++ }
++ if( !reg.exactMatch( wmfile )) {
++ continue;
++ }
++ TQString wm = reg.cap( 1 );
++ if( wms.values().contains( wm )) {
++ continue;
++ }
++ wms[ name ] = wm;
++ dialog->windowManagerCombo->insertItem( name );
++ if( wms[ name ] == current ) // make it selected
++ {
++ dialog->windowManagerCombo->setCurrentItem( dialog->windowManagerCombo->count() - 1 );
++ oldwm = wm;
++ }
++ }
++}
++
++TQString SMServerConfig::currentWM() const
++{
++ return wms[ dialog->windowManagerCombo->currentText() ];
++}
++
++
+ #include "kcmsmserver.moc"
+
+--- ./kcontrol/smserver/kcmsmserver.h.ORI 2013-05-08 20:58:45.880171397 +0200
++++ ./kcontrol/smserver/kcmsmserver.h 2013-05-08 20:59:21.030453176 +0200
+@@ -40,6 +40,10 @@
+
+ private:
+ SMServerConfigImpl* dialog;
++ void loadWMs( const TQString& current );
++ TQString currentWM() const;
++ TQMap< TQString, TQString > wms; // i18n text -> internal name
++ TQString oldwm; // the original value
+
+ };
+