diff options
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.patch | 639 |
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 + + }; + |