summaryrefslogtreecommitdiff
path: root/library/qpeapplication.cpp
authorzecke <zecke>2004-02-06 15:48:42 (UTC)
committer zecke <zecke>2004-02-06 15:48:42 (UTC)
commitd1c1ce295b6522e52244c970010a9e42c0b614ae (patch) (unidiff)
tree54e3fefdb0ea998e5c9117f245d6a615ce02200c /library/qpeapplication.cpp
parentb033733924e5d3454bb0a810c6a70d4ff0531d2b (diff)
downloadopie-d1c1ce295b6522e52244c970010a9e42c0b614ae.zip
opie-d1c1ce295b6522e52244c970010a9e42c0b614ae.tar.gz
opie-d1c1ce295b6522e52244c970010a9e42c0b614ae.tar.bz2
add api docu
Diffstat (limited to 'library/qpeapplication.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index a97efc0..6f2e43b 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -1,2099 +1,2101 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 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#define QTOPIA_INTERNAL_LANGLIST 20#define QTOPIA_INTERNAL_LANGLIST
21#include <stdlib.h> 21#include <stdlib.h>
22#include <unistd.h> 22#include <unistd.h>
23#ifndef Q_OS_MACX 23#ifndef Q_OS_MACX
24#include <linux/limits.h> // needed for some toolchains (PATH_MAX) 24#include <linux/limits.h> // needed for some toolchains (PATH_MAX)
25#endif 25#endif
26#include <qfile.h> 26#include <qfile.h>
27#include <qqueue.h> 27#include <qqueue.h>
28#ifdef Q_WS_QWS 28#ifdef Q_WS_QWS
29#ifndef QT_NO_COP 29#ifndef QT_NO_COP
30#if QT_VERSION <= 231 30#if QT_VERSION <= 231
31#define private public 31#define private public
32#define sendLocally processEvent 32#define sendLocally processEvent
33#include "qcopenvelope_qws.h" 33#include "qcopenvelope_qws.h"
34#undef private 34#undef private
35#else 35#else
36#include "qcopenvelope_qws.h" 36#include "qcopenvelope_qws.h"
37#endif 37#endif
38#endif 38#endif
39#include <qwindowsystem_qws.h> 39#include <qwindowsystem_qws.h>
40#endif 40#endif
41#include <qtextstream.h> 41#include <qtextstream.h>
42#include <qpalette.h> 42#include <qpalette.h>
43#include <qbuffer.h> 43#include <qbuffer.h>
44#include <qptrdict.h> 44#include <qptrdict.h>
45#include <qregexp.h> 45#include <qregexp.h>
46#include <qdir.h> 46#include <qdir.h>
47#include <qlabel.h> 47#include <qlabel.h>
48#include <qdialog.h> 48#include <qdialog.h>
49#include <qdragobject.h> 49#include <qdragobject.h>
50#include <qtextcodec.h> 50#include <qtextcodec.h>
51#include <qevent.h> 51#include <qevent.h>
52#include <qtooltip.h> 52#include <qtooltip.h>
53#include <qsignal.h> 53#include <qsignal.h>
54#include <qmainwindow.h> 54#include <qmainwindow.h>
55#include <qwidgetlist.h> 55#include <qwidgetlist.h>
56#include <qpixmapcache.h> 56#include <qpixmapcache.h>
57 57
58#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 58#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
59#define QTOPIA_INTERNAL_INITAPP 59#define QTOPIA_INTERNAL_INITAPP
60#include "qpeapplication.h" 60#include "qpeapplication.h"
61#include "qpestyle.h" 61#include "qpestyle.h"
62#include "styleinterface.h" 62#include "styleinterface.h"
63#if QT_VERSION >= 300 63#if QT_VERSION >= 300
64#include <qstylefactory.h> 64#include <qstylefactory.h>
65#else 65#else
66#include <qplatinumstyle.h> 66#include <qplatinumstyle.h>
67#include <qwindowsstyle.h> 67#include <qwindowsstyle.h>
68#include <qmotifstyle.h> 68#include <qmotifstyle.h>
69#include <qmotifplusstyle.h> 69#include <qmotifplusstyle.h>
70#include "lightstyle.h" 70#include "lightstyle.h"
71 71
72#include <qpe/qlibrary.h> 72#include <qpe/qlibrary.h>
73#endif 73#endif
74#include "global.h" 74#include "global.h"
75#include "resource.h" 75#include "resource.h"
76#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 76#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
77#include "qutfcodec.h" 77#include "qutfcodec.h"
78#endif 78#endif
79#include "config.h" 79#include "config.h"
80#include "network.h" 80#include "network.h"
81#ifdef QWS 81#ifdef QWS
82#include "fontmanager.h" 82#include "fontmanager.h"
83#endif 83#endif
84 84
85#include "alarmserver.h" 85#include "alarmserver.h"
86#include "applnk.h" 86#include "applnk.h"
87#include "qpemenubar.h" 87#include "qpemenubar.h"
88#include "textcodecinterface.h" 88#include "textcodecinterface.h"
89#include "imagecodecinterface.h" 89#include "imagecodecinterface.h"
90 90
91#include <unistd.h> 91#include <unistd.h>
92#include <sys/file.h> 92#include <sys/file.h>
93#include <sys/ioctl.h> 93#include <sys/ioctl.h>
94#ifndef QT_NO_SOUND 94#ifndef QT_NO_SOUND
95#include <sys/soundcard.h> 95#include <sys/soundcard.h>
96#endif 96#endif
97#include "qt_override_p.h" 97#include "qt_override_p.h"
98 98
99 99
100class QPEApplicationData 100class QPEApplicationData
101{ 101{
102public: 102public:
103 QPEApplicationData ( ) 103 QPEApplicationData ( )
104 : presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ), 104 : presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ),
105 notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ), 105 notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ),
106 keep_running( true ), qcopQok( false ), qpe_main_widget( 0 ) 106 keep_running( true ), qcopQok( false ), qpe_main_widget( 0 )
107 107
108 {} 108 {}
109 109
110 int presstimer; 110 int presstimer;
111 QWidget* presswidget; 111 QWidget* presswidget;
112 QPoint presspos; 112 QPoint presspos;
113 113
114 bool rightpressed : 1; 114 bool rightpressed : 1;
115 bool kbgrabbed : 1; 115 bool kbgrabbed : 1;
116 bool notbusysent : 1; 116 bool notbusysent : 1;
117 bool preloaded : 1; 117 bool preloaded : 1;
118 bool forceshow : 1; 118 bool forceshow : 1;
119 bool nomaximize : 1; 119 bool nomaximize : 1;
120 bool keep_running : 1; 120 bool keep_running : 1;
121 bool qcopQok : 1; 121 bool qcopQok : 1;
122 122
123 123
124 QStringList langs; 124 QStringList langs;
125 QString appName; 125 QString appName;
126 struct QCopRec 126 struct QCopRec
127 { 127 {
128 QCopRec( const QCString &ch, const QCString &msg, 128 QCopRec( const QCString &ch, const QCString &msg,
129 const QByteArray &d ) : 129 const QByteArray &d ) :
130 channel( ch ), message( msg ), data( d ) 130 channel( ch ), message( msg ), data( d )
131 { } 131 { }
132 132
133 QCString channel; 133 QCString channel;
134 QCString message; 134 QCString message;
135 QByteArray data; 135 QByteArray data;
136 }; 136 };
137 QWidget* qpe_main_widget; 137 QWidget* qpe_main_widget;
138 QGuardedPtr<QWidget> lastraised; 138 QGuardedPtr<QWidget> lastraised;
139 QQueue<QCopRec> qcopq; 139 QQueue<QCopRec> qcopq;
140 QString styleName; 140 QString styleName;
141 QString decorationName; 141 QString decorationName;
142 142
143 void enqueueQCop( const QCString &ch, const QCString &msg, 143 void enqueueQCop( const QCString &ch, const QCString &msg,
144 const QByteArray &data ) 144 const QByteArray &data )
145 { 145 {
146 qcopq.enqueue( new QCopRec( ch, msg, data ) ); 146 qcopq.enqueue( new QCopRec( ch, msg, data ) );
147 } 147 }
148 void sendQCopQ() 148 void sendQCopQ()
149 { 149 {
150 if (!qcopQok ) 150 if (!qcopQok )
151 return; 151 return;
152 152
153 QCopRec * r; 153 QCopRec * r;
154 154
155 while((r=qcopq.dequeue())) { 155 while((r=qcopq.dequeue())) {
156 // remove from queue before sending... 156 // remove from queue before sending...
157 // event loop can come around again before getting 157 // event loop can come around again before getting
158 // back from sendLocally 158 // back from sendLocally
159#ifndef QT_NO_COP 159#ifndef QT_NO_COP
160 QCopChannel::sendLocally( r->channel, r->message, r->data ); 160 QCopChannel::sendLocally( r->channel, r->message, r->data );
161#endif 161#endif
162 162
163 delete r; 163 delete r;
164 } 164 }
165 } 165 }
166 static void show_mx(QWidget* mw, bool nomaximize, const QString & = QString::null ) 166 static void show_mx(QWidget* mw, bool nomaximize, const QString & = QString::null )
167 { 167 {
168 168
169 // ugly hack, remove that later after finding a sane solution 169 // ugly hack, remove that later after finding a sane solution
170 // Addendum: Only Sharp currently has models with high resolution but (physically) small displays, 170 // Addendum: Only Sharp currently has models with high resolution but (physically) small displays,
171 // so this is only useful if QT_QWS_SIMPAD is NOT defined. E.g. SIMpad has 800x600 but has 171 // so this is only useful if QT_QWS_SIMPAD is NOT defined. E.g. SIMpad has 800x600 but has
172 // a (physically) large enough display to use the small icons 172 // a (physically) large enough display to use the small icons
173#if defined(OPIE_HIGH_RES_SMALL_PHY) 173#if defined(OPIE_HIGH_RES_SMALL_PHY)
174 if ( QPEApplication::desktop() ->width() >= 600 && ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") ) ) { 174 if ( QPEApplication::desktop() ->width() >= 600 && ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") ) ) {
175 ( ( QMainWindow* ) mw )->setUsesBigPixmaps( true ); 175 ( ( QMainWindow* ) mw )->setUsesBigPixmaps( true );
176 } 176 }
177#endif 177#endif
178 178
179 if ( mw->layout() && mw->inherits("QDialog") ) { 179 if ( mw->layout() && mw->inherits("QDialog") ) {
180 QPEApplication::showDialog((QDialog*)mw, nomaximize); 180 QPEApplication::showDialog((QDialog*)mw, nomaximize);
181 } 181 }
182 else { 182 else {
183#ifdef Q_WS_QWS 183#ifdef Q_WS_QWS
184 if ( !nomaximize ) 184 if ( !nomaximize )
185 mw->showMaximized(); 185 mw->showMaximized();
186 else 186 else
187#endif 187#endif
188 188
189 mw->show(); 189 mw->show();
190 } 190 }
191 } 191 }
192 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ ) 192 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ )
193 { 193 {
194 /* 194 /*
195 // This works but disable it for now until it is safe to apply 195 // This works but disable it for now until it is safe to apply
196 // What is does is scan the .desktop files of all the apps for 196 // What is does is scan the .desktop files of all the apps for
197 // the applnk that has the corresponding argv[0] as this program 197 // the applnk that has the corresponding argv[0] as this program
198 // then it uses the name stored in the .desktop file as the caption 198 // then it uses the name stored in the .desktop file as the caption
199 // for the main widget. This saves duplicating translations for 199 // for the main widget. This saves duplicating translations for
200 // the app name in the program and in the .desktop files. 200 // the app name in the program and in the .desktop files.
201 201
202 AppLnkSet apps( appsPath ); 202 AppLnkSet apps( appsPath );
203 203
204 QList<AppLnk> appsList = apps.children(); 204 QList<AppLnk> appsList = apps.children();
205 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) { 205 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) {
206 if ( (*it)->exec() == appName ) { 206 if ( (*it)->exec() == appName ) {
207 mw->setCaption( (*it)->name() ); 207 mw->setCaption( (*it)->name() );
208 return TRUE; 208 return TRUE;
209 } 209 }
210 } 210 }
211 */ 211 */
212 return FALSE; 212 return FALSE;
213 } 213 }
214 214
215 215
216 void show(QWidget* mw, bool nomax) 216 void show(QWidget* mw, bool nomax)
217 { 217 {
218 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" ); 218 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" );
219 nomaximize = nomax; 219 nomaximize = nomax;
220 qpe_main_widget = mw; 220 qpe_main_widget = mw;
221 qcopQok = TRUE; 221 qcopQok = TRUE;
222#ifndef QT_NO_COP 222#ifndef QT_NO_COP
223 223
224 sendQCopQ(); 224 sendQCopQ();
225#endif 225#endif
226 226
227 if ( preloaded ) { 227 if ( preloaded ) {
228 if (forceshow) 228 if (forceshow)
229 show_mx(mw, nomax); 229 show_mx(mw, nomax);
230 } 230 }
231 else if ( keep_running ) { 231 else if ( keep_running ) {
232 show_mx(mw, nomax); 232 show_mx(mw, nomax);
233 } 233 }
234 } 234 }
235 235
236 void loadTextCodecs() 236 void loadTextCodecs()
237 { 237 {
238 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs"; 238 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs";
239#ifdef Q_OS_MACX 239#ifdef Q_OS_MACX
240 QDir dir( path, "lib*.dylib" ); 240 QDir dir( path, "lib*.dylib" );
241#else 241#else
242 QDir dir( path, "lib*.so" ); 242 QDir dir( path, "lib*.so" );
243#endif 243#endif
244 QStringList list; 244 QStringList list;
245 if ( dir. exists ( )) 245 if ( dir. exists ( ))
246 list = dir.entryList(); 246 list = dir.entryList();
247 QStringList::Iterator it; 247 QStringList::Iterator it;
248 for ( it = list.begin(); it != list.end(); ++it ) { 248 for ( it = list.begin(); it != list.end(); ++it ) {
249 TextCodecInterface *iface = 0; 249 TextCodecInterface *iface = 0;
250 QLibrary *lib = new QLibrary( path + "/" + *it ); 250 QLibrary *lib = new QLibrary( path + "/" + *it );
251 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 251 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
252 QValueList<int> mibs = iface->mibEnums(); 252 QValueList<int> mibs = iface->mibEnums();
253 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) { 253 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) {
254 (void)iface->createForMib(*i); 254 (void)iface->createForMib(*i);
255 // ### it exists now; need to remember if we can delete it 255 // ### it exists now; need to remember if we can delete it
256 } 256 }
257 } 257 }
258 else { 258 else {
259 lib->unload(); 259 lib->unload();
260 delete lib; 260 delete lib;
261 } 261 }
262 } 262 }
263 } 263 }
264 264
265 void loadImageCodecs() 265 void loadImageCodecs()
266 { 266 {
267 QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs"; 267 QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs";
268#ifdef Q_OS_MACX 268#ifdef Q_OS_MACX
269 QDir dir( path, "lib*.dylib" ); 269 QDir dir( path, "lib*.dylib" );
270#else 270#else
271 QDir dir( path, "lib*.so" ); 271 QDir dir( path, "lib*.so" );
272#endif 272#endif
273 QStringList list; 273 QStringList list;
274 if ( dir. exists ( )) 274 if ( dir. exists ( ))
275 list = dir.entryList(); 275 list = dir.entryList();
276 QStringList::Iterator it; 276 QStringList::Iterator it;
277 for ( it = list.begin(); it != list.end(); ++it ) { 277 for ( it = list.begin(); it != list.end(); ++it ) {
278 ImageCodecInterface *iface = 0; 278 ImageCodecInterface *iface = 0;
279 QLibrary *lib = new QLibrary( path + "/" + *it ); 279 QLibrary *lib = new QLibrary( path + "/" + *it );
280 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 280 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
281 QStringList formats = iface->keys(); 281 QStringList formats = iface->keys();
282 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) { 282 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) {
283 (void)iface->installIOHandler(*i); 283 (void)iface->installIOHandler(*i);
284 // ### it exists now; need to remember if we can delete it 284 // ### it exists now; need to remember if we can delete it
285 } 285 }
286 } 286 }
287 else { 287 else {
288 lib->unload(); 288 lib->unload();
289 delete lib; 289 delete lib;
290 } 290 }
291 } 291 }
292 } 292 }
293}; 293};
294 294
295class ResourceMimeFactory : public QMimeSourceFactory 295class ResourceMimeFactory : public QMimeSourceFactory
296{ 296{
297public: 297public:
298 ResourceMimeFactory() : resImage( 0 ) 298 ResourceMimeFactory() : resImage( 0 )
299 { 299 {
300 setFilePath( Global::helpPath() ); 300 setFilePath( Global::helpPath() );
301 setExtensionType( "html", "text/html;charset=UTF-8" ); 301 setExtensionType( "html", "text/html;charset=UTF-8" );
302 } 302 }
303 ~ResourceMimeFactory() { 303 ~ResourceMimeFactory() {
304 delete resImage; 304 delete resImage;
305 } 305 }
306 306
307 const QMimeSource* data( const QString& abs_name ) const 307 const QMimeSource* data( const QString& abs_name ) const
308 { 308 {
309 const QMimeSource * r = QMimeSourceFactory::data( abs_name ); 309 const QMimeSource * r = QMimeSourceFactory::data( abs_name );
310 if ( !r ) { 310 if ( !r ) {
311 int sl = abs_name.length(); 311 int sl = abs_name.length();
312 do { 312 do {
313 sl = abs_name.findRev( '/', sl - 1 ); 313 sl = abs_name.findRev( '/', sl - 1 );
314 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name; 314 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name;
315 int dot = name.findRev( '.' ); 315 int dot = name.findRev( '.' );
316 if ( dot >= 0 ) 316 if ( dot >= 0 )
317 name = name.left( dot ); 317 name = name.left( dot );
318 QImage img = Resource::loadImage( name ); 318 QImage img = Resource::loadImage( name );
319 if ( !img.isNull() ) { 319 if ( !img.isNull() ) {
320 delete resImage; 320 delete resImage;
321 resImage = new QImageDrag( img ); 321 resImage = new QImageDrag( img );
322 r = resImage; 322 r = resImage;
323 } 323 }
324 } 324 }
325 while ( !r && sl > 0 ); 325 while ( !r && sl > 0 );
326 } 326 }
327 return r; 327 return r;
328 } 328 }
329private: 329private:
330 mutable QImageDrag *resImage; 330 mutable QImageDrag *resImage;
331}; 331};
332 332
333static int& hack(int& i) 333static int& hack(int& i)
334{ 334{
335#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 335#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
336 // These should be created, but aren't in Qt 2.3.0 336 // These should be created, but aren't in Qt 2.3.0
337 (void)new QUtf8Codec; 337 (void)new QUtf8Codec;
338 (void)new QUtf16Codec; 338 (void)new QUtf16Codec;
339#endif 339#endif
340 return i; 340 return i;
341} 341}
342 342
343static int muted = 0; 343static int muted = 0;
344static int micMuted = 0; 344static int micMuted = 0;
345 345
346static void setVolume( int t = 0, int percent = -1 ) 346static void setVolume( int t = 0, int percent = -1 )
347{ 347{
348 switch ( t ) { 348 switch ( t ) {
349 case 0: { 349 case 0: {
350 Config cfg( "qpe" ); 350 Config cfg( "qpe" );
351 cfg.setGroup( "Volume" ); 351 cfg.setGroup( "Volume" );
352 if ( percent < 0 ) 352 if ( percent < 0 )
353 percent = cfg.readNumEntry( "VolumePercent", 50 ); 353 percent = cfg.readNumEntry( "VolumePercent", 50 );
354#ifndef QT_NO_SOUND 354#ifndef QT_NO_SOUND
355 int fd = 0; 355 int fd = 0;
356 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 356 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
357 int vol = muted ? 0 : percent; 357 int vol = muted ? 0 : percent;
358 // set both channels to same volume 358 // set both channels to same volume
359 vol |= vol << 8; 359 vol |= vol << 8;
360 ioctl( fd, MIXER_WRITE( 0 ), &vol ); 360 ioctl( fd, MIXER_WRITE( 0 ), &vol );
361 ::close( fd ); 361 ::close( fd );
362 } 362 }
363#endif 363#endif
364 } 364 }
365 break; 365 break;
366 } 366 }
367} 367}
368 368
369static void setMic( int t = 0, int percent = -1 ) 369static void setMic( int t = 0, int percent = -1 )
370{ 370{
371 switch ( t ) { 371 switch ( t ) {
372 case 0: { 372 case 0: {
373 Config cfg( "qpe" ); 373 Config cfg( "qpe" );
374 cfg.setGroup( "Volume" ); 374 cfg.setGroup( "Volume" );
375 if ( percent < 0 ) 375 if ( percent < 0 )
376 percent = cfg.readNumEntry( "Mic", 50 ); 376 percent = cfg.readNumEntry( "Mic", 50 );
377 377
378#ifndef QT_NO_SOUND 378#ifndef QT_NO_SOUND
379 int fd = 0; 379 int fd = 0;
380 int mic = micMuted ? 0 : percent; 380 int mic = micMuted ? 0 : percent;
381 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 381 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
382 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic ); 382 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic );
383 ::close( fd ); 383 ::close( fd );
384 } 384 }
385#endif 385#endif
386 } 386 }
387 break; 387 break;
388 } 388 }
389} 389}
390 390
391 391
392static void setBass( int t = 0, int percent = -1 ) 392static void setBass( int t = 0, int percent = -1 )
393{ 393{
394 switch ( t ) { 394 switch ( t ) {
395 case 0: { 395 case 0: {
396 Config cfg( "qpe" ); 396 Config cfg( "qpe" );
397 cfg.setGroup( "Volume" ); 397 cfg.setGroup( "Volume" );
398 if ( percent < 0 ) 398 if ( percent < 0 )
399 percent = cfg.readNumEntry( "BassPercent", 50 ); 399 percent = cfg.readNumEntry( "BassPercent", 50 );
400 400
401#ifndef QT_NO_SOUND 401#ifndef QT_NO_SOUND
402 int fd = 0; 402 int fd = 0;
403 int bass = percent; 403 int bass = percent;
404 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 404 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
405 ioctl( fd, MIXER_WRITE( SOUND_MIXER_BASS ), &bass ); 405 ioctl( fd, MIXER_WRITE( SOUND_MIXER_BASS ), &bass );
406 ::close( fd ); 406 ::close( fd );
407 } 407 }
408#endif 408#endif
409 } 409 }
410 break; 410 break;
411 } 411 }
412} 412}
413 413
414 414
415static void setTreble( int t = 0, int percent = -1 ) 415static void setTreble( int t = 0, int percent = -1 )
416{ 416{
417 switch ( t ) { 417 switch ( t ) {
418 case 0: { 418 case 0: {
419 Config cfg( "qpe" ); 419 Config cfg( "qpe" );
420 cfg.setGroup( "Volume" ); 420 cfg.setGroup( "Volume" );
421 if ( percent < 0 ) 421 if ( percent < 0 )
422 percent = cfg.readNumEntry( "TreblePercent", 50 ); 422 percent = cfg.readNumEntry( "TreblePercent", 50 );
423 423
424#ifndef QT_NO_SOUND 424#ifndef QT_NO_SOUND
425 int fd = 0; 425 int fd = 0;
426 int treble = percent; 426 int treble = percent;
427 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 427 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
428 ioctl( fd, MIXER_WRITE( SOUND_MIXER_TREBLE ), &treble ); 428 ioctl( fd, MIXER_WRITE( SOUND_MIXER_TREBLE ), &treble );
429 ::close( fd ); 429 ::close( fd );
430 } 430 }
431#endif 431#endif
432 } 432 }
433 break; 433 break;
434 } 434 }
435} 435}
436 436
437 437
438/*! 438/**
439 \class QPEApplication qpeapplication.h 439 \class QPEApplication
440 \brief The QPEApplication class implements various system services 440 \brief The QPEApplication class implements various system services
441 that are available to all Qtopia applications. 441 that are available to all Qtopia applications.
442 442
443 Simply by using QPEApplication instead of QApplication, a standard Qt 443 Simply by using QPEApplication instead of QApplication, a standard Qt
444 application becomes a Qtopia application. It automatically follows 444 application becomes a Qtopia application. It automatically follows
445 style changes, quits and raises, and in the 445 style changes, quits and raises, and in the
446 case of \link docwidget.html document-oriented\endlink applications, 446 case of \link docwidget.html document-oriented\endlink applications,
447 changes the currently displayed document in response to the environment. 447 changes the currently displayed document in response to the environment.
448 448
449 To create a \link docwidget.html document-oriented\endlink 449 To create a \link docwidget.html document-oriented\endlink
450 application use showMainDocumentWidget(); to create a 450 application use showMainDocumentWidget(); to create a
451 non-document-oriented application use showMainWidget(). The 451 non-document-oriented application use showMainWidget(). The
452 keepRunning() function indicates whether the application will 452 keepRunning() function indicates whether the application will
453 continue running after it's processed the last \link qcop.html 453 continue running after it's processed the last \link qcop.html
454 QCop\endlink message. This can be changed using setKeepRunning(). 454 QCop\endlink message. This can be changed using setKeepRunning().
455 455
456 A variety of signals are emitted when certain events occur, for 456 A variety of signals are emitted when certain events occur, for
457 example, timeChanged(), clockChanged(), weekChanged(), 457 example, timeChanged(), clockChanged(), weekChanged(),
458 dateFormatChanged() and volumeChanged(). If the application receives 458 dateFormatChanged() and volumeChanged(). If the application receives
459 a \link qcop.html QCop\endlink message on the application's 459 a \link qcop.html QCop\endlink message on the application's
460 QPE/Application/\e{appname} channel, the appMessage() signal is 460 QPE/Application/\e{appname} channel, the appMessage() signal is
461 emitted. There are also flush() and reload() signals, which 461 emitted. There are also flush() and reload() signals, which
462 are emitted when synching begins and ends respectively - upon these 462 are emitted when synching begins and ends respectively - upon these
463 signals, the application should save and reload any data 463 signals, the application should save and reload any data
464 files that are involved in synching. Most of these signals will initially 464 files that are involved in synching. Most of these signals will initially
465 be received and unfiltered through the appMessage() signal. 465 be received and unfiltered through the appMessage() signal.
466 466
467 This class also provides a set of useful static functions. The 467 This class also provides a set of useful static functions. The
468 qpeDir() and documentDir() functions return the respective paths. 468 qpeDir() and documentDir() functions return the respective paths.
469 The grabKeyboard() and ungrabKeyboard() functions are used to 469 The grabKeyboard() and ungrabKeyboard() functions are used to
470 control whether the application takes control of the device's 470 control whether the application takes control of the device's
471 physical buttons (e.g. application launch keys). The stylus' mode of 471 physical buttons (e.g. application launch keys). The stylus' mode of
472 operation is set with setStylusOperation() and retrieved with 472 operation is set with setStylusOperation() and retrieved with
473 stylusOperation(). There are also setInputMethodHint() and 473 stylusOperation(). There are also setInputMethodHint() and
474 inputMethodHint() functions. 474 inputMethodHint() functions.
475 475
476 \ingroup qtopiaemb 476 \ingroup qtopiaemb
477*/ 477*/
478 478
479/*! 479/*!
480 \fn void QPEApplication::clientMoused() 480 \fn void QPEApplication::clientMoused()
481 481
482 \internal 482 \internal
483*/ 483*/
484 484
485/*! 485/*!
486 \fn void QPEApplication::timeChanged(); 486 \fn void QPEApplication::timeChanged();
487 This signal is emitted when the time changes outside the normal 487 This signal is emitted when the time changes outside the normal
488 passage of time, i.e. if the time is set backwards or forwards. 488 passage of time, i.e. if the time is set backwards or forwards.
489*/ 489*/
490 490
491/*! 491/*!
492 \fn void QPEApplication::clockChanged( bool ampm ); 492 \fn void QPEApplication::clockChanged( bool ampm );
493 493
494 This signal is emitted when the user changes the clock's style. If 494 This signal is emitted when the user changes the clock's style. If
495 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise, 495 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise,
496 they want a 24-hour clock. 496 they want a 24-hour clock.
497*/ 497*/
498 498
499/*! 499/*!
500 \fn void QPEApplication::volumeChanged( bool muted ) 500 \fn void QPEApplication::volumeChanged( bool muted )
501 501
502 This signal is emitted whenever the mute state is changed. If \a 502 This signal is emitted whenever the mute state is changed. If \a
503 muted is TRUE, then sound output has been muted. 503 muted is TRUE, then sound output has been muted.
504*/ 504*/
505 505
506/*! 506/*!
507 \fn void QPEApplication::weekChanged( bool startOnMonday ) 507 \fn void QPEApplication::weekChanged( bool startOnMonday )
508 508
509 This signal is emitted if the week start day is changed. If \a 509 This signal is emitted if the week start day is changed. If \a
510 startOnMonday is TRUE then the first day of the week is Monday; if 510 startOnMonday is TRUE then the first day of the week is Monday; if
511 \a startOnMonday is FALSE then the first day of the week is 511 \a startOnMonday is FALSE then the first day of the week is
512 Sunday. 512 Sunday.
513*/ 513*/
514 514
515/*! 515/*!
516 \fn void QPEApplication::dateFormatChanged(DateFormat) 516 \fn void QPEApplication::dateFormatChanged(DateFormat)
517 517
518 This signal is emitted whenever the date format is changed. 518 This signal is emitted whenever the date format is changed.
519*/ 519*/
520 520
521/*! 521/*!
522 \fn void QPEApplication::flush() 522 \fn void QPEApplication::flush()
523 523
524 ### 524 ###
525*/ 525*/
526 526
527/*! 527/*!
528 \fn void QPEApplication::reload() 528 \fn void QPEApplication::reload()
529 529
530*/ 530*/
531 531
532 532
533 533
534void QPEApplication::processQCopFile() 534void QPEApplication::processQCopFile()
535{ 535{
536 QString qcopfn("/tmp/qcop-msg-"); 536 QString qcopfn("/tmp/qcop-msg-");
537 qcopfn += d->appName; // append command name 537 qcopfn += d->appName; // append command name
538 538
539 QFile f(qcopfn); 539 QFile f(qcopfn);
540 if ( f.open(IO_ReadWrite) ) { 540 if ( f.open(IO_ReadWrite) ) {
541#ifndef Q_OS_WIN32 541#ifndef Q_OS_WIN32
542 flock(f.handle(), LOCK_EX); 542 flock(f.handle(), LOCK_EX);
543#endif 543#endif
544 QDataStream ds(&f); 544 QDataStream ds(&f);
545 QCString channel, message; 545 QCString channel, message;
546 QByteArray data; 546 QByteArray data;
547 while(!ds.atEnd()) { 547 while(!ds.atEnd()) {
548 ds >> channel >> message >> data; 548 ds >> channel >> message >> data;
549 d->enqueueQCop(channel,message,data); 549 d->enqueueQCop(channel,message,data);
550 } 550 }
551 ::ftruncate(f.handle(), 0); 551 ::ftruncate(f.handle(), 0);
552#ifndef Q_OS_WIN32 552#ifndef Q_OS_WIN32
553 f.flush(); 553 f.flush();
554 flock(f.handle(), LOCK_UN); 554 flock(f.handle(), LOCK_UN);
555#endif 555#endif
556 } 556 }
557#endif 557#endif
558} 558}
559 559
560 560
561/*! 561/*!
562 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data ) 562 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data )
563 563
564 This signal is emitted when a message is received on this 564 This signal is emitted when a message is received on this
565 application's QPE/Application/<i>appname</i> \link qcop.html 565 application's QPE/Application/<i>appname</i> \link qcop.html
566 QCop\endlink channel. 566 QCop\endlink channel.
567 567
568 The slot to which you connect this signal uses \a msg and \a data 568 The slot to which you connect this signal uses \a msg and \a data
569 in the following way: 569 in the following way:
570 570
571\code 571\code
572 void MyWidget::receive( const QCString& msg, const QByteArray& data ) 572 void MyWidget::receive( const QCString& msg, const QByteArray& data )
573 { 573 {
574 QDataStream stream( data, IO_ReadOnly ); 574 QDataStream stream( data, IO_ReadOnly );
575 if ( msg == "someMessage(int,int,int)" ) { 575 if ( msg == "someMessage(int,int,int)" ) {
576 int a,b,c; 576 int a,b,c;
577 stream >> a >> b >> c; 577 stream >> a >> b >> c;
578 ... 578 ...
579 } else if ( msg == "otherMessage(QString)" ) { 579 } else if ( msg == "otherMessage(QString)" ) {
580 ... 580 ...
581 } 581 }
582 } 582 }
583\endcode 583\endcode
584 584
585 \sa qcop.html 585 \sa qcop.html
586 Note that messages received here may be processed by qpe application 586 Note that messages received here may be processed by qpe application
587 and emitted as signals, such as flush() and reload(). 587 and emitted as signals, such as flush() and reload().
588*/ 588*/
589 589
590/*! 590/*!
591 Constructs a QPEApplication just as you would construct 591 Constructs a QPEApplication just as you would construct
592 a QApplication, passing \a argc, \a argv, and \a t. 592 a QApplication, passing \a argc, \a argv, and \a t.
593 593
594 For applications, \a t should be the default, GuiClient. Only 594 For applications, \a t should be the default, GuiClient. Only
595 the Qtopia server passes GuiServer. 595 the Qtopia server passes GuiServer.
596*/ 596*/
597QPEApplication::QPEApplication( int & argc, char **argv, Type t ) 597QPEApplication::QPEApplication( int & argc, char **argv, Type t )
598 : QApplication( hack(argc), argv, t ), pidChannel( 0 ) 598 : QApplication( hack(argc), argv, t ), pidChannel( 0 )
599{ 599{
600 QPixmapCache::setCacheLimit(256); // sensible default for smaller devices. 600 QPixmapCache::setCacheLimit(256); // sensible default for smaller devices.
601 601
602 d = new QPEApplicationData; 602 d = new QPEApplicationData;
603 d->loadTextCodecs(); 603 d->loadTextCodecs();
604 d->loadImageCodecs(); 604 d->loadImageCodecs();
605 int dw = desktop() ->width(); 605 int dw = desktop() ->width();
606 606
607 if ( dw < 200 ) { 607 if ( dw < 200 ) {
608 setFont( QFont( "vera", 8 ) ); 608 setFont( QFont( "vera", 8 ) );
609 AppLnk::setSmallIconSize( 10 ); 609 AppLnk::setSmallIconSize( 10 );
610 AppLnk::setBigIconSize( 28 ); 610 AppLnk::setBigIconSize( 28 );
611 } 611 }
612#if defined(OPIE_HIGH_RES_SMALL_PHY) 612#if defined(OPIE_HIGH_RES_SMALL_PHY)
613 else if ( dw > 600 ) { 613 else if ( dw > 600 ) {
614 setFont( QFont( "vera", 16 ) ); 614 setFont( QFont( "vera", 16 ) );
615 AppLnk::setSmallIconSize( 24 ); 615 AppLnk::setSmallIconSize( 24 );
616 AppLnk::setBigIconSize( 48 ); 616 AppLnk::setBigIconSize( 48 );
617 } 617 }
618#endif 618#endif
619 else if ( dw > 200 ) { 619 else if ( dw > 200 ) {
620 setFont( QFont( "vera", 10 ) ); 620 setFont( QFont( "vera", 10 ) );
621 AppLnk::setSmallIconSize( 14 ); 621 AppLnk::setSmallIconSize( 14 );
622 AppLnk::setBigIconSize( 32 ); 622 AppLnk::setBigIconSize( 32 );
623 } 623 }
624 624
625 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory ); 625 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory );
626 626
627 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) ); 627 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) );
628 628
629 629
630 sysChannel = new QCopChannel( "QPE/System", this ); 630 sysChannel = new QCopChannel( "QPE/System", this );
631 connect( sysChannel, SIGNAL( received( const QCString &, const QByteArray & ) ), 631 connect( sysChannel, SIGNAL( received( const QCString &, const QByteArray & ) ),
632 this, SLOT( systemMessage( const QCString &, const QByteArray & ) ) ); 632 this, SLOT( systemMessage( const QCString &, const QByteArray & ) ) );
633 633
634/* COde now in initapp */ 634/* COde now in initapp */
635#if 0 635#if 0
636#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 636#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
637 637
638 QString qcopfn( "/tmp/qcop-msg-" ); 638 QString qcopfn( "/tmp/qcop-msg-" );
639 qcopfn += QString( argv[ 0 ] ); // append command name 639 qcopfn += QString( argv[ 0 ] ); // append command name
640 640
641 QFile f( qcopfn ); 641 QFile f( qcopfn );
642 if ( f.open( IO_ReadOnly ) ) { 642 if ( f.open( IO_ReadOnly ) ) {
643 flock( f.handle(), LOCK_EX ); 643 flock( f.handle(), LOCK_EX );
644 } 644 }
645 645
646 646
647 647
648 QCString channel = QCString( argv[ 0 ] ); 648 QCString channel = QCString( argv[ 0 ] );
649 channel.replace( QRegExp( ".*/" ), "" ); 649 channel.replace( QRegExp( ".*/" ), "" );
650 d->appName = channel; 650 d->appName = channel;
651 channel = "QPE/Application/" + channel; 651 channel = "QPE/Application/" + channel;
652 pidChannel = new QCopChannel( channel, this ); 652 pidChannel = new QCopChannel( channel, this );
653 connect( pidChannel, SIGNAL( received( const QCString &, const QByteArray & ) ), 653 connect( pidChannel, SIGNAL( received( const QCString &, const QByteArray & ) ),
654 this, SLOT( pidMessage( const QCString &, const QByteArray & ) ) ); 654 this, SLOT( pidMessage( const QCString &, const QByteArray & ) ) );
655 655
656 if ( f.isOpen() ) { 656 if ( f.isOpen() ) {
657 d->keep_running = FALSE; 657 d->keep_running = FALSE;
658 QDataStream ds( &f ); 658 QDataStream ds( &f );
659 QCString channel, message; 659 QCString channel, message;
660 QByteArray data; 660 QByteArray data;
661 while ( !ds.atEnd() ) { 661 while ( !ds.atEnd() ) {
662 ds >> channel >> message >> data; 662 ds >> channel >> message >> data;
663 d->enqueueQCop( channel, message, data ); 663 d->enqueueQCop( channel, message, data );
664 } 664 }
665 665
666 flock( f.handle(), LOCK_UN ); 666 flock( f.handle(), LOCK_UN );
667 f.close(); 667 f.close();
668 f.remove(); 668 f.remove();
669 } 669 }
670 670
671 for ( int a = 0; a < argc; a++ ) { 671 for ( int a = 0; a < argc; a++ ) {
672 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) { 672 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) {
673 argv[ a ] = argv[ a + 1 ]; 673 argv[ a ] = argv[ a + 1 ];
674 a++; 674 a++;
675 d->preloaded = TRUE; 675 d->preloaded = TRUE;
676 argc -= 1; 676 argc -= 1;
677 } 677 }
678 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) { 678 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) {
679 argv[ a ] = argv[ a + 1 ]; 679 argv[ a ] = argv[ a + 1 ];
680 a++; 680 a++;
681 d->preloaded = TRUE; 681 d->preloaded = TRUE;
682 d->forceshow = TRUE; 682 d->forceshow = TRUE;
683 argc -= 1; 683 argc -= 1;
684 } 684 }
685 } 685 }
686 686
687 /* overide stored arguments */ 687 /* overide stored arguments */
688 setArgs( argc, argv ); 688 setArgs( argc, argv );
689 689
690#endif 690#endif
691#else 691#else
692 initApp( argc, argv ); 692 initApp( argc, argv );
693#endif 693#endif
694 // qwsSetDecoration( new QPEDecoration() ); 694 // qwsSetDecoration( new QPEDecoration() );
695 695
696#ifndef QT_NO_TRANSLATION 696#ifndef QT_NO_TRANSLATION
697 697
698 d->langs = Global::languageList(); 698 d->langs = Global::languageList();
699 for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it ) { 699 for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it ) {
700 QString lang = *it; 700 QString lang = *it;
701 701
702 installTranslation( lang + "/libopie.qm"); 702 installTranslation( lang + "/libopie.qm");
703 installTranslation( lang + "/libqpe.qm" ); 703 installTranslation( lang + "/libqpe.qm" );
704 installTranslation( lang + "/" + d->appName + ".qm" ); 704 installTranslation( lang + "/" + d->appName + ".qm" );
705 705
706 706
707 //###language/font hack; should look it up somewhere 707 //###language/font hack; should look it up somewhere
708#ifdef QWS 708#ifdef QWS
709 709
710 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) { 710 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) {
711 QFont fn = FontManager::unicodeFont( FontManager::Proportional ); 711 QFont fn = FontManager::unicodeFont( FontManager::Proportional );
712 setFont( fn ); 712 setFont( fn );
713 } 713 }
714#endif 714#endif
715 } 715 }
716#endif 716#endif
717 717
718 applyStyle(); 718 applyStyle();
719 719
720 if ( type() == GuiServer ) { 720 if ( type() == GuiServer ) {
721 setVolume(); 721 setVolume();
722 } 722 }
723 723
724 installEventFilter( this ); 724 installEventFilter( this );
725 725
726 QPEMenuToolFocusManager::initialize(); 726 QPEMenuToolFocusManager::initialize();
727 727
728#ifdef QT_NO_QWS_CURSOR 728#ifdef QT_NO_QWS_CURSOR
729 // if we have no cursor, probably don't want tooltips 729 // if we have no cursor, probably don't want tooltips
730 QToolTip::setEnabled( FALSE ); 730 QToolTip::setEnabled( FALSE );
731#endif 731#endif
732} 732}
733 733
734 734
735#ifdef QTOPIA_INTERNAL_INITAPP 735#ifdef QTOPIA_INTERNAL_INITAPP
736void QPEApplication::initApp( int argc, char **argv ) 736void QPEApplication::initApp( int argc, char **argv )
737{ 737{
738 bool initial = pidChannel; // was set to 0 in the initializer 738 bool initial = pidChannel; // was set to 0 in the initializer
739 delete pidChannel; 739 delete pidChannel;
740 d->keep_running = TRUE; 740 d->keep_running = TRUE;
741 d->preloaded = FALSE; 741 d->preloaded = FALSE;
742 d->forceshow = FALSE; 742 d->forceshow = FALSE;
743 743
744 QCString channel = QCString(argv[0]); 744 QCString channel = QCString(argv[0]);
745 745
746 channel.replace(QRegExp(".*/"),""); 746 channel.replace(QRegExp(".*/"),"");
747 d->appName = channel; 747 d->appName = channel;
748 748
749 #if QT_VERSION > 235 749 #if QT_VERSION > 235
750 qt_fbdpy->setIdentity( channel ); // In Qt/E 2.3.6 750 qt_fbdpy->setIdentity( channel ); // In Qt/E 2.3.6
751 #endif 751 #endif
752 752
753 channel = "QPE/Application/" + channel; 753 channel = "QPE/Application/" + channel;
754 pidChannel = new QCopChannel( channel, this); 754 pidChannel = new QCopChannel( channel, this);
755 connect( pidChannel, SIGNAL(received(const QCString &, const QByteArray &)), 755 connect( pidChannel, SIGNAL(received(const QCString &, const QByteArray &)),
756 this, SLOT(pidMessage(const QCString &, const QByteArray &))); 756 this, SLOT(pidMessage(const QCString &, const QByteArray &)));
757 757
758 if (!initial) { 758 if (!initial) {
759 processQCopFile(); 759 processQCopFile();
760 d->keep_running = d->qcopq.isEmpty(); 760 d->keep_running = d->qcopq.isEmpty();
761 } 761 }
762 762
763 for (int a=0; a<argc; a++) { 763 for (int a=0; a<argc; a++) {
764 if ( qstrcmp(argv[a],"-preload")==0 ) { 764 if ( qstrcmp(argv[a],"-preload")==0 ) {
765 argv[a] = argv[a+1]; 765 argv[a] = argv[a+1];
766 a++; 766 a++;
767 d->preloaded = TRUE; 767 d->preloaded = TRUE;
768 argc-=1; 768 argc-=1;
769 } else if ( qstrcmp(argv[a],"-preload-show")==0 ) { 769 } else if ( qstrcmp(argv[a],"-preload-show")==0 ) {
770 argv[a] = argv[a+1]; 770 argv[a] = argv[a+1];
771 a++; 771 a++;
772 d->preloaded = TRUE; 772 d->preloaded = TRUE;
773 d->forceshow = TRUE; 773 d->forceshow = TRUE;
774 argc-=1; 774 argc-=1;
775 } 775 }
776 } 776 }
777 777
778 /* overide stored arguments */ 778 /* overide stored arguments */
779 setArgs(argc, argv); 779 setArgs(argc, argv);
780 780
781 /* install translation here */ 781 /* install translation here */
782 for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it ) 782 for ( QStringList::ConstIterator it = d->langs.begin(); it != d->langs.end(); ++it )
783 installTranslation( (*it) + "/" + d->appName + ".qm" ); 783 installTranslation( (*it) + "/" + d->appName + ".qm" );
784} 784}
785#endif 785#endif
786 786
787 787
788static QPtrDict<void>* inputMethodDict = 0; 788static QPtrDict<void>* inputMethodDict = 0;
789static void createInputMethodDict() 789static void createInputMethodDict()
790{ 790{
791 if ( !inputMethodDict ) 791 if ( !inputMethodDict )
792 inputMethodDict = new QPtrDict<void>; 792 inputMethodDict = new QPtrDict<void>;
793} 793}
794 794
795/*! 795/*!
796 Returns the currently set hint to the system as to whether 796 Returns the currently set hint to the system as to whether
797 widget \a w has any use for text input methods. 797 widget \a w has any use for text input methods.
798 798
799 799
800 \sa setInputMethodHint() InputMethodHint 800 \sa setInputMethodHint() InputMethodHint
801*/ 801*/
802QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) 802QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w )
803{ 803{
804 if ( inputMethodDict && w ) 804 if ( inputMethodDict && w )
805 return ( InputMethodHint ) ( int ) inputMethodDict->find( w ); 805 return ( InputMethodHint ) ( int ) inputMethodDict->find( w );
806 return Normal; 806 return Normal;
807} 807}
808 808
809/*! 809/*!
810 \enum QPEApplication::InputMethodHint 810 \enum QPEApplication::InputMethodHint
811 811
812 \value Normal the application sometimes needs text input (the default). 812 \value Normal the application sometimes needs text input (the default).
813 \value AlwaysOff the application never needs text input. 813 \value AlwaysOff the application never needs text input.
814 \value AlwaysOn the application always needs text input. 814 \value AlwaysOn the application always needs text input.
815*/ 815*/
816 816
817/*! 817/*!
818 Hints to the system that widget \a w has use for text input methods 818 Hints to the system that widget \a w has use for text input methods
819 as specified by \a mode. 819 as specified by \a mode.
820 820
821 \sa inputMethodHint() InputMethodHint 821 \sa inputMethodHint() InputMethodHint
822*/ 822*/
823void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) 823void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode )
824{ 824{
825 createInputMethodDict(); 825 createInputMethodDict();
826 if ( mode == Normal ) { 826 if ( mode == Normal ) {
827 inputMethodDict->remove 827 inputMethodDict->remove
828 ( w ); 828 ( w );
829 } 829 }
830 else { 830 else {
831 inputMethodDict->insert( w, ( void* ) mode ); 831 inputMethodDict->insert( w, ( void* ) mode );
832 } 832 }
833} 833}
834 834
835class HackDialog : public QDialog 835class HackDialog : public QDialog
836{ 836{
837public: 837public:
838 void acceptIt() 838 void acceptIt()
839 { 839 {
840 accept(); 840 accept();
841 } 841 }
842 void rejectIt() 842 void rejectIt()
843 { 843 {
844 reject(); 844 reject();
845 } 845 }
846}; 846};
847 847
848 848
849void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) 849void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key )
850{ 850{
851 // specialised actions for certain widgets. May want to 851 // specialised actions for certain widgets. May want to
852 // add more stuff here. 852 // add more stuff here.
853 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" ) 853 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" )
854 && activePopupWidget() ->parentWidget() 854 && activePopupWidget() ->parentWidget()
855 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) ) 855 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) )
856 key = Qt::Key_Return; 856 key = Qt::Key_Return;
857 857
858 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) ) 858 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) )
859 key = Qt::Key_Return; 859 key = Qt::Key_Return;
860 860
861#ifdef QWS 861#ifdef QWS
862 862
863 ke->simpleData.keycode = key; 863 ke->simpleData.keycode = key;
864#endif 864#endif
865} 865}
866 866
867class HackWidget : public QWidget 867class HackWidget : public QWidget
868{ 868{
869public: 869public:
870 bool needsOk() 870 bool needsOk()
871 { 871 {
872 return ( getWState() & WState_Reserved1 ); 872 return ( getWState() & WState_Reserved1 );
873 } 873 }
874}; 874};
875 875
876/*! 876/*!
877 \internal 877 \internal
878*/ 878*/
879 879
880#ifdef QWS 880#ifdef QWS
881bool QPEApplication::qwsEventFilter( QWSEvent * e ) 881bool QPEApplication::qwsEventFilter( QWSEvent * e )
882{ 882{
883 if ( !d->notbusysent && e->type == QWSEvent::Focus ) { 883 if ( !d->notbusysent && e->type == QWSEvent::Focus ) {
884 if ( qApp->type() != QApplication::GuiServer ) { 884 if ( qApp->type() != QApplication::GuiServer ) {
885 QCopEnvelope e( "QPE/System", "notBusy(QString)" ); 885 QCopEnvelope e( "QPE/System", "notBusy(QString)" );
886 e << d->appName; 886 e << d->appName;
887 } 887 }
888 d->notbusysent = TRUE; 888 d->notbusysent = TRUE;
889 } 889 }
890 if ( type() == GuiServer ) { 890 if ( type() == GuiServer ) {
891 switch ( e->type ) { 891 switch ( e->type ) {
892 case QWSEvent::Mouse: 892 case QWSEvent::Mouse:
893 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) 893 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) )
894 emit clientMoused(); 894 emit clientMoused();
895 break; 895 break;
896 default: 896 default:
897 break; 897 break;
898 } 898 }
899 } 899 }
900 if ( e->type == QWSEvent::Key ) { 900 if ( e->type == QWSEvent::Key ) {
901 QWSKeyEvent *ke = ( QWSKeyEvent * ) e; 901 QWSKeyEvent *ke = ( QWSKeyEvent * ) e;
902 if ( ke->simpleData.keycode == Qt::Key_F33 ) { 902 if ( ke->simpleData.keycode == Qt::Key_F33 ) {
903 // Use special "OK" key to press "OK" on top level widgets 903 // Use special "OK" key to press "OK" on top level widgets
904 QWidget * active = activeWindow(); 904 QWidget * active = activeWindow();
905 QWidget *popup = 0; 905 QWidget *popup = 0;
906 if ( active && active->isPopup() ) { 906 if ( active && active->isPopup() ) {
907 popup = active; 907 popup = active;
908 active = active->parentWidget(); 908 active = active->parentWidget();
909 } 909 }
910 if ( active && ( int ) active->winId() == ke->simpleData.window && 910 if ( active && ( int ) active->winId() == ke->simpleData.window &&
911 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) { 911 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) {
912 if ( ke->simpleData.is_press ) { 912 if ( ke->simpleData.is_press ) {
913 if ( popup ) 913 if ( popup )
914 popup->close(); 914 popup->close();
915 if ( active->inherits( "QDialog" ) ) { 915 if ( active->inherits( "QDialog" ) ) {
916 HackDialog * d = ( HackDialog * ) active; 916 HackDialog * d = ( HackDialog * ) active;
917 d->acceptIt(); 917 d->acceptIt();
918 return TRUE; 918 return TRUE;
919 } 919 }
920 else if ( ( ( HackWidget * ) active ) ->needsOk() ) { 920 else if ( ( ( HackWidget * ) active ) ->needsOk() ) {
921 QSignal s; 921 QSignal s;
922 s.connect( active, SLOT( accept() ) ); 922 s.connect( active, SLOT( accept() ) );
923 s.activate(); 923 s.activate();
924 } 924 }
925 else { 925 else {
926 // do the same as with the select key: Map to the default action of the widget: 926 // do the same as with the select key: Map to the default action of the widget:
927 mapToDefaultAction( ke, Qt::Key_Return ); 927 mapToDefaultAction( ke, Qt::Key_Return );
928 } 928 }
929 } 929 }
930 } 930 }
931 } 931 }
932 else if ( ke->simpleData.keycode == Qt::Key_F30 ) { 932 else if ( ke->simpleData.keycode == Qt::Key_F30 ) {
933 // Use special "select" key to do whatever default action a widget has 933 // Use special "select" key to do whatever default action a widget has
934 mapToDefaultAction( ke, Qt::Key_Space ); 934 mapToDefaultAction( ke, Qt::Key_Space );
935 } 935 }
936 else if ( ke->simpleData.keycode == Qt::Key_Escape && 936 else if ( ke->simpleData.keycode == Qt::Key_Escape &&
937 ke->simpleData.is_press ) { 937 ke->simpleData.is_press ) {
938 // Escape key closes app if focus on toplevel 938 // Escape key closes app if focus on toplevel
939 QWidget * active = activeWindow(); 939 QWidget * active = activeWindow();
940 if ( active && active->testWFlags( WType_TopLevel ) && 940 if ( active && active->testWFlags( WType_TopLevel ) &&
941 ( int ) active->winId() == ke->simpleData.window && 941 ( int ) active->winId() == ke->simpleData.window &&
942 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) { 942 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) {
943 if ( active->inherits( "QDialog" ) ) { 943 if ( active->inherits( "QDialog" ) ) {
944 HackDialog * d = ( HackDialog * ) active; 944 HackDialog * d = ( HackDialog * ) active;
945 d->rejectIt(); 945 d->rejectIt();
946 return TRUE; 946 return TRUE;
947 } 947 }
948 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) { 948 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) {
949 active->close(); 949 active->close();
950 } 950 }
951 } 951 }
952 } 952 }
953 else if ( ke->simpleData.keycode >= Qt::Key_F1 && ke->simpleData.keycode <= Qt::Key_F29 ) { 953 else if ( ke->simpleData.keycode >= Qt::Key_F1 && ke->simpleData.keycode <= Qt::Key_F29 ) {
954 // this should be if ( ODevice::inst ( )-> buttonForKeycode ( ... )) 954 // this should be if ( ODevice::inst ( )-> buttonForKeycode ( ... ))
955 // but we cannot access libopie function within libqpe :( 955 // but we cannot access libopie function within libqpe :(
956 956
957 QWidget * active = activeWindow ( ); 957 QWidget * active = activeWindow ( );
958 if ( active && ((int) active-> winId ( ) == ke-> simpleData.window )) { 958 if ( active && ((int) active-> winId ( ) == ke-> simpleData.window )) {
959 if ( d-> kbgrabbed ) { // we grabbed the keyboard 959 if ( d-> kbgrabbed ) { // we grabbed the keyboard
960 QChar ch ( ke-> simpleData.unicode ); 960 QChar ch ( ke-> simpleData.unicode );
961 QKeyEvent qke ( ke-> simpleData. is_press ? QEvent::KeyPress : QEvent::KeyRelease, 961 QKeyEvent qke ( ke-> simpleData. is_press ? QEvent::KeyPress : QEvent::KeyRelease,
962 ke-> simpleData.keycode, 962 ke-> simpleData.keycode,
963 ch. latin1 ( ), 963 ch. latin1 ( ),
964 ke-> simpleData.modifiers, 964 ke-> simpleData.modifiers,
965 QString ( ch ), 965 QString ( ch ),
966 ke-> simpleData.is_auto_repeat, 1 ); 966 ke-> simpleData.is_auto_repeat, 1 );
967 967
968 QObject *which = QWidget::keyboardGrabber ( ); 968 QObject *which = QWidget::keyboardGrabber ( );
969 if ( !which ) 969 if ( !which )
970 which = QApplication::focusWidget ( ); 970 which = QApplication::focusWidget ( );
971 if ( !which ) 971 if ( !which )
972 which = QApplication::activeWindow ( ); 972 which = QApplication::activeWindow ( );
973 if ( !which ) 973 if ( !which )
974 which = qApp; 974 which = qApp;
975 975
976 QApplication::sendEvent ( which, &qke ); 976 QApplication::sendEvent ( which, &qke );
977 } 977 }
978 else { // we didn't grab the keyboard, so send the event to the launcher 978 else { // we didn't grab the keyboard, so send the event to the launcher
979 QCopEnvelope e ( "QPE/Launcher", "deviceButton(int,int,int)" ); 979 QCopEnvelope e ( "QPE/Launcher", "deviceButton(int,int,int)" );
980 e << int( ke-> simpleData.keycode ) << int( ke-> simpleData. is_press ) << int( ke-> simpleData.is_auto_repeat ); 980 e << int( ke-> simpleData.keycode ) << int( ke-> simpleData. is_press ) << int( ke-> simpleData.is_auto_repeat );
981 } 981 }
982 } 982 }
983 return true; 983 return true;
984 } 984 }
985 } 985 }
986 if ( e->type == QWSEvent::Focus ) { 986 if ( e->type == QWSEvent::Focus ) {
987 QWSFocusEvent * fe = ( QWSFocusEvent* ) e; 987 QWSFocusEvent * fe = ( QWSFocusEvent* ) e;
988 if ( !fe->simpleData.get_focus ) { 988 if ( !fe->simpleData.get_focus ) {
989 QWidget * active = activeWindow(); 989 QWidget * active = activeWindow();
990 while ( active && active->isPopup() ) { 990 while ( active && active->isPopup() ) {
991 active->close(); 991 active->close();
992 active = activeWindow(); 992 active = activeWindow();
993 } 993 }
994 } 994 }
995 else { 995 else {
996 // make sure our modal widget is ALWAYS on top 996 // make sure our modal widget is ALWAYS on top
997 QWidget *topm = activeModalWidget(); 997 QWidget *topm = activeModalWidget();
998 if ( topm ) { 998 if ( topm ) {
999 topm->raise(); 999 topm->raise();
1000 } 1000 }
1001 } 1001 }
1002 if ( fe->simpleData.get_focus && inputMethodDict ) { 1002 if ( fe->simpleData.get_focus && inputMethodDict ) {
1003 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) ); 1003 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) );
1004 if ( m == AlwaysOff ) 1004 if ( m == AlwaysOff )
1005 Global::hideInputMethod(); 1005 Global::hideInputMethod();
1006 if ( m == AlwaysOn ) 1006 if ( m == AlwaysOn )
1007 Global::showInputMethod(); 1007 Global::showInputMethod();
1008 } 1008 }
1009 } 1009 }
1010 1010
1011 1011
1012 return QApplication::qwsEventFilter( e ); 1012 return QApplication::qwsEventFilter( e );
1013} 1013}
1014#endif 1014#endif
1015 1015
1016/*! 1016/*!
1017 Destroys the QPEApplication. 1017 Destroys the QPEApplication.
1018*/ 1018*/
1019QPEApplication::~QPEApplication() 1019QPEApplication::~QPEApplication()
1020{ 1020{
1021 ungrabKeyboard(); 1021 ungrabKeyboard();
1022#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 1022#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
1023 // Need to delete QCopChannels early, since the display will 1023 // Need to delete QCopChannels early, since the display will
1024 // be gone by the time we get to ~QObject(). 1024 // be gone by the time we get to ~QObject().
1025 delete sysChannel; 1025 delete sysChannel;
1026 delete pidChannel; 1026 delete pidChannel;
1027#endif 1027#endif
1028 1028
1029 delete d; 1029 delete d;
1030} 1030}
1031 1031
1032/*! 1032/*!
1033 Returns <tt>$OPIEDIR/</tt>. 1033 Returns <tt>$OPIEDIR/</tt>.
1034*/ 1034*/
1035QString QPEApplication::qpeDir() 1035QString QPEApplication::qpeDir()
1036{ 1036{
1037 const char * base = getenv( "OPIEDIR" ); 1037 const char * base = getenv( "OPIEDIR" );
1038 if ( base ) 1038 if ( base )
1039 return QString( base ) + "/"; 1039 return QString( base ) + "/";
1040 1040
1041 return QString( "../" ); 1041 return QString( "../" );
1042} 1042}
1043 1043
1044/*! 1044/*!
1045 Returns the user's current Document directory. There is a trailing "/". 1045 Returns the user's current Document directory. There is a trailing "/".
1046 .. well, it does now,, and there's no trailing '/' 1046 .. well, it does now,, and there's no trailing '/'
1047*/ 1047*/
1048QString QPEApplication::documentDir() 1048QString QPEApplication::documentDir()
1049{ 1049{
1050 const char* base = getenv( "HOME"); 1050 const char* base = getenv( "HOME");
1051 if ( base ) 1051 if ( base )
1052 return QString( base ) + "/Documents"; 1052 return QString( base ) + "/Documents";
1053 1053
1054 return QString( "../Documents" ); 1054 return QString( "../Documents" );
1055} 1055}
1056 1056
1057static int deforient = -1; 1057static int deforient = -1;
1058 1058
1059/*! 1059/*!
1060 \internal 1060 \internal
1061*/ 1061*/
1062int QPEApplication::defaultRotation() 1062int QPEApplication::defaultRotation()
1063{ 1063{
1064 if ( deforient < 0 ) { 1064 if ( deforient < 0 ) {
1065 QString d = getenv( "QWS_DISPLAY" ); 1065 QString d = getenv( "QWS_DISPLAY" );
1066 if ( d.contains( "Rot90" ) ) { 1066 if ( d.contains( "Rot90" ) ) {
1067 deforient = 90; 1067 deforient = 90;
1068 } 1068 }
1069 else if ( d.contains( "Rot180" ) ) { 1069 else if ( d.contains( "Rot180" ) ) {
1070 deforient = 180; 1070 deforient = 180;
1071 } 1071 }
1072 else if ( d.contains( "Rot270" ) ) { 1072 else if ( d.contains( "Rot270" ) ) {
1073 deforient = 270; 1073 deforient = 270;
1074 } 1074 }
1075 else { 1075 else {
1076 deforient = 0; 1076 deforient = 0;
1077 } 1077 }
1078 } 1078 }
1079 return deforient; 1079 return deforient;
1080} 1080}
1081 1081
1082/*! 1082/*!
1083 \internal 1083 \internal
1084*/ 1084*/
1085void QPEApplication::setDefaultRotation( int r ) 1085void QPEApplication::setDefaultRotation( int r )
1086{ 1086{
1087 if ( qApp->type() == GuiServer ) { 1087 if ( qApp->type() == GuiServer ) {
1088 deforient = r; 1088 deforient = r;
1089 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); 1089 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 );
1090 Config config("qpe"); 1090 Config config("qpe");
1091 config.setGroup( "Rotation" ); 1091 config.setGroup( "Rotation" );
1092 config.writeEntry( "Rot", r ); 1092 config.writeEntry( "Rot", r );
1093 } 1093 }
1094 else { 1094 else {
1095#ifndef QT_NO_COP 1095#ifndef QT_NO_COP
1096 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" ); 1096 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" );
1097 e << r; 1097 e << r;
1098 } 1098 }
1099#endif 1099#endif
1100 1100
1101 } 1101 }
1102} 1102}
1103 1103
1104#include <qgfx_qws.h> 1104#include <qgfx_qws.h>
1105#include <qwindowsystem_qws.h> 1105#include <qwindowsystem_qws.h>
1106#include <qpixmapcache.h> 1106#include <qpixmapcache.h>
1107 1107
1108extern void qws_clearLoadedFonts(); 1108extern void qws_clearLoadedFonts();
1109 1109
1110void QPEApplication::setCurrentMode( int x, int y, int depth ) 1110void QPEApplication::setCurrentMode( int x, int y, int depth )
1111{ 1111{
1112 // Reset the caches 1112 // Reset the caches
1113 qws_clearLoadedFonts(); 1113 qws_clearLoadedFonts();
1114 QPixmapCache::clear(); 1114 QPixmapCache::clear();
1115 1115
1116 // Change the screen mode 1116 // Change the screen mode
1117 qt_screen->setMode(x, y, depth); 1117 qt_screen->setMode(x, y, depth);
1118 1118
1119 if ( qApp->type() == GuiServer ) { 1119 if ( qApp->type() == GuiServer ) {
1120 // Reconfigure the GuiServer 1120 // Reconfigure the GuiServer
1121 qwsServer->beginDisplayReconfigure(); 1121 qwsServer->beginDisplayReconfigure();
1122 qwsServer->endDisplayReconfigure(); 1122 qwsServer->endDisplayReconfigure();
1123 1123
1124 // Get all the running apps to reset 1124 // Get all the running apps to reset
1125 QCopEnvelope env( "QPE/System", "reset()" ); 1125 QCopEnvelope env( "QPE/System", "reset()" );
1126 } 1126 }
1127} 1127}
1128 1128
1129void QPEApplication::reset() { 1129void QPEApplication::reset() {
1130 // Reconnect to the screen 1130 // Reconnect to the screen
1131 qt_screen->disconnect(); 1131 qt_screen->disconnect();
1132 qt_screen->connect( QString::null ); 1132 qt_screen->connect( QString::null );
1133 1133
1134 // Redraw everything 1134 // Redraw everything
1135 applyStyle(); 1135 applyStyle();
1136} 1136}
1137 1137
1138/*! 1138/*!
1139 \internal 1139 \internal
1140*/ 1140*/
1141void QPEApplication::applyStyle() 1141void QPEApplication::applyStyle()
1142{ 1142{
1143 Config config( "qpe" ); 1143 Config config( "qpe" );
1144 config.setGroup( "Appearance" ); 1144 config.setGroup( "Appearance" );
1145 1145
1146#if QT_VERSION > 233 1146#if QT_VERSION > 233
1147#if !defined(OPIE_NO_OVERRIDE_QT) 1147#if !defined(OPIE_NO_OVERRIDE_QT)
1148 // don't block ourselves ... 1148 // don't block ourselves ...
1149 Opie::force_appearance = 0; 1149 Opie::force_appearance = 0;
1150 1150
1151 static QString appname = Opie::binaryName ( ); 1151 static QString appname = Opie::binaryName ( );
1152 1152
1153 QStringList ex = config. readListEntry ( "NoStyle", ';' ); 1153 QStringList ex = config. readListEntry ( "NoStyle", ';' );
1154 int nostyle = 0; 1154 int nostyle = 0;
1155 for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) { 1155 for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) {
1156 if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) { 1156 if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) {
1157 nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 ); 1157 nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 );
1158 break; 1158 break;
1159 } 1159 }
1160 } 1160 }
1161#else 1161#else
1162 int nostyle = 0; 1162 int nostyle = 0;
1163#endif 1163#endif
1164 1164
1165 // Widget style 1165 // Widget style
1166 QString style = config.readEntry( "Style", "FlatStyle" ); 1166 QString style = config.readEntry( "Style", "FlatStyle" );
1167 1167
1168 // don't set a custom style 1168 // don't set a custom style
1169 if ( nostyle & Opie::Force_Style ) 1169 if ( nostyle & Opie::Force_Style )
1170 style = "FlatStyle"; 1170 style = "FlatStyle";
1171 1171
1172 internalSetStyle ( style ); 1172 internalSetStyle ( style );
1173 1173
1174 // Colors - from /etc/colors/Liquid.scheme 1174 // Colors - from /etc/colors/Liquid.scheme
1175 QColor bgcolor( config.readEntry( "Background", "#E0E0E0" ) ); 1175 QColor bgcolor( config.readEntry( "Background", "#E0E0E0" ) );
1176 QColor btncolor( config.readEntry( "Button", "#96c8fa" ) ); 1176 QColor btncolor( config.readEntry( "Button", "#96c8fa" ) );
1177 QPalette pal( btncolor, bgcolor ); 1177 QPalette pal( btncolor, bgcolor );
1178 QString color = config.readEntry( "Highlight", "#73adef" ); 1178 QString color = config.readEntry( "Highlight", "#73adef" );
1179 pal.setColor( QColorGroup::Highlight, QColor( color ) ); 1179 pal.setColor( QColorGroup::Highlight, QColor( color ) );
1180 color = config.readEntry( "HighlightedText", "#FFFFFF" ); 1180 color = config.readEntry( "HighlightedText", "#FFFFFF" );
1181 pal.setColor( QColorGroup::HighlightedText, QColor( color ) ); 1181 pal.setColor( QColorGroup::HighlightedText, QColor( color ) );
1182 color = config.readEntry( "Text", "#000000" ); 1182 color = config.readEntry( "Text", "#000000" );
1183 pal.setColor( QColorGroup::Text, QColor( color ) ); 1183 pal.setColor( QColorGroup::Text, QColor( color ) );
1184 color = config.readEntry( "ButtonText", "#000000" ); 1184 color = config.readEntry( "ButtonText", "#000000" );
1185 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) ); 1185 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) );
1186 color = config.readEntry( "Base", "#FFFFFF" ); 1186 color = config.readEntry( "Base", "#FFFFFF" );
1187 pal.setColor( QColorGroup::Base, QColor( color ) ); 1187 pal.setColor( QColorGroup::Base, QColor( color ) );
1188 1188
1189 pal.setColor( QPalette::Disabled, QColorGroup::Text, 1189 pal.setColor( QPalette::Disabled, QColorGroup::Text,
1190 pal.color( QPalette::Active, QColorGroup::Background ).dark() ); 1190 pal.color( QPalette::Active, QColorGroup::Background ).dark() );
1191 1191
1192 setPalette( pal, TRUE ); 1192 setPalette( pal, TRUE );
1193 1193
1194 // Window Decoration 1194 // Window Decoration
1195 QString dec = config.readEntry( "Decoration", "Flat" ); 1195 QString dec = config.readEntry( "Decoration", "Flat" );
1196 1196
1197 // don't set a custom deco 1197 // don't set a custom deco
1198 if ( nostyle & Opie::Force_Decoration ) 1198 if ( nostyle & Opie::Force_Decoration )
1199 dec = ""; 1199 dec = "";
1200 1200
1201 //qDebug ( "Setting Deco: %s -- old %s (%d)", dec.latin1(), d-> decorationName.latin1(), nostyle); 1201 //qDebug ( "Setting Deco: %s -- old %s (%d)", dec.latin1(), d-> decorationName.latin1(), nostyle);
1202 1202
1203 if ( dec != d->decorationName ) { 1203 if ( dec != d->decorationName ) {
1204 qwsSetDecoration( new QPEDecoration( dec ) ); 1204 qwsSetDecoration( new QPEDecoration( dec ) );
1205 d->decorationName = dec; 1205 d->decorationName = dec;
1206 } 1206 }
1207 1207
1208 // Font 1208 // Font
1209 QString ff = config.readEntry( "FontFamily", font().family() ); 1209 QString ff = config.readEntry( "FontFamily", font().family() );
1210 int fs = config.readNumEntry( "FontSize", font().pointSize() ); 1210 int fs = config.readNumEntry( "FontSize", font().pointSize() );
1211 1211
1212 // don't set a custom font 1212 // don't set a custom font
1213 if ( nostyle & Opie::Force_Font ) { 1213 if ( nostyle & Opie::Force_Font ) {
1214 ff = "Vera"; 1214 ff = "Vera";
1215 fs = 10; 1215 fs = 10;
1216 } 1216 }
1217 1217
1218 setFont ( QFont ( ff, fs ), true ); 1218 setFont ( QFont ( ff, fs ), true );
1219 1219
1220#if !defined(OPIE_NO_OVERRIDE_QT) 1220#if !defined(OPIE_NO_OVERRIDE_QT)
1221 // revert to global blocking policy ... 1221 // revert to global blocking policy ...
1222 Opie::force_appearance = config. readBoolEntry ( "ForceStyle", false ) ? Opie::Force_All : Opie::Force_None; 1222 Opie::force_appearance = config. readBoolEntry ( "ForceStyle", false ) ? Opie::Force_All : Opie::Force_None;
1223 Opie::force_appearance &= ~nostyle; 1223 Opie::force_appearance &= ~nostyle;
1224#endif 1224#endif
1225#endif 1225#endif
1226} 1226}
1227 1227
1228void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data ) 1228void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data )
1229{ 1229{
1230#ifdef Q_WS_QWS 1230#ifdef Q_WS_QWS
1231 QDataStream stream( data, IO_ReadOnly ); 1231 QDataStream stream( data, IO_ReadOnly );
1232 if ( msg == "applyStyle()" ) { 1232 if ( msg == "applyStyle()" ) {
1233 applyStyle(); 1233 applyStyle();
1234 } 1234 }
1235 else if ( msg == "toggleApplicationMenu()" ) { 1235 else if ( msg == "toggleApplicationMenu()" ) {
1236 QWidget *active = activeWindow ( ); 1236 QWidget *active = activeWindow ( );
1237 1237
1238 if ( active ) { 1238 if ( active ) {
1239 QPEMenuToolFocusManager *man = QPEMenuToolFocusManager::manager ( ); 1239 QPEMenuToolFocusManager *man = QPEMenuToolFocusManager::manager ( );
1240 bool oldactive = man-> isActive ( ); 1240 bool oldactive = man-> isActive ( );
1241 1241
1242 man-> setActive( !man-> isActive() ); 1242 man-> setActive( !man-> isActive() );
1243 1243
1244 if ( !oldactive && !man-> isActive ( )) { // no menubar to toggle -> try O-Menu 1244 if ( !oldactive && !man-> isActive ( )) { // no menubar to toggle -> try O-Menu
1245 QCopEnvelope e ( "QPE/TaskBar", "toggleStartMenu()" ); 1245 QCopEnvelope e ( "QPE/TaskBar", "toggleStartMenu()" );
1246 } 1246 }
1247 } 1247 }
1248 } 1248 }
1249 else if ( msg == "setDefaultRotation(int)" ) { 1249 else if ( msg == "setDefaultRotation(int)" ) {
1250 if ( type() == GuiServer ) { 1250 if ( type() == GuiServer ) {
1251 int r; 1251 int r;
1252 stream >> r; 1252 stream >> r;
1253 setDefaultRotation( r ); 1253 setDefaultRotation( r );
1254 } 1254 }
1255 } 1255 }
1256 else if ( msg == "setCurrentMode(int,int,int)" ) { // Added: 2003-06-11 by Tim Ansell <mithro@mithis.net> 1256 else if ( msg == "setCurrentMode(int,int,int)" ) { // Added: 2003-06-11 by Tim Ansell <mithro@mithis.net>
1257 if ( type() == GuiServer ) { 1257 if ( type() == GuiServer ) {
1258 int x, y, depth; 1258 int x, y, depth;
1259 stream >> x; 1259 stream >> x;
1260 stream >> y; 1260 stream >> y;
1261 stream >> depth; 1261 stream >> depth;
1262 setCurrentMode( x, y, depth ); 1262 setCurrentMode( x, y, depth );
1263 } 1263 }
1264 } 1264 }
1265 else if ( msg == "reset()" ) { 1265 else if ( msg == "reset()" ) {
1266 if ( type() != GuiServer ) 1266 if ( type() != GuiServer )
1267 reset(); 1267 reset();
1268 } 1268 }
1269 else if ( msg == "setCurrentRotation(int)" ) { 1269 else if ( msg == "setCurrentRotation(int)" ) {
1270 int r; 1270 int r;
1271 stream >> r; 1271 stream >> r;
1272 setCurrentRotation( r ); 1272 setCurrentRotation( r );
1273 } 1273 }
1274 else if ( msg == "shutdown()" ) { 1274 else if ( msg == "shutdown()" ) {
1275 if ( type() == GuiServer ) 1275 if ( type() == GuiServer )
1276 shutdown(); 1276 shutdown();
1277 } 1277 }
1278 else if ( msg == "quit()" ) { 1278 else if ( msg == "quit()" ) {
1279 if ( type() != GuiServer ) 1279 if ( type() != GuiServer )
1280 tryQuit(); 1280 tryQuit();
1281 } 1281 }
1282 else if ( msg == "forceQuit()" ) { 1282 else if ( msg == "forceQuit()" ) {
1283 if ( type() != GuiServer ) 1283 if ( type() != GuiServer )
1284 quit(); 1284 quit();
1285 } 1285 }
1286 else if ( msg == "restart()" ) { 1286 else if ( msg == "restart()" ) {
1287 if ( type() == GuiServer ) 1287 if ( type() == GuiServer )
1288 restart(); 1288 restart();
1289 } 1289 }
1290 else if ( msg == "language(QString)" ) { 1290 else if ( msg == "language(QString)" ) {
1291 if ( type() == GuiServer ) { 1291 if ( type() == GuiServer ) {
1292 QString l; 1292 QString l;
1293 stream >> l; 1293 stream >> l;
1294 QString cl = getenv( "LANG" ); 1294 QString cl = getenv( "LANG" );
1295 if ( cl != l ) { 1295 if ( cl != l ) {
1296 if ( l.isNull() ) 1296 if ( l.isNull() )
1297 unsetenv( "LANG" ); 1297 unsetenv( "LANG" );
1298 else 1298 else
1299 setenv( "LANG", l.latin1(), 1 ); 1299 setenv( "LANG", l.latin1(), 1 );
1300 restart(); 1300 restart();
1301 } 1301 }
1302 } 1302 }
1303 } 1303 }
1304 else if ( msg == "timeChange(QString)" ) { 1304 else if ( msg == "timeChange(QString)" ) {
1305 QString t; 1305 QString t;
1306 stream >> t; 1306 stream >> t;
1307 if ( t.isNull() ) 1307 if ( t.isNull() )
1308 unsetenv( "TZ" ); 1308 unsetenv( "TZ" );
1309 else 1309 else
1310 setenv( "TZ", t.latin1(), 1 ); 1310 setenv( "TZ", t.latin1(), 1 );
1311 // emit the signal so everyone else knows... 1311 // emit the signal so everyone else knows...
1312 emit timeChanged(); 1312 emit timeChanged();
1313 } 1313 }
1314 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) { 1314 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) {
1315 if ( type() == GuiServer ) { 1315 if ( type() == GuiServer ) {
1316 QDateTime when; 1316 QDateTime when;
1317 QCString channel, message; 1317 QCString channel, message;
1318 int data; 1318 int data;
1319 stream >> when >> channel >> message >> data; 1319 stream >> when >> channel >> message >> data;
1320 AlarmServer::addAlarm( when, channel, message, data ); 1320 AlarmServer::addAlarm( when, channel, message, data );
1321 } 1321 }
1322 } 1322 }
1323 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) { 1323 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) {
1324 if ( type() == GuiServer ) { 1324 if ( type() == GuiServer ) {
1325 QDateTime when; 1325 QDateTime when;
1326 QCString channel, message; 1326 QCString channel, message;
1327 int data; 1327 int data;
1328 stream >> when >> channel >> message >> data; 1328 stream >> when >> channel >> message >> data;
1329 AlarmServer::deleteAlarm( when, channel, message, data ); 1329 AlarmServer::deleteAlarm( when, channel, message, data );
1330 } 1330 }
1331 } 1331 }
1332 else if ( msg == "clockChange(bool)" ) { 1332 else if ( msg == "clockChange(bool)" ) {
1333 int tmp; 1333 int tmp;
1334 stream >> tmp; 1334 stream >> tmp;
1335 emit clockChanged( tmp ); 1335 emit clockChanged( tmp );
1336 } 1336 }
1337 else if ( msg == "weekChange(bool)" ) { 1337 else if ( msg == "weekChange(bool)" ) {
1338 int tmp; 1338 int tmp;
1339 stream >> tmp; 1339 stream >> tmp;
1340 emit weekChanged( tmp ); 1340 emit weekChanged( tmp );
1341 } 1341 }
1342 else if ( msg == "setDateFormat(DateFormat)" ) { 1342 else if ( msg == "setDateFormat(DateFormat)" ) {
1343 DateFormat tmp; 1343 DateFormat tmp;
1344 stream >> tmp; 1344 stream >> tmp;
1345 emit dateFormatChanged( tmp ); 1345 emit dateFormatChanged( tmp );
1346 } 1346 }
1347 else if ( msg == "setVolume(int,int)" ) { 1347 else if ( msg == "setVolume(int,int)" ) {
1348 int t, v; 1348 int t, v;
1349 stream >> t >> v; 1349 stream >> t >> v;
1350 setVolume( t, v ); 1350 setVolume( t, v );
1351 emit volumeChanged( muted ); 1351 emit volumeChanged( muted );
1352 } 1352 }
1353 else if ( msg == "volumeChange(bool)" ) { 1353 else if ( msg == "volumeChange(bool)" ) {
1354 stream >> muted; 1354 stream >> muted;
1355 setVolume(); 1355 setVolume();
1356 emit volumeChanged( muted ); 1356 emit volumeChanged( muted );
1357 } 1357 }
1358 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1358 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1359 int t, v; 1359 int t, v;
1360 stream >> t >> v; 1360 stream >> t >> v;
1361 setMic( t, v ); 1361 setMic( t, v );
1362 emit micChanged( micMuted ); 1362 emit micChanged( micMuted );
1363 } 1363 }
1364 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1364 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1365 stream >> micMuted; 1365 stream >> micMuted;
1366 setMic(); 1366 setMic();
1367 emit micChanged( micMuted ); 1367 emit micChanged( micMuted );
1368 } 1368 }
1369 else if ( msg == "setBass(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> 1369 else if ( msg == "setBass(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org>
1370 int t, v; 1370 int t, v;
1371 stream >> t >> v; 1371 stream >> t >> v;
1372 setBass( t, v ); 1372 setBass( t, v );
1373 } 1373 }
1374 else if ( msg == "bassChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> 1374 else if ( msg == "bassChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org>
1375 setBass(); 1375 setBass();
1376 } 1376 }
1377 else if ( msg == "setTreble(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> 1377 else if ( msg == "setTreble(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org>
1378 int t, v; 1378 int t, v;
1379 stream >> t >> v; 1379 stream >> t >> v;
1380 setTreble( t, v ); 1380 setTreble( t, v );
1381 } 1381 }
1382 else if ( msg == "trebleChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> 1382 else if ( msg == "trebleChange(bool)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org>
1383 setTreble(); 1383 setTreble();
1384 } else if ( msg == "getMarkedText()" ) { 1384 } else if ( msg == "getMarkedText()" ) {
1385 if ( type() == GuiServer ) { 1385 if ( type() == GuiServer ) {
1386 const ushort unicode = 'C'-'@'; 1386 const ushort unicode = 'C'-'@';
1387 const int scan = Key_C; 1387 const int scan = Key_C;
1388 qwsServer->processKeyEvent( unicode, scan, ControlButton, TRUE, FALSE ); 1388 qwsServer->processKeyEvent( unicode, scan, ControlButton, TRUE, FALSE );
1389 qwsServer->processKeyEvent( unicode, scan, ControlButton, FALSE, FALSE ); 1389 qwsServer->processKeyEvent( unicode, scan, ControlButton, FALSE, FALSE );
1390 } 1390 }
1391 } else if ( msg == "newChannel(QString)") { 1391 } else if ( msg == "newChannel(QString)") {
1392 QString myChannel = "QPE/Application/" + d->appName; 1392 QString myChannel = "QPE/Application/" + d->appName;
1393 QString channel; 1393 QString channel;
1394 stream >> channel; 1394 stream >> channel;
1395 if (channel == myChannel) { 1395 if (channel == myChannel) {
1396 processQCopFile(); 1396 processQCopFile();
1397 d->sendQCopQ(); 1397 d->sendQCopQ();
1398 } 1398 }
1399 } 1399 }
1400 1400
1401 1401
1402#endif 1402#endif
1403} 1403}
1404 1404
1405 1405
1406 1406
1407 1407
1408 1408
1409/*! 1409/*!
1410 \internal 1410 \internal
1411*/ 1411*/
1412bool QPEApplication::raiseAppropriateWindow() 1412bool QPEApplication::raiseAppropriateWindow()
1413{ 1413{
1414 bool r=FALSE; 1414 bool r=FALSE;
1415 1415
1416 // 1. Raise the main widget 1416 // 1. Raise the main widget
1417 QWidget *top = d->qpe_main_widget; 1417 QWidget *top = d->qpe_main_widget;
1418 if ( !top ) top = mainWidget(); 1418 if ( !top ) top = mainWidget();
1419 1419
1420 if ( top && d->keep_running ) { 1420 if ( top && d->keep_running ) {
1421 if ( top->isVisible() ) 1421 if ( top->isVisible() )
1422 r = TRUE; 1422 r = TRUE;
1423 else if (d->preloaded) { 1423 else if (d->preloaded) {
1424 // We are preloaded and not visible.. pretend we just started.. 1424 // We are preloaded and not visible.. pretend we just started..
1425#ifndef QT_NO_COP 1425#ifndef QT_NO_COP
1426 QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); 1426 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1427 e << d->appName; 1427 e << d->appName;
1428#endif 1428#endif
1429 } 1429 }
1430 1430
1431 d->show_mx(top,d->nomaximize, d->appName); 1431 d->show_mx(top,d->nomaximize, d->appName);
1432 top->raise(); 1432 top->raise();
1433 } 1433 }
1434 1434
1435 QWidget *topm = activeModalWidget(); 1435 QWidget *topm = activeModalWidget();
1436 1436
1437 // 2. Raise any parentless widgets (except top and topm, as they 1437 // 2. Raise any parentless widgets (except top and topm, as they
1438 // are raised before and after this loop). Order from most 1438 // are raised before and after this loop). Order from most
1439 // recently raised as deepest to least recently as top, so 1439 // recently raised as deepest to least recently as top, so
1440 // that repeated calls cycle through widgets. 1440 // that repeated calls cycle through widgets.
1441 QWidgetList *list = topLevelWidgets(); 1441 QWidgetList *list = topLevelWidgets();
1442 if ( list ) { 1442 if ( list ) {
1443 bool foundlast = FALSE; 1443 bool foundlast = FALSE;
1444 QWidget* topsub = 0; 1444 QWidget* topsub = 0;
1445 if ( d->lastraised ) { 1445 if ( d->lastraised ) {
1446 for (QWidget* w = list->first(); w; w = list->next()) { 1446 for (QWidget* w = list->first(); w; w = list->next()) {
1447 if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) { 1447 if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) {
1448 if ( w == d->lastraised ) 1448 if ( w == d->lastraised )
1449 foundlast = TRUE; 1449 foundlast = TRUE;
1450 if ( foundlast ) { 1450 if ( foundlast ) {
1451 w->raise(); 1451 w->raise();
1452 topsub = w; 1452 topsub = w;
1453 } 1453 }
1454 } 1454 }
1455 } 1455 }
1456 } 1456 }
1457 for (QWidget* w = list->first(); w; w = list->next()) { 1457 for (QWidget* w = list->first(); w; w = list->next()) {
1458 if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) { 1458 if ( !w->parentWidget() && w != topm && w->isVisible() && !w->isDesktop() ) {
1459 if ( w == d->lastraised ) 1459 if ( w == d->lastraised )
1460 break; 1460 break;
1461 w->raise(); 1461 w->raise();
1462 topsub = w; 1462 topsub = w;
1463 } 1463 }
1464 } 1464 }
1465 d->lastraised = topsub; 1465 d->lastraised = topsub;
1466 delete list; 1466 delete list;
1467 } 1467 }
1468 1468
1469 // 3. Raise the active modal widget. 1469 // 3. Raise the active modal widget.
1470 if ( topm && topm != top ) { 1470 if ( topm && topm != top ) {
1471 topm->show(); 1471 topm->show();
1472 topm->raise(); 1472 topm->raise();
1473 // If we haven't already handled the fastAppShowing message 1473 // If we haven't already handled the fastAppShowing message
1474 if (!top && d->preloaded) { 1474 if (!top && d->preloaded) {
1475#ifndef QT_NO_COP 1475#ifndef QT_NO_COP
1476 QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); 1476 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1477 e << d->appName; 1477 e << d->appName;
1478#endif 1478#endif
1479 } 1479 }
1480 r = FALSE; 1480 r = FALSE;
1481 } 1481 }
1482 1482
1483 return r; 1483 return r;
1484} 1484}
1485 1485
1486 1486
1487void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data) 1487void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data)
1488{ 1488{
1489#ifdef Q_WS_QWS 1489#ifdef Q_WS_QWS
1490 1490
1491 if ( msg == "quit()" ) { 1491 if ( msg == "quit()" ) {
1492 tryQuit(); 1492 tryQuit();
1493 } 1493 }
1494 else if ( msg == "quitIfInvisible()" ) { 1494 else if ( msg == "quitIfInvisible()" ) {
1495 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() ) 1495 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() )
1496 quit(); 1496 quit();
1497 } 1497 }
1498 else if ( msg == "close()" ) { 1498 else if ( msg == "close()" ) {
1499 hideOrQuit(); 1499 hideOrQuit();
1500 } 1500 }
1501 else if ( msg == "disablePreload()" ) { 1501 else if ( msg == "disablePreload()" ) {
1502 d->preloaded = FALSE; 1502 d->preloaded = FALSE;
1503 d->keep_running = TRUE; 1503 d->keep_running = TRUE;
1504 /* so that quit will quit */ 1504 /* so that quit will quit */
1505 } 1505 }
1506 else if ( msg == "enablePreload()" ) { 1506 else if ( msg == "enablePreload()" ) {
1507 if (d->qpe_main_widget) 1507 if (d->qpe_main_widget)
1508 d->preloaded = TRUE; 1508 d->preloaded = TRUE;
1509 d->keep_running = TRUE; 1509 d->keep_running = TRUE;
1510 /* so next quit won't quit */ 1510 /* so next quit won't quit */
1511 } 1511 }
1512 else if ( msg == "raise()" ) { 1512 else if ( msg == "raise()" ) {
1513 d->keep_running = TRUE; 1513 d->keep_running = TRUE;
1514 d->notbusysent = FALSE; 1514 d->notbusysent = FALSE;
1515 raiseAppropriateWindow(); 1515 raiseAppropriateWindow();
1516 // Tell the system we're still chugging along... 1516 // Tell the system we're still chugging along...
1517 QCopEnvelope e("QPE/System", "appRaised(QString)"); 1517 QCopEnvelope e("QPE/System", "appRaised(QString)");
1518 e << d->appName; 1518 e << d->appName;
1519 } 1519 }
1520 else if ( msg == "flush()" ) { 1520 else if ( msg == "flush()" ) {
1521 emit flush(); 1521 emit flush();
1522 // we need to tell the desktop 1522 // we need to tell the desktop
1523 QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" ); 1523 QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" );
1524 e << d->appName; 1524 e << d->appName;
1525 } 1525 }
1526 else if ( msg == "reload()" ) { 1526 else if ( msg == "reload()" ) {
1527 emit reload(); 1527 emit reload();
1528 } 1528 }
1529 else if ( msg == "setDocument(QString)" ) { 1529 else if ( msg == "setDocument(QString)" ) {
1530 d->keep_running = TRUE; 1530 d->keep_running = TRUE;
1531 QDataStream stream( data, IO_ReadOnly ); 1531 QDataStream stream( data, IO_ReadOnly );
1532 QString doc; 1532 QString doc;
1533 stream >> doc; 1533 stream >> doc;
1534 QWidget *mw = mainWidget(); 1534 QWidget *mw = mainWidget();
1535 if ( !mw ) 1535 if ( !mw )
1536 mw = d->qpe_main_widget; 1536 mw = d->qpe_main_widget;
1537 if ( mw ) 1537 if ( mw )
1538 Global::setDocument( mw, doc ); 1538 Global::setDocument( mw, doc );
1539 1539
1540 } else if ( msg == "QPEProcessQCop()" ) { 1540 } else if ( msg == "QPEProcessQCop()" ) {
1541 processQCopFile(); 1541 processQCopFile();
1542 d->sendQCopQ(); 1542 d->sendQCopQ();
1543 }else 1543 }else
1544 { 1544 {
1545 bool p = d->keep_running; 1545 bool p = d->keep_running;
1546 d->keep_running = FALSE; 1546 d->keep_running = FALSE;
1547 emit appMessage( msg, data); 1547 emit appMessage( msg, data);
1548 if ( d->keep_running ) { 1548 if ( d->keep_running ) {
1549 d->notbusysent = FALSE; 1549 d->notbusysent = FALSE;
1550 raiseAppropriateWindow(); 1550 raiseAppropriateWindow();
1551 if ( !p ) { 1551 if ( !p ) {
1552 // Tell the system we're still chugging along... 1552 // Tell the system we're still chugging along...
1553#ifndef QT_NO_COP 1553#ifndef QT_NO_COP
1554 QCopEnvelope e("QPE/System", "appRaised(QString)"); 1554 QCopEnvelope e("QPE/System", "appRaised(QString)");
1555 e << d->appName; 1555 e << d->appName;
1556#endif 1556#endif
1557 } 1557 }
1558 } 1558 }
1559 if ( p ) 1559 if ( p )
1560 d->keep_running = p; 1560 d->keep_running = p;
1561 } 1561 }
1562#endif 1562#endif
1563} 1563}
1564 1564
1565 1565
1566/*! 1566/*!
1567 Sets widget \a mw as the mainWidget() and shows it. For small windows, 1567 Sets widget \a mw as the mainWidget() and shows it. For small windows,
1568 consider passing TRUE for \a nomaximize rather than the default FALSE. 1568 consider passing TRUE for \a nomaximize rather than the default FALSE.
1569 1569
1570 \sa showMainDocumentWidget() 1570 \sa showMainDocumentWidget()
1571*/ 1571*/
1572void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize ) 1572void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize )
1573{ 1573{
1574 setMainWidget(mw);
1574 d->show(mw, nomaximize ); 1575 d->show(mw, nomaximize );
1575} 1576}
1576 1577
1577/*! 1578/*!
1578 Sets widget \a mw as the mainWidget() and shows it. For small windows, 1579 Sets widget \a mw as the mainWidget() and shows it. For small windows,
1579 consider passing TRUE for \a nomaximize rather than the default FALSE. 1580 consider passing TRUE for \a nomaximize rather than the default FALSE.
1580 1581
1581 This calls designates the application as 1582 This calls designates the application as
1582 a \link docwidget.html document-oriented\endlink application. 1583 a \link docwidget.html document-oriented\endlink application.
1583 1584
1584 The \a mw widget \e must have this slot: setDocument(const QString&). 1585 The \a mw widget \e must have this slot: setDocument(const QString&).
1585 1586
1586 \sa showMainWidget() 1587 \sa showMainWidget()
1587*/ 1588*/
1588void QPEApplication::showMainDocumentWidget( QWidget* mw, bool nomaximize ) 1589void QPEApplication::showMainDocumentWidget( QWidget* mw, bool nomaximize )
1589{ 1590{
1590 if ( mw && argc() == 2 ) 1591 if ( mw && argc() == 2 )
1591 Global::setDocument( mw, QString::fromUtf8(argv()[1]) ); 1592 Global::setDocument( mw, QString::fromUtf8(argv()[1]) );
1592 1593
1593 1594
1595 setMainWidget(mw);
1594 d->show(mw, nomaximize ); 1596 d->show(mw, nomaximize );
1595} 1597}
1596 1598
1597 1599
1598/*! 1600/*!
1599 If an application is started via a \link qcop.html QCop\endlink 1601 If an application is started via a \link qcop.html QCop\endlink
1600 message, the application will process the \link qcop.html 1602 message, the application will process the \link qcop.html
1601 QCop\endlink message and then quit. If the application calls this 1603 QCop\endlink message and then quit. If the application calls this
1602 function while processing a \link qcop.html QCop\endlink message, 1604 function while processing a \link qcop.html QCop\endlink message,
1603 after processing its outstanding \link qcop.html QCop\endlink 1605 after processing its outstanding \link qcop.html QCop\endlink
1604 messages the application will start 'properly' and show itself. 1606 messages the application will start 'properly' and show itself.
1605 1607
1606 \sa keepRunning() 1608 \sa keepRunning()
1607*/ 1609*/
1608void QPEApplication::setKeepRunning() 1610void QPEApplication::setKeepRunning()
1609{ 1611{
1610 if ( qApp && qApp->inherits( "QPEApplication" ) ) { 1612 if ( qApp && qApp->inherits( "QPEApplication" ) ) {
1611 QPEApplication * qpeApp = ( QPEApplication* ) qApp; 1613 QPEApplication * qpeApp = ( QPEApplication* ) qApp;
1612 qpeApp->d->keep_running = TRUE; 1614 qpeApp->d->keep_running = TRUE;
1613 } 1615 }
1614} 1616}
1615 1617
1616/*! 1618/*!
1617 Returns TRUE if the application will quit after processing the 1619 Returns TRUE if the application will quit after processing the
1618 current list of qcop messages; otherwise returns FALSE. 1620 current list of qcop messages; otherwise returns FALSE.
1619 1621
1620 \sa setKeepRunning() 1622 \sa setKeepRunning()
1621*/ 1623*/
1622bool QPEApplication::keepRunning() const 1624bool QPEApplication::keepRunning() const
1623{ 1625{
1624 return d->keep_running; 1626 return d->keep_running;
1625} 1627}
1626 1628
1627/*! 1629/*!
1628 \internal 1630 \internal
1629*/ 1631*/
1630void QPEApplication::internalSetStyle( const QString &style ) 1632void QPEApplication::internalSetStyle( const QString &style )
1631{ 1633{
1632#if QT_VERSION >= 300 1634#if QT_VERSION >= 300
1633 if ( style == "QPE" ) { 1635 if ( style == "QPE" ) {
1634 setStyle( new QPEStyle ); 1636 setStyle( new QPEStyle );
1635 } 1637 }
1636 else { 1638 else {
1637 QStyle *s = QStyleFactory::create( style ); 1639 QStyle *s = QStyleFactory::create( style );
1638 if ( s ) 1640 if ( s )
1639 setStyle( s ); 1641 setStyle( s );
1640 } 1642 }
1641#else 1643#else
1642 if ( style == "Windows" ) { 1644 if ( style == "Windows" ) {
1643 setStyle( new QWindowsStyle ); 1645 setStyle( new QWindowsStyle );
1644 } 1646 }
1645 else if ( style == "QPE" ) { 1647 else if ( style == "QPE" ) {
1646 setStyle( new QPEStyle ); 1648 setStyle( new QPEStyle );
1647 } 1649 }
1648 else if ( style == "Light" ) { 1650 else if ( style == "Light" ) {
1649 setStyle( new LightStyle ); 1651 setStyle( new LightStyle );
1650 } 1652 }
1651#ifndef QT_NO_STYLE_PLATINUM 1653#ifndef QT_NO_STYLE_PLATINUM
1652 else if ( style == "Platinum" ) { 1654 else if ( style == "Platinum" ) {
1653 setStyle( new QPlatinumStyle ); 1655 setStyle( new QPlatinumStyle );
1654 } 1656 }
1655#endif 1657#endif
1656#ifndef QT_NO_STYLE_MOTIF 1658#ifndef QT_NO_STYLE_MOTIF
1657 else if ( style == "Motif" ) { 1659 else if ( style == "Motif" ) {
1658 setStyle( new QMotifStyle ); 1660 setStyle( new QMotifStyle );
1659 } 1661 }
1660#endif 1662#endif
1661#ifndef QT_NO_STYLE_MOTIFPLUS 1663#ifndef QT_NO_STYLE_MOTIFPLUS
1662 else if ( style == "MotifPlus" ) { 1664 else if ( style == "MotifPlus" ) {
1663 setStyle( new QMotifPlusStyle ); 1665 setStyle( new QMotifPlusStyle );
1664 } 1666 }
1665#endif 1667#endif
1666 1668
1667 else { 1669 else {
1668 QStyle *sty = 0; 1670 QStyle *sty = 0;
1669 QString path = QPEApplication::qpeDir ( ) + "/plugins/styles/"; 1671 QString path = QPEApplication::qpeDir ( ) + "/plugins/styles/";
1670 1672
1671#ifdef Q_OS_MACX 1673#ifdef Q_OS_MACX
1672 if ( style. find ( ".dylib" ) > 0 ) 1674 if ( style. find ( ".dylib" ) > 0 )
1673 path += style; 1675 path += style;
1674 else 1676 else
1675 path = path + "lib" + style. lower ( ) + ".dylib"; // compatibility 1677 path = path + "lib" + style. lower ( ) + ".dylib"; // compatibility
1676#else 1678#else
1677 if ( style. find ( ".so" ) > 0 ) 1679 if ( style. find ( ".so" ) > 0 )
1678 path += style; 1680 path += style;
1679 else 1681 else
1680 path = path + "lib" + style. lower ( ) + ".so"; // compatibility 1682 path = path + "lib" + style. lower ( ) + ".so"; // compatibility
1681#endif 1683#endif
1682 static QLibrary *lastlib = 0; 1684 static QLibrary *lastlib = 0;
1683 static StyleInterface *lastiface = 0; 1685 static StyleInterface *lastiface = 0;
1684 1686
1685 QLibrary *lib = new QLibrary ( path ); 1687 QLibrary *lib = new QLibrary ( path );
1686 StyleInterface *iface = 0; 1688 StyleInterface *iface = 0;
1687 1689
1688 if (( lib-> queryInterface ( IID_Style, ( QUnknownInterface ** ) &iface ) == QS_OK ) && iface ) 1690 if (( lib-> queryInterface ( IID_Style, ( QUnknownInterface ** ) &iface ) == QS_OK ) && iface )
1689 sty = iface-> style ( ); 1691 sty = iface-> style ( );
1690 1692
1691 if ( sty ) { 1693 if ( sty ) {
1692 setStyle ( sty ); 1694 setStyle ( sty );
1693 1695
1694 if ( lastiface ) 1696 if ( lastiface )
1695 lastiface-> release ( ); 1697 lastiface-> release ( );
1696 lastiface = iface; 1698 lastiface = iface;
1697 1699
1698 if ( lastlib ) { 1700 if ( lastlib ) {
1699 lastlib-> unload ( ); 1701 lastlib-> unload ( );
1700 delete lastlib; 1702 delete lastlib;
1701 } 1703 }
1702 lastlib = lib; 1704 lastlib = lib;
1703 } 1705 }
1704 else { 1706 else {
1705 if ( iface ) 1707 if ( iface )
1706 iface-> release ( ); 1708 iface-> release ( );
1707 delete lib; 1709 delete lib;
1708 1710
1709 setStyle ( new LightStyle ( )); 1711 setStyle ( new LightStyle ( ));
1710 } 1712 }
1711 } 1713 }
1712#endif 1714#endif
1713} 1715}
1714 1716
1715/*! 1717/*!
1716 \internal 1718 \internal
1717*/ 1719*/
1718void QPEApplication::prepareForTermination( bool willrestart ) 1720void QPEApplication::prepareForTermination( bool willrestart )
1719{ 1721{
1720 if ( willrestart ) { 1722 if ( willrestart ) {
1721 // Draw a big wait icon, the image can be altered in later revisions 1723 // Draw a big wait icon, the image can be altered in later revisions
1722 // QWidget *d = QApplication::desktop(); 1724 // QWidget *d = QApplication::desktop();
1723 QImage img = Resource::loadImage( "launcher/new_wait" ); 1725 QImage img = Resource::loadImage( "launcher/new_wait" );
1724 QPixmap pix; 1726 QPixmap pix;
1725 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) ); 1727 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) );
1726 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize | 1728 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize |
1727 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool ); 1729 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool );
1728 lblWait->setPixmap( pix ); 1730 lblWait->setPixmap( pix );
1729 lblWait->setAlignment( QWidget::AlignCenter ); 1731 lblWait->setAlignment( QWidget::AlignCenter );
1730 lblWait->show(); 1732 lblWait->show();
1731 lblWait->showMaximized(); 1733 lblWait->showMaximized();
1732 } 1734 }
1733#ifndef SINGLE_APP 1735#ifndef SINGLE_APP
1734 { QCopEnvelope envelope( "QPE/System", "forceQuit()" ); 1736 { QCopEnvelope envelope( "QPE/System", "forceQuit()" );
1735 } 1737 }
1736 processEvents(); // ensure the message goes out. 1738 processEvents(); // ensure the message goes out.
1737 sleep( 1 ); // You have 1 second to comply. 1739 sleep( 1 ); // You have 1 second to comply.
1738#endif 1740#endif
1739} 1741}
1740 1742
1741/*! 1743/*!
1742 \internal 1744 \internal
1743*/ 1745*/
1744void QPEApplication::shutdown() 1746void QPEApplication::shutdown()
1745{ 1747{
1746 // Implement in server's QPEApplication subclass 1748 // Implement in server's QPEApplication subclass
1747} 1749}
1748 1750
1749/*! 1751/*!
1750 \internal 1752 \internal
1751*/ 1753*/
1752void QPEApplication::restart() 1754void QPEApplication::restart()
1753{ 1755{
1754 // Implement in server's QPEApplication subclass 1756 // Implement in server's QPEApplication subclass
1755} 1757}
1756 1758
1757static QPtrDict<void>* stylusDict = 0; 1759static QPtrDict<void>* stylusDict = 0;
1758static void createDict() 1760static void createDict()
1759{ 1761{
1760 if ( !stylusDict ) 1762 if ( !stylusDict )
1761 stylusDict = new QPtrDict<void>; 1763 stylusDict = new QPtrDict<void>;
1762} 1764}
1763 1765
1764/*! 1766/*!
1765 Returns the current StylusMode for widget \a w. 1767 Returns the current StylusMode for widget \a w.
1766 1768
1767 \sa setStylusOperation() StylusMode 1769 \sa setStylusOperation() StylusMode
1768*/ 1770*/
1769QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w ) 1771QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w )
1770{ 1772{
1771 if ( stylusDict ) 1773 if ( stylusDict )
1772 return ( StylusMode ) ( int ) stylusDict->find( w ); 1774 return ( StylusMode ) ( int ) stylusDict->find( w );
1773 return LeftOnly; 1775 return LeftOnly;
1774} 1776}
1775 1777
1776/*! 1778/*!
1777 \enum QPEApplication::StylusMode 1779 \enum QPEApplication::StylusMode
1778 1780
1779 \value LeftOnly the stylus only generates LeftButton 1781 \value LeftOnly the stylus only generates LeftButton
1780 events (the default). 1782 events (the default).
1781 \value RightOnHold the stylus generates RightButton events 1783 \value RightOnHold the stylus generates RightButton events
1782 if the user uses the press-and-hold gesture. 1784 if the user uses the press-and-hold gesture.
1783 1785
1784 \sa setStylusOperation() stylusOperation() 1786 \sa setStylusOperation() stylusOperation()
1785*/ 1787*/
1786 1788
1787/*! 1789/*!
1788 Causes widget \a w to receive mouse events according to the stylus 1790 Causes widget \a w to receive mouse events according to the stylus
1789 \a mode. 1791 \a mode.
1790 1792
1791 \sa stylusOperation() StylusMode 1793 \sa stylusOperation() StylusMode
1792*/ 1794*/
1793void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode ) 1795void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode )
1794{ 1796{
1795 createDict(); 1797 createDict();
1796 if ( mode == LeftOnly ) { 1798 if ( mode == LeftOnly ) {
1797 stylusDict->remove 1799 stylusDict->remove
1798 ( w ); 1800 ( w );
1799 w->removeEventFilter( qApp ); 1801 w->removeEventFilter( qApp );
1800 } 1802 }
1801 else { 1803 else {
1802 stylusDict->insert( w, ( void* ) mode ); 1804 stylusDict->insert( w, ( void* ) mode );
1803 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) ); 1805 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) );
1804 w->installEventFilter( qApp ); 1806 w->installEventFilter( qApp );
1805 } 1807 }
1806} 1808}
1807 1809
1808 1810
1809/*! 1811/*!
1810 \reimp 1812 \reimp
1811*/ 1813*/
1812bool QPEApplication::eventFilter( QObject *o, QEvent *e ) 1814bool QPEApplication::eventFilter( QObject *o, QEvent *e )
1813{ 1815{
1814 if ( !o->isWidgetType() ) 1816 if ( !o->isWidgetType() )
1815 return FALSE; 1817 return FALSE;
1816 1818
1817 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) { 1819 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) {
1818 QMouseEvent * me = ( QMouseEvent* ) e; 1820 QMouseEvent * me = ( QMouseEvent* ) e;
1819 StylusMode mode = (StylusMode)(int)stylusDict->find(o); 1821 StylusMode mode = (StylusMode)(int)stylusDict->find(o);
1820 switch (mode) { 1822 switch (mode) {
1821 case RightOnHold: 1823 case RightOnHold:
1822 switch ( me->type() ) { 1824 switch ( me->type() ) {
1823 case QEvent::MouseButtonPress: 1825 case QEvent::MouseButtonPress:
1824 if ( me->button() == LeftButton ) { 1826 if ( me->button() == LeftButton ) {
1825 if (!d->presstimer ) 1827 if (!d->presstimer )
1826 d->presstimer = startTimer(500); // #### pref. 1828 d->presstimer = startTimer(500); // #### pref.
1827 d->presswidget = (QWidget*)o; 1829 d->presswidget = (QWidget*)o;
1828 d->presspos = me->pos(); 1830 d->presspos = me->pos();
1829 d->rightpressed = FALSE; 1831 d->rightpressed = FALSE;
1830 } 1832 }
1831 break; 1833 break;
1832 case QEvent::MouseMove: 1834 case QEvent::MouseMove:
1833 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) { 1835 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) {
1834 killTimer(d->presstimer); 1836 killTimer(d->presstimer);
1835 d->presstimer = 0; 1837 d->presstimer = 0;
1836 } 1838 }
1837 break; 1839 break;
1838 case QEvent::MouseButtonRelease: 1840 case QEvent::MouseButtonRelease:
1839 if ( me->button() == LeftButton ) { 1841 if ( me->button() == LeftButton ) {
1840 if ( d->presstimer ) { 1842 if ( d->presstimer ) {
1841 killTimer(d->presstimer); 1843 killTimer(d->presstimer);
1842 d->presstimer = 0; 1844 d->presstimer = 0;
1843 } 1845 }
1844 if ( d->rightpressed && d->presswidget ) { 1846 if ( d->rightpressed && d->presswidget ) {
1845 // Right released 1847 // Right released
1846 postEvent( d->presswidget, 1848 postEvent( d->presswidget,
1847 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(), 1849 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(),
1848 RightButton, LeftButton + RightButton ) ); 1850 RightButton, LeftButton + RightButton ) );
1849 // Left released, off-widget 1851 // Left released, off-widget
1850 postEvent( d->presswidget, 1852 postEvent( d->presswidget,
1851 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1), 1853 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1),
1852 LeftButton, LeftButton ) ); 1854 LeftButton, LeftButton ) );
1853 postEvent( d->presswidget, 1855 postEvent( d->presswidget,
1854 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1), 1856 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1),
1855 LeftButton, LeftButton ) ); 1857 LeftButton, LeftButton ) );
1856 d->rightpressed = FALSE; 1858 d->rightpressed = FALSE;
1857 return TRUE; // don't send the real Left release 1859 return TRUE; // don't send the real Left release
1858 } 1860 }
1859 } 1861 }
1860 break; 1862 break;
1861 default: 1863 default:
1862 break; 1864 break;
1863 } 1865 }
1864 break; 1866 break;
1865 default: 1867 default:
1866 ; 1868 ;
1867 } 1869 }
1868 } 1870 }
1869 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { 1871 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
1870 QKeyEvent *ke = (QKeyEvent *)e; 1872 QKeyEvent *ke = (QKeyEvent *)e;
1871 if ( ke->key() == Key_Enter ) { 1873 if ( ke->key() == Key_Enter ) {
1872 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) { 1874 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) {
1873 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ', 1875 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ',
1874 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) ); 1876 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) );
1875 return TRUE; 1877 return TRUE;
1876 } 1878 }
1877 } 1879 }
1878 } 1880 }
1879 return FALSE; 1881 return FALSE;
1880} 1882}
1881 1883
1882/*! 1884/*!
1883 \reimp 1885 \reimp
1884*/ 1886*/
1885void QPEApplication::timerEvent( QTimerEvent *e ) 1887void QPEApplication::timerEvent( QTimerEvent *e )
1886{ 1888{
1887 if ( e->timerId() == d->presstimer && d->presswidget ) { 1889 if ( e->timerId() == d->presstimer && d->presswidget ) {
1888 // Right pressed 1890 // Right pressed
1889 postEvent( d->presswidget, 1891 postEvent( d->presswidget,
1890 new QMouseEvent( QEvent::MouseButtonPress, d->presspos, 1892 new QMouseEvent( QEvent::MouseButtonPress, d->presspos,
1891 RightButton, LeftButton ) ); 1893 RightButton, LeftButton ) );
1892 killTimer( d->presstimer ); 1894 killTimer( d->presstimer );
1893 d->presstimer = 0; 1895 d->presstimer = 0;
1894 d->rightpressed = TRUE; 1896 d->rightpressed = TRUE;
1895 } 1897 }
1896} 1898}
1897 1899
1898void QPEApplication::removeSenderFromStylusDict() 1900void QPEApplication::removeSenderFromStylusDict()
1899{ 1901{
1900 stylusDict->remove 1902 stylusDict->remove
1901 ( ( void* ) sender() ); 1903 ( ( void* ) sender() );
1902 if ( d->presswidget == sender() ) 1904 if ( d->presswidget == sender() )
1903 d->presswidget = 0; 1905 d->presswidget = 0;
1904} 1906}
1905 1907
1906/*! 1908/*!
1907 \internal 1909 \internal
1908*/ 1910*/
1909bool QPEApplication::keyboardGrabbed() const 1911bool QPEApplication::keyboardGrabbed() const
1910{ 1912{
1911 return d->kbgrabbed; 1913 return d->kbgrabbed;
1912} 1914}
1913 1915
1914 1916
1915/*! 1917/*!
1916 Reverses the effect of grabKeyboard(). This is called automatically 1918 Reverses the effect of grabKeyboard(). This is called automatically
1917 on program exit. 1919 on program exit.
1918*/ 1920*/
1919void QPEApplication::ungrabKeyboard() 1921void QPEApplication::ungrabKeyboard()
1920{ 1922{
1921 ((QPEApplication *) qApp )-> d-> kbgrabbed = false; 1923 ((QPEApplication *) qApp )-> d-> kbgrabbed = false;
1922} 1924}
1923 1925
1924/*! 1926/*!
1925 Grabs the physical keyboard keys, e.g. the application's launching 1927 Grabs the physical keyboard keys, e.g. the application's launching
1926 keys. Instead of launching applications when these keys are pressed 1928 keys. Instead of launching applications when these keys are pressed
1927 the signals emitted are sent to this application instead. Some games 1929 the signals emitted are sent to this application instead. Some games
1928 programs take over the launch keys in this way to make interaction 1930 programs take over the launch keys in this way to make interaction
1929 easier. 1931 easier.
1930 1932
1931 \sa ungrabKeyboard() 1933 \sa ungrabKeyboard()
1932*/ 1934*/
1933void QPEApplication::grabKeyboard() 1935void QPEApplication::grabKeyboard()
1934{ 1936{
1935 ((QPEApplication *) qApp )-> d-> kbgrabbed = true; 1937 ((QPEApplication *) qApp )-> d-> kbgrabbed = true;
1936} 1938}
1937 1939
1938/*! 1940/*!
1939 \reimp 1941 \reimp
1940*/ 1942*/
1941int QPEApplication::exec() 1943int QPEApplication::exec()
1942{ 1944{
1943 d->qcopQok = true; 1945 d->qcopQok = true;
1944#ifndef QT_NO_COP 1946#ifndef QT_NO_COP
1945 d->sendQCopQ(); 1947 d->sendQCopQ();
1946 if ( !d->keep_running ) 1948 if ( !d->keep_running )
1947 processEvents(); // we may have received QCop messages in the meantime. 1949 processEvents(); // we may have received QCop messages in the meantime.
1948#endif 1950#endif
1949 1951
1950 if ( d->keep_running ) 1952 if ( d->keep_running )
1951 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() ) 1953 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() )
1952 return QApplication::exec(); 1954 return QApplication::exec();
1953 1955
1954#ifndef QT_NO_COP 1956#ifndef QT_NO_COP
1955 1957
1956 { 1958 {
1957 QCopEnvelope e( "QPE/System", "closing(QString)" ); 1959 QCopEnvelope e( "QPE/System", "closing(QString)" );
1958 e << d->appName; 1960 e << d->appName;
1959 } 1961 }
1960#endif 1962#endif
1961 processEvents(); 1963 processEvents();
1962 return 0; 1964 return 0;
1963} 1965}
1964 1966
1965/*! 1967/*!
1966 \internal 1968 \internal
1967 External request for application to quit. Quits if possible without 1969 External request for application to quit. Quits if possible without
1968 loosing state. 1970 loosing state.
1969*/ 1971*/
1970void QPEApplication::tryQuit() 1972void QPEApplication::tryQuit()
1971{ 1973{
1972 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 ) 1974 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 )
1973 return ; // Inside modal loop or konsole. Too hard to save state. 1975 return ; // Inside modal loop or konsole. Too hard to save state.
1974#ifndef QT_NO_COP 1976#ifndef QT_NO_COP
1975 1977
1976 { 1978 {
1977 QCopEnvelope e( "QPE/System", "closing(QString)" ); 1979 QCopEnvelope e( "QPE/System", "closing(QString)" );
1978 e << d->appName; 1980 e << d->appName;
1979 } 1981 }
1980#endif 1982#endif
1981 processEvents(); 1983 processEvents();
1982 1984
1983 quit(); 1985 quit();
1984} 1986}
1985 1987
1986/*! 1988/*!
1987 \internal 1989 \internal
1988*/ 1990*/
1989void QPEApplication::installTranslation( const QString& baseName ) { 1991void QPEApplication::installTranslation( const QString& baseName ) {
1990 QTranslator* trans = new QTranslator(this); 1992 QTranslator* trans = new QTranslator(this);
1991 QString tfn = qpeDir() + "/i18n/"+baseName; 1993 QString tfn = qpeDir() + "/i18n/"+baseName;
1992 if ( trans->load( tfn ) ) 1994 if ( trans->load( tfn ) )
1993 installTranslator( trans ); 1995 installTranslator( trans );
1994 else 1996 else
1995 delete trans; 1997 delete trans;
1996} 1998}
1997 1999
1998/*! 2000/*!
1999 \internal 2001 \internal
2000 User initiated quit. Makes the window 'Go Away'. If preloaded this means 2002 User initiated quit. Makes the window 'Go Away'. If preloaded this means
2001 hiding the window. If not it means quitting the application. 2003 hiding the window. If not it means quitting the application.
2002 As this is user initiated we don't need to check state. 2004 As this is user initiated we don't need to check state.
2003*/ 2005*/
2004void QPEApplication::hideOrQuit() 2006void QPEApplication::hideOrQuit()
2005{ 2007{
2006 processEvents(); 2008 processEvents();
2007 2009
2008 // If we are a preloaded application we don't actually quit, so emit 2010 // If we are a preloaded application we don't actually quit, so emit
2009 // a System message indicating we're quasi-closing. 2011 // a System message indicating we're quasi-closing.
2010 if ( d->preloaded && d->qpe_main_widget ) 2012 if ( d->preloaded && d->qpe_main_widget )
2011#ifndef QT_NO_COP 2013#ifndef QT_NO_COP
2012 2014
2013 { 2015 {
2014 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" ); 2016 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" );
2015 e << d->appName; 2017 e << d->appName;
2016 d->qpe_main_widget->hide(); 2018 d->qpe_main_widget->hide();
2017 } 2019 }
2018#endif 2020#endif
2019 else 2021 else
2020 quit(); 2022 quit();
2021} 2023}
2022 2024
2023#if (__GNUC__ > 2 ) 2025#if (__GNUC__ > 2 )
2024extern "C" void __cxa_pure_virtual(); 2026extern "C" void __cxa_pure_virtual();
2025 2027
2026void __cxa_pure_virtual() 2028void __cxa_pure_virtual()
2027{ 2029{
2028 fprintf( stderr, "Pure virtual called\n"); 2030 fprintf( stderr, "Pure virtual called\n");
2029 abort(); 2031 abort();
2030 2032
2031} 2033}
2032 2034
2033#endif 2035#endif
2034 2036
2035 2037
2036#if defined(OPIE_NEW_MALLOC) 2038#if defined(OPIE_NEW_MALLOC)
2037 2039
2038// The libraries with the skiff package (and possibly others) have 2040// The libraries with the skiff package (and possibly others) have
2039// completely useless implementations of builtin new and delete that 2041// completely useless implementations of builtin new and delete that
2040// use about 50% of your CPU. Here we revert to the simple libc 2042// use about 50% of your CPU. Here we revert to the simple libc
2041// functions. 2043// functions.
2042 2044
2043void* operator new[]( size_t size ) 2045void* operator new[]( size_t size )
2044{ 2046{
2045 return malloc( size ); 2047 return malloc( size );
2046} 2048}
2047 2049
2048void* operator new( size_t size ) 2050void* operator new( size_t size )
2049{ 2051{
2050 return malloc( size ); 2052 return malloc( size );
2051} 2053}
2052 2054
2053void operator delete[]( void* p ) 2055void operator delete[]( void* p )
2054{ 2056{
2055 free( p ); 2057 free( p );
2056} 2058}
2057 2059
2058void operator delete[]( void* p, size_t /*size*/ ) 2060void operator delete[]( void* p, size_t /*size*/ )
2059{ 2061{
2060 free( p ); 2062 free( p );
2061} 2063}
2062 2064
2063 2065
2064void operator delete( void* p ) 2066void operator delete( void* p )
2065{ 2067{
2066 free( p ); 2068 free( p );
2067} 2069}
2068 2070
2069void operator delete( void* p, size_t /*size*/ ) 2071void operator delete( void* p, size_t /*size*/ )
2070{ 2072{
2071 free( p ); 2073 free( p );
2072} 2074}
2073 2075
2074#endif 2076#endif
2075 2077
2076#if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP) 2078#if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP)
2077#include <qwidgetlist.h> 2079#include <qwidgetlist.h>
2078#ifdef QWS 2080#ifdef QWS
2079#include <qgfx_qws.h> 2081#include <qgfx_qws.h>
2080extern QRect qt_maxWindowRect; 2082extern QRect qt_maxWindowRect;
2081void qt_setMaxWindowRect(const QRect& r ) 2083void qt_setMaxWindowRect(const QRect& r )
2082{ 2084{
2083 qt_maxWindowRect = qt_screen->mapFromDevice( r, 2085 qt_maxWindowRect = qt_screen->mapFromDevice( r,
2084 qt_screen->mapToDevice( QSize( qt_screen->width(), qt_screen->height() ) ) ); 2086 qt_screen->mapToDevice( QSize( qt_screen->width(), qt_screen->height() ) ) );
2085 // Re-resize any maximized windows 2087 // Re-resize any maximized windows
2086 QWidgetList* l = QApplication::topLevelWidgets(); 2088 QWidgetList* l = QApplication::topLevelWidgets();
2087 if ( l ) { 2089 if ( l ) {
2088 QWidget * w = l->first(); 2090 QWidget * w = l->first();
2089 while ( w ) { 2091 while ( w ) {
2090 if ( w->isVisible() && w->isMaximized() ) { 2092 if ( w->isVisible() && w->isMaximized() ) {
2091 w->showMaximized(); 2093 w->showMaximized();
2092 } 2094 }
2093 w = l->next(); 2095 w = l->next();
2094 } 2096 }
2095 delete l; 2097 delete l;
2096 } 2098 }
2097} 2099}
2098#endif 2100#endif
2099#endif 2101#endif