summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/tools/quicklauncher/main.cpp227
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
@@ -1,275 +1,278 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2003 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2003 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#define QTOPIA_INTERNAL_INITAPP 21#define QTOPIA_INTERNAL_INITAPP
22#include "dropins.h" 22#include "dropins.h"
23 23
24/* OPIE */ 24/* OPIE */
25#include <opie2/odebug.h> 25#include <opie2/odebug.h>
26using namespace Opie::Core; 26using namespace Opie::Core;
27 27
28/* QT */ 28/* QT */
29#include <qpainter.h> 29#include <qpainter.h>
30#include <qstrlist.h> 30#include <qstrlist.h>
31#include <qtimer.h> 31#include <qtimer.h>
32#include <qguardedptr.h> 32#include <qguardedptr.h>
33#include <qcopchannel_qws.h> 33#include <qcopchannel_qws.h>
34 34
35#ifdef private 35#ifdef private
36# undef private 36# undef private
37#endif 37#endif
38#define private public 38#define private public
39#include <qtopia/qpeapplication.h> 39#include <qtopia/qpeapplication.h>
40#undef private 40#undef private
41 41
42/* STD */ 42/* STD */
43#include <stdio.h> 43#include <stdio.h>
44#include <stdlib.h> 44#include <stdlib.h>
45#include <sys/types.h> 45#include <sys/types.h>
46#include <sys/stat.h> 46#include <sys/stat.h>
47#include <unistd.h> 47#include <unistd.h>
48 48
49 49
50using QuickPrivate::PluginLoader; 50using QuickPrivate::PluginLoader;
51 51
52static QPEApplication *app = 0; 52static QPEApplication *app = 0;
53static PluginLoader *loader = 0; 53static PluginLoader *loader = 0;
54static ApplicationInterface *appIface = 0; 54static ApplicationInterface *appIface = 0;
55static QGuardedPtr<QWidget> mainWindow; 55static QGuardedPtr<QWidget> mainWindow;
56 56
57#ifdef _OS_LINUX_ 57#ifdef _OS_LINUX_
58static char **argv0 = 0; 58static char **argv0 = 0;
59static int argv_lth; 59static int argv_lth;
60extern char **environ; 60extern char **environ;
61#ifndef SPT_BUFSIZE 61#ifndef SPT_BUFSIZE
62#define SPT_BUFSIZE 2048 62#define SPT_BUFSIZE 2048
63#endif 63#endif
64#include <stdarg.h> 64#include <stdarg.h>
65void setproctitle (const char *fmt,...) { 65void setproctitle (const char *fmt,...) {
66 int i; 66 int i;
67 char buf[SPT_BUFSIZE]; 67 char buf[SPT_BUFSIZE];
68 va_list ap; 68 va_list ap;
69 69
70 if (!argv0) 70 if (!argv0)
71 return; 71 return;
72 72
73 va_start(ap, fmt); 73 va_start(ap, fmt);
74 (void) vsnprintf(buf, SPT_BUFSIZE, fmt, ap); 74 (void) vsnprintf(buf, SPT_BUFSIZE, fmt, ap);
75 va_end(ap); 75 va_end(ap);
76 76
77 i = strlen (buf); 77 i = strlen (buf);
78 if (i > argv_lth - 2) { 78 if (i > argv_lth - 2) {
79 i = argv_lth - 2; 79 i = argv_lth - 2;
80 buf[i] = '\0'; 80 buf[i] = '\0';
81 } 81 }
82
82 memset(argv0[0], '\0', argv_lth); /* clear the memory area */ 83 memset(argv0[0], '\0', argv_lth); /* clear the memory area */
83 (void) strcpy (argv0[0], buf); 84 (void) strcpy (argv0[0], buf);
84 85
85 argv0[1] = NULL; 86 argv0[1] = NULL;
86} 87}
87#endif 88#endif
88 89
89 90
90class QuickLauncher : public QObject 91class QuickLauncher : public QObject
91{ 92{
92 Q_OBJECT 93 Q_OBJECT
93public: 94public:
94 QuickLauncher() : QObject() 95 QuickLauncher() : QObject()
95 { 96 {
96 QCString ch("QPE/QuickLauncher-"); 97 QCString ch("QPE/QuickLauncher-");
97 ch += QString::number(getpid()); 98 ch += QString::number(getpid());
98 qlChannel = new QCopChannel( ch, this); 99 qlChannel = new QCopChannel( ch, this);
99 connect( qlChannel, SIGNAL(received(const QCString&,const QByteArray&)), 100 connect( qlChannel, SIGNAL(received(const QCString&,const QByteArray&)),
100 this, SLOT(message(const QCString&,const QByteArray&)) ); 101 this, SLOT(message(const QCString&,const QByteArray&)) );
101 } 102 }
102 103
103 static void exec( int /*argc*/, char **argv ) 104 static void exec( int /*argc*/, char **argv )
104 { 105 {
105 QString appName = argv[0]; 106 QString appName = argv[0];
106 int sep = appName.findRev( '/' ); 107 int sep = appName.findRev( '/' );
107 if ( sep > 0 ) 108 if ( sep > 0 )
108 appName = appName.mid( sep+1 ); 109 appName = appName.mid( sep+1 );
110
111 appIface = 0;
112 if ( loader->queryInterface(appName, IID_QtopiaApplication, (QUnknownInterface**)&appIface) == QS_OK ) {
113 mainWindow = appIface->createMainWindow( appName );
114 }
109 115
110 appIface = 0; 116 if ( mainWindow ) {
111 if ( loader->queryInterface(appName, IID_QtopiaApplication, (QUnknownInterface**)&appIface) == QS_OK ) { 117 if ( mainWindow->metaObject()->slotNames().contains("setDocument(const QString&)") ) {
112 mainWindow = appIface->createMainWindow( appName ); 118 app->showMainDocumentWidget( mainWindow );
113 } 119 } else {
114 if ( mainWindow ) { 120 app->showMainWidget( mainWindow );
115 if ( mainWindow->metaObject()->slotNames().contains("setDocument(const QString&)") ) { 121 }
116 app->showMainDocumentWidget( mainWindow );
117 } else { 122 } else {
118 app->showMainWidget( mainWindow ); 123 owarn << "Could not create application main window" << oendl;
124 exit(-1);
119 } 125 }
120 } else {
121 owarn << "Could not create application main window" << oendl;
122 exit(-1);
123 }
124 } 126 }
125 127
126private slots: 128private slots:
127 void message(const QCString &msg, const QByteArray & data) 129 void message(const QCString &msg, const QByteArray & data)
128 { 130 {
129 QStrList argList;
130
131 if ( msg == "execute(QStrList)" ) {
132 delete qlChannel;
133 QDataStream stream( data, IO_ReadOnly );
134 QStrList argList;
135 stream >> argList;
136 odebug << "QuickLauncher execute: " << argList.at(0) << oendl;
137 doQuickLaunch( argList );
138 delete this;
139 } else if ( msg == "execute(QString)" ) {
140 delete qlChannel;
141 QDataStream stream( data, IO_ReadOnly );
142 QString arg;
143 stream >> arg;
144 odebug << "QuickLauncher execute: " << arg << oendl;
145 QStrList argList; 131 QStrList argList;
146 argList.append( arg.utf8() ); 132
147 doQuickLaunch( argList ); 133 if ( msg == "execute(QStrList)" ) {
148 delete this; 134 delete qlChannel;
149 } 135 QDataStream stream( data, IO_ReadOnly );
136 QStrList argList;
137 stream >> argList;
138 odebug << "QuickLauncher execute: " << argList.at(0) << oendl;
139 doQuickLaunch( argList );
140 delete this;
141 } else if ( msg == "execute(QString)" ) {
142 delete qlChannel;
143 QDataStream stream( data, IO_ReadOnly );
144 QString arg;
145 stream >> arg;
146 odebug << "QuickLauncher execute: " << arg << oendl;
147 QStrList argList;
148 argList.append( arg.utf8() );
149 doQuickLaunch( argList );
150 delete this;
151 }
150 } 152 }
151 153
152private: 154private:
153 void doQuickLaunch( QStrList &argList ) 155 void doQuickLaunch( QStrList &argList )
154 { 156 {
155 static int myargc = argList.count(); 157 static int myargc = argList.count();
156 static char **myargv = new char *[myargc + 1]; 158 static char **myargv = new char *[myargc + 1];
157 for ( int j = 0; j < myargc; j++ ) { 159
158 myargv[j] = new char [strlen(argList.at(j))+1]; 160 for ( int j = 0; j < myargc; j++ ) {
159 strcpy( myargv[j], argList.at(j) ); 161 myargv[j] = new char [strlen(argList.at(j))+1];
160 } 162 strcpy( myargv[j], argList.at(j) );
161 myargv[myargc] = NULL; 163 }
164
165 myargv[myargc] = NULL;
162#ifdef _OS_LINUX_ 166#ifdef _OS_LINUX_
163 // Change name of process 167 // Change name of process
164 setproctitle(myargv[0]); 168 setproctitle(myargv[0]);
165#endif 169#endif
166 170
167 connect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit())); 171 connect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit()));
168 app->exit_loop(); 172 app->exit_loop();
169 app->initApp( myargc, myargv ); 173 app->initApp( myargc, myargv );
170 exec( myargc, myargv ); 174 exec( myargc, myargv );
171 } 175 }
172 176
173private: 177private:
174 QCopChannel *qlChannel; 178 QCopChannel *qlChannel;
175}; 179};
176 180
177int main( int argc, char** argv ) 181int main( int argc, char** argv )
178{ 182{
179 app = new QPEApplication( argc, argv ); 183 app = new QPEApplication( argc, argv );
180 184
181 loader = new PluginLoader( "application" ); 185 loader = new PluginLoader( "application" );
182 186
183 unsetenv( "LD_BIND_NOW" ); 187 unsetenv( "LD_BIND_NOW" );
184 188
185 QCString arg0 = argv[0]; 189 QCString arg0 = argv[0];
186 int sep = arg0.findRev( '/' ); 190 int sep = arg0.findRev( '/' );
191
187 if ( sep > 0 ) 192 if ( sep > 0 )
188 arg0 = arg0.mid( sep+1 ); 193 arg0 = arg0.mid( sep+1 );
194
189 if ( arg0 != "quicklauncher" ) { 195 if ( arg0 != "quicklauncher" ) {
190 odebug << "QuickLauncher invoked as: " << arg0.data() << oendl; 196 odebug << "QuickLauncher invoked as: " << arg0.data() << oendl;
191 QuickLauncher::exec( argc, argv ); 197 QuickLauncher::exec( argc, argv );
192 } else { 198 } else {
193#ifdef _OS_LINUX_ 199#ifdef _OS_LINUX_
194 // Setup to change proc title 200 // Setup to change proc title
195 int i; 201 int i;
196 char **envp = environ; 202 char **envp = environ;
197 /* Move the environment so we can reuse the memory. 203 /* Move the environment so we can reuse the memory.
198 * (Code borrowed from sendmail.) */ 204 * (Code borrowed from sendmail.) */
199 for (i = 0; envp[i] != NULL; i++) 205 for (i = 0; envp[i] != NULL; i++)
200 continue; 206 continue;
201 environ = (char **) malloc(sizeof(char *) * (i + 1)); 207 environ = (char **) malloc(sizeof(char *) * (i + 1));
202 if (environ == NULL) 208 if (environ == NULL)
203 return -1; 209 return -1;
204 for (i = 0; envp[i] != NULL; i++) 210 for (i = 0; envp[i] != NULL; i++)
205 if ((environ[i] = strdup(envp[i])) == NULL) 211 if ((environ[i] = strdup(envp[i])) == NULL)
206 return -1; 212 return -1;
207 environ[i] = NULL; 213 environ[i] = NULL;
208 214
209 argv0 = argv; 215 argv0 = argv;
210 if (i > 0) 216 if (i > 0)
211 argv_lth = envp[i-1] + strlen(envp[i-1]) - argv0[0]; 217 argv_lth = envp[i-1] + strlen(envp[i-1]) - argv0[0];
212 else 218 else
213 argv_lth = argv0[argc-1] + strlen(argv0[argc-1]) - argv0[0]; 219 argv_lth = argv0[argc-1] + strlen(argv0[argc-1]) - argv0[0];
214#endif 220#endif
215 (void)new QuickLauncher(); 221 (void)new QuickLauncher();
216 odebug << "QuickLauncher running" << oendl; 222 odebug << "QuickLauncher running" << oendl;
217 // Pre-load default fonts 223 // Pre-load default fonts
218 QFontMetrics fm( QApplication::font() ); 224 QFontMetrics fm( QApplication::font() );
219 fm.ascent(); // causes font load. 225 fm.ascent(); // causes font load.
220 QFont f( QApplication::font() ); 226 QFont f( QApplication::font() );
221 f.setWeight( QFont::Bold ); 227 f.setWeight( QFont::Bold );
222 QFontMetrics fmb( f ); 228 QFontMetrics fmb( f );
223 fmb.ascent(); // causes font load. 229 fmb.ascent(); // causes font load.
224 230
225 // Each of the following force internal structures/internal 231 // Each of the following force internal structures/internal
226 // initialization to be performed. This may mean allocating 232 // initialization to be performed. This may mean allocating
227 // memory that is not needed by all applications. 233 // memory that is not needed by all applications.
228#if 0 234 Resource::loadIconSet("new"); // do internal init
229 TimeZone::current().isValid(); // popuplate timezone cache
230 TimeString::currentDateFormat(); // create internal structures
231 TimeString::currentAMPM();
232#endif
233 Resource::loadIconSet("new"); // do internal init
234 235
235 /* make sure libopie gets lined in */ 236 /* make sure libopie gets lined in */
236 { 237 {
237 Opie::Ui::OWait item; 238 Opie::Ui::OWait item;
238 } 239 }
239 240
240 // Create a widget to force initialization of title bar images, etc. 241 // Create a widget to force initialization of title bar images, etc.
241 QObject::disconnect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit())); 242 QObject::disconnect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit()));
242 QWidget *w = new QWidget(0,0,Qt::WDestructiveClose|Qt::WStyle_ContextHelp|Qt::WStyle_Tool); 243 QWidget *w = new QWidget(0,0,Qt::WDestructiveClose|Qt::WStyle_ContextHelp|Qt::WStyle_Tool);
243 w->setGeometry( -100, -100, 10, 10 ); 244 w->setGeometry( -100, -100, 10, 10 );
244 w->show(); 245 w->show();
245 QTimer::singleShot( 0, w, SLOT(close()) ); 246 QTimer::singleShot( 0, w, SLOT(close()) );
246 247
247 app->enter_loop(); 248 app->enter_loop();
248 } 249 }
249 250
250 int rv = app->exec(); 251 int rv = app->exec();
251 252
252 if ( mainWindow ) 253 if ( mainWindow )
253 delete (QWidget*)mainWindow; 254 delete (QWidget*)mainWindow;
254
255 delete app; 255 delete app;
256
256 if ( appIface ) 257 if ( appIface )
257 loader->releaseInterface( appIface ); 258 loader->releaseInterface( appIface );
258 delete loader; 259 delete loader;
260
261
259 // Neither QLibrary nor my Dropin is a QObject and they don't depend 262 // Neither QLibrary nor my Dropin is a QObject and they don't depend
260 // on a qApp so we destroy QWidget::destroyMapper() without 263 // on a qApp so we destroy QWidget::destroyMapper() without
261 // crashing the app 264 // crashing the app
262 // 265 //
263 // The problem is there are some 'static' resources not freed 266 // The problem is there are some 'static' resources not freed
264 // in the apps and on destructing these objects are not available 267 // in the apps and on destructing these objects are not available
265 // anymore. In future fix up the apps but for now 268 // anymore. In future fix up the apps but for now
266 // we just skip deletion and hope things go well -zecke 269 // we just skip deletion and hope things go well -zecke
267// delete app; 270 // delete app;
268 // hack instead -zecke 271 // hack instead -zecke
269// delete app->pidChannel; 272 // delete app->pidChannel;
270// app->pidChannel = 0; 273 // app->pidChannel = 0;
271 274
272 return rv; 275 return rv;
273} 276}
274 277
275#include "main.moc" 278#include "main.moc"