summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/serverapp.cpp19
-rw-r--r--core/launcher/systray.cpp8
-rw-r--r--core/launcher/systray.h1
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
@@ -720,15 +720,34 @@ void ServerApplication::shutdown( ShutdownImpl::Type t )
720 } 720 }
721} 721}
722 722
723void ServerApplication::restart() 723void ServerApplication::restart()
724{ 724{
725 if ( allowRestart ) { 725 if ( allowRestart ) {
726
727 /*
728 * Applets and restart is a problem. Some applets delete
729 * their widgets even if ownership gets transfered to the
730 * parent (Systray ) but deleting the applet may be unsafe
731 * as well ( double deletion ). Some have topLevel widgets
732 * and when we dlclose and then delete the widget we will
733 * crash and an crash during restart is not nice
734 */
735#ifdef ALL_APPLETS_ON_THIS_WORLD_ARE_FIXED
736 /* same as above */
737 emit aboutToQuit();
726 prepareForTermination(TRUE); 738 prepareForTermination(TRUE);
727 doRestart = TRUE; 739 doRestart = TRUE;
728 quit(); 740 quit();
741#else
742 prepareForTermination( true );
743 for ( int fd = 3; fd < 100; fd++ )
744 close( fd );
745 execl( ( qpeDir() + "/bin/qpe" ).latin1(), "qpe", 0 );
746 exit( 1 );
747#endif
729 } 748 }
730} 749}
731 750
732void ServerApplication::rereadVolumes() 751void ServerApplication::rereadVolumes()
733{ 752{
734 Config cfg( "qpe" ); 753 Config cfg( "qpe" );
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
@@ -66,12 +66,20 @@ void SysTray::loadApplets()
66} 66}
67 67
68void SysTray::clearApplets() 68void SysTray::clearApplets()
69{ 69{
70#ifndef QT_NO_COMPONENTS 70#ifndef QT_NO_COMPONENTS
71 71
72 /*
73 * Note on clearing. SOme applets delete their
74 * applets themselves some don't do it
75 * and on restart this can crash. If we delete it
76 * here we might end up in a double deletion. We could
77 * use QGuardedPtr but that would be one QOBject
78 * for every applet more but only useful for restart
79 */
72 QValueList<TaskbarApplet>::Iterator mit; 80 QValueList<TaskbarApplet>::Iterator mit;
73 for ( mit = appletList.begin(); mit != appletList.end(); ++mit ) { 81 for ( mit = appletList.begin(); mit != appletList.end(); ++mit ) {
74 (*mit).iface->release(); 82 (*mit).iface->release();
75 (*mit).library->unload(); 83 (*mit).library->unload();
76 delete (*mit).library; 84 delete (*mit).library;
77 } 85 }
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
@@ -24,12 +24,13 @@
24#ifndef QT_NO_COMPONENT 24#ifndef QT_NO_COMPONENT
25#include <qtopia/taskbarappletinterface.h> 25#include <qtopia/taskbarappletinterface.h>
26#endif 26#endif
27 27
28#include <qframe.h> 28#include <qframe.h>
29#include <qvaluelist.h> 29#include <qvaluelist.h>
30#include <qguardedptr.h>
30 31
31class QHBoxLayout; 32class QHBoxLayout;
32class QLibrary; 33class QLibrary;
33 34
34struct TaskbarApplet 35struct TaskbarApplet
35{ 36{