-rw-r--r-- | core/tools/quicklauncher/main.cpp | 227 |
1 files changed, 115 insertions, 112 deletions
diff --git a/core/tools/quicklauncher/main.cpp b/core/tools/quicklauncher/main.cpp index b1befce..fb2ca44 100644 --- a/core/tools/quicklauncher/main.cpp +++ b/core/tools/quicklauncher/main.cpp @@ -59,217 +59,220 @@ static char **argv0 = 0; static int argv_lth; extern char **environ; #ifndef SPT_BUFSIZE #define SPT_BUFSIZE 2048 #endif #include <stdarg.h> void setproctitle (const char *fmt,...) { int i; char buf[SPT_BUFSIZE]; va_list ap; if (!argv0) - return; + return; va_start(ap, fmt); (void) vsnprintf(buf, SPT_BUFSIZE, fmt, ap); va_end(ap); i = strlen (buf); if (i > argv_lth - 2) { - i = argv_lth - 2; - buf[i] = '\0'; + i = argv_lth - 2; + buf[i] = '\0'; } + memset(argv0[0], '\0', argv_lth); /* clear the memory area */ (void) strcpy (argv0[0], buf); argv0[1] = NULL; } #endif class QuickLauncher : public QObject { Q_OBJECT public: QuickLauncher() : QObject() { - QCString ch("QPE/QuickLauncher-"); - ch += QString::number(getpid()); - qlChannel = new QCopChannel( ch, this); - connect( qlChannel, SIGNAL(received(const QCString&,const QByteArray&)), - this, SLOT(message(const QCString&,const QByteArray&)) ); + QCString ch("QPE/QuickLauncher-"); + ch += QString::number(getpid()); + qlChannel = new QCopChannel( ch, this); + connect( qlChannel, SIGNAL(received(const QCString&,const QByteArray&)), + this, SLOT(message(const QCString&,const QByteArray&)) ); } static void exec( int /*argc*/, char **argv ) { - QString appName = argv[0]; - int sep = appName.findRev( '/' ); - if ( sep > 0 ) - appName = appName.mid( sep+1 ); + QString appName = argv[0]; + int sep = appName.findRev( '/' ); + if ( sep > 0 ) + appName = appName.mid( sep+1 ); + + appIface = 0; + if ( loader->queryInterface(appName, IID_QtopiaApplication, (QUnknownInterface**)&appIface) == QS_OK ) { + mainWindow = appIface->createMainWindow( appName ); + } - appIface = 0; - if ( loader->queryInterface(appName, IID_QtopiaApplication, (QUnknownInterface**)&appIface) == QS_OK ) { - mainWindow = appIface->createMainWindow( appName ); - } - if ( mainWindow ) { - if ( mainWindow->metaObject()->slotNames().contains("setDocument(const QString&)") ) { - app->showMainDocumentWidget( mainWindow ); + if ( mainWindow ) { + if ( mainWindow->metaObject()->slotNames().contains("setDocument(const QString&)") ) { + app->showMainDocumentWidget( mainWindow ); + } else { + app->showMainWidget( mainWindow ); + } } else { - app->showMainWidget( mainWindow ); + owarn << "Could not create application main window" << oendl; + exit(-1); } - } else { - owarn << "Could not create application main window" << oendl; - exit(-1); - } } private slots: void message(const QCString &msg, const QByteArray & data) { - QStrList argList; - - if ( msg == "execute(QStrList)" ) { - delete qlChannel; - QDataStream stream( data, IO_ReadOnly ); - QStrList argList; - stream >> argList; - odebug << "QuickLauncher execute: " << argList.at(0) << oendl; - doQuickLaunch( argList ); - delete this; - } else if ( msg == "execute(QString)" ) { - delete qlChannel; - QDataStream stream( data, IO_ReadOnly ); - QString arg; - stream >> arg; - odebug << "QuickLauncher execute: " << arg << oendl; QStrList argList; - argList.append( arg.utf8() ); - doQuickLaunch( argList ); - delete this; - } + + if ( msg == "execute(QStrList)" ) { + delete qlChannel; + QDataStream stream( data, IO_ReadOnly ); + QStrList argList; + stream >> argList; + odebug << "QuickLauncher execute: " << argList.at(0) << oendl; + doQuickLaunch( argList ); + delete this; + } else if ( msg == "execute(QString)" ) { + delete qlChannel; + QDataStream stream( data, IO_ReadOnly ); + QString arg; + stream >> arg; + odebug << "QuickLauncher execute: " << arg << oendl; + QStrList argList; + argList.append( arg.utf8() ); + doQuickLaunch( argList ); + delete this; + } } private: void doQuickLaunch( QStrList &argList ) { - static int myargc = argList.count(); - static char **myargv = new char *[myargc + 1]; - for ( int j = 0; j < myargc; j++ ) { - myargv[j] = new char [strlen(argList.at(j))+1]; - strcpy( myargv[j], argList.at(j) ); - } - myargv[myargc] = NULL; + static int myargc = argList.count(); + static char **myargv = new char *[myargc + 1]; + + for ( int j = 0; j < myargc; j++ ) { + myargv[j] = new char [strlen(argList.at(j))+1]; + strcpy( myargv[j], argList.at(j) ); + } + + myargv[myargc] = NULL; #ifdef _OS_LINUX_ - // Change name of process - setproctitle(myargv[0]); + // Change name of process + setproctitle(myargv[0]); #endif - connect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit())); - app->exit_loop(); - app->initApp( myargc, myargv ); - exec( myargc, myargv ); + connect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit())); + app->exit_loop(); + app->initApp( myargc, myargv ); + exec( myargc, myargv ); } private: QCopChannel *qlChannel; }; int main( int argc, char** argv ) { app = new QPEApplication( argc, argv ); loader = new PluginLoader( "application" ); unsetenv( "LD_BIND_NOW" ); QCString arg0 = argv[0]; int sep = arg0.findRev( '/' ); + if ( sep > 0 ) - arg0 = arg0.mid( sep+1 ); + arg0 = arg0.mid( sep+1 ); + if ( arg0 != "quicklauncher" ) { - odebug << "QuickLauncher invoked as: " << arg0.data() << oendl; - QuickLauncher::exec( argc, argv ); + odebug << "QuickLauncher invoked as: " << arg0.data() << oendl; + QuickLauncher::exec( argc, argv ); } else { #ifdef _OS_LINUX_ - // Setup to change proc title - int i; - char **envp = environ; - /* Move the environment so we can reuse the memory. - * (Code borrowed from sendmail.) */ - for (i = 0; envp[i] != NULL; i++) - continue; - environ = (char **) malloc(sizeof(char *) * (i + 1)); - if (environ == NULL) - return -1; - for (i = 0; envp[i] != NULL; i++) - if ((environ[i] = strdup(envp[i])) == NULL) - return -1; - environ[i] = NULL; - - argv0 = argv; - if (i > 0) - argv_lth = envp[i-1] + strlen(envp[i-1]) - argv0[0]; - else - argv_lth = argv0[argc-1] + strlen(argv0[argc-1]) - argv0[0]; + // Setup to change proc title + int i; + char **envp = environ; + /* Move the environment so we can reuse the memory. + * (Code borrowed from sendmail.) */ + for (i = 0; envp[i] != NULL; i++) + continue; + environ = (char **) malloc(sizeof(char *) * (i + 1)); + if (environ == NULL) + return -1; + for (i = 0; envp[i] != NULL; i++) + if ((environ[i] = strdup(envp[i])) == NULL) + return -1; + environ[i] = NULL; + + argv0 = argv; + if (i > 0) + argv_lth = envp[i-1] + strlen(envp[i-1]) - argv0[0]; + else + argv_lth = argv0[argc-1] + strlen(argv0[argc-1]) - argv0[0]; #endif - (void)new QuickLauncher(); - odebug << "QuickLauncher running" << oendl; - // Pre-load default fonts - QFontMetrics fm( QApplication::font() ); - fm.ascent(); // causes font load. - QFont f( QApplication::font() ); - f.setWeight( QFont::Bold ); - QFontMetrics fmb( f ); - fmb.ascent(); // causes font load. - - // Each of the following force internal structures/internal - // initialization to be performed. This may mean allocating - // memory that is not needed by all applications. -#if 0 - TimeZone::current().isValid(); // popuplate timezone cache - TimeString::currentDateFormat(); // create internal structures - TimeString::currentAMPM(); -#endif - Resource::loadIconSet("new"); // do internal init + (void)new QuickLauncher(); + odebug << "QuickLauncher running" << oendl; + // Pre-load default fonts + QFontMetrics fm( QApplication::font() ); + fm.ascent(); // causes font load. + QFont f( QApplication::font() ); + f.setWeight( QFont::Bold ); + QFontMetrics fmb( f ); + fmb.ascent(); // causes font load. + + // Each of the following force internal structures/internal + // initialization to be performed. This may mean allocating + // memory that is not needed by all applications. + Resource::loadIconSet("new"); // do internal init /* make sure libopie gets lined in */ { Opie::Ui::OWait item; } - // Create a widget to force initialization of title bar images, etc. - QObject::disconnect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit())); - QWidget *w = new QWidget(0,0,Qt::WDestructiveClose|Qt::WStyle_ContextHelp|Qt::WStyle_Tool); - w->setGeometry( -100, -100, 10, 10 ); - w->show(); - QTimer::singleShot( 0, w, SLOT(close()) ); + // Create a widget to force initialization of title bar images, etc. + QObject::disconnect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit())); + QWidget *w = new QWidget(0,0,Qt::WDestructiveClose|Qt::WStyle_ContextHelp|Qt::WStyle_Tool); + w->setGeometry( -100, -100, 10, 10 ); + w->show(); + QTimer::singleShot( 0, w, SLOT(close()) ); - app->enter_loop(); + app->enter_loop(); } int rv = app->exec(); if ( mainWindow ) - delete (QWidget*)mainWindow; - + delete (QWidget*)mainWindow; delete app; + if ( appIface ) - loader->releaseInterface( appIface ); + loader->releaseInterface( appIface ); delete loader; + + // Neither QLibrary nor my Dropin is a QObject and they don't depend // on a qApp so we destroy QWidget::destroyMapper() without // crashing the app // // The problem is there are some 'static' resources not freed // in the apps and on destructing these objects are not available // anymore. In future fix up the apps but for now // we just skip deletion and hope things go well -zecke -// delete app; + // delete app; // hack instead -zecke -// delete app->pidChannel; -// app->pidChannel = 0; + // delete app->pidChannel; + // app->pidChannel = 0; return rv; } #include "main.moc" |