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