summaryrefslogtreecommitdiff
path: root/library
Unidiff
Diffstat (limited to 'library') (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp1
1 files changed, 1 insertions, 0 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index c8e6e74..c782837 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -1,1048 +1,1049 @@
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** $Id$ 19** $Id$
20** 20**
21**********************************************************************/ 21**********************************************************************/
22#define QTOPIA_INTERNAL_LANGLIST 22#define QTOPIA_INTERNAL_LANGLIST
23#include <stdlib.h> 23#include <stdlib.h>
24#include <unistd.h> 24#include <unistd.h>
25#include <linux/limits.h> // needed for some toolchains (PATH_MAX)
25#include <qfile.h> 26#include <qfile.h>
26#ifdef Q_WS_QWS 27#ifdef Q_WS_QWS
27#ifndef QT_NO_COP 28#ifndef QT_NO_COP
28#if QT_VERSION <= 231 29#if QT_VERSION <= 231
29#define private public 30#define private public
30#define sendLocally processEvent 31#define sendLocally processEvent
31#include "qcopenvelope_qws.h" 32#include "qcopenvelope_qws.h"
32#undef private 33#undef private
33#else 34#else
34#include "qcopenvelope_qws.h" 35#include "qcopenvelope_qws.h"
35#endif 36#endif
36#endif 37#endif
37#include <qwindowsystem_qws.h> 38#include <qwindowsystem_qws.h>
38#endif 39#endif
39#include <qtextstream.h> 40#include <qtextstream.h>
40#include <qpalette.h> 41#include <qpalette.h>
41#include <qbuffer.h> 42#include <qbuffer.h>
42#include <qptrdict.h> 43#include <qptrdict.h>
43#include <qregexp.h> 44#include <qregexp.h>
44#include <qdir.h> 45#include <qdir.h>
45#include <qlabel.h> 46#include <qlabel.h>
46#include <qdialog.h> 47#include <qdialog.h>
47#include <qdragobject.h> 48#include <qdragobject.h>
48#include <qtextcodec.h> 49#include <qtextcodec.h>
49#include <qevent.h> 50#include <qevent.h>
50#include <qtooltip.h> 51#include <qtooltip.h>
51#include <qsignal.h> 52#include <qsignal.h>
52#include "qpeapplication.h" 53#include "qpeapplication.h"
53#include "qpestyle.h" 54#include "qpestyle.h"
54#include "styleinterface.h" 55#include "styleinterface.h"
55#if QT_VERSION >= 300 56#if QT_VERSION >= 300
56#include <qstylefactory.h> 57#include <qstylefactory.h>
57#else 58#else
58#include <qplatinumstyle.h> 59#include <qplatinumstyle.h>
59#include <qwindowsstyle.h> 60#include <qwindowsstyle.h>
60#include <qmotifstyle.h> 61#include <qmotifstyle.h>
61#include <qmotifplusstyle.h> 62#include <qmotifplusstyle.h>
62#include "lightstyle.h" 63#include "lightstyle.h"
63 64
64#include <qpe/qlibrary.h> 65#include <qpe/qlibrary.h>
65#endif 66#endif
66#include "global.h" 67#include "global.h"
67#include "resource.h" 68#include "resource.h"
68#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 69#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
69#include "qutfcodec.h" 70#include "qutfcodec.h"
70#endif 71#endif
71#include "config.h" 72#include "config.h"
72#include "network.h" 73#include "network.h"
73#ifdef QWS 74#ifdef QWS
74#include "fontmanager.h" 75#include "fontmanager.h"
75#endif 76#endif
76 77
77#include "alarmserver.h" 78#include "alarmserver.h"
78#include "applnk.h" 79#include "applnk.h"
79#include "qpemenubar.h" 80#include "qpemenubar.h"
80#include "textcodecinterface.h" 81#include "textcodecinterface.h"
81#include "imagecodecinterface.h" 82#include "imagecodecinterface.h"
82 83
83#include <unistd.h> 84#include <unistd.h>
84#include <sys/file.h> 85#include <sys/file.h>
85#include <sys/ioctl.h> 86#include <sys/ioctl.h>
86#include <sys/soundcard.h> 87#include <sys/soundcard.h>
87 88
88 89
89class QPEApplicationData 90class QPEApplicationData
90{ 91{
91public: 92public:
92 QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), rightpressed( FALSE ), 93 QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), rightpressed( FALSE ),
93 kbgrabber( 0 ), kbregrab( FALSE ), notbusysent( FALSE ), preloaded( FALSE ), 94 kbgrabber( 0 ), kbregrab( FALSE ), notbusysent( FALSE ), preloaded( FALSE ),
94 forceshow( FALSE ), nomaximize( FALSE ), qpe_main_widget( 0 ), 95 forceshow( FALSE ), nomaximize( FALSE ), qpe_main_widget( 0 ),
95 keep_running( TRUE ) 96 keep_running( TRUE )
96 { 97 {
97 qcopq.setAutoDelete( TRUE ); 98 qcopq.setAutoDelete( TRUE );
98 } 99 }
99 100
100 int presstimer; 101 int presstimer;
101 QWidget* presswidget; 102 QWidget* presswidget;
102 QPoint presspos; 103 QPoint presspos;
103bool rightpressed : 104bool rightpressed :
104 1; // AEH why not use uint foobar :1; if it's tt style -zecke 105 1; // AEH why not use uint foobar :1; if it's tt style -zecke
105 int kbgrabber; 106 int kbgrabber;
106bool kbregrab : 107bool kbregrab :
107 1; 108 1;
108bool notbusysent : 109bool notbusysent :
109 1; 110 1;
110 QString appName; 111 QString appName;
111 struct QCopRec 112 struct QCopRec
112 { 113 {
113 QCopRec( const QCString &ch, const QCString &msg, 114 QCopRec( const QCString &ch, const QCString &msg,
114 const QByteArray &d ) : 115 const QByteArray &d ) :
115 channel( ch ), message( msg ), data( d ) 116 channel( ch ), message( msg ), data( d )
116 { } 117 { }
117 118
118 QCString channel; 119 QCString channel;
119 QCString message; 120 QCString message;
120 QByteArray data; 121 QByteArray data;
121 }; 122 };
122bool preloaded : 123bool preloaded :
123 1; 124 1;
124bool forceshow : 125bool forceshow :
125 1; 126 1;
126bool nomaximize : 127bool nomaximize :
127 1; 128 1;
128 QWidget* qpe_main_widget; 129 QWidget* qpe_main_widget;
129bool keep_running : 130bool keep_running :
130 1; 131 1;
131 QList<QCopRec> qcopq; 132 QList<QCopRec> qcopq;
132 133
133 void enqueueQCop( const QCString &ch, const QCString &msg, 134 void enqueueQCop( const QCString &ch, const QCString &msg,
134 const QByteArray &data ) 135 const QByteArray &data )
135 { 136 {
136 qcopq.append( new QCopRec( ch, msg, data ) ); 137 qcopq.append( new QCopRec( ch, msg, data ) );
137 } 138 }
138 void sendQCopQ() 139 void sendQCopQ()
139 { 140 {
140 QCopRec * r; 141 QCopRec * r;
141#ifndef QT_NO_COP 142#ifndef QT_NO_COP
142 143
143 for ( QListIterator<QCopRec> it( qcopq ); ( r = it.current() ); ++it ) 144 for ( QListIterator<QCopRec> it( qcopq ); ( r = it.current() ); ++it )
144 QCopChannel::sendLocally( r->channel, r->message, r->data ); 145 QCopChannel::sendLocally( r->channel, r->message, r->data );
145#endif 146#endif
146 147
147 qcopq.clear(); 148 qcopq.clear();
148 } 149 }
149 static void show_mx(QWidget* mw, bool nomaximize) 150 static void show_mx(QWidget* mw, bool nomaximize)
150 { 151 {
151 if ( mw->layout() && mw->inherits("QDialog") ) { 152 if ( mw->layout() && mw->inherits("QDialog") ) {
152 QPEApplication::showDialog((QDialog*)mw, nomaximize); 153 QPEApplication::showDialog((QDialog*)mw, nomaximize);
153 } 154 }
154 else { 155 else {
155#ifdef Q_WS_QWS 156#ifdef Q_WS_QWS
156 if ( !nomaximize ) 157 if ( !nomaximize )
157 mw->showMaximized(); 158 mw->showMaximized();
158 else 159 else
159#endif 160#endif
160 161
161 mw->show(); 162 mw->show();
162 } 163 }
163 } 164 }
164 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ ) 165 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ )
165 { 166 {
166 /* 167 /*
167 // This works but disable it for now until it is safe to apply 168 // This works but disable it for now until it is safe to apply
168 // What is does is scan the .desktop files of all the apps for 169 // What is does is scan the .desktop files of all the apps for
169 // the applnk that has the corresponding argv[0] as this program 170 // the applnk that has the corresponding argv[0] as this program
170 // then it uses the name stored in the .desktop file as the caption 171 // then it uses the name stored in the .desktop file as the caption
171 // for the main widget. This saves duplicating translations for 172 // for the main widget. This saves duplicating translations for
172 // the app name in the program and in the .desktop files. 173 // the app name in the program and in the .desktop files.
173 174
174 AppLnkSet apps( appsPath ); 175 AppLnkSet apps( appsPath );
175 176
176 QList<AppLnk> appsList = apps.children(); 177 QList<AppLnk> appsList = apps.children();
177 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) { 178 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) {
178 if ( (*it)->exec() == appName ) { 179 if ( (*it)->exec() == appName ) {
179 mw->setCaption( (*it)->name() ); 180 mw->setCaption( (*it)->name() );
180 return TRUE; 181 return TRUE;
181 } 182 }
182 } 183 }
183 */ 184 */
184 return FALSE; 185 return FALSE;
185 } 186 }
186 187
187 188
188 void show(QWidget* mw, bool nomax) 189 void show(QWidget* mw, bool nomax)
189 { 190 {
190 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" ); 191 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" );
191 nomaximize = nomax; 192 nomaximize = nomax;
192 qpe_main_widget = mw; 193 qpe_main_widget = mw;
193#ifndef QT_NO_COP 194#ifndef QT_NO_COP
194 195
195 sendQCopQ(); 196 sendQCopQ();
196#endif 197#endif
197 198
198 if ( preloaded ) { 199 if ( preloaded ) {
199 if (forceshow) 200 if (forceshow)
200 show_mx(mw, nomax); 201 show_mx(mw, nomax);
201 } 202 }
202 else if ( keep_running ) { 203 else if ( keep_running ) {
203 show_mx(mw, nomax); 204 show_mx(mw, nomax);
204 } 205 }
205 } 206 }
206 207
207 void loadTextCodecs() 208 void loadTextCodecs()
208 { 209 {
209 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs"; 210 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs";
210 QDir dir( path, "lib*.so" ); 211 QDir dir( path, "lib*.so" );
211 QStringList list = dir.entryList(); 212 QStringList list = dir.entryList();
212 QStringList::Iterator it; 213 QStringList::Iterator it;
213 for ( it = list.begin(); it != list.end(); ++it ) { 214 for ( it = list.begin(); it != list.end(); ++it ) {
214 TextCodecInterface *iface = 0; 215 TextCodecInterface *iface = 0;
215 QLibrary *lib = new QLibrary( path + "/" + *it ); 216 QLibrary *lib = new QLibrary( path + "/" + *it );
216 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 217 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
217 QValueList<int> mibs = iface->mibEnums(); 218 QValueList<int> mibs = iface->mibEnums();
218 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) { 219 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) {
219 (void)iface->createForMib(*i); 220 (void)iface->createForMib(*i);
220 // ### it exists now; need to remember if we can delete it 221 // ### it exists now; need to remember if we can delete it
221 } 222 }
222 } 223 }
223 else { 224 else {
224 lib->unload(); 225 lib->unload();
225 delete lib; 226 delete lib;
226 } 227 }
227 } 228 }
228 } 229 }
229 230
230 void loadImageCodecs() 231 void loadImageCodecs()
231 { 232 {
232 QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs"; 233 QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs";
233 QDir dir( path, "lib*.so" ); 234 QDir dir( path, "lib*.so" );
234 QStringList list = dir.entryList(); 235 QStringList list = dir.entryList();
235 QStringList::Iterator it; 236 QStringList::Iterator it;
236 for ( it = list.begin(); it != list.end(); ++it ) { 237 for ( it = list.begin(); it != list.end(); ++it ) {
237 ImageCodecInterface *iface = 0; 238 ImageCodecInterface *iface = 0;
238 QLibrary *lib = new QLibrary( path + "/" + *it ); 239 QLibrary *lib = new QLibrary( path + "/" + *it );
239 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 240 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
240 QStringList formats = iface->keys(); 241 QStringList formats = iface->keys();
241 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) { 242 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) {
242 (void)iface->installIOHandler(*i); 243 (void)iface->installIOHandler(*i);
243 // ### it exists now; need to remember if we can delete it 244 // ### it exists now; need to remember if we can delete it
244 } 245 }
245 } 246 }
246 else { 247 else {
247 lib->unload(); 248 lib->unload();
248 delete lib; 249 delete lib;
249 } 250 }
250 } 251 }
251 } 252 }
252 QString styleName; 253 QString styleName;
253 QString decorationName; 254 QString decorationName;
254}; 255};
255 256
256class ResourceMimeFactory : public QMimeSourceFactory 257class ResourceMimeFactory : public QMimeSourceFactory
257{ 258{
258public: 259public:
259 ResourceMimeFactory() 260 ResourceMimeFactory()
260 { 261 {
261 setFilePath( Global::helpPath() ); 262 setFilePath( Global::helpPath() );
262 setExtensionType( "html", "text/html;charset=UTF-8" ); 263 setExtensionType( "html", "text/html;charset=UTF-8" );
263 } 264 }
264 265
265 const QMimeSource* data( const QString& abs_name ) const 266 const QMimeSource* data( const QString& abs_name ) const
266 { 267 {
267 const QMimeSource * r = QMimeSourceFactory::data( abs_name ); 268 const QMimeSource * r = QMimeSourceFactory::data( abs_name );
268 if ( !r ) { 269 if ( !r ) {
269 int sl = abs_name.length(); 270 int sl = abs_name.length();
270 do { 271 do {
271 sl = abs_name.findRev( '/', sl - 1 ); 272 sl = abs_name.findRev( '/', sl - 1 );
272 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name; 273 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name;
273 int dot = name.findRev( '.' ); 274 int dot = name.findRev( '.' );
274 if ( dot >= 0 ) 275 if ( dot >= 0 )
275 name = name.left( dot ); 276 name = name.left( dot );
276 QImage img = Resource::loadImage( name ); 277 QImage img = Resource::loadImage( name );
277 if ( !img.isNull() ) 278 if ( !img.isNull() )
278 r = new QImageDrag( img ); 279 r = new QImageDrag( img );
279 } 280 }
280 while ( !r && sl > 0 ); 281 while ( !r && sl > 0 );
281 } 282 }
282 return r; 283 return r;
283 } 284 }
284}; 285};
285 286
286static int muted = 0; 287static int muted = 0;
287static int micMuted = 0; 288static int micMuted = 0;
288 289
289static void setVolume( int t = 0, int percent = -1 ) 290static void setVolume( int t = 0, int percent = -1 )
290{ 291{
291 switch ( t ) { 292 switch ( t ) {
292 case 0: { 293 case 0: {
293 Config cfg( "qpe" ); 294 Config cfg( "qpe" );
294 cfg.setGroup( "Volume" ); 295 cfg.setGroup( "Volume" );
295 if ( percent < 0 ) 296 if ( percent < 0 )
296 percent = cfg.readNumEntry( "VolumePercent", 50 ); 297 percent = cfg.readNumEntry( "VolumePercent", 50 );
297 int fd = 0; 298 int fd = 0;
298 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 299 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
299 int vol = muted ? 0 : percent; 300 int vol = muted ? 0 : percent;
300 // set both channels to same volume 301 // set both channels to same volume
301 vol |= vol << 8; 302 vol |= vol << 8;
302 ioctl( fd, MIXER_WRITE( 0 ), &vol ); 303 ioctl( fd, MIXER_WRITE( 0 ), &vol );
303 ::close( fd ); 304 ::close( fd );
304 } 305 }
305 } 306 }
306 break; 307 break;
307 } 308 }
308} 309}
309 310
310static void setMic( int t = 0, int percent = -1 ) 311static void setMic( int t = 0, int percent = -1 )
311{ 312{
312 switch ( t ) { 313 switch ( t ) {
313 case 0: { 314 case 0: {
314 Config cfg( "qpe" ); 315 Config cfg( "qpe" );
315 cfg.setGroup( "Volume" ); 316 cfg.setGroup( "Volume" );
316 if ( percent < 0 ) 317 if ( percent < 0 )
317 percent = cfg.readNumEntry( "Mic", 50 ); 318 percent = cfg.readNumEntry( "Mic", 50 );
318 319
319 int fd = 0; 320 int fd = 0;
320 int mic = micMuted ? 0 : percent; 321 int mic = micMuted ? 0 : percent;
321 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 322 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
322 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic ); 323 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic );
323 ::close( fd ); 324 ::close( fd );
324 } 325 }
325 } 326 }
326 break; 327 break;
327 } 328 }
328} 329}
329 330
330 331
331/*! 332/*!
332 \class QPEApplication qpeapplication.h 333 \class QPEApplication qpeapplication.h
333 \brief The QPEApplication class implements various system services 334 \brief The QPEApplication class implements various system services
334 that are available to all Qtopia applications. 335 that are available to all Qtopia applications.
335 336
336 Simply by using QPEApplication instead of QApplication, a standard Qt 337 Simply by using QPEApplication instead of QApplication, a standard Qt
337 application becomes a Qtopia application. It automatically follows 338 application becomes a Qtopia application. It automatically follows
338 style changes, quits and raises, and in the 339 style changes, quits and raises, and in the
339 case of \link docwidget.html document-oriented\endlink applications, 340 case of \link docwidget.html document-oriented\endlink applications,
340 changes the currently displayed document in response to the environment. 341 changes the currently displayed document in response to the environment.
341 342
342 To create a \link docwidget.html document-oriented\endlink 343 To create a \link docwidget.html document-oriented\endlink
343 application use showMainDocumentWidget(); to create a 344 application use showMainDocumentWidget(); to create a
344 non-document-oriented application use showMainWidget(). The 345 non-document-oriented application use showMainWidget(). The
345 keepRunning() function indicates whether the application will 346 keepRunning() function indicates whether the application will
346 continue running after it's processed the last \link qcop.html 347 continue running after it's processed the last \link qcop.html
347 QCop\endlink message. This can be changed using setKeepRunning(). 348 QCop\endlink message. This can be changed using setKeepRunning().
348 349
349 A variety of signals are emitted when certain events occur, for 350 A variety of signals are emitted when certain events occur, for
350 example, timeChanged(), clockChanged(), weekChanged(), 351 example, timeChanged(), clockChanged(), weekChanged(),
351 dateFormatChanged() and volumeChanged(). If the application receives 352 dateFormatChanged() and volumeChanged(). If the application receives
352 a \link qcop.html QCop\endlink message on the application's 353 a \link qcop.html QCop\endlink message on the application's
353 QPE/Application/\e{appname} channel, the appMessage() signal is 354 QPE/Application/\e{appname} channel, the appMessage() signal is
354 emitted. There are also flush() and reload() signals, which 355 emitted. There are also flush() and reload() signals, which
355 are emitted when synching begins and ends respectively - upon these 356 are emitted when synching begins and ends respectively - upon these
356 signals, the application should save and reload any data 357 signals, the application should save and reload any data
357 files that are involved in synching. Most of these signals will initially 358 files that are involved in synching. Most of these signals will initially
358 be received and unfiltered through the appMessage() signal. 359 be received and unfiltered through the appMessage() signal.
359 360
360 This class also provides a set of useful static functions. The 361 This class also provides a set of useful static functions. The
361 qpeDir() and documentDir() functions return the respective paths. 362 qpeDir() and documentDir() functions return the respective paths.
362 The grabKeyboard() and ungrabKeyboard() functions are used to 363 The grabKeyboard() and ungrabKeyboard() functions are used to
363 control whether the application takes control of the device's 364 control whether the application takes control of the device's
364 physical buttons (e.g. application launch keys). The stylus' mode of 365 physical buttons (e.g. application launch keys). The stylus' mode of
365 operation is set with setStylusOperation() and retrieved with 366 operation is set with setStylusOperation() and retrieved with
366 stylusOperation(). There are also setInputMethodHint() and 367 stylusOperation(). There are also setInputMethodHint() and
367 inputMethodHint() functions. 368 inputMethodHint() functions.
368 369
369 \ingroup qtopiaemb 370 \ingroup qtopiaemb
370*/ 371*/
371 372
372/*! 373/*!
373 \fn void QPEApplication::clientMoused() 374 \fn void QPEApplication::clientMoused()
374 375
375 \internal 376 \internal
376*/ 377*/
377 378
378/*! 379/*!
379 \fn void QPEApplication::timeChanged(); 380 \fn void QPEApplication::timeChanged();
380 This signal is emitted when the time changes outside the normal 381 This signal is emitted when the time changes outside the normal
381 passage of time, i.e. if the time is set backwards or forwards. 382 passage of time, i.e. if the time is set backwards or forwards.
382*/ 383*/
383 384
384/*! 385/*!
385 \fn void QPEApplication::clockChanged( bool ampm ); 386 \fn void QPEApplication::clockChanged( bool ampm );
386 387
387 This signal is emitted when the user changes the clock's style. If 388 This signal is emitted when the user changes the clock's style. If
388 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise, 389 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise,
389 they want a 24-hour clock. 390 they want a 24-hour clock.
390*/ 391*/
391 392
392/*! 393/*!
393 \fn void QPEApplication::volumeChanged( bool muted ) 394 \fn void QPEApplication::volumeChanged( bool muted )
394 395
395 This signal is emitted whenever the mute state is changed. If \a 396 This signal is emitted whenever the mute state is changed. If \a
396 muted is TRUE, then sound output has been muted. 397 muted is TRUE, then sound output has been muted.
397*/ 398*/
398 399
399/*! 400/*!
400 \fn void QPEApplication::weekChanged( bool startOnMonday ) 401 \fn void QPEApplication::weekChanged( bool startOnMonday )
401 402
402 This signal is emitted if the week start day is changed. If \a 403 This signal is emitted if the week start day is changed. If \a
403 startOnMonday is TRUE then the first day of the week is Monday; if 404 startOnMonday is TRUE then the first day of the week is Monday; if
404 \a startOnMonday is FALSE then the first day of the week is 405 \a startOnMonday is FALSE then the first day of the week is
405 Sunday. 406 Sunday.
406*/ 407*/
407 408
408/*! 409/*!
409 \fn void QPEApplication::dateFormatChanged() 410 \fn void QPEApplication::dateFormatChanged()
410 411
411 This signal is emitted whenever the date format is changed. 412 This signal is emitted whenever the date format is changed.
412*/ 413*/
413 414
414/*! 415/*!
415 \fn void QPEApplication::flush() 416 \fn void QPEApplication::flush()
416 417
417 ### 418 ###
418*/ 419*/
419 420
420/*! 421/*!
421 \fn void QPEApplication::reload() 422 \fn void QPEApplication::reload()
422 423
423*/ 424*/
424 425
425/*! 426/*!
426 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data ) 427 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data )
427 428
428 This signal is emitted when a message is received on this 429 This signal is emitted when a message is received on this
429 application's QPE/Application/<i>appname</i> \link qcop.html 430 application's QPE/Application/<i>appname</i> \link qcop.html
430 QCop\endlink channel. 431 QCop\endlink channel.
431 432
432 The slot to which you connect this signal uses \a msg and \a data 433 The slot to which you connect this signal uses \a msg and \a data
433 in the following way: 434 in the following way:
434 435
435\code 436\code
436 void MyWidget::receive( const QCString& msg, const QByteArray& data ) 437 void MyWidget::receive( const QCString& msg, const QByteArray& data )
437 { 438 {
438 QDataStream stream( data, IO_ReadOnly ); 439 QDataStream stream( data, IO_ReadOnly );
439 if ( msg == "someMessage(int,int,int)" ) { 440 if ( msg == "someMessage(int,int,int)" ) {
440 int a,b,c; 441 int a,b,c;
441 stream >> a >> b >> c; 442 stream >> a >> b >> c;
442 ... 443 ...
443 } else if ( msg == "otherMessage(QString)" ) { 444 } else if ( msg == "otherMessage(QString)" ) {
444 ... 445 ...
445 } 446 }
446 } 447 }
447\endcode 448\endcode
448 449
449 \sa qcop.html 450 \sa qcop.html
450 Note that messages received here may be processed by qpe application 451 Note that messages received here may be processed by qpe application
451 and emitted as signals, such as flush() and reload(). 452 and emitted as signals, such as flush() and reload().
452*/ 453*/
453 454
454/*! 455/*!
455 Constructs a QPEApplication just as you would construct 456 Constructs a QPEApplication just as you would construct
456 a QApplication, passing \a argc, \a argv, and \a t. 457 a QApplication, passing \a argc, \a argv, and \a t.
457 458
458 For applications, \a t should be the default, GuiClient. Only 459 For applications, \a t should be the default, GuiClient. Only
459 the Qtopia server passes GuiServer. 460 the Qtopia server passes GuiServer.
460*/ 461*/
461QPEApplication::QPEApplication( int & argc, char **argv, Type t ) 462QPEApplication::QPEApplication( int & argc, char **argv, Type t )
462 : QApplication( argc, argv, t ) 463 : QApplication( argc, argv, t )
463{ 464{
464 d = new QPEApplicationData; 465 d = new QPEApplicationData;
465 d->loadTextCodecs(); 466 d->loadTextCodecs();
466 d->loadImageCodecs(); 467 d->loadImageCodecs();
467 int dw = desktop() ->width(); 468 int dw = desktop() ->width();
468 qWarning( "Width %d", dw ); 469 qWarning( "Width %d", dw );
469 if ( dw < 200 ) { 470 if ( dw < 200 ) {
470 setFont( QFont( "helvetica", 8 ) ); 471 setFont( QFont( "helvetica", 8 ) );
471 AppLnk::setSmallIconSize( 10 ); 472 AppLnk::setSmallIconSize( 10 );
472 AppLnk::setBigIconSize( 28 ); 473 AppLnk::setBigIconSize( 28 );
473 } 474 }
474 else if ( dw > 600 ) { 475 else if ( dw > 600 ) {
475 setFont( QFont( "helvetica", 12 ) ); 476 setFont( QFont( "helvetica", 12 ) );
476 AppLnk::setSmallIconSize( 24 ); 477 AppLnk::setSmallIconSize( 24 );
477 AppLnk::setBigIconSize( 48 ); 478 AppLnk::setBigIconSize( 48 );
478 } 479 }
479 else if ( dw > 200 ) { 480 else if ( dw > 200 ) {
480 setFont( QFont( "helvetica", 10 ) ); 481 setFont( QFont( "helvetica", 10 ) );
481 AppLnk::setSmallIconSize( 16 ); 482 AppLnk::setSmallIconSize( 16 );
482 AppLnk::setBigIconSize( 32 ); 483 AppLnk::setBigIconSize( 32 );
483 } 484 }
484 485
485 486
486 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory ); 487 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory );
487 488
488 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) ); 489 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) );
489#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 490#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
490 491
491 QString qcopfn( "/tmp/qcop-msg-" ); 492 QString qcopfn( "/tmp/qcop-msg-" );
492 qcopfn += QString( argv[ 0 ] ); // append command name 493 qcopfn += QString( argv[ 0 ] ); // append command name
493 494
494 QFile f( qcopfn ); 495 QFile f( qcopfn );
495 if ( f.open( IO_ReadOnly ) ) { 496 if ( f.open( IO_ReadOnly ) ) {
496 flock( f.handle(), LOCK_EX ); 497 flock( f.handle(), LOCK_EX );
497 } 498 }
498 499
499 sysChannel = new QCopChannel( "QPE/System", this ); 500 sysChannel = new QCopChannel( "QPE/System", this );
500 connect( sysChannel, SIGNAL( received( const QCString &, const QByteArray & ) ), 501 connect( sysChannel, SIGNAL( received( const QCString &, const QByteArray & ) ),
501 this, SLOT( systemMessage( const QCString &, const QByteArray & ) ) ); 502 this, SLOT( systemMessage( const QCString &, const QByteArray & ) ) );
502 503
503 QCString channel = QCString( argv[ 0 ] ); 504 QCString channel = QCString( argv[ 0 ] );
504 channel.replace( QRegExp( ".*/" ), "" ); 505 channel.replace( QRegExp( ".*/" ), "" );
505 d->appName = channel; 506 d->appName = channel;
506 channel = "QPE/Application/" + channel; 507 channel = "QPE/Application/" + channel;
507 pidChannel = new QCopChannel( channel, this ); 508 pidChannel = new QCopChannel( channel, this );
508 connect( pidChannel, SIGNAL( received( const QCString &, const QByteArray & ) ), 509 connect( pidChannel, SIGNAL( received( const QCString &, const QByteArray & ) ),
509 this, SLOT( pidMessage( const QCString &, const QByteArray & ) ) ); 510 this, SLOT( pidMessage( const QCString &, const QByteArray & ) ) );
510 511
511 if ( f.isOpen() ) { 512 if ( f.isOpen() ) {
512 d->keep_running = FALSE; 513 d->keep_running = FALSE;
513 QDataStream ds( &f ); 514 QDataStream ds( &f );
514 QCString channel, message; 515 QCString channel, message;
515 QByteArray data; 516 QByteArray data;
516 while ( !ds.atEnd() ) { 517 while ( !ds.atEnd() ) {
517 ds >> channel >> message >> data; 518 ds >> channel >> message >> data;
518 d->enqueueQCop( channel, message, data ); 519 d->enqueueQCop( channel, message, data );
519 } 520 }
520 521
521 flock( f.handle(), LOCK_UN ); 522 flock( f.handle(), LOCK_UN );
522 f.close(); 523 f.close();
523 f.remove(); 524 f.remove();
524 } 525 }
525 526
526 for ( int a = 0; a < argc; a++ ) { 527 for ( int a = 0; a < argc; a++ ) {
527 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) { 528 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) {
528 argv[ a ] = argv[ a + 1 ]; 529 argv[ a ] = argv[ a + 1 ];
529 a++; 530 a++;
530 d->preloaded = TRUE; 531 d->preloaded = TRUE;
531 argc -= 1; 532 argc -= 1;
532 } 533 }
533 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) { 534 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) {
534 argv[ a ] = argv[ a + 1 ]; 535 argv[ a ] = argv[ a + 1 ];
535 a++; 536 a++;
536 d->preloaded = TRUE; 537 d->preloaded = TRUE;
537 d->forceshow = TRUE; 538 d->forceshow = TRUE;
538 argc -= 1; 539 argc -= 1;
539 } 540 }
540 } 541 }
541 542
542 /* overide stored arguments */ 543 /* overide stored arguments */
543 setArgs( argc, argv ); 544 setArgs( argc, argv );
544 545
545#endif 546#endif
546 547
547 // qwsSetDecoration( new QPEDecoration() ); 548 // qwsSetDecoration( new QPEDecoration() );
548 549
549#ifndef QT_NO_TRANSLATION 550#ifndef QT_NO_TRANSLATION
550 551
551 QStringList langs = Global::languageList(); 552 QStringList langs = Global::languageList();
552 for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) { 553 for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) {
553 QString lang = *it; 554 QString lang = *it;
554 555
555 QTranslator * trans; 556 QTranslator * trans;
556 QString tfn; 557 QString tfn;
557 558
558 trans = new QTranslator( this ); 559 trans = new QTranslator( this );
559 tfn = qpeDir() + "/i18n/" + lang + "/libqpe.qm"; 560 tfn = qpeDir() + "/i18n/" + lang + "/libqpe.qm";
560 if ( trans->load( tfn ) ) 561 if ( trans->load( tfn ) )
561 installTranslator( trans ); 562 installTranslator( trans );
562 else 563 else
563 delete trans; 564 delete trans;
564 565
565 trans = new QTranslator( this ); 566 trans = new QTranslator( this );
566 tfn = qpeDir() + "/i18n/" + lang + "/" + d->appName + ".qm"; 567 tfn = qpeDir() + "/i18n/" + lang + "/" + d->appName + ".qm";
567 if ( trans->load( tfn ) ) 568 if ( trans->load( tfn ) )
568 installTranslator( trans ); 569 installTranslator( trans );
569 else 570 else
570 delete trans; 571 delete trans;
571 572
572 //###language/font hack; should look it up somewhere 573 //###language/font hack; should look it up somewhere
573#ifdef QWS 574#ifdef QWS
574 575
575 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) { 576 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) {
576 QFont fn = FontManager::unicodeFont( FontManager::Proportional ); 577 QFont fn = FontManager::unicodeFont( FontManager::Proportional );
577 setFont( fn ); 578 setFont( fn );
578 } 579 }
579#endif 580#endif
580 581
581 } 582 }
582#endif 583#endif
583 584
584 applyStyle(); 585 applyStyle();
585 586
586 if ( type() == GuiServer ) { 587 if ( type() == GuiServer ) {
587 setVolume(); 588 setVolume();
588 } 589 }
589 590
590 installEventFilter( this ); 591 installEventFilter( this );
591 592
592 QPEMenuToolFocusManager::initialize(); 593 QPEMenuToolFocusManager::initialize();
593 594
594#ifdef QT_NO_QWS_CURSOR 595#ifdef QT_NO_QWS_CURSOR
595 // if we have no cursor, probably don't want tooltips 596 // if we have no cursor, probably don't want tooltips
596 QToolTip::setEnabled( FALSE ); 597 QToolTip::setEnabled( FALSE );
597#endif 598#endif
598} 599}
599 600
600static QPtrDict<void>* inputMethodDict = 0; 601static QPtrDict<void>* inputMethodDict = 0;
601static void createInputMethodDict() 602static void createInputMethodDict()
602{ 603{
603 if ( !inputMethodDict ) 604 if ( !inputMethodDict )
604 inputMethodDict = new QPtrDict<void>; 605 inputMethodDict = new QPtrDict<void>;
605} 606}
606 607
607/*! 608/*!
608 Returns the currently set hint to the system as to whether 609 Returns the currently set hint to the system as to whether
609 widget \a w has any use for text input methods. 610 widget \a w has any use for text input methods.
610 611
611 612
612 \sa setInputMethodHint() InputMethodHint 613 \sa setInputMethodHint() InputMethodHint
613*/ 614*/
614QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) 615QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w )
615{ 616{
616 if ( inputMethodDict && w ) 617 if ( inputMethodDict && w )
617 return ( InputMethodHint ) ( int ) inputMethodDict->find( w ); 618 return ( InputMethodHint ) ( int ) inputMethodDict->find( w );
618 return Normal; 619 return Normal;
619} 620}
620 621
621/*! 622/*!
622 \enum QPEApplication::InputMethodHint 623 \enum QPEApplication::InputMethodHint
623 624
624 \value Normal the application sometimes needs text input (the default). 625 \value Normal the application sometimes needs text input (the default).
625 \value AlwaysOff the application never needs text input. 626 \value AlwaysOff the application never needs text input.
626 \value AlwaysOn the application always needs text input. 627 \value AlwaysOn the application always needs text input.
627*/ 628*/
628 629
629/*! 630/*!
630 Hints to the system that widget \a w has use for text input methods 631 Hints to the system that widget \a w has use for text input methods
631 as specified by \a mode. 632 as specified by \a mode.
632 633
633 \sa inputMethodHint() InputMethodHint 634 \sa inputMethodHint() InputMethodHint
634*/ 635*/
635void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) 636void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode )
636{ 637{
637 createInputMethodDict(); 638 createInputMethodDict();
638 if ( mode == Normal ) { 639 if ( mode == Normal ) {
639 inputMethodDict->remove 640 inputMethodDict->remove
640 ( w ); 641 ( w );
641 } 642 }
642 else { 643 else {
643 inputMethodDict->insert( w, ( void* ) mode ); 644 inputMethodDict->insert( w, ( void* ) mode );
644 } 645 }
645} 646}
646 647
647class HackDialog : public QDialog 648class HackDialog : public QDialog
648{ 649{
649public: 650public:
650 void acceptIt() 651 void acceptIt()
651 { 652 {
652 accept(); 653 accept();
653 } 654 }
654 void rejectIt() 655 void rejectIt()
655 { 656 {
656 reject(); 657 reject();
657 } 658 }
658}; 659};
659 660
660 661
661void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) 662void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key )
662{ 663{
663 // specialised actions for certain widgets. May want to 664 // specialised actions for certain widgets. May want to
664 // add more stuff here. 665 // add more stuff here.
665 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" ) 666 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" )
666 && activePopupWidget() ->parentWidget() 667 && activePopupWidget() ->parentWidget()
667 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) ) 668 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) )
668 key = Qt::Key_Return; 669 key = Qt::Key_Return;
669 670
670 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) ) 671 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) )
671 key = Qt::Key_Return; 672 key = Qt::Key_Return;
672 673
673#ifdef QWS 674#ifdef QWS
674 675
675 ke->simpleData.keycode = key; 676 ke->simpleData.keycode = key;
676#endif 677#endif
677} 678}
678 679
679class HackWidget : public QWidget 680class HackWidget : public QWidget
680{ 681{
681public: 682public:
682 bool needsOk() 683 bool needsOk()
683 { 684 {
684 return ( getWState() & WState_Reserved1 ); 685 return ( getWState() & WState_Reserved1 );
685 } 686 }
686}; 687};
687 688
688/*! 689/*!
689 \internal 690 \internal
690*/ 691*/
691 692
692#ifdef QWS 693#ifdef QWS
693bool QPEApplication::qwsEventFilter( QWSEvent * e ) 694bool QPEApplication::qwsEventFilter( QWSEvent * e )
694{ 695{
695 if ( !d->notbusysent && e->type == QWSEvent::Focus ) { 696 if ( !d->notbusysent && e->type == QWSEvent::Focus ) {
696 if ( qApp->type() != QApplication::GuiServer ) { 697 if ( qApp->type() != QApplication::GuiServer ) {
697 QCopEnvelope e( "QPE/System", "notBusy(QString)" ); 698 QCopEnvelope e( "QPE/System", "notBusy(QString)" );
698 e << d->appName; 699 e << d->appName;
699 } 700 }
700 d->notbusysent = TRUE; 701 d->notbusysent = TRUE;
701 } 702 }
702 if ( type() == GuiServer ) { 703 if ( type() == GuiServer ) {
703 switch ( e->type ) { 704 switch ( e->type ) {
704 case QWSEvent::Mouse: 705 case QWSEvent::Mouse:
705 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) 706 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) )
706 emit clientMoused(); 707 emit clientMoused();
707 break; 708 break;
708 default: 709 default:
709 break; 710 break;
710 } 711 }
711 } 712 }
712 if ( e->type == QWSEvent::Key ) { 713 if ( e->type == QWSEvent::Key ) {
713 if ( d->kbgrabber == 1 ) 714 if ( d->kbgrabber == 1 )
714 return TRUE; 715 return TRUE;
715 QWSKeyEvent *ke = ( QWSKeyEvent * ) e; 716 QWSKeyEvent *ke = ( QWSKeyEvent * ) e;
716 if ( ke->simpleData.keycode == Qt::Key_F33 ) { 717 if ( ke->simpleData.keycode == Qt::Key_F33 ) {
717 // Use special "OK" key to press "OK" on top level widgets 718 // Use special "OK" key to press "OK" on top level widgets
718 QWidget * active = activeWindow(); 719 QWidget * active = activeWindow();
719 QWidget *popup = 0; 720 QWidget *popup = 0;
720 if ( active && active->isPopup() ) { 721 if ( active && active->isPopup() ) {
721 popup = active; 722 popup = active;
722 active = active->parentWidget(); 723 active = active->parentWidget();
723 } 724 }
724 if ( active && ( int ) active->winId() == ke->simpleData.window && 725 if ( active && ( int ) active->winId() == ke->simpleData.window &&
725 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) { 726 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) {
726 if ( ke->simpleData.is_press ) { 727 if ( ke->simpleData.is_press ) {
727 if ( popup ) 728 if ( popup )
728 popup->close(); 729 popup->close();
729 if ( active->inherits( "QDialog" ) ) { 730 if ( active->inherits( "QDialog" ) ) {
730 HackDialog * d = ( HackDialog * ) active; 731 HackDialog * d = ( HackDialog * ) active;
731 d->acceptIt(); 732 d->acceptIt();
732 return TRUE; 733 return TRUE;
733 } 734 }
734 else if ( ( ( HackWidget * ) active ) ->needsOk() ) { 735 else if ( ( ( HackWidget * ) active ) ->needsOk() ) {
735 QSignal s; 736 QSignal s;
736 s.connect( active, SLOT( accept() ) ); 737 s.connect( active, SLOT( accept() ) );
737 s.activate(); 738 s.activate();
738 } 739 }
739 else { 740 else {
740 // do the same as with the select key: Map to the default action of the widget: 741 // do the same as with the select key: Map to the default action of the widget:
741 mapToDefaultAction( ke, Qt::Key_Return ); 742 mapToDefaultAction( ke, Qt::Key_Return );
742 } 743 }
743 } 744 }
744 } 745 }
745 } 746 }
746 else if ( ke->simpleData.keycode == Qt::Key_F30 ) { 747 else if ( ke->simpleData.keycode == Qt::Key_F30 ) {
747 // Use special "select" key to do whatever default action a widget has 748 // Use special "select" key to do whatever default action a widget has
748 mapToDefaultAction( ke, Qt::Key_Space ); 749 mapToDefaultAction( ke, Qt::Key_Space );
749 } 750 }
750 else if ( ke->simpleData.keycode == Qt::Key_Escape && 751 else if ( ke->simpleData.keycode == Qt::Key_Escape &&
751 ke->simpleData.is_press ) { 752 ke->simpleData.is_press ) {
752 // Escape key closes app if focus on toplevel 753 // Escape key closes app if focus on toplevel
753 QWidget * active = activeWindow(); 754 QWidget * active = activeWindow();
754 if ( active && active->testWFlags( WType_TopLevel ) && 755 if ( active && active->testWFlags( WType_TopLevel ) &&
755 ( int ) active->winId() == ke->simpleData.window && 756 ( int ) active->winId() == ke->simpleData.window &&
756 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) { 757 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) {
757 if ( active->inherits( "QDialog" ) ) { 758 if ( active->inherits( "QDialog" ) ) {
758 HackDialog * d = ( HackDialog * ) active; 759 HackDialog * d = ( HackDialog * ) active;
759 d->rejectIt(); 760 d->rejectIt();
760 return TRUE; 761 return TRUE;
761 } 762 }
762 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) { 763 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) {
763 active->close(); 764 active->close();
764 } 765 }
765 } 766 }
766 } 767 }
767 768
768#if QT_VERSION < 231 769#if QT_VERSION < 231
769 // Filter out the F4/Launcher key from apps 770 // Filter out the F4/Launcher key from apps
770 // ### The launcher key may not always be F4 on all devices 771 // ### The launcher key may not always be F4 on all devices
771 if ( ( ( QWSKeyEvent * ) e ) ->simpleData.keycode == Qt::Key_F4 ) 772 if ( ( ( QWSKeyEvent * ) e ) ->simpleData.keycode == Qt::Key_F4 )
772 return TRUE; 773 return TRUE;
773#endif 774#endif
774 775
775 } 776 }
776 if ( e->type == QWSEvent::Focus ) { 777 if ( e->type == QWSEvent::Focus ) {
777 QWSFocusEvent * fe = ( QWSFocusEvent* ) e; 778 QWSFocusEvent * fe = ( QWSFocusEvent* ) e;
778 QWidget* nfw = QWidget::find( e->window() ); 779 QWidget* nfw = QWidget::find( e->window() );
779 if ( !fe->simpleData.get_focus ) { 780 if ( !fe->simpleData.get_focus ) {
780 QWidget * active = activeWindow(); 781 QWidget * active = activeWindow();
781 while ( active && active->isPopup() ) { 782 while ( active && active->isPopup() ) {
782 active->close(); 783 active->close();
783 active = activeWindow(); 784 active = activeWindow();
784 } 785 }
785 if ( !nfw && d->kbgrabber == 2 ) { 786 if ( !nfw && d->kbgrabber == 2 ) {
786 ungrabKeyboard(); 787 ungrabKeyboard();
787 d->kbregrab = TRUE; // want kb back when we're active 788 d->kbregrab = TRUE; // want kb back when we're active
788 } 789 }
789 } 790 }
790 else { 791 else {
791 // make sure our modal widget is ALWAYS on top 792 // make sure our modal widget is ALWAYS on top
792 QWidget *topm = activeModalWidget(); 793 QWidget *topm = activeModalWidget();
793 if ( topm ) { 794 if ( topm ) {
794 topm->raise(); 795 topm->raise();
795 } 796 }
796 if ( d->kbregrab ) { 797 if ( d->kbregrab ) {
797 grabKeyboard(); 798 grabKeyboard();
798 d->kbregrab = FALSE; 799 d->kbregrab = FALSE;
799 } 800 }
800 } 801 }
801 if ( fe->simpleData.get_focus && inputMethodDict ) { 802 if ( fe->simpleData.get_focus && inputMethodDict ) {
802 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) ); 803 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) );
803 if ( m == AlwaysOff ) 804 if ( m == AlwaysOff )
804 Global::hideInputMethod(); 805 Global::hideInputMethod();
805 if ( m == AlwaysOn ) 806 if ( m == AlwaysOn )
806 Global::showInputMethod(); 807 Global::showInputMethod();
807 } 808 }
808 } 809 }
809 return QApplication::qwsEventFilter( e ); 810 return QApplication::qwsEventFilter( e );
810} 811}
811#endif 812#endif
812 813
813/*! 814/*!
814 Destroys the QPEApplication. 815 Destroys the QPEApplication.
815*/ 816*/
816QPEApplication::~QPEApplication() 817QPEApplication::~QPEApplication()
817{ 818{
818 ungrabKeyboard(); 819 ungrabKeyboard();
819#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 820#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
820 // Need to delete QCopChannels early, since the display will 821 // Need to delete QCopChannels early, since the display will
821 // be gone by the time we get to ~QObject(). 822 // be gone by the time we get to ~QObject().
822 delete sysChannel; 823 delete sysChannel;
823 delete pidChannel; 824 delete pidChannel;
824#endif 825#endif
825 826
826 delete d; 827 delete d;
827} 828}
828 829
829/*! 830/*!
830 Returns <tt>$OPIEDIR/</tt>. 831 Returns <tt>$OPIEDIR/</tt>.
831*/ 832*/
832QString QPEApplication::qpeDir() 833QString QPEApplication::qpeDir()
833{ 834{
834 const char * base = getenv( "OPIEDIR" ); 835 const char * base = getenv( "OPIEDIR" );
835 if ( base ) 836 if ( base )
836 return QString( base ) + "/"; 837 return QString( base ) + "/";
837 838
838 return QString( "../" ); 839 return QString( "../" );
839} 840}
840 841
841/*! 842/*!
842 Returns the user's current Document directory. There is a trailing "/". 843 Returns the user's current Document directory. There is a trailing "/".
843 .. well, it does now,, and there's no trailing '/' 844 .. well, it does now,, and there's no trailing '/'
844*/ 845*/
845QString QPEApplication::documentDir() 846QString QPEApplication::documentDir()
846{ 847{
847 const char* base = getenv( "HOME"); 848 const char* base = getenv( "HOME");
848 if ( base ) 849 if ( base )
849 return QString( base ) + "/Documents"; 850 return QString( base ) + "/Documents";
850 851
851 return QString( "../Documents" ); 852 return QString( "../Documents" );
852} 853}
853 854
854static int deforient = -1; 855static int deforient = -1;
855 856
856/*! 857/*!
857 \internal 858 \internal
858*/ 859*/
859int QPEApplication::defaultRotation() 860int QPEApplication::defaultRotation()
860{ 861{
861 if ( deforient < 0 ) { 862 if ( deforient < 0 ) {
862 QString d = getenv( "QWS_DISPLAY" ); 863 QString d = getenv( "QWS_DISPLAY" );
863 if ( d.contains( "Rot90" ) ) { 864 if ( d.contains( "Rot90" ) ) {
864 deforient = 90; 865 deforient = 90;
865 } 866 }
866 else if ( d.contains( "Rot180" ) ) { 867 else if ( d.contains( "Rot180" ) ) {
867 deforient = 180; 868 deforient = 180;
868 } 869 }
869 else if ( d.contains( "Rot270" ) ) { 870 else if ( d.contains( "Rot270" ) ) {
870 deforient = 270; 871 deforient = 270;
871 } 872 }
872 else { 873 else {
873 deforient = 0; 874 deforient = 0;
874 } 875 }
875 } 876 }
876 return deforient; 877 return deforient;
877} 878}
878 879
879/*! 880/*!
880 \internal 881 \internal
881*/ 882*/
882void QPEApplication::setDefaultRotation( int r ) 883void QPEApplication::setDefaultRotation( int r )
883{ 884{
884 if ( qApp->type() == GuiServer ) { 885 if ( qApp->type() == GuiServer ) {
885 deforient = r; 886 deforient = r;
886 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); 887 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 );
887 Config config("qpe"); 888 Config config("qpe");
888 config.setGroup( "Rotation" ); 889 config.setGroup( "Rotation" );
889 config.writeEntry( "Screen", getenv("QWS_DISPLAY") ); 890 config.writeEntry( "Screen", getenv("QWS_DISPLAY") );
890 } 891 }
891 else { 892 else {
892#ifndef QT_NO_COP 893#ifndef QT_NO_COP
893 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" ); 894 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" );
894 e << r; 895 e << r;
895 } 896 }
896#endif 897#endif
897 898
898 } 899 }
899} 900}
900 901
901// exported to libpreload.so 902// exported to libpreload.so
902int opie_block_style = 0; 903int opie_block_style = 0;
903 904
904/*! 905/*!
905 \internal 906 \internal
906*/ 907*/
907void QPEApplication::applyStyle() 908void QPEApplication::applyStyle()
908{ 909{
909 Config config( "qpe" ); 910 Config config( "qpe" );
910 config.setGroup( "Appearance" ); 911 config.setGroup( "Appearance" );
911 912
912 // don't block ourselves ... 913 // don't block ourselves ...
913 opie_block_style = 0; 914 opie_block_style = 0;
914 915
915 916
916 static QString appname; 917 static QString appname;
917 918
918 if ( appname. isNull ( )) { 919 if ( appname. isNull ( )) {
919 char src [32]; 920 char src [32];
920 char dst [PATH_MAX + 1]; 921 char dst [PATH_MAX + 1];
921 ::sprintf ( src, "/proc/%d/exe", ::getpid ( )); 922 ::sprintf ( src, "/proc/%d/exe", ::getpid ( ));
922 int l = ::readlink ( src, dst, PATH_MAX ); 923 int l = ::readlink ( src, dst, PATH_MAX );
923 if ( l > 0 ) { 924 if ( l > 0 ) {
924 dst [l] = 0; 925 dst [l] = 0;
925 const char *b = ::strrchr ( dst, '/' ); 926 const char *b = ::strrchr ( dst, '/' );
926 appname = ( b ? b + 1 : dst ); 927 appname = ( b ? b + 1 : dst );
927 } 928 }
928 else 929 else
929 appname = ""; 930 appname = "";
930 } 931 }
931 932
932 933
933 QStringList ex = config. readListEntry ( "NoStyle", ';' ); 934 QStringList ex = config. readListEntry ( "NoStyle", ';' );
934 int nostyle = 0; 935 int nostyle = 0;
935 for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) { 936 for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) {
936 if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) { 937 if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) {
937 nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 ); 938 nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 );
938 break; 939 break;
939 } 940 }
940 } 941 }
941 942
942 // Widget style 943 // Widget style
943 QString style = config.readEntry( "Style", "Light" ); 944 QString style = config.readEntry( "Style", "Light" );
944 945
945 // don't set a custom style 946 // don't set a custom style
946 if ( nostyle & 0x01 ) 947 if ( nostyle & 0x01 )
947 style = "Light"; 948 style = "Light";
948 949
949 internalSetStyle ( style ); 950 internalSetStyle ( style );
950 951
951 // Colors 952 // Colors
952 QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) ); 953 QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) );
953 QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) ); 954 QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) );
954 QPalette pal( btncolor, bgcolor ); 955 QPalette pal( btncolor, bgcolor );
955 QString color = config.readEntry( "Highlight", "#800000" ); 956 QString color = config.readEntry( "Highlight", "#800000" );
956 pal.setColor( QColorGroup::Highlight, QColor( color ) ); 957 pal.setColor( QColorGroup::Highlight, QColor( color ) );
957 color = config.readEntry( "HighlightedText", "#FFFFFF" ); 958 color = config.readEntry( "HighlightedText", "#FFFFFF" );
958 pal.setColor( QColorGroup::HighlightedText, QColor( color ) ); 959 pal.setColor( QColorGroup::HighlightedText, QColor( color ) );
959 color = config.readEntry( "Text", "#000000" ); 960 color = config.readEntry( "Text", "#000000" );
960 pal.setColor( QColorGroup::Text, QColor( color ) ); 961 pal.setColor( QColorGroup::Text, QColor( color ) );
961 color = config.readEntry( "ButtonText", "#000000" ); 962 color = config.readEntry( "ButtonText", "#000000" );
962 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) ); 963 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) );
963 color = config.readEntry( "Base", "#FFFFFF" ); 964 color = config.readEntry( "Base", "#FFFFFF" );
964 pal.setColor( QColorGroup::Base, QColor( color ) ); 965 pal.setColor( QColorGroup::Base, QColor( color ) );
965 966
966 pal.setColor( QPalette::Disabled, QColorGroup::Text, 967 pal.setColor( QPalette::Disabled, QColorGroup::Text,
967 pal.color( QPalette::Active, QColorGroup::Background ).dark() ); 968 pal.color( QPalette::Active, QColorGroup::Background ).dark() );
968 969
969 setPalette( pal, TRUE ); 970 setPalette( pal, TRUE );
970 971
971 // Window Decoration 972 // Window Decoration
972 QString dec = config.readEntry( "Decoration", "Qtopia" ); 973 QString dec = config.readEntry( "Decoration", "Qtopia" );
973 974
974 // don't set a custom deco 975 // don't set a custom deco
975 if ( nostyle & 0x04 ) 976 if ( nostyle & 0x04 )
976 dec = ""; 977 dec = "";
977 978
978 //qDebug ( "Setting Deco: %s -- old %s (%d)", dec.latin1(), d-> decorationName.latin1(), nostyle); 979 //qDebug ( "Setting Deco: %s -- old %s (%d)", dec.latin1(), d-> decorationName.latin1(), nostyle);
979 980
980 if ( dec != d->decorationName ) { 981 if ( dec != d->decorationName ) {
981 qwsSetDecoration( new QPEDecoration( dec ) ); 982 qwsSetDecoration( new QPEDecoration( dec ) );
982 d->decorationName = dec; 983 d->decorationName = dec;
983 } 984 }
984 985
985 // Font 986 // Font
986 QString ff = config.readEntry( "FontFamily", font().family() ); 987 QString ff = config.readEntry( "FontFamily", font().family() );
987 int fs = config.readNumEntry( "FontSize", font().pointSize() ); 988 int fs = config.readNumEntry( "FontSize", font().pointSize() );
988 989
989 // don't set a custom font 990 // don't set a custom font
990 if ( nostyle & 0x02 ) { 991 if ( nostyle & 0x02 ) {
991 ff = "Helvetica"; 992 ff = "Helvetica";
992 fs = 10; 993 fs = 10;
993 } 994 }
994 995
995 setFont( QFont(ff, fs) ); 996 setFont( QFont(ff, fs) );
996 997
997 // revert to global blocking policy ... 998 // revert to global blocking policy ...
998 opie_block_style = config. readBoolEntry ( "ForceStyle", false ) ? 0xff : 0x00; 999 opie_block_style = config. readBoolEntry ( "ForceStyle", false ) ? 0xff : 0x00;
999 opie_block_style -= nostyle; 1000 opie_block_style -= nostyle;
1000} 1001}
1001 1002
1002void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data ) 1003void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data )
1003{ 1004{
1004#ifdef Q_WS_QWS 1005#ifdef Q_WS_QWS
1005 QDataStream stream( data, IO_ReadOnly ); 1006 QDataStream stream( data, IO_ReadOnly );
1006 if ( msg == "applyStyle()" ) { 1007 if ( msg == "applyStyle()" ) {
1007 applyStyle(); 1008 applyStyle();
1008 } 1009 }
1009 else if ( msg == "setDefaultRotation(int)" ) { 1010 else if ( msg == "setDefaultRotation(int)" ) {
1010 if ( type() == GuiServer ) { 1011 if ( type() == GuiServer ) {
1011 int r; 1012 int r;
1012 stream >> r; 1013 stream >> r;
1013 setDefaultRotation( r ); 1014 setDefaultRotation( r );
1014 } 1015 }
1015 } 1016 }
1016 else if ( msg == "shutdown()" ) { 1017 else if ( msg == "shutdown()" ) {
1017 if ( type() == GuiServer ) 1018 if ( type() == GuiServer )
1018 shutdown(); 1019 shutdown();
1019 } 1020 }
1020 else if ( msg == "quit()" ) { 1021 else if ( msg == "quit()" ) {
1021 if ( type() != GuiServer ) 1022 if ( type() != GuiServer )
1022 tryQuit(); 1023 tryQuit();
1023 } 1024 }
1024 else if ( msg == "forceQuit()" ) { 1025 else if ( msg == "forceQuit()" ) {
1025 if ( type() != GuiServer ) 1026 if ( type() != GuiServer )
1026 quit(); 1027 quit();
1027 } 1028 }
1028 else if ( msg == "restart()" ) { 1029 else if ( msg == "restart()" ) {
1029 if ( type() == GuiServer ) 1030 if ( type() == GuiServer )
1030 restart(); 1031 restart();
1031 } 1032 }
1032 else if ( msg == "grabKeyboard(QString)" ) { 1033 else if ( msg == "grabKeyboard(QString)" ) {
1033 QString who; 1034 QString who;
1034 stream >> who; 1035 stream >> who;
1035 if ( who.isEmpty() ) 1036 if ( who.isEmpty() )
1036 d->kbgrabber = 0; 1037 d->kbgrabber = 0;
1037 else if ( who != d->appName ) 1038 else if ( who != d->appName )
1038 d->kbgrabber = 1; 1039 d->kbgrabber = 1;
1039 else 1040 else
1040 d->kbgrabber = 2; 1041 d->kbgrabber = 2;
1041 } 1042 }
1042 else if ( msg == "language(QString)" ) { 1043 else if ( msg == "language(QString)" ) {
1043 if ( type() == GuiServer ) { 1044 if ( type() == GuiServer ) {
1044 QString l; 1045 QString l;
1045 stream >> l; 1046 stream >> l;
1046 QString cl = getenv( "LANG" ); 1047 QString cl = getenv( "LANG" );
1047 if ( cl != l ) { 1048 if ( cl != l ) {
1048 if ( l.isNull() ) 1049 if ( l.isNull() )