summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/tools/quicklauncher/config.in2
-rw-r--r--core/tools/quicklauncher/dropins.h6
-rw-r--r--core/tools/quicklauncher/main.cpp3
-rw-r--r--core/tools/quicklauncher/quicklauncher.pro2
4 files changed, 7 insertions, 6 deletions
diff --git a/core/tools/quicklauncher/config.in b/core/tools/quicklauncher/config.in
index c105e94..eacbcf6 100644
--- a/core/tools/quicklauncher/config.in
+++ b/core/tools/quicklauncher/config.in
@@ -1,4 +1,4 @@
1 config QUICKLAUNCHER 1 config QUICKLAUNCHER
2 boolean "The Quick Launcher Loader" 2 boolean "The Quick Launcher Loader"
3 default "y" 3 default "y"
4 depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE 4 depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIEUI2 && LIBOPIECORE2
diff --git a/core/tools/quicklauncher/dropins.h b/core/tools/quicklauncher/dropins.h
index 3e2b5fd..7acace9 100644
--- a/core/tools/quicklauncher/dropins.h
+++ b/core/tools/quicklauncher/dropins.h
@@ -1,70 +1,68 @@
1 1
2#include <qstring.h> 2#include <qstring.h>
3#include <qtopia/qcom.h> 3#include <qtopia/qcom.h>
4#include <qtopia/qlibrary.h> 4#include <qtopia/qlibrary.h>
5#include <qtopia/applicationinterface.h> 5#include <qtopia/applicationinterface.h>
6#include <qtopia/resource.h> 6#include <qtopia/resource.h>
7 7
8#include <opie/owait.h> 8#include <opie2/owait.h>
9 9
10#include <qmetaobject.h> 10#include <qmetaobject.h>
11#include <qmap.h> 11#include <qmap.h>
12 12
13namespace Opie { 13namespace QuickPrivate {
14 14
15 struct PluginLoader { 15 struct PluginLoader {
16 PluginLoader( const char* ) { 16 PluginLoader( const char* ) {
17 } 17 }
18 18
19 QRESULT queryInterface( const QString& app, const QUuid&, QUnknownInterface** ); 19 QRESULT queryInterface( const QString& app, const QUuid&, QUnknownInterface** );
20 void releaseInterface( QUnknownInterface* ); 20 void releaseInterface( QUnknownInterface* );
21 QMap<QUnknownInterface*, QLibrary*> libs; 21 QMap<QUnknownInterface*, QLibrary*> libs;
22 }; 22 };
23 23
24 /* 24 /*
25 * We can skip installing a Translator here because Opies QPEApplication 25 * We can skip installing a Translator here because Opies QPEApplication
26 * will do that in initApp for us as well 26 * will do that in initApp for us as well
27 */ 27 */
28 QRESULT PluginLoader::queryInterface( const QString& libFile, const QUuid& uuid, QUnknownInterface** iface ) { 28 QRESULT PluginLoader::queryInterface( const QString& libFile, const QUuid& uuid, QUnknownInterface** iface ) {
29 QRESULT res = QS_FALSE; 29 QRESULT res = QS_FALSE;
30 *iface = 0; 30 *iface = 0;
31 31
32 // This code is very platform specific.. We should find better 32 // This code is very platform specific.. We should find better
33 // solutions to handle names.. Maybe one central function would be 33 // solutions to handle names.. Maybe one central function would be
34 // better than checking this ".so" stuff all around in the sources.. 34 // better than checking this ".so" stuff all around in the sources..
35 // (eilers) 35 // (eilers)
36 36
37 // Below lines from TT then mine again 37 // Below lines from TT then mine again
38 QString name = libFile; 38 QString name = libFile;
39 if ( libFile.findRev(".so") == (int)libFile.length()-3 ) { 39 if ( libFile.findRev(".so") == (int)libFile.length()-3 ) {
40 name = libFile.left( libFile.length()-3 ); 40 name = libFile.left( libFile.length()-3 );
41 if ( name.find( "lib" ) == 0 ) 41 if ( name.find( "lib" ) == 0 )
42 name = name.mid( 3 ); 42 name = name.mid( 3 );
43 } 43 }
44#ifdef Q_OS_MACX 44#ifdef Q_OS_MACX
45 QString path = QPEApplication::qpeDir() + "/plugins/application/lib"+name+".dylib"; 45 QString path = QPEApplication::qpeDir() + "/plugins/application/lib"+name+".dylib";
46#else 46#else
47 QString path = QPEApplication::qpeDir() + "/plugins/application/lib"+name+".so"; 47 QString path = QPEApplication::qpeDir() + "/plugins/application/lib"+name+".so";
48#endif 48#endif
49 49
50 QLibrary *lib = new QLibrary( path ); 50 QLibrary *lib = new QLibrary( path );
51 if ( lib->queryInterface( uuid, iface ) == QS_OK && iface ) { 51 if ( lib->queryInterface( uuid, iface ) == QS_OK && iface ) {
52 libs.insert( *iface, lib ); 52 libs.insert( *iface, lib );
53 res = QS_OK; 53 res = QS_OK;
54 } 54 }
55 55
56 return res; 56 return res;
57 } 57 }
58 58
59 void PluginLoader::releaseInterface( QUnknownInterface* iface ) { 59 void PluginLoader::releaseInterface( QUnknownInterface* iface ) {
60 if ( libs.contains( iface ) ) { 60 if ( libs.contains( iface ) ) {
61 iface->release(); 61 iface->release();
62 delete libs[iface]; 62 delete libs[iface];
63 libs.remove( iface ); // we only handle pointers so even if the object is not valid the address-space is 63 libs.remove( iface ); // we only handle pointers so even if the object is not valid the address-space is
64 } 64 }
65 } 65 }
66 66
67} 67}
68 68
69/* small hack ;) */
70using namespace Opie;
diff --git a/core/tools/quicklauncher/main.cpp b/core/tools/quicklauncher/main.cpp
index 1d6774c..f3055cc 100644
--- a/core/tools/quicklauncher/main.cpp
+++ b/core/tools/quicklauncher/main.cpp
@@ -1,265 +1,268 @@
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#include <qpainter.h> 21#include <qpainter.h>
22#include <qstrlist.h> 22#include <qstrlist.h>
23#include <qtimer.h> 23#include <qtimer.h>
24#include <qguardedptr.h> 24#include <qguardedptr.h>
25#include <qcopchannel_qws.h> 25#include <qcopchannel_qws.h>
26#define QTOPIA_INTERNAL_INITAPP 26#define QTOPIA_INTERNAL_INITAPP
27 27
28#ifdef private 28#ifdef private
29# undef private 29# undef private
30#endif 30#endif
31#define private public 31#define private public
32#include <qtopia/qpeapplication.h> 32#include <qtopia/qpeapplication.h>
33#undef private 33#undef private
34#include <stdio.h> 34#include <stdio.h>
35#include <stdlib.h> 35#include <stdlib.h>
36#include <sys/types.h> 36#include <sys/types.h>
37#include <sys/stat.h> 37#include <sys/stat.h>
38#include <unistd.h> 38#include <unistd.h>
39 39
40#include "dropins.h" 40#include "dropins.h"
41 41
42using QuickPrivate::PluginLoader;
43
42static QPEApplication *app = 0; 44static QPEApplication *app = 0;
43static PluginLoader *loader = 0; 45static PluginLoader *loader = 0;
44static ApplicationInterface *appIface = 0; 46static ApplicationInterface *appIface = 0;
45static QGuardedPtr<QWidget> mainWindow; 47static QGuardedPtr<QWidget> mainWindow;
46 48
47#ifdef _OS_LINUX_ 49#ifdef _OS_LINUX_
48static char **argv0 = 0; 50static char **argv0 = 0;
49static int argv_lth; 51static int argv_lth;
50extern char **environ; 52extern char **environ;
51#ifndef SPT_BUFSIZE 53#ifndef SPT_BUFSIZE
52#define SPT_BUFSIZE 2048 54#define SPT_BUFSIZE 2048
53#endif 55#endif
54#include <stdarg.h> 56#include <stdarg.h>
57using namespace Opie::Ui;
55void setproctitle (const char *fmt,...) { 58void setproctitle (const char *fmt,...) {
56 int i; 59 int i;
57 char buf[SPT_BUFSIZE]; 60 char buf[SPT_BUFSIZE];
58 va_list ap; 61 va_list ap;
59 62
60 if (!argv0) 63 if (!argv0)
61 return; 64 return;
62 65
63 va_start(ap, fmt); 66 va_start(ap, fmt);
64 (void) vsnprintf(buf, SPT_BUFSIZE, fmt, ap); 67 (void) vsnprintf(buf, SPT_BUFSIZE, fmt, ap);
65 va_end(ap); 68 va_end(ap);
66 69
67 i = strlen (buf); 70 i = strlen (buf);
68 if (i > argv_lth - 2) { 71 if (i > argv_lth - 2) {
69 i = argv_lth - 2; 72 i = argv_lth - 2;
70 buf[i] = '\0'; 73 buf[i] = '\0';
71 } 74 }
72 memset(argv0[0], '\0', argv_lth); /* clear the memory area */ 75 memset(argv0[0], '\0', argv_lth); /* clear the memory area */
73 (void) strcpy (argv0[0], buf); 76 (void) strcpy (argv0[0], buf);
74 77
75 argv0[1] = NULL; 78 argv0[1] = NULL;
76} 79}
77#endif 80#endif
78 81
79 82
80class QuickLauncher : public QObject 83class QuickLauncher : public QObject
81{ 84{
82 Q_OBJECT 85 Q_OBJECT
83public: 86public:
84 QuickLauncher() : QObject() 87 QuickLauncher() : QObject()
85 { 88 {
86 QCString ch("QPE/QuickLauncher-"); 89 QCString ch("QPE/QuickLauncher-");
87 ch += QString::number(getpid()); 90 ch += QString::number(getpid());
88 qlChannel = new QCopChannel( ch, this); 91 qlChannel = new QCopChannel( ch, this);
89 connect( qlChannel, SIGNAL(received(const QCString&,const QByteArray&)), 92 connect( qlChannel, SIGNAL(received(const QCString&,const QByteArray&)),
90 this, SLOT(message(const QCString&,const QByteArray&)) ); 93 this, SLOT(message(const QCString&,const QByteArray&)) );
91 } 94 }
92 95
93 static void exec( int /*argc*/, char **argv ) 96 static void exec( int /*argc*/, char **argv )
94 { 97 {
95 QString appName = argv[0]; 98 QString appName = argv[0];
96 int sep = appName.findRev( '/' ); 99 int sep = appName.findRev( '/' );
97 if ( sep > 0 ) 100 if ( sep > 0 )
98 appName = appName.mid( sep+1 ); 101 appName = appName.mid( sep+1 );
99 102
100 appIface = 0; 103 appIface = 0;
101 if ( loader->queryInterface(appName, IID_QtopiaApplication, (QUnknownInterface**)&appIface) == QS_OK ) { 104 if ( loader->queryInterface(appName, IID_QtopiaApplication, (QUnknownInterface**)&appIface) == QS_OK ) {
102 mainWindow = appIface->createMainWindow( appName ); 105 mainWindow = appIface->createMainWindow( appName );
103 } 106 }
104 if ( mainWindow ) { 107 if ( mainWindow ) {
105 if ( mainWindow->metaObject()->slotNames().contains("setDocument(const QString&)") ) { 108 if ( mainWindow->metaObject()->slotNames().contains("setDocument(const QString&)") ) {
106 app->showMainDocumentWidget( mainWindow ); 109 app->showMainDocumentWidget( mainWindow );
107 } else { 110 } else {
108 app->showMainWidget( mainWindow ); 111 app->showMainWidget( mainWindow );
109 } 112 }
110 } else { 113 } else {
111 qWarning( "Could not create application main window" ); 114 qWarning( "Could not create application main window" );
112 exit(-1); 115 exit(-1);
113 } 116 }
114 } 117 }
115 118
116private slots: 119private slots:
117 void message(const QCString &msg, const QByteArray & data) 120 void message(const QCString &msg, const QByteArray & data)
118 { 121 {
119 QStrList argList; 122 QStrList argList;
120 123
121 if ( msg == "execute(QStrList)" ) { 124 if ( msg == "execute(QStrList)" ) {
122 delete qlChannel; 125 delete qlChannel;
123 QDataStream stream( data, IO_ReadOnly ); 126 QDataStream stream( data, IO_ReadOnly );
124 QStrList argList; 127 QStrList argList;
125 stream >> argList; 128 stream >> argList;
126 qDebug( "QuickLauncher execute: %s", argList.at(0) ); 129 qDebug( "QuickLauncher execute: %s", argList.at(0) );
127 doQuickLaunch( argList ); 130 doQuickLaunch( argList );
128 delete this; 131 delete this;
129 } else if ( msg == "execute(QString)" ) { 132 } else if ( msg == "execute(QString)" ) {
130 delete qlChannel; 133 delete qlChannel;
131 QDataStream stream( data, IO_ReadOnly ); 134 QDataStream stream( data, IO_ReadOnly );
132 QString arg; 135 QString arg;
133 stream >> arg; 136 stream >> arg;
134 qDebug( "QuickLauncher execute: %s", arg.latin1() ); 137 qDebug( "QuickLauncher execute: %s", arg.latin1() );
135 QStrList argList; 138 QStrList argList;
136 argList.append( arg.utf8() ); 139 argList.append( arg.utf8() );
137 doQuickLaunch( argList ); 140 doQuickLaunch( argList );
138 delete this; 141 delete this;
139 } 142 }
140 } 143 }
141 144
142private: 145private:
143 void doQuickLaunch( QStrList &argList ) 146 void doQuickLaunch( QStrList &argList )
144 { 147 {
145 static int myargc = argList.count(); 148 static int myargc = argList.count();
146 static char **myargv = new char *[myargc + 1]; 149 static char **myargv = new char *[myargc + 1];
147 for ( int j = 0; j < myargc; j++ ) { 150 for ( int j = 0; j < myargc; j++ ) {
148 myargv[j] = new char [strlen(argList.at(j))+1]; 151 myargv[j] = new char [strlen(argList.at(j))+1];
149 strcpy( myargv[j], argList.at(j) ); 152 strcpy( myargv[j], argList.at(j) );
150 } 153 }
151 myargv[myargc] = NULL; 154 myargv[myargc] = NULL;
152#ifdef _OS_LINUX_ 155#ifdef _OS_LINUX_
153 // Change name of process 156 // Change name of process
154 setproctitle(myargv[0]); 157 setproctitle(myargv[0]);
155#endif 158#endif
156 159
157 connect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit())); 160 connect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit()));
158 app->exit_loop(); 161 app->exit_loop();
159 app->initApp( myargc, myargv ); 162 app->initApp( myargc, myargv );
160 exec( myargc, myargv ); 163 exec( myargc, myargv );
161 } 164 }
162 165
163private: 166private:
164 QCopChannel *qlChannel; 167 QCopChannel *qlChannel;
165}; 168};
166 169
167int main( int argc, char** argv ) 170int main( int argc, char** argv )
168{ 171{
169 app = new QPEApplication( argc, argv ); 172 app = new QPEApplication( argc, argv );
170 173
171 loader = new PluginLoader( "application" ); 174 loader = new PluginLoader( "application" );
172 175
173 unsetenv( "LD_BIND_NOW" ); 176 unsetenv( "LD_BIND_NOW" );
174 177
175 QCString arg0 = argv[0]; 178 QCString arg0 = argv[0];
176 int sep = arg0.findRev( '/' ); 179 int sep = arg0.findRev( '/' );
177 if ( sep > 0 ) 180 if ( sep > 0 )
178 arg0 = arg0.mid( sep+1 ); 181 arg0 = arg0.mid( sep+1 );
179 if ( arg0 != "quicklauncher" ) { 182 if ( arg0 != "quicklauncher" ) {
180 qDebug( "QuickLauncher invoked as: %s", arg0.data() ); 183 qDebug( "QuickLauncher invoked as: %s", arg0.data() );
181 QuickLauncher::exec( argc, argv ); 184 QuickLauncher::exec( argc, argv );
182 } else { 185 } else {
183#ifdef _OS_LINUX_ 186#ifdef _OS_LINUX_
184 // Setup to change proc title 187 // Setup to change proc title
185 int i; 188 int i;
186 char **envp = environ; 189 char **envp = environ;
187 /* Move the environment so we can reuse the memory. 190 /* Move the environment so we can reuse the memory.
188 * (Code borrowed from sendmail.) */ 191 * (Code borrowed from sendmail.) */
189 for (i = 0; envp[i] != NULL; i++) 192 for (i = 0; envp[i] != NULL; i++)
190 continue; 193 continue;
191 environ = (char **) malloc(sizeof(char *) * (i + 1)); 194 environ = (char **) malloc(sizeof(char *) * (i + 1));
192 if (environ == NULL) 195 if (environ == NULL)
193 return -1; 196 return -1;
194 for (i = 0; envp[i] != NULL; i++) 197 for (i = 0; envp[i] != NULL; i++)
195 if ((environ[i] = strdup(envp[i])) == NULL) 198 if ((environ[i] = strdup(envp[i])) == NULL)
196 return -1; 199 return -1;
197 environ[i] = NULL; 200 environ[i] = NULL;
198 201
199 argv0 = argv; 202 argv0 = argv;
200 if (i > 0) 203 if (i > 0)
201 argv_lth = envp[i-1] + strlen(envp[i-1]) - argv0[0]; 204 argv_lth = envp[i-1] + strlen(envp[i-1]) - argv0[0];
202 else 205 else
203 argv_lth = argv0[argc-1] + strlen(argv0[argc-1]) - argv0[0]; 206 argv_lth = argv0[argc-1] + strlen(argv0[argc-1]) - argv0[0];
204#endif 207#endif
205 (void)new QuickLauncher(); 208 (void)new QuickLauncher();
206 qDebug( "QuickLauncher running" ); 209 qDebug( "QuickLauncher running" );
207 // Pre-load default fonts 210 // Pre-load default fonts
208 QFontMetrics fm( QApplication::font() ); 211 QFontMetrics fm( QApplication::font() );
209 fm.ascent(); // causes font load. 212 fm.ascent(); // causes font load.
210 QFont f( QApplication::font() ); 213 QFont f( QApplication::font() );
211 f.setWeight( QFont::Bold ); 214 f.setWeight( QFont::Bold );
212 QFontMetrics fmb( f ); 215 QFontMetrics fmb( f );
213 fmb.ascent(); // causes font load. 216 fmb.ascent(); // causes font load.
214 217
215 // Each of the following force internal structures/internal 218 // Each of the following force internal structures/internal
216 // initialization to be performed. This may mean allocating 219 // initialization to be performed. This may mean allocating
217 // memory that is not needed by all applications. 220 // memory that is not needed by all applications.
218#if 0 221#if 0
219 TimeZone::current().isValid(); // popuplate timezone cache 222 TimeZone::current().isValid(); // popuplate timezone cache
220 TimeString::currentDateFormat(); // create internal structures 223 TimeString::currentDateFormat(); // create internal structures
221 TimeString::currentAMPM(); 224 TimeString::currentAMPM();
222#endif 225#endif
223 Resource::loadIconSet("new"); // do internal init 226 Resource::loadIconSet("new"); // do internal init
224 227
225 /* make sure libopie gets lined in */ 228 /* make sure libopie gets lined in */
226 { 229 {
227 OWait item; 230 OWait item;
228 } 231 }
229 232
230 // Create a widget to force initialization of title bar images, etc. 233 // Create a widget to force initialization of title bar images, etc.
231 QObject::disconnect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit())); 234 QObject::disconnect(app, SIGNAL(lastWindowClosed()), app, SLOT(hideOrQuit()));
232 QWidget *w = new QWidget(0,0,Qt::WDestructiveClose|Qt::WStyle_ContextHelp|Qt::WStyle_Tool); 235 QWidget *w = new QWidget(0,0,Qt::WDestructiveClose|Qt::WStyle_ContextHelp|Qt::WStyle_Tool);
233 w->setGeometry( -100, -100, 10, 10 ); 236 w->setGeometry( -100, -100, 10, 10 );
234 w->show(); 237 w->show();
235 QTimer::singleShot( 0, w, SLOT(close()) ); 238 QTimer::singleShot( 0, w, SLOT(close()) );
236 239
237 app->enter_loop(); 240 app->enter_loop();
238 } 241 }
239 242
240 int rv = app->exec(); 243 int rv = app->exec();
241 244
242 if ( mainWindow ) 245 if ( mainWindow )
243 delete (QWidget*)mainWindow; 246 delete (QWidget*)mainWindow;
244 247
245 delete app; 248 delete app;
246 if ( appIface ) 249 if ( appIface )
247 loader->releaseInterface( appIface ); 250 loader->releaseInterface( appIface );
248 delete loader; 251 delete loader;
249 // Neither QLibrary nor my Dropin is a QObject and they don't depend 252 // Neither QLibrary nor my Dropin is a QObject and they don't depend
250 // on a qApp so we destroy QWidget::destroyMapper() without 253 // on a qApp so we destroy QWidget::destroyMapper() without
251 // crashing the app 254 // crashing the app
252 // 255 //
253 // The problem is there are some 'static' resources not freed 256 // The problem is there are some 'static' resources not freed
254 // in the apps and on destructing these objects are not available 257 // in the apps and on destructing these objects are not available
255 // anymore. In future fix up the apps but for now 258 // anymore. In future fix up the apps but for now
256 // we just skip deletion and hope things go well -zecke 259 // we just skip deletion and hope things go well -zecke
257// delete app; 260// delete app;
258 // hack instead -zecke 261 // hack instead -zecke
259// delete app->pidChannel; 262// delete app->pidChannel;
260// app->pidChannel = 0; 263// app->pidChannel = 0;
261 264
262 return rv; 265 return rv;
263} 266}
264 267
265#include "main.moc" 268#include "main.moc"
diff --git a/core/tools/quicklauncher/quicklauncher.pro b/core/tools/quicklauncher/quicklauncher.pro
index 6ab5fc8..ae390e5 100644
--- a/core/tools/quicklauncher/quicklauncher.pro
+++ b/core/tools/quicklauncher/quicklauncher.pro
@@ -1,15 +1,15 @@
1 TEMPLATE= app 1 TEMPLATE= app
2 CONFIG += qtopia warn_on release 2 CONFIG += qtopia warn_on release
3 DESTDIR = $(OPIEDIR)/bin 3 DESTDIR = $(OPIEDIR)/bin
4 4
5 HEADERS = dropins.h 5 HEADERS = dropins.h
6 SOURCES = main.cpp 6 SOURCES = main.cpp
7 INTERFACES= 7 INTERFACES=
8 8
9 INCLUDEPATH+= $(OPIEDIR)/include 9 INCLUDEPATH+= $(OPIEDIR)/include
10 LIBS += -lqpe -lopie 10 LIBS += -lqpe -lopiecore2 -lopieui2
11 11
12 TARGET = quicklauncher 12 TARGET = quicklauncher
13 13
14 14
15include ( $(OPIEDIR)/include.pro ) \ No newline at end of file 15include ( $(OPIEDIR)/include.pro ) \ No newline at end of file