-rw-r--r-- | core/launcher/serverapp.cpp | 19 | ||||
-rw-r--r-- | core/launcher/systray.cpp | 8 | ||||
-rw-r--r-- | core/launcher/systray.h | 1 |
3 files changed, 28 insertions, 0 deletions
diff --git a/core/launcher/serverapp.cpp b/core/launcher/serverapp.cpp index 522ef07..28316a4 100644 --- a/core/launcher/serverapp.cpp +++ b/core/launcher/serverapp.cpp @@ -718,19 +718,38 @@ void ServerApplication::shutdown( ShutdownImpl::Type t ) quit(); break; } } void ServerApplication::restart() { if ( allowRestart ) { + + /* + * Applets and restart is a problem. Some applets delete + * their widgets even if ownership gets transfered to the + * parent (Systray ) but deleting the applet may be unsafe + * as well ( double deletion ). Some have topLevel widgets + * and when we dlclose and then delete the widget we will + * crash and an crash during restart is not nice + */ +#ifdef ALL_APPLETS_ON_THIS_WORLD_ARE_FIXED + /* same as above */ + emit aboutToQuit(); prepareForTermination(TRUE); doRestart = TRUE; quit(); +#else + prepareForTermination( true ); + for ( int fd = 3; fd < 100; fd++ ) + close( fd ); + execl( ( qpeDir() + "/bin/qpe" ).latin1(), "qpe", 0 ); + exit( 1 ); +#endif } } void ServerApplication::rereadVolumes() { Config cfg( "qpe" ); cfg. setGroup ( "Volume" ); diff --git a/core/launcher/systray.cpp b/core/launcher/systray.cpp index 64356ca..6122770 100644 --- a/core/launcher/systray.cpp +++ b/core/launcher/systray.cpp @@ -64,16 +64,24 @@ void SysTray::loadApplets() clearApplets(); addApplets(); } void SysTray::clearApplets() { #ifndef QT_NO_COMPONENTS + /* + * Note on clearing. SOme applets delete their + * applets themselves some don't do it + * and on restart this can crash. If we delete it + * here we might end up in a double deletion. We could + * use QGuardedPtr but that would be one QOBject + * for every applet more but only useful for restart + */ QValueList<TaskbarApplet>::Iterator mit; for ( mit = appletList.begin(); mit != appletList.end(); ++mit ) { (*mit).iface->release(); (*mit).library->unload(); delete (*mit).library; } #endif diff --git a/core/launcher/systray.h b/core/launcher/systray.h index 77c581f..b989d58 100644 --- a/core/launcher/systray.h +++ b/core/launcher/systray.h @@ -22,16 +22,17 @@ #define __SYSTRAY_H__ #ifndef QT_NO_COMPONENT #include <qtopia/taskbarappletinterface.h> #endif #include <qframe.h> #include <qvaluelist.h> +#include <qguardedptr.h> class QHBoxLayout; class QLibrary; struct TaskbarApplet { #ifndef QT_NO_COMPONENT QLibrary *library; |