author | zecke <zecke> | 2003-09-03 18:58:20 (UTC) |
---|---|---|
committer | zecke <zecke> | 2003-09-03 18:58:20 (UTC) |
commit | 3038503f6ffc2d58b00650d5feae23cc8e842bcb (patch) (side-by-side diff) | |
tree | 33b2b319307b9a5abda47b51c31329131295d703 | |
parent | 577cdc4f2ce81eaceb132af08d8ab6fe12b4eadc (diff) | |
download | opie-3038503f6ffc2d58b00650d5feae23cc8e842bcb.zip opie-3038503f6ffc2d58b00650d5feae23cc8e842bcb.tar.gz opie-3038503f6ffc2d58b00650d5feae23cc8e842bcb.tar.bz2 |
Failure free restart of the launcher and a comment
why we do that
-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 @@ -694,67 +694,86 @@ void ServerApplication::shutdown( ShutdownImpl::Type t ) switch ( t ) { case ShutdownImpl::ShutdownSystem: opt = "-h"; // fall through case ShutdownImpl::RebootSystem: if ( opt == 0 ) opt = "-r"; if ( execl( "/sbin/shutdown", "shutdown", opt, "now", ( void* ) 0) < 0 ) perror("shutdown"); // ::syslog ( LOG_ERR, "Erroring execing shutdown\n" ); break; case ShutdownImpl::RestartDesktop: restart(); break; case ShutdownImpl::TerminateDesktop: prepareForTermination( FALSE ); // This is a workaround for a Qt bug // clipboard applet has to stop its poll timer, or Qt/E // will hang on quit() right before it emits aboutToQuit() emit aboutToQuit ( ); 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" ); m_screentap_sound = cfg. readBoolEntry ( "TouchSound" ); m_keyclick_sound = cfg. readBoolEntry ( "KeySound" ); m_alarm_sound = cfg. readBoolEntry ( "AlarmSound" ); } void ServerApplication::checkMemory() { #if defined(QPE_HAVE_MEMALERTER) static bool ignoreNormal=TRUE; static bool existingMessage=FALSE; if(existingMessage) return; // don't show a second message while still on first existingMessage = TRUE; switch ( memstate ) { case MemUnknown: break; case MemLow: memstate = MemUnknown; if ( !recoverMemory() ) { QMessageBox::warning( 0 , tr("Memory Status"), tr("Memory Low\nPlease save data.") ); 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 @@ -40,64 +40,72 @@ SysTray::SysTray( QWidget *parent ) : QFrame( parent ), layout(0) { //setFrameStyle( QFrame::Panel | QFrame::Sunken ); loadApplets(); } SysTray::~SysTray() { clearApplets(); } static int compareAppletPositions(const void *a, const void *b) { const TaskbarApplet* aa = *(const TaskbarApplet**)a; const TaskbarApplet* ab = *(const TaskbarApplet**)b; int d = ab->iface->position() - aa->iface->position(); if ( d ) return d; return QString::compare(ab->name,aa->name); } void SysTray::loadApplets() { hide(); 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 appletList.clear(); if ( layout ) delete layout; layout = new QHBoxLayout( this, 0, 1 ); layout->setAutoAdd(TRUE); } void SysTray::addApplets() { hide(); #ifndef QT_NO_COMPONENTS Config cfg( "Taskbar" ); cfg.setGroup( "Applets" ); QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' ); QString lang = getenv( "LANG" ); QString path = QPEApplication::qpeDir() + "/plugins/applets"; QDir dir( path, "lib*.so" ); QStringList list = dir.entryList(); QStringList::Iterator it; int napplets=0; TaskbarApplet* *applets = new TaskbarApplet*[list.count()]; for ( it = list.begin(); it != list.end(); ++it ) { if ( exclude.find( *it ) != exclude.end() ) 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 @@ -1,61 +1,62 @@ /********************************************************************** ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** ** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef __SYSTRAY_H__ #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; TaskbarAppletInterface *iface; #endif QWidget *applet; QString name; }; class SysTray : public QFrame { Q_OBJECT public: SysTray( QWidget *parent ); ~SysTray(); void clearApplets(); void addApplets(); private: void loadApplets(); QHBoxLayout *layout; QValueList<TaskbarApplet> appletList; }; #endif // __SYSTRAY_H__ |