summaryrefslogtreecommitdiff
path: root/library
authorsandman <sandman>2002-11-25 22:12:18 (UTC)
committer sandman <sandman>2002-11-25 22:12:18 (UTC)
commit4e6b2585987290f874697cbec7c289b4df29f82b (patch) (unidiff)
treee19415ef5374ffa3730380813298111e24711590 /library
parent7bd8ef9197506897d3a5287a013934f89658d60a (diff)
downloadopie-4e6b2585987290f874697cbec7c289b4df29f82b.zip
opie-4e6b2585987290f874697cbec7c289b4df29f82b.tar.gz
opie-4e6b2585987290f874697cbec7c289b4df29f82b.tar.bz2
Some changes to the QPEDecoration c'tor internals:
Since the current deco plugin is unloaded, when a new Deco is created via new (even if this new deco is never used or deleted immediatly afer- wards), we have to remember the plugin name, in case someone calls the default c'tor (without supplying a plugin name)
Diffstat (limited to 'library') (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp9
-rw-r--r--library/qpedecoration_qws.cpp41
-rw-r--r--library/qpedecoration_qws.h2
3 files changed, 25 insertions, 27 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index a54fb20..c8e6e74 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -1,1754 +1,1757 @@
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 <qfile.h> 25#include <qfile.h>
26#ifdef Q_WS_QWS 26#ifdef Q_WS_QWS
27#ifndef QT_NO_COP 27#ifndef QT_NO_COP
28#if QT_VERSION <= 231 28#if QT_VERSION <= 231
29#define private public 29#define private public
30#define sendLocally processEvent 30#define sendLocally processEvent
31#include "qcopenvelope_qws.h" 31#include "qcopenvelope_qws.h"
32#undef private 32#undef private
33#else 33#else
34#include "qcopenvelope_qws.h" 34#include "qcopenvelope_qws.h"
35#endif 35#endif
36#endif 36#endif
37#include <qwindowsystem_qws.h> 37#include <qwindowsystem_qws.h>
38#endif 38#endif
39#include <qtextstream.h> 39#include <qtextstream.h>
40#include <qpalette.h> 40#include <qpalette.h>
41#include <qbuffer.h> 41#include <qbuffer.h>
42#include <qptrdict.h> 42#include <qptrdict.h>
43#include <qregexp.h> 43#include <qregexp.h>
44#include <qdir.h> 44#include <qdir.h>
45#include <qlabel.h> 45#include <qlabel.h>
46#include <qdialog.h> 46#include <qdialog.h>
47#include <qdragobject.h> 47#include <qdragobject.h>
48#include <qtextcodec.h> 48#include <qtextcodec.h>
49#include <qevent.h> 49#include <qevent.h>
50#include <qtooltip.h> 50#include <qtooltip.h>
51#include <qsignal.h> 51#include <qsignal.h>
52#include "qpeapplication.h" 52#include "qpeapplication.h"
53#include "qpestyle.h" 53#include "qpestyle.h"
54#include "styleinterface.h" 54#include "styleinterface.h"
55#if QT_VERSION >= 300 55#if QT_VERSION >= 300
56#include <qstylefactory.h> 56#include <qstylefactory.h>
57#else 57#else
58#include <qplatinumstyle.h> 58#include <qplatinumstyle.h>
59#include <qwindowsstyle.h> 59#include <qwindowsstyle.h>
60#include <qmotifstyle.h> 60#include <qmotifstyle.h>
61#include <qmotifplusstyle.h> 61#include <qmotifplusstyle.h>
62#include "lightstyle.h" 62#include "lightstyle.h"
63 63
64#include <qpe/qlibrary.h> 64#include <qpe/qlibrary.h>
65#endif 65#endif
66#include "global.h" 66#include "global.h"
67#include "resource.h" 67#include "resource.h"
68#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 68#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
69#include "qutfcodec.h" 69#include "qutfcodec.h"
70#endif 70#endif
71#include "config.h" 71#include "config.h"
72#include "network.h" 72#include "network.h"
73#ifdef QWS 73#ifdef QWS
74#include "fontmanager.h" 74#include "fontmanager.h"
75#endif 75#endif
76 76
77#include "alarmserver.h" 77#include "alarmserver.h"
78#include "applnk.h" 78#include "applnk.h"
79#include "qpemenubar.h" 79#include "qpemenubar.h"
80#include "textcodecinterface.h" 80#include "textcodecinterface.h"
81#include "imagecodecinterface.h" 81#include "imagecodecinterface.h"
82 82
83#include <unistd.h> 83#include <unistd.h>
84#include <sys/file.h> 84#include <sys/file.h>
85#include <sys/ioctl.h> 85#include <sys/ioctl.h>
86#include <sys/soundcard.h> 86#include <sys/soundcard.h>
87 87
88 88
89class QPEApplicationData 89class QPEApplicationData
90{ 90{
91public: 91public:
92 QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), rightpressed( FALSE ), 92 QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), rightpressed( FALSE ),
93 kbgrabber( 0 ), kbregrab( FALSE ), notbusysent( FALSE ), preloaded( FALSE ), 93 kbgrabber( 0 ), kbregrab( FALSE ), notbusysent( FALSE ), preloaded( FALSE ),
94 forceshow( FALSE ), nomaximize( FALSE ), qpe_main_widget( 0 ), 94 forceshow( FALSE ), nomaximize( FALSE ), qpe_main_widget( 0 ),
95 keep_running( TRUE ) 95 keep_running( TRUE )
96 { 96 {
97 qcopq.setAutoDelete( TRUE ); 97 qcopq.setAutoDelete( TRUE );
98 } 98 }
99 99
100 int presstimer; 100 int presstimer;
101 QWidget* presswidget; 101 QWidget* presswidget;
102 QPoint presspos; 102 QPoint presspos;
103bool rightpressed : 103bool rightpressed :
104 1; // AEH why not use uint foobar :1; if it's tt style -zecke 104 1; // AEH why not use uint foobar :1; if it's tt style -zecke
105 int kbgrabber; 105 int kbgrabber;
106bool kbregrab : 106bool kbregrab :
107 1; 107 1;
108bool notbusysent : 108bool notbusysent :
109 1; 109 1;
110 QString appName; 110 QString appName;
111 struct QCopRec 111 struct QCopRec
112 { 112 {
113 QCopRec( const QCString &ch, const QCString &msg, 113 QCopRec( const QCString &ch, const QCString &msg,
114 const QByteArray &d ) : 114 const QByteArray &d ) :
115 channel( ch ), message( msg ), data( d ) 115 channel( ch ), message( msg ), data( d )
116 { } 116 { }
117 117
118 QCString channel; 118 QCString channel;
119 QCString message; 119 QCString message;
120 QByteArray data; 120 QByteArray data;
121 }; 121 };
122bool preloaded : 122bool preloaded :
123 1; 123 1;
124bool forceshow : 124bool forceshow :
125 1; 125 1;
126bool nomaximize : 126bool nomaximize :
127 1; 127 1;
128 QWidget* qpe_main_widget; 128 QWidget* qpe_main_widget;
129bool keep_running : 129bool keep_running :
130 1; 130 1;
131 QList<QCopRec> qcopq; 131 QList<QCopRec> qcopq;
132 132
133 void enqueueQCop( const QCString &ch, const QCString &msg, 133 void enqueueQCop( const QCString &ch, const QCString &msg,
134 const QByteArray &data ) 134 const QByteArray &data )
135 { 135 {
136 qcopq.append( new QCopRec( ch, msg, data ) ); 136 qcopq.append( new QCopRec( ch, msg, data ) );
137 } 137 }
138 void sendQCopQ() 138 void sendQCopQ()
139 { 139 {
140 QCopRec * r; 140 QCopRec * r;
141#ifndef QT_NO_COP 141#ifndef QT_NO_COP
142 142
143 for ( QListIterator<QCopRec> it( qcopq ); ( r = it.current() ); ++it ) 143 for ( QListIterator<QCopRec> it( qcopq ); ( r = it.current() ); ++it )
144 QCopChannel::sendLocally( r->channel, r->message, r->data ); 144 QCopChannel::sendLocally( r->channel, r->message, r->data );
145#endif 145#endif
146 146
147 qcopq.clear(); 147 qcopq.clear();
148 } 148 }
149 static void show_mx(QWidget* mw, bool nomaximize) 149 static void show_mx(QWidget* mw, bool nomaximize)
150 { 150 {
151 if ( mw->layout() && mw->inherits("QDialog") ) { 151 if ( mw->layout() && mw->inherits("QDialog") ) {
152 QPEApplication::showDialog((QDialog*)mw, nomaximize); 152 QPEApplication::showDialog((QDialog*)mw, nomaximize);
153 } 153 }
154 else { 154 else {
155#ifdef Q_WS_QWS 155#ifdef Q_WS_QWS
156 if ( !nomaximize ) 156 if ( !nomaximize )
157 mw->showMaximized(); 157 mw->showMaximized();
158 else 158 else
159#endif 159#endif
160 160
161 mw->show(); 161 mw->show();
162 } 162 }
163 } 163 }
164 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ ) 164 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ )
165 { 165 {
166 /* 166 /*
167 // This works but disable it for now until it is safe to apply 167 // 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 168 // 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 169 // 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 170 // then it uses the name stored in the .desktop file as the caption
171 // for the main widget. This saves duplicating translations for 171 // for the main widget. This saves duplicating translations for
172 // the app name in the program and in the .desktop files. 172 // the app name in the program and in the .desktop files.
173 173
174 AppLnkSet apps( appsPath ); 174 AppLnkSet apps( appsPath );
175 175
176 QList<AppLnk> appsList = apps.children(); 176 QList<AppLnk> appsList = apps.children();
177 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) { 177 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) {
178 if ( (*it)->exec() == appName ) { 178 if ( (*it)->exec() == appName ) {
179 mw->setCaption( (*it)->name() ); 179 mw->setCaption( (*it)->name() );
180 return TRUE; 180 return TRUE;
181 } 181 }
182 } 182 }
183 */ 183 */
184 return FALSE; 184 return FALSE;
185 } 185 }
186 186
187 187
188 void show(QWidget* mw, bool nomax) 188 void show(QWidget* mw, bool nomax)
189 { 189 {
190 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" ); 190 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" );
191 nomaximize = nomax; 191 nomaximize = nomax;
192 qpe_main_widget = mw; 192 qpe_main_widget = mw;
193#ifndef QT_NO_COP 193#ifndef QT_NO_COP
194 194
195 sendQCopQ(); 195 sendQCopQ();
196#endif 196#endif
197 197
198 if ( preloaded ) { 198 if ( preloaded ) {
199 if (forceshow) 199 if (forceshow)
200 show_mx(mw, nomax); 200 show_mx(mw, nomax);
201 } 201 }
202 else if ( keep_running ) { 202 else if ( keep_running ) {
203 show_mx(mw, nomax); 203 show_mx(mw, nomax);
204 } 204 }
205 } 205 }
206 206
207 void loadTextCodecs() 207 void loadTextCodecs()
208 { 208 {
209 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs"; 209 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs";
210 QDir dir( path, "lib*.so" ); 210 QDir dir( path, "lib*.so" );
211 QStringList list = dir.entryList(); 211 QStringList list = dir.entryList();
212 QStringList::Iterator it; 212 QStringList::Iterator it;
213 for ( it = list.begin(); it != list.end(); ++it ) { 213 for ( it = list.begin(); it != list.end(); ++it ) {
214 TextCodecInterface *iface = 0; 214 TextCodecInterface *iface = 0;
215 QLibrary *lib = new QLibrary( path + "/" + *it ); 215 QLibrary *lib = new QLibrary( path + "/" + *it );
216 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 216 if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
217 QValueList<int> mibs = iface->mibEnums(); 217 QValueList<int> mibs = iface->mibEnums();
218 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) { 218 for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) {
219 (void)iface->createForMib(*i); 219 (void)iface->createForMib(*i);
220 // ### it exists now; need to remember if we can delete it 220 // ### it exists now; need to remember if we can delete it
221 } 221 }
222 } 222 }
223 else { 223 else {
224 lib->unload(); 224 lib->unload();
225 delete lib; 225 delete lib;
226 } 226 }
227 } 227 }
228 } 228 }
229 229
230 void loadImageCodecs() 230 void loadImageCodecs()
231 { 231 {
232 QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs"; 232 QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs";
233 QDir dir( path, "lib*.so" ); 233 QDir dir( path, "lib*.so" );
234 QStringList list = dir.entryList(); 234 QStringList list = dir.entryList();
235 QStringList::Iterator it; 235 QStringList::Iterator it;
236 for ( it = list.begin(); it != list.end(); ++it ) { 236 for ( it = list.begin(); it != list.end(); ++it ) {
237 ImageCodecInterface *iface = 0; 237 ImageCodecInterface *iface = 0;
238 QLibrary *lib = new QLibrary( path + "/" + *it ); 238 QLibrary *lib = new QLibrary( path + "/" + *it );
239 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 239 if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
240 QStringList formats = iface->keys(); 240 QStringList formats = iface->keys();
241 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) { 241 for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) {
242 (void)iface->installIOHandler(*i); 242 (void)iface->installIOHandler(*i);
243 // ### it exists now; need to remember if we can delete it 243 // ### it exists now; need to remember if we can delete it
244 } 244 }
245 } 245 }
246 else { 246 else {
247 lib->unload(); 247 lib->unload();
248 delete lib; 248 delete lib;
249 } 249 }
250 } 250 }
251 } 251 }
252 QString styleName; 252 QString styleName;
253 QString decorationName; 253 QString decorationName;
254}; 254};
255 255
256class ResourceMimeFactory : public QMimeSourceFactory 256class ResourceMimeFactory : public QMimeSourceFactory
257{ 257{
258public: 258public:
259 ResourceMimeFactory() 259 ResourceMimeFactory()
260 { 260 {
261 setFilePath( Global::helpPath() ); 261 setFilePath( Global::helpPath() );
262 setExtensionType( "html", "text/html;charset=UTF-8" ); 262 setExtensionType( "html", "text/html;charset=UTF-8" );
263 } 263 }
264 264
265 const QMimeSource* data( const QString& abs_name ) const 265 const QMimeSource* data( const QString& abs_name ) const
266 { 266 {
267 const QMimeSource * r = QMimeSourceFactory::data( abs_name ); 267 const QMimeSource * r = QMimeSourceFactory::data( abs_name );
268 if ( !r ) { 268 if ( !r ) {
269 int sl = abs_name.length(); 269 int sl = abs_name.length();
270 do { 270 do {
271 sl = abs_name.findRev( '/', sl - 1 ); 271 sl = abs_name.findRev( '/', sl - 1 );
272 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name; 272 QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name;
273 int dot = name.findRev( '.' ); 273 int dot = name.findRev( '.' );
274 if ( dot >= 0 ) 274 if ( dot >= 0 )
275 name = name.left( dot ); 275 name = name.left( dot );
276 QImage img = Resource::loadImage( name ); 276 QImage img = Resource::loadImage( name );
277 if ( !img.isNull() ) 277 if ( !img.isNull() )
278 r = new QImageDrag( img ); 278 r = new QImageDrag( img );
279 } 279 }
280 while ( !r && sl > 0 ); 280 while ( !r && sl > 0 );
281 } 281 }
282 return r; 282 return r;
283 } 283 }
284}; 284};
285 285
286static int muted = 0; 286static int muted = 0;
287static int micMuted = 0; 287static int micMuted = 0;
288 288
289static void setVolume( int t = 0, int percent = -1 ) 289static void setVolume( int t = 0, int percent = -1 )
290{ 290{
291 switch ( t ) { 291 switch ( t ) {
292 case 0: { 292 case 0: {
293 Config cfg( "qpe" ); 293 Config cfg( "qpe" );
294 cfg.setGroup( "Volume" ); 294 cfg.setGroup( "Volume" );
295 if ( percent < 0 ) 295 if ( percent < 0 )
296 percent = cfg.readNumEntry( "VolumePercent", 50 ); 296 percent = cfg.readNumEntry( "VolumePercent", 50 );
297 int fd = 0; 297 int fd = 0;
298 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 298 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
299 int vol = muted ? 0 : percent; 299 int vol = muted ? 0 : percent;
300 // set both channels to same volume 300 // set both channels to same volume
301 vol |= vol << 8; 301 vol |= vol << 8;
302 ioctl( fd, MIXER_WRITE( 0 ), &vol ); 302 ioctl( fd, MIXER_WRITE( 0 ), &vol );
303 ::close( fd ); 303 ::close( fd );
304 } 304 }
305 } 305 }
306 break; 306 break;
307 } 307 }
308} 308}
309 309
310static void setMic( int t = 0, int percent = -1 ) 310static void setMic( int t = 0, int percent = -1 )
311{ 311{
312 switch ( t ) { 312 switch ( t ) {
313 case 0: { 313 case 0: {
314 Config cfg( "qpe" ); 314 Config cfg( "qpe" );
315 cfg.setGroup( "Volume" ); 315 cfg.setGroup( "Volume" );
316 if ( percent < 0 ) 316 if ( percent < 0 )
317 percent = cfg.readNumEntry( "Mic", 50 ); 317 percent = cfg.readNumEntry( "Mic", 50 );
318 318
319 int fd = 0; 319 int fd = 0;
320 int mic = micMuted ? 0 : percent; 320 int mic = micMuted ? 0 : percent;
321 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { 321 if ( ( fd = open( "/dev/mixer", O_RDWR ) ) >= 0 ) {
322 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic ); 322 ioctl( fd, MIXER_WRITE( SOUND_MIXER_MIC ), &mic );
323 ::close( fd ); 323 ::close( fd );
324 } 324 }
325 } 325 }
326 break; 326 break;
327 } 327 }
328} 328}
329 329
330 330
331/*! 331/*!
332 \class QPEApplication qpeapplication.h 332 \class QPEApplication qpeapplication.h
333 \brief The QPEApplication class implements various system services 333 \brief The QPEApplication class implements various system services
334 that are available to all Qtopia applications. 334 that are available to all Qtopia applications.
335 335
336 Simply by using QPEApplication instead of QApplication, a standard Qt 336 Simply by using QPEApplication instead of QApplication, a standard Qt
337 application becomes a Qtopia application. It automatically follows 337 application becomes a Qtopia application. It automatically follows
338 style changes, quits and raises, and in the 338 style changes, quits and raises, and in the
339 case of \link docwidget.html document-oriented\endlink applications, 339 case of \link docwidget.html document-oriented\endlink applications,
340 changes the currently displayed document in response to the environment. 340 changes the currently displayed document in response to the environment.
341 341
342 To create a \link docwidget.html document-oriented\endlink 342 To create a \link docwidget.html document-oriented\endlink
343 application use showMainDocumentWidget(); to create a 343 application use showMainDocumentWidget(); to create a
344 non-document-oriented application use showMainWidget(). The 344 non-document-oriented application use showMainWidget(). The
345 keepRunning() function indicates whether the application will 345 keepRunning() function indicates whether the application will
346 continue running after it's processed the last \link qcop.html 346 continue running after it's processed the last \link qcop.html
347 QCop\endlink message. This can be changed using setKeepRunning(). 347 QCop\endlink message. This can be changed using setKeepRunning().
348 348
349 A variety of signals are emitted when certain events occur, for 349 A variety of signals are emitted when certain events occur, for
350 example, timeChanged(), clockChanged(), weekChanged(), 350 example, timeChanged(), clockChanged(), weekChanged(),
351 dateFormatChanged() and volumeChanged(). If the application receives 351 dateFormatChanged() and volumeChanged(). If the application receives
352 a \link qcop.html QCop\endlink message on the application's 352 a \link qcop.html QCop\endlink message on the application's
353 QPE/Application/\e{appname} channel, the appMessage() signal is 353 QPE/Application/\e{appname} channel, the appMessage() signal is
354 emitted. There are also flush() and reload() signals, which 354 emitted. There are also flush() and reload() signals, which
355 are emitted when synching begins and ends respectively - upon these 355 are emitted when synching begins and ends respectively - upon these
356 signals, the application should save and reload any data 356 signals, the application should save and reload any data
357 files that are involved in synching. Most of these signals will initially 357 files that are involved in synching. Most of these signals will initially
358 be received and unfiltered through the appMessage() signal. 358 be received and unfiltered through the appMessage() signal.
359 359
360 This class also provides a set of useful static functions. The 360 This class also provides a set of useful static functions. The
361 qpeDir() and documentDir() functions return the respective paths. 361 qpeDir() and documentDir() functions return the respective paths.
362 The grabKeyboard() and ungrabKeyboard() functions are used to 362 The grabKeyboard() and ungrabKeyboard() functions are used to
363 control whether the application takes control of the device's 363 control whether the application takes control of the device's
364 physical buttons (e.g. application launch keys). The stylus' mode of 364 physical buttons (e.g. application launch keys). The stylus' mode of
365 operation is set with setStylusOperation() and retrieved with 365 operation is set with setStylusOperation() and retrieved with
366 stylusOperation(). There are also setInputMethodHint() and 366 stylusOperation(). There are also setInputMethodHint() and
367 inputMethodHint() functions. 367 inputMethodHint() functions.
368 368
369 \ingroup qtopiaemb 369 \ingroup qtopiaemb
370*/ 370*/
371 371
372/*! 372/*!
373 \fn void QPEApplication::clientMoused() 373 \fn void QPEApplication::clientMoused()
374 374
375 \internal 375 \internal
376*/ 376*/
377 377
378/*! 378/*!
379 \fn void QPEApplication::timeChanged(); 379 \fn void QPEApplication::timeChanged();
380 This signal is emitted when the time changes outside the normal 380 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. 381 passage of time, i.e. if the time is set backwards or forwards.
382*/ 382*/
383 383
384/*! 384/*!
385 \fn void QPEApplication::clockChanged( bool ampm ); 385 \fn void QPEApplication::clockChanged( bool ampm );
386 386
387 This signal is emitted when the user changes the clock's style. If 387 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, 388 \a ampm is TRUE, the user wants a 12-hour AM/PM clock, otherwise,
389 they want a 24-hour clock. 389 they want a 24-hour clock.
390*/ 390*/
391 391
392/*! 392/*!
393 \fn void QPEApplication::volumeChanged( bool muted ) 393 \fn void QPEApplication::volumeChanged( bool muted )
394 394
395 This signal is emitted whenever the mute state is changed. If \a 395 This signal is emitted whenever the mute state is changed. If \a
396 muted is TRUE, then sound output has been muted. 396 muted is TRUE, then sound output has been muted.
397*/ 397*/
398 398
399/*! 399/*!
400 \fn void QPEApplication::weekChanged( bool startOnMonday ) 400 \fn void QPEApplication::weekChanged( bool startOnMonday )
401 401
402 This signal is emitted if the week start day is changed. If \a 402 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 403 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 404 \a startOnMonday is FALSE then the first day of the week is
405 Sunday. 405 Sunday.
406*/ 406*/
407 407
408/*! 408/*!
409 \fn void QPEApplication::dateFormatChanged() 409 \fn void QPEApplication::dateFormatChanged()
410 410
411 This signal is emitted whenever the date format is changed. 411 This signal is emitted whenever the date format is changed.
412*/ 412*/
413 413
414/*! 414/*!
415 \fn void QPEApplication::flush() 415 \fn void QPEApplication::flush()
416 416
417 ### 417 ###
418*/ 418*/
419 419
420/*! 420/*!
421 \fn void QPEApplication::reload() 421 \fn void QPEApplication::reload()
422 422
423*/ 423*/
424 424
425/*! 425/*!
426 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data ) 426 \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data )
427 427
428 This signal is emitted when a message is received on this 428 This signal is emitted when a message is received on this
429 application's QPE/Application/<i>appname</i> \link qcop.html 429 application's QPE/Application/<i>appname</i> \link qcop.html
430 QCop\endlink channel. 430 QCop\endlink channel.
431 431
432 The slot to which you connect this signal uses \a msg and \a data 432 The slot to which you connect this signal uses \a msg and \a data
433 in the following way: 433 in the following way:
434 434
435\code 435\code
436 void MyWidget::receive( const QCString& msg, const QByteArray& data ) 436 void MyWidget::receive( const QCString& msg, const QByteArray& data )
437 { 437 {
438 QDataStream stream( data, IO_ReadOnly ); 438 QDataStream stream( data, IO_ReadOnly );
439 if ( msg == "someMessage(int,int,int)" ) { 439 if ( msg == "someMessage(int,int,int)" ) {
440 int a,b,c; 440 int a,b,c;
441 stream >> a >> b >> c; 441 stream >> a >> b >> c;
442 ... 442 ...
443 } else if ( msg == "otherMessage(QString)" ) { 443 } else if ( msg == "otherMessage(QString)" ) {
444 ... 444 ...
445 } 445 }
446 } 446 }
447\endcode 447\endcode
448 448
449 \sa qcop.html 449 \sa qcop.html
450 Note that messages received here may be processed by qpe application 450 Note that messages received here may be processed by qpe application
451 and emitted as signals, such as flush() and reload(). 451 and emitted as signals, such as flush() and reload().
452*/ 452*/
453 453
454/*! 454/*!
455 Constructs a QPEApplication just as you would construct 455 Constructs a QPEApplication just as you would construct
456 a QApplication, passing \a argc, \a argv, and \a t. 456 a QApplication, passing \a argc, \a argv, and \a t.
457 457
458 For applications, \a t should be the default, GuiClient. Only 458 For applications, \a t should be the default, GuiClient. Only
459 the Qtopia server passes GuiServer. 459 the Qtopia server passes GuiServer.
460*/ 460*/
461QPEApplication::QPEApplication( int & argc, char **argv, Type t ) 461QPEApplication::QPEApplication( int & argc, char **argv, Type t )
462 : QApplication( argc, argv, t ) 462 : QApplication( argc, argv, t )
463{ 463{
464 d = new QPEApplicationData; 464 d = new QPEApplicationData;
465 d->loadTextCodecs(); 465 d->loadTextCodecs();
466 d->loadImageCodecs(); 466 d->loadImageCodecs();
467 int dw = desktop() ->width(); 467 int dw = desktop() ->width();
468 qWarning( "Width %d", dw ); 468 qWarning( "Width %d", dw );
469 if ( dw < 200 ) { 469 if ( dw < 200 ) {
470 setFont( QFont( "helvetica", 8 ) ); 470 setFont( QFont( "helvetica", 8 ) );
471 AppLnk::setSmallIconSize( 10 ); 471 AppLnk::setSmallIconSize( 10 );
472 AppLnk::setBigIconSize( 28 ); 472 AppLnk::setBigIconSize( 28 );
473 } 473 }
474 else if ( dw > 600 ) { 474 else if ( dw > 600 ) {
475 setFont( QFont( "helvetica", 12 ) ); 475 setFont( QFont( "helvetica", 12 ) );
476 AppLnk::setSmallIconSize( 24 ); 476 AppLnk::setSmallIconSize( 24 );
477 AppLnk::setBigIconSize( 48 ); 477 AppLnk::setBigIconSize( 48 );
478 } 478 }
479 else if ( dw > 200 ) { 479 else if ( dw > 200 ) {
480 setFont( QFont( "helvetica", 10 ) ); 480 setFont( QFont( "helvetica", 10 ) );
481 AppLnk::setSmallIconSize( 16 ); 481 AppLnk::setSmallIconSize( 16 );
482 AppLnk::setBigIconSize( 32 ); 482 AppLnk::setBigIconSize( 32 );
483 } 483 }
484 484
485 485
486 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory ); 486 QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory );
487 487
488 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) ); 488 connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) );
489#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 489#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
490 490
491 QString qcopfn( "/tmp/qcop-msg-" ); 491 QString qcopfn( "/tmp/qcop-msg-" );
492 qcopfn += QString( argv[ 0 ] ); // append command name 492 qcopfn += QString( argv[ 0 ] ); // append command name
493 493
494 QFile f( qcopfn ); 494 QFile f( qcopfn );
495 if ( f.open( IO_ReadOnly ) ) { 495 if ( f.open( IO_ReadOnly ) ) {
496 flock( f.handle(), LOCK_EX ); 496 flock( f.handle(), LOCK_EX );
497 } 497 }
498 498
499 sysChannel = new QCopChannel( "QPE/System", this ); 499 sysChannel = new QCopChannel( "QPE/System", this );
500 connect( sysChannel, SIGNAL( received( const QCString &, const QByteArray & ) ), 500 connect( sysChannel, SIGNAL( received( const QCString &, const QByteArray & ) ),
501 this, SLOT( systemMessage( const QCString &, const QByteArray & ) ) ); 501 this, SLOT( systemMessage( const QCString &, const QByteArray & ) ) );
502 502
503 QCString channel = QCString( argv[ 0 ] ); 503 QCString channel = QCString( argv[ 0 ] );
504 channel.replace( QRegExp( ".*/" ), "" ); 504 channel.replace( QRegExp( ".*/" ), "" );
505 d->appName = channel; 505 d->appName = channel;
506 channel = "QPE/Application/" + channel; 506 channel = "QPE/Application/" + channel;
507 pidChannel = new QCopChannel( channel, this ); 507 pidChannel = new QCopChannel( channel, this );
508 connect( pidChannel, SIGNAL( received( const QCString &, const QByteArray & ) ), 508 connect( pidChannel, SIGNAL( received( const QCString &, const QByteArray & ) ),
509 this, SLOT( pidMessage( const QCString &, const QByteArray & ) ) ); 509 this, SLOT( pidMessage( const QCString &, const QByteArray & ) ) );
510 510
511 if ( f.isOpen() ) { 511 if ( f.isOpen() ) {
512 d->keep_running = FALSE; 512 d->keep_running = FALSE;
513 QDataStream ds( &f ); 513 QDataStream ds( &f );
514 QCString channel, message; 514 QCString channel, message;
515 QByteArray data; 515 QByteArray data;
516 while ( !ds.atEnd() ) { 516 while ( !ds.atEnd() ) {
517 ds >> channel >> message >> data; 517 ds >> channel >> message >> data;
518 d->enqueueQCop( channel, message, data ); 518 d->enqueueQCop( channel, message, data );
519 } 519 }
520 520
521 flock( f.handle(), LOCK_UN ); 521 flock( f.handle(), LOCK_UN );
522 f.close(); 522 f.close();
523 f.remove(); 523 f.remove();
524 } 524 }
525 525
526 for ( int a = 0; a < argc; a++ ) { 526 for ( int a = 0; a < argc; a++ ) {
527 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) { 527 if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) {
528 argv[ a ] = argv[ a + 1 ]; 528 argv[ a ] = argv[ a + 1 ];
529 a++; 529 a++;
530 d->preloaded = TRUE; 530 d->preloaded = TRUE;
531 argc -= 1; 531 argc -= 1;
532 } 532 }
533 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) { 533 else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) {
534 argv[ a ] = argv[ a + 1 ]; 534 argv[ a ] = argv[ a + 1 ];
535 a++; 535 a++;
536 d->preloaded = TRUE; 536 d->preloaded = TRUE;
537 d->forceshow = TRUE; 537 d->forceshow = TRUE;
538 argc -= 1; 538 argc -= 1;
539 } 539 }
540 } 540 }
541 541
542 /* overide stored arguments */ 542 /* overide stored arguments */
543 setArgs( argc, argv ); 543 setArgs( argc, argv );
544 544
545#endif 545#endif
546 546
547 // qwsSetDecoration( new QPEDecoration() ); 547 // qwsSetDecoration( new QPEDecoration() );
548 548
549#ifndef QT_NO_TRANSLATION 549#ifndef QT_NO_TRANSLATION
550 550
551 QStringList langs = Global::languageList(); 551 QStringList langs = Global::languageList();
552 for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) { 552 for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) {
553 QString lang = *it; 553 QString lang = *it;
554 554
555 QTranslator * trans; 555 QTranslator * trans;
556 QString tfn; 556 QString tfn;
557 557
558 trans = new QTranslator( this ); 558 trans = new QTranslator( this );
559 tfn = qpeDir() + "/i18n/" + lang + "/libqpe.qm"; 559 tfn = qpeDir() + "/i18n/" + lang + "/libqpe.qm";
560 if ( trans->load( tfn ) ) 560 if ( trans->load( tfn ) )
561 installTranslator( trans ); 561 installTranslator( trans );
562 else 562 else
563 delete trans; 563 delete trans;
564 564
565 trans = new QTranslator( this ); 565 trans = new QTranslator( this );
566 tfn = qpeDir() + "/i18n/" + lang + "/" + d->appName + ".qm"; 566 tfn = qpeDir() + "/i18n/" + lang + "/" + d->appName + ".qm";
567 if ( trans->load( tfn ) ) 567 if ( trans->load( tfn ) )
568 installTranslator( trans ); 568 installTranslator( trans );
569 else 569 else
570 delete trans; 570 delete trans;
571 571
572 //###language/font hack; should look it up somewhere 572 //###language/font hack; should look it up somewhere
573#ifdef QWS 573#ifdef QWS
574 574
575 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) { 575 if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) {
576 QFont fn = FontManager::unicodeFont( FontManager::Proportional ); 576 QFont fn = FontManager::unicodeFont( FontManager::Proportional );
577 setFont( fn ); 577 setFont( fn );
578 } 578 }
579#endif 579#endif
580 580
581 } 581 }
582#endif 582#endif
583 583
584 applyStyle(); 584 applyStyle();
585 585
586 if ( type() == GuiServer ) { 586 if ( type() == GuiServer ) {
587 setVolume(); 587 setVolume();
588 } 588 }
589 589
590 installEventFilter( this ); 590 installEventFilter( this );
591 591
592 QPEMenuToolFocusManager::initialize(); 592 QPEMenuToolFocusManager::initialize();
593 593
594#ifdef QT_NO_QWS_CURSOR 594#ifdef QT_NO_QWS_CURSOR
595 // if we have no cursor, probably don't want tooltips 595 // if we have no cursor, probably don't want tooltips
596 QToolTip::setEnabled( FALSE ); 596 QToolTip::setEnabled( FALSE );
597#endif 597#endif
598} 598}
599 599
600static QPtrDict<void>* inputMethodDict = 0; 600static QPtrDict<void>* inputMethodDict = 0;
601static void createInputMethodDict() 601static void createInputMethodDict()
602{ 602{
603 if ( !inputMethodDict ) 603 if ( !inputMethodDict )
604 inputMethodDict = new QPtrDict<void>; 604 inputMethodDict = new QPtrDict<void>;
605} 605}
606 606
607/*! 607/*!
608 Returns the currently set hint to the system as to whether 608 Returns the currently set hint to the system as to whether
609 widget \a w has any use for text input methods. 609 widget \a w has any use for text input methods.
610 610
611 611
612 \sa setInputMethodHint() InputMethodHint 612 \sa setInputMethodHint() InputMethodHint
613*/ 613*/
614QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) 614QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w )
615{ 615{
616 if ( inputMethodDict && w ) 616 if ( inputMethodDict && w )
617 return ( InputMethodHint ) ( int ) inputMethodDict->find( w ); 617 return ( InputMethodHint ) ( int ) inputMethodDict->find( w );
618 return Normal; 618 return Normal;
619} 619}
620 620
621/*! 621/*!
622 \enum QPEApplication::InputMethodHint 622 \enum QPEApplication::InputMethodHint
623 623
624 \value Normal the application sometimes needs text input (the default). 624 \value Normal the application sometimes needs text input (the default).
625 \value AlwaysOff the application never needs text input. 625 \value AlwaysOff the application never needs text input.
626 \value AlwaysOn the application always needs text input. 626 \value AlwaysOn the application always needs text input.
627*/ 627*/
628 628
629/*! 629/*!
630 Hints to the system that widget \a w has use for text input methods 630 Hints to the system that widget \a w has use for text input methods
631 as specified by \a mode. 631 as specified by \a mode.
632 632
633 \sa inputMethodHint() InputMethodHint 633 \sa inputMethodHint() InputMethodHint
634*/ 634*/
635void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) 635void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode )
636{ 636{
637 createInputMethodDict(); 637 createInputMethodDict();
638 if ( mode == Normal ) { 638 if ( mode == Normal ) {
639 inputMethodDict->remove 639 inputMethodDict->remove
640 ( w ); 640 ( w );
641 } 641 }
642 else { 642 else {
643 inputMethodDict->insert( w, ( void* ) mode ); 643 inputMethodDict->insert( w, ( void* ) mode );
644 } 644 }
645} 645}
646 646
647class HackDialog : public QDialog 647class HackDialog : public QDialog
648{ 648{
649public: 649public:
650 void acceptIt() 650 void acceptIt()
651 { 651 {
652 accept(); 652 accept();
653 } 653 }
654 void rejectIt() 654 void rejectIt()
655 { 655 {
656 reject(); 656 reject();
657 } 657 }
658}; 658};
659 659
660 660
661void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) 661void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key )
662{ 662{
663 // specialised actions for certain widgets. May want to 663 // specialised actions for certain widgets. May want to
664 // add more stuff here. 664 // add more stuff here.
665 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" ) 665 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" )
666 && activePopupWidget() ->parentWidget() 666 && activePopupWidget() ->parentWidget()
667 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) ) 667 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) )
668 key = Qt::Key_Return; 668 key = Qt::Key_Return;
669 669
670 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) ) 670 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) )
671 key = Qt::Key_Return; 671 key = Qt::Key_Return;
672 672
673#ifdef QWS 673#ifdef QWS
674 674
675 ke->simpleData.keycode = key; 675 ke->simpleData.keycode = key;
676#endif 676#endif
677} 677}
678 678
679class HackWidget : public QWidget 679class HackWidget : public QWidget
680{ 680{
681public: 681public:
682 bool needsOk() 682 bool needsOk()
683 { 683 {
684 return ( getWState() & WState_Reserved1 ); 684 return ( getWState() & WState_Reserved1 );
685 } 685 }
686}; 686};
687 687
688/*! 688/*!
689 \internal 689 \internal
690*/ 690*/
691 691
692#ifdef QWS 692#ifdef QWS
693bool QPEApplication::qwsEventFilter( QWSEvent * e ) 693bool QPEApplication::qwsEventFilter( QWSEvent * e )
694{ 694{
695 if ( !d->notbusysent && e->type == QWSEvent::Focus ) { 695 if ( !d->notbusysent && e->type == QWSEvent::Focus ) {
696 if ( qApp->type() != QApplication::GuiServer ) { 696 if ( qApp->type() != QApplication::GuiServer ) {
697 QCopEnvelope e( "QPE/System", "notBusy(QString)" ); 697 QCopEnvelope e( "QPE/System", "notBusy(QString)" );
698 e << d->appName; 698 e << d->appName;
699 } 699 }
700 d->notbusysent = TRUE; 700 d->notbusysent = TRUE;
701 } 701 }
702 if ( type() == GuiServer ) { 702 if ( type() == GuiServer ) {
703 switch ( e->type ) { 703 switch ( e->type ) {
704 case QWSEvent::Mouse: 704 case QWSEvent::Mouse:
705 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) 705 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) )
706 emit clientMoused(); 706 emit clientMoused();
707 break; 707 break;
708 default: 708 default:
709 break; 709 break;
710 } 710 }
711 } 711 }
712 if ( e->type == QWSEvent::Key ) { 712 if ( e->type == QWSEvent::Key ) {
713 if ( d->kbgrabber == 1 ) 713 if ( d->kbgrabber == 1 )
714 return TRUE; 714 return TRUE;
715 QWSKeyEvent *ke = ( QWSKeyEvent * ) e; 715 QWSKeyEvent *ke = ( QWSKeyEvent * ) e;
716 if ( ke->simpleData.keycode == Qt::Key_F33 ) { 716 if ( ke->simpleData.keycode == Qt::Key_F33 ) {
717 // Use special "OK" key to press "OK" on top level widgets 717 // Use special "OK" key to press "OK" on top level widgets
718 QWidget * active = activeWindow(); 718 QWidget * active = activeWindow();
719 QWidget *popup = 0; 719 QWidget *popup = 0;
720 if ( active && active->isPopup() ) { 720 if ( active && active->isPopup() ) {
721 popup = active; 721 popup = active;
722 active = active->parentWidget(); 722 active = active->parentWidget();
723 } 723 }
724 if ( active && ( int ) active->winId() == ke->simpleData.window && 724 if ( active && ( int ) active->winId() == ke->simpleData.window &&
725 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) { 725 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) {
726 if ( ke->simpleData.is_press ) { 726 if ( ke->simpleData.is_press ) {
727 if ( popup ) 727 if ( popup )
728 popup->close(); 728 popup->close();
729 if ( active->inherits( "QDialog" ) ) { 729 if ( active->inherits( "QDialog" ) ) {
730 HackDialog * d = ( HackDialog * ) active; 730 HackDialog * d = ( HackDialog * ) active;
731 d->acceptIt(); 731 d->acceptIt();
732 return TRUE; 732 return TRUE;
733 } 733 }
734 else if ( ( ( HackWidget * ) active ) ->needsOk() ) { 734 else if ( ( ( HackWidget * ) active ) ->needsOk() ) {
735 QSignal s; 735 QSignal s;
736 s.connect( active, SLOT( accept() ) ); 736 s.connect( active, SLOT( accept() ) );
737 s.activate(); 737 s.activate();
738 } 738 }
739 else { 739 else {
740 // do the same as with the select key: Map to the default action of the widget: 740 // do the same as with the select key: Map to the default action of the widget:
741 mapToDefaultAction( ke, Qt::Key_Return ); 741 mapToDefaultAction( ke, Qt::Key_Return );
742 } 742 }
743 } 743 }
744 } 744 }
745 } 745 }
746 else if ( ke->simpleData.keycode == Qt::Key_F30 ) { 746 else if ( ke->simpleData.keycode == Qt::Key_F30 ) {
747 // Use special "select" key to do whatever default action a widget has 747 // Use special "select" key to do whatever default action a widget has
748 mapToDefaultAction( ke, Qt::Key_Space ); 748 mapToDefaultAction( ke, Qt::Key_Space );
749 } 749 }
750 else if ( ke->simpleData.keycode == Qt::Key_Escape && 750 else if ( ke->simpleData.keycode == Qt::Key_Escape &&
751 ke->simpleData.is_press ) { 751 ke->simpleData.is_press ) {
752 // Escape key closes app if focus on toplevel 752 // Escape key closes app if focus on toplevel
753 QWidget * active = activeWindow(); 753 QWidget * active = activeWindow();
754 if ( active && active->testWFlags( WType_TopLevel ) && 754 if ( active && active->testWFlags( WType_TopLevel ) &&
755 ( int ) active->winId() == ke->simpleData.window && 755 ( int ) active->winId() == ke->simpleData.window &&
756 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) { 756 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) {
757 if ( active->inherits( "QDialog" ) ) { 757 if ( active->inherits( "QDialog" ) ) {
758 HackDialog * d = ( HackDialog * ) active; 758 HackDialog * d = ( HackDialog * ) active;
759 d->rejectIt(); 759 d->rejectIt();
760 return TRUE; 760 return TRUE;
761 } 761 }
762 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) { 762 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) {
763 active->close(); 763 active->close();
764 } 764 }
765 } 765 }
766 } 766 }
767 767
768#if QT_VERSION < 231 768#if QT_VERSION < 231
769 // Filter out the F4/Launcher key from apps 769 // Filter out the F4/Launcher key from apps
770 // ### The launcher key may not always be F4 on all devices 770 // ### The launcher key may not always be F4 on all devices
771 if ( ( ( QWSKeyEvent * ) e ) ->simpleData.keycode == Qt::Key_F4 ) 771 if ( ( ( QWSKeyEvent * ) e ) ->simpleData.keycode == Qt::Key_F4 )
772 return TRUE; 772 return TRUE;
773#endif 773#endif
774 774
775 } 775 }
776 if ( e->type == QWSEvent::Focus ) { 776 if ( e->type == QWSEvent::Focus ) {
777 QWSFocusEvent * fe = ( QWSFocusEvent* ) e; 777 QWSFocusEvent * fe = ( QWSFocusEvent* ) e;
778 QWidget* nfw = QWidget::find( e->window() ); 778 QWidget* nfw = QWidget::find( e->window() );
779 if ( !fe->simpleData.get_focus ) { 779 if ( !fe->simpleData.get_focus ) {
780 QWidget * active = activeWindow(); 780 QWidget * active = activeWindow();
781 while ( active && active->isPopup() ) { 781 while ( active && active->isPopup() ) {
782 active->close(); 782 active->close();
783 active = activeWindow(); 783 active = activeWindow();
784 } 784 }
785 if ( !nfw && d->kbgrabber == 2 ) { 785 if ( !nfw && d->kbgrabber == 2 ) {
786 ungrabKeyboard(); 786 ungrabKeyboard();
787 d->kbregrab = TRUE; // want kb back when we're active 787 d->kbregrab = TRUE; // want kb back when we're active
788 } 788 }
789 } 789 }
790 else { 790 else {
791 // make sure our modal widget is ALWAYS on top 791 // make sure our modal widget is ALWAYS on top
792 QWidget *topm = activeModalWidget(); 792 QWidget *topm = activeModalWidget();
793 if ( topm ) { 793 if ( topm ) {
794 topm->raise(); 794 topm->raise();
795 } 795 }
796 if ( d->kbregrab ) { 796 if ( d->kbregrab ) {
797 grabKeyboard(); 797 grabKeyboard();
798 d->kbregrab = FALSE; 798 d->kbregrab = FALSE;
799 } 799 }
800 } 800 }
801 if ( fe->simpleData.get_focus && inputMethodDict ) { 801 if ( fe->simpleData.get_focus && inputMethodDict ) {
802 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) ); 802 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) );
803 if ( m == AlwaysOff ) 803 if ( m == AlwaysOff )
804 Global::hideInputMethod(); 804 Global::hideInputMethod();
805 if ( m == AlwaysOn ) 805 if ( m == AlwaysOn )
806 Global::showInputMethod(); 806 Global::showInputMethod();
807 } 807 }
808 } 808 }
809 return QApplication::qwsEventFilter( e ); 809 return QApplication::qwsEventFilter( e );
810} 810}
811#endif 811#endif
812 812
813/*! 813/*!
814 Destroys the QPEApplication. 814 Destroys the QPEApplication.
815*/ 815*/
816QPEApplication::~QPEApplication() 816QPEApplication::~QPEApplication()
817{ 817{
818 ungrabKeyboard(); 818 ungrabKeyboard();
819#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 819#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
820 // Need to delete QCopChannels early, since the display will 820 // Need to delete QCopChannels early, since the display will
821 // be gone by the time we get to ~QObject(). 821 // be gone by the time we get to ~QObject().
822 delete sysChannel; 822 delete sysChannel;
823 delete pidChannel; 823 delete pidChannel;
824#endif 824#endif
825 825
826 delete d; 826 delete d;
827} 827}
828 828
829/*! 829/*!
830 Returns <tt>$OPIEDIR/</tt>. 830 Returns <tt>$OPIEDIR/</tt>.
831*/ 831*/
832QString QPEApplication::qpeDir() 832QString QPEApplication::qpeDir()
833{ 833{
834 const char * base = getenv( "OPIEDIR" ); 834 const char * base = getenv( "OPIEDIR" );
835 if ( base ) 835 if ( base )
836 return QString( base ) + "/"; 836 return QString( base ) + "/";
837 837
838 return QString( "../" ); 838 return QString( "../" );
839} 839}
840 840
841/*! 841/*!
842 Returns the user's current Document directory. There is a trailing "/". 842 Returns the user's current Document directory. There is a trailing "/".
843 .. well, it does now,, and there's no trailing '/' 843 .. well, it does now,, and there's no trailing '/'
844*/ 844*/
845QString QPEApplication::documentDir() 845QString QPEApplication::documentDir()
846{ 846{
847 const char* base = getenv( "HOME"); 847 const char* base = getenv( "HOME");
848 if ( base ) 848 if ( base )
849 return QString( base ) + "/Documents"; 849 return QString( base ) + "/Documents";
850 850
851 return QString( "../Documents" ); 851 return QString( "../Documents" );
852} 852}
853 853
854static int deforient = -1; 854static int deforient = -1;
855 855
856/*! 856/*!
857 \internal 857 \internal
858*/ 858*/
859int QPEApplication::defaultRotation() 859int QPEApplication::defaultRotation()
860{ 860{
861 if ( deforient < 0 ) { 861 if ( deforient < 0 ) {
862 QString d = getenv( "QWS_DISPLAY" ); 862 QString d = getenv( "QWS_DISPLAY" );
863 if ( d.contains( "Rot90" ) ) { 863 if ( d.contains( "Rot90" ) ) {
864 deforient = 90; 864 deforient = 90;
865 } 865 }
866 else if ( d.contains( "Rot180" ) ) { 866 else if ( d.contains( "Rot180" ) ) {
867 deforient = 180; 867 deforient = 180;
868 } 868 }
869 else if ( d.contains( "Rot270" ) ) { 869 else if ( d.contains( "Rot270" ) ) {
870 deforient = 270; 870 deforient = 270;
871 } 871 }
872 else { 872 else {
873 deforient = 0; 873 deforient = 0;
874 } 874 }
875 } 875 }
876 return deforient; 876 return deforient;
877} 877}
878 878
879/*! 879/*!
880 \internal 880 \internal
881*/ 881*/
882void QPEApplication::setDefaultRotation( int r ) 882void QPEApplication::setDefaultRotation( int r )
883{ 883{
884 if ( qApp->type() == GuiServer ) { 884 if ( qApp->type() == GuiServer ) {
885 deforient = r; 885 deforient = r;
886 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); 886 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 );
887 Config config("qpe"); 887 Config config("qpe");
888 config.setGroup( "Rotation" ); 888 config.setGroup( "Rotation" );
889 config.writeEntry( "Screen", getenv("QWS_DISPLAY") ); 889 config.writeEntry( "Screen", getenv("QWS_DISPLAY") );
890 } 890 }
891 else { 891 else {
892#ifndef QT_NO_COP 892#ifndef QT_NO_COP
893 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" ); 893 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" );
894 e << r; 894 e << r;
895 } 895 }
896#endif 896#endif
897 897
898 } 898 }
899} 899}
900 900
901// exported to libpreload.so 901// exported to libpreload.so
902bool opie_block_style = false; 902int opie_block_style = 0;
903 903
904/*! 904/*!
905 \internal 905 \internal
906*/ 906*/
907void QPEApplication::applyStyle() 907void QPEApplication::applyStyle()
908{ 908{
909 Config config( "qpe" ); 909 Config config( "qpe" );
910 config.setGroup( "Appearance" ); 910 config.setGroup( "Appearance" );
911 911
912 // don't block ourselves ... 912 // don't block ourselves ...
913 opie_block_style = false; 913 opie_block_style = 0;
914 914
915 915
916 static QString appname; 916 static QString appname;
917 917
918 if ( appname. isNull ( )) { 918 if ( appname. isNull ( )) {
919 char src [32]; 919 char src [32];
920 char dst [PATH_MAX + 1]; 920 char dst [PATH_MAX + 1];
921 ::sprintf ( src, "/proc/%d/exe", ::getpid ( )); 921 ::sprintf ( src, "/proc/%d/exe", ::getpid ( ));
922 int l = ::readlink ( src, dst, PATH_MAX ); 922 int l = ::readlink ( src, dst, PATH_MAX );
923 if ( l > 0 ) { 923 if ( l > 0 ) {
924 dst [l] = 0; 924 dst [l] = 0;
925 const char *b = ::strrchr ( dst, '/' ); 925 const char *b = ::strrchr ( dst, '/' );
926 appname = ( b ? b + 1 : dst ); 926 appname = ( b ? b + 1 : dst );
927 } 927 }
928 else 928 else
929 appname = ""; 929 appname = "";
930 } 930 }
931 931
932 932
933 QStringList ex = config. readListEntry ( "NoStyle", ';' ); 933 QStringList ex = config. readListEntry ( "NoStyle", ';' );
934 int nostyle = 0; 934 int nostyle = 0;
935 for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) { 935 for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) {
936 if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) { 936 if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) {
937 nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 ); 937 nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 );
938 break; 938 break;
939 } 939 }
940 } 940 }
941 941
942 // Widget style 942 // Widget style
943 QString style = config.readEntry( "Style", "Light" ); 943 QString style = config.readEntry( "Style", "Light" );
944 944
945 // don't set a custom style 945 // don't set a custom style
946 if ( nostyle & 0x01 ) 946 if ( nostyle & 0x01 )
947 style = "Light"; 947 style = "Light";
948 948
949 internalSetStyle ( style ); 949 internalSetStyle ( style );
950 950
951 // Colors 951 // Colors
952 QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) ); 952 QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) );
953 QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) ); 953 QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) );
954 QPalette pal( btncolor, bgcolor ); 954 QPalette pal( btncolor, bgcolor );
955 QString color = config.readEntry( "Highlight", "#800000" ); 955 QString color = config.readEntry( "Highlight", "#800000" );
956 pal.setColor( QColorGroup::Highlight, QColor( color ) ); 956 pal.setColor( QColorGroup::Highlight, QColor( color ) );
957 color = config.readEntry( "HighlightedText", "#FFFFFF" ); 957 color = config.readEntry( "HighlightedText", "#FFFFFF" );
958 pal.setColor( QColorGroup::HighlightedText, QColor( color ) ); 958 pal.setColor( QColorGroup::HighlightedText, QColor( color ) );
959 color = config.readEntry( "Text", "#000000" ); 959 color = config.readEntry( "Text", "#000000" );
960 pal.setColor( QColorGroup::Text, QColor( color ) ); 960 pal.setColor( QColorGroup::Text, QColor( color ) );
961 color = config.readEntry( "ButtonText", "#000000" ); 961 color = config.readEntry( "ButtonText", "#000000" );
962 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) ); 962 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) );
963 color = config.readEntry( "Base", "#FFFFFF" ); 963 color = config.readEntry( "Base", "#FFFFFF" );
964 pal.setColor( QColorGroup::Base, QColor( color ) ); 964 pal.setColor( QColorGroup::Base, QColor( color ) );
965 965
966 pal.setColor( QPalette::Disabled, QColorGroup::Text, 966 pal.setColor( QPalette::Disabled, QColorGroup::Text,
967 pal.color( QPalette::Active, QColorGroup::Background ).dark() ); 967 pal.color( QPalette::Active, QColorGroup::Background ).dark() );
968 968
969 setPalette( pal, TRUE ); 969 setPalette( pal, TRUE );
970 970
971 // Window Decoration 971 // Window Decoration
972 QString dec = config.readEntry( "Decoration", "Qtopia" ); 972 QString dec = config.readEntry( "Decoration", "Qtopia" );
973 973
974 // don't set a custom deco 974 // don't set a custom deco
975 if ( nostyle & 0x04 ) 975 if ( nostyle & 0x04 )
976 dec = ""; 976 dec = "";
977 977
978 //qDebug ( "Setting Deco: %s -- old %s (%d)", dec.latin1(), d-> decorationName.latin1(), nostyle);
979
978 if ( dec != d->decorationName ) { 980 if ( dec != d->decorationName ) {
979 qwsSetDecoration( new QPEDecoration( dec ) ); 981 qwsSetDecoration( new QPEDecoration( dec ) );
980 d->decorationName = dec; 982 d->decorationName = dec;
981 } 983 }
982 984
983 // Font 985 // Font
984 QString ff = config.readEntry( "FontFamily", font().family() ); 986 QString ff = config.readEntry( "FontFamily", font().family() );
985 int fs = config.readNumEntry( "FontSize", font().pointSize() ); 987 int fs = config.readNumEntry( "FontSize", font().pointSize() );
986 988
987 // don't set a custom font 989 // don't set a custom font
988 if ( nostyle & 0x02 ) { 990 if ( nostyle & 0x02 ) {
989 ff = "Helvetica"; 991 ff = "Helvetica";
990 fs = 10; 992 fs = 10;
991 } 993 }
992 994
993 setFont( QFont(ff, fs) ); 995 setFont( QFont(ff, fs) );
994 996
995 // revert to global blocking policy ... 997 // revert to global blocking policy ...
996 opie_block_style = config. readBoolEntry ( "ForceStyle", false ); 998 opie_block_style = config. readBoolEntry ( "ForceStyle", false ) ? 0xff : 0x00;
999 opie_block_style -= nostyle;
997} 1000}
998 1001
999void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data ) 1002void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data )
1000{ 1003{
1001#ifdef Q_WS_QWS 1004#ifdef Q_WS_QWS
1002 QDataStream stream( data, IO_ReadOnly ); 1005 QDataStream stream( data, IO_ReadOnly );
1003 if ( msg == "applyStyle()" ) { 1006 if ( msg == "applyStyle()" ) {
1004 applyStyle(); 1007 applyStyle();
1005 } 1008 }
1006 else if ( msg == "setDefaultRotation(int)" ) { 1009 else if ( msg == "setDefaultRotation(int)" ) {
1007 if ( type() == GuiServer ) { 1010 if ( type() == GuiServer ) {
1008 int r; 1011 int r;
1009 stream >> r; 1012 stream >> r;
1010 setDefaultRotation( r ); 1013 setDefaultRotation( r );
1011 } 1014 }
1012 } 1015 }
1013 else if ( msg == "shutdown()" ) { 1016 else if ( msg == "shutdown()" ) {
1014 if ( type() == GuiServer ) 1017 if ( type() == GuiServer )
1015 shutdown(); 1018 shutdown();
1016 } 1019 }
1017 else if ( msg == "quit()" ) { 1020 else if ( msg == "quit()" ) {
1018 if ( type() != GuiServer ) 1021 if ( type() != GuiServer )
1019 tryQuit(); 1022 tryQuit();
1020 } 1023 }
1021 else if ( msg == "forceQuit()" ) { 1024 else if ( msg == "forceQuit()" ) {
1022 if ( type() != GuiServer ) 1025 if ( type() != GuiServer )
1023 quit(); 1026 quit();
1024 } 1027 }
1025 else if ( msg == "restart()" ) { 1028 else if ( msg == "restart()" ) {
1026 if ( type() == GuiServer ) 1029 if ( type() == GuiServer )
1027 restart(); 1030 restart();
1028 } 1031 }
1029 else if ( msg == "grabKeyboard(QString)" ) { 1032 else if ( msg == "grabKeyboard(QString)" ) {
1030 QString who; 1033 QString who;
1031 stream >> who; 1034 stream >> who;
1032 if ( who.isEmpty() ) 1035 if ( who.isEmpty() )
1033 d->kbgrabber = 0; 1036 d->kbgrabber = 0;
1034 else if ( who != d->appName ) 1037 else if ( who != d->appName )
1035 d->kbgrabber = 1; 1038 d->kbgrabber = 1;
1036 else 1039 else
1037 d->kbgrabber = 2; 1040 d->kbgrabber = 2;
1038 } 1041 }
1039 else if ( msg == "language(QString)" ) { 1042 else if ( msg == "language(QString)" ) {
1040 if ( type() == GuiServer ) { 1043 if ( type() == GuiServer ) {
1041 QString l; 1044 QString l;
1042 stream >> l; 1045 stream >> l;
1043 QString cl = getenv( "LANG" ); 1046 QString cl = getenv( "LANG" );
1044 if ( cl != l ) { 1047 if ( cl != l ) {
1045 if ( l.isNull() ) 1048 if ( l.isNull() )
1046 unsetenv( "LANG" ); 1049 unsetenv( "LANG" );
1047 else 1050 else
1048 setenv( "LANG", l.latin1(), 1 ); 1051 setenv( "LANG", l.latin1(), 1 );
1049 restart(); 1052 restart();
1050 } 1053 }
1051 } 1054 }
1052 } 1055 }
1053 else if ( msg == "timeChange(QString)" ) { 1056 else if ( msg == "timeChange(QString)" ) {
1054 QString t; 1057 QString t;
1055 stream >> t; 1058 stream >> t;
1056 if ( t.isNull() ) 1059 if ( t.isNull() )
1057 unsetenv( "TZ" ); 1060 unsetenv( "TZ" );
1058 else 1061 else
1059 setenv( "TZ", t.latin1(), 1 ); 1062 setenv( "TZ", t.latin1(), 1 );
1060 // emit the signal so everyone else knows... 1063 // emit the signal so everyone else knows...
1061 emit timeChanged(); 1064 emit timeChanged();
1062 } 1065 }
1063 else if ( msg == "execute(QString)" ) { 1066 else if ( msg == "execute(QString)" ) {
1064 if ( type() == GuiServer ) { 1067 if ( type() == GuiServer ) {
1065 QString t; 1068 QString t;
1066 stream >> t; 1069 stream >> t;
1067 Global::execute( t ); 1070 Global::execute( t );
1068 } 1071 }
1069 } 1072 }
1070 else if ( msg == "execute(QString,QString)" ) { 1073 else if ( msg == "execute(QString,QString)" ) {
1071 if ( type() == GuiServer ) { 1074 if ( type() == GuiServer ) {
1072 QString t, d; 1075 QString t, d;
1073 stream >> t >> d; 1076 stream >> t >> d;
1074 Global::execute( t, d ); 1077 Global::execute( t, d );
1075 } 1078 }
1076 } 1079 }
1077 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) { 1080 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) {
1078 if ( type() == GuiServer ) { 1081 if ( type() == GuiServer ) {
1079 QDateTime when; 1082 QDateTime when;
1080 QCString channel, message; 1083 QCString channel, message;
1081 int data; 1084 int data;
1082 stream >> when >> channel >> message >> data; 1085 stream >> when >> channel >> message >> data;
1083 AlarmServer::addAlarm( when, channel, message, data ); 1086 AlarmServer::addAlarm( when, channel, message, data );
1084 } 1087 }
1085 } 1088 }
1086 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) { 1089 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) {
1087 if ( type() == GuiServer ) { 1090 if ( type() == GuiServer ) {
1088 QDateTime when; 1091 QDateTime when;
1089 QCString channel, message; 1092 QCString channel, message;
1090 int data; 1093 int data;
1091 stream >> when >> channel >> message >> data; 1094 stream >> when >> channel >> message >> data;
1092 AlarmServer::deleteAlarm( when, channel, message, data ); 1095 AlarmServer::deleteAlarm( when, channel, message, data );
1093 } 1096 }
1094 } 1097 }
1095 else if ( msg == "clockChange(bool)" ) { 1098 else if ( msg == "clockChange(bool)" ) {
1096 int tmp; 1099 int tmp;
1097 stream >> tmp; 1100 stream >> tmp;
1098 emit clockChanged( tmp ); 1101 emit clockChanged( tmp );
1099 } 1102 }
1100 else if ( msg == "weekChange(bool)" ) { 1103 else if ( msg == "weekChange(bool)" ) {
1101 int tmp; 1104 int tmp;
1102 stream >> tmp; 1105 stream >> tmp;
1103 emit weekChanged( tmp ); 1106 emit weekChanged( tmp );
1104 } 1107 }
1105 else if ( msg == "setDateFormat(DateFormat)" ) { 1108 else if ( msg == "setDateFormat(DateFormat)" ) {
1106 DateFormat tmp; 1109 DateFormat tmp;
1107 stream >> tmp; 1110 stream >> tmp;
1108 emit dateFormatChanged( tmp ); 1111 emit dateFormatChanged( tmp );
1109 } 1112 }
1110 else if ( msg == "setVolume(int,int)" ) { 1113 else if ( msg == "setVolume(int,int)" ) {
1111 int t, v; 1114 int t, v;
1112 stream >> t >> v; 1115 stream >> t >> v;
1113 setVolume( t, v ); 1116 setVolume( t, v );
1114 emit volumeChanged( muted ); 1117 emit volumeChanged( muted );
1115 } 1118 }
1116 else if ( msg == "volumeChange(bool)" ) { 1119 else if ( msg == "volumeChange(bool)" ) {
1117 stream >> muted; 1120 stream >> muted;
1118 setVolume(); 1121 setVolume();
1119 emit volumeChanged( muted ); 1122 emit volumeChanged( muted );
1120 } 1123 }
1121 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1124 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1122 int t, v; 1125 int t, v;
1123 stream >> t >> v; 1126 stream >> t >> v;
1124 setMic( t, v ); 1127 setMic( t, v );
1125 emit micChanged( micMuted ); 1128 emit micChanged( micMuted );
1126 } 1129 }
1127 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1130 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1128 stream >> micMuted; 1131 stream >> micMuted;
1129 setMic(); 1132 setMic();
1130 emit micChanged( micMuted ); 1133 emit micChanged( micMuted );
1131 } 1134 }
1132#endif 1135#endif
1133} 1136}
1134 1137
1135/*! 1138/*!
1136 \internal 1139 \internal
1137*/ 1140*/
1138bool QPEApplication::raiseAppropriateWindow() 1141bool QPEApplication::raiseAppropriateWindow()
1139{ 1142{
1140 bool r = FALSE; 1143 bool r = FALSE;
1141 // ########## raise()ing main window should raise and set active 1144 // ########## raise()ing main window should raise and set active
1142 // ########## it and then all childen. This belongs in Qt/Embedded 1145 // ########## it and then all childen. This belongs in Qt/Embedded
1143 QWidget *top = d->qpe_main_widget; 1146 QWidget *top = d->qpe_main_widget;
1144 if ( !top ) 1147 if ( !top )
1145 top = mainWidget(); 1148 top = mainWidget();
1146 if ( top && d->keep_running ) { 1149 if ( top && d->keep_running ) {
1147 if ( top->isVisible() ) 1150 if ( top->isVisible() )
1148 r = TRUE; 1151 r = TRUE;
1149 else if (d->preloaded) { 1152 else if (d->preloaded) {
1150 // We are preloaded and not visible.. pretend we just started.. 1153 // We are preloaded and not visible.. pretend we just started..
1151 QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); 1154 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1152 e << d->appName; 1155 e << d->appName;
1153 } 1156 }
1154 1157
1155 d->show_mx(top, d->nomaximize); 1158 d->show_mx(top, d->nomaximize);
1156 top->raise(); 1159 top->raise();
1157 top->setActiveWindow(); 1160 top->setActiveWindow();
1158 } 1161 }
1159 QWidget *topm = activeModalWidget(); 1162 QWidget *topm = activeModalWidget();
1160 if ( topm && topm != top ) { 1163 if ( topm && topm != top ) {
1161 topm->show(); 1164 topm->show();
1162 topm->raise(); 1165 topm->raise();
1163 topm->setActiveWindow(); 1166 topm->setActiveWindow();
1164 // If we haven't already handled the fastAppShowing message 1167 // If we haven't already handled the fastAppShowing message
1165 if (!top && d->preloaded) { 1168 if (!top && d->preloaded) {
1166 QCopEnvelope e("QPE/System", "fastAppShowing(QString)"); 1169 QCopEnvelope e("QPE/System", "fastAppShowing(QString)");
1167 e << d->appName; 1170 e << d->appName;
1168 } 1171 }
1169 r = FALSE; 1172 r = FALSE;
1170 } 1173 }
1171 return r; 1174 return r;
1172} 1175}
1173 1176
1174void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data) 1177void QPEApplication::pidMessage( const QCString& msg, const QByteArray& data)
1175{ 1178{
1176#ifdef Q_WS_QWS 1179#ifdef Q_WS_QWS
1177 1180
1178 if ( msg == "quit()" ) { 1181 if ( msg == "quit()" ) {
1179 tryQuit(); 1182 tryQuit();
1180 } 1183 }
1181 else if ( msg == "quitIfInvisible()" ) { 1184 else if ( msg == "quitIfInvisible()" ) {
1182 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() ) 1185 if ( d->qpe_main_widget && !d->qpe_main_widget->isVisible() )
1183 quit(); 1186 quit();
1184 } 1187 }
1185 else if ( msg == "close()" ) { 1188 else if ( msg == "close()" ) {
1186 hideOrQuit(); 1189 hideOrQuit();
1187 } 1190 }
1188 else if ( msg == "disablePreload()" ) { 1191 else if ( msg == "disablePreload()" ) {
1189 d->preloaded = FALSE; 1192 d->preloaded = FALSE;
1190 d->keep_running = TRUE; 1193 d->keep_running = TRUE;
1191 /* so that quit will quit */ 1194 /* so that quit will quit */
1192 } 1195 }
1193 else if ( msg == "enablePreload()" ) { 1196 else if ( msg == "enablePreload()" ) {
1194 if (d->qpe_main_widget) 1197 if (d->qpe_main_widget)
1195 d->preloaded = TRUE; 1198 d->preloaded = TRUE;
1196 d->keep_running = TRUE; 1199 d->keep_running = TRUE;
1197 /* so next quit won't quit */ 1200 /* so next quit won't quit */
1198 } 1201 }
1199 else if ( msg == "raise()" ) { 1202 else if ( msg == "raise()" ) {
1200 d->keep_running = TRUE; 1203 d->keep_running = TRUE;
1201 d->notbusysent = FALSE; 1204 d->notbusysent = FALSE;
1202 raiseAppropriateWindow(); 1205 raiseAppropriateWindow();
1203 // Tell the system we're still chugging along... 1206 // Tell the system we're still chugging along...
1204 QCopEnvelope e("QPE/System", "appRaised(QString)"); 1207 QCopEnvelope e("QPE/System", "appRaised(QString)");
1205 e << d->appName; 1208 e << d->appName;
1206 } 1209 }
1207 else if ( msg == "flush()" ) { 1210 else if ( msg == "flush()" ) {
1208 emit flush(); 1211 emit flush();
1209 // we need to tell the desktop 1212 // we need to tell the desktop
1210 QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" ); 1213 QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" );
1211 e << d->appName; 1214 e << d->appName;
1212 } 1215 }
1213 else if ( msg == "reload()" ) { 1216 else if ( msg == "reload()" ) {
1214 emit reload(); 1217 emit reload();
1215 } 1218 }
1216 else if ( msg == "setDocument(QString)" ) { 1219 else if ( msg == "setDocument(QString)" ) {
1217 d->keep_running = TRUE; 1220 d->keep_running = TRUE;
1218 QDataStream stream( data, IO_ReadOnly ); 1221 QDataStream stream( data, IO_ReadOnly );
1219 QString doc; 1222 QString doc;
1220 stream >> doc; 1223 stream >> doc;
1221 QWidget *mw = mainWidget(); 1224 QWidget *mw = mainWidget();
1222 if ( !mw ) 1225 if ( !mw )
1223 mw = d->qpe_main_widget; 1226 mw = d->qpe_main_widget;
1224 if ( mw ) 1227 if ( mw )
1225 Global::setDocument( mw, doc ); 1228 Global::setDocument( mw, doc );
1226 } 1229 }
1227 else if ( msg == "nextView()" ) { 1230 else if ( msg == "nextView()" ) {
1228 qDebug("got nextView()"); 1231 qDebug("got nextView()");
1229 /* 1232 /*
1230 if ( raiseAppropriateWindow() ) 1233 if ( raiseAppropriateWindow() )
1231 */ 1234 */
1232 emit appMessage( msg, data); 1235 emit appMessage( msg, data);
1233 } 1236 }
1234 else { 1237 else {
1235 emit appMessage( msg, data); 1238 emit appMessage( msg, data);
1236 } 1239 }
1237 1240
1238#endif 1241#endif
1239} 1242}
1240 1243
1241 1244
1242/*! 1245/*!
1243 Sets widget \a mw as the mainWidget() and shows it. For small windows, 1246 Sets widget \a mw as the mainWidget() and shows it. For small windows,
1244 consider passing TRUE for \a nomaximize rather than the default FALSE. 1247 consider passing TRUE for \a nomaximize rather than the default FALSE.
1245 1248
1246 \sa showMainDocumentWidget() 1249 \sa showMainDocumentWidget()
1247*/ 1250*/
1248void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize ) 1251void QPEApplication::showMainWidget( QWidget* mw, bool nomaximize )
1249{ 1252{
1250 d->show(mw, nomaximize ); 1253 d->show(mw, nomaximize );
1251} 1254}
1252 1255
1253/*! 1256/*!
1254 Sets widget \a mw as the mainWidget() and shows it. For small windows, 1257 Sets widget \a mw as the mainWidget() and shows it. For small windows,
1255 consider passing TRUE for \a nomaximize rather than the default FALSE. 1258 consider passing TRUE for \a nomaximize rather than the default FALSE.
1256 1259
1257 This calls designates the application as 1260 This calls designates the application as
1258 a \link docwidget.html document-oriented\endlink application. 1261 a \link docwidget.html document-oriented\endlink application.
1259 1262
1260 The \a mw widget \e must have this slot: setDocument(const QString&). 1263 The \a mw widget \e must have this slot: setDocument(const QString&).
1261 1264
1262 \sa showMainWidget() 1265 \sa showMainWidget()
1263*/ 1266*/
1264void QPEApplication::showMainDocumentWidget( QWidget* mw, bool nomaximize ) 1267void QPEApplication::showMainDocumentWidget( QWidget* mw, bool nomaximize )
1265{ 1268{
1266 if ( mw && argc() == 2 ) 1269 if ( mw && argc() == 2 )
1267 Global::setDocument( mw, QString::fromUtf8(argv()[1]) ); 1270 Global::setDocument( mw, QString::fromUtf8(argv()[1]) );
1268 1271
1269 d->show(mw, nomaximize ); 1272 d->show(mw, nomaximize );
1270} 1273}
1271 1274
1272 1275
1273/*! 1276/*!
1274 If an application is started via a \link qcop.html QCop\endlink 1277 If an application is started via a \link qcop.html QCop\endlink
1275 message, the application will process the \link qcop.html 1278 message, the application will process the \link qcop.html
1276 QCop\endlink message and then quit. If the application calls this 1279 QCop\endlink message and then quit. If the application calls this
1277 function while processing a \link qcop.html QCop\endlink message, 1280 function while processing a \link qcop.html QCop\endlink message,
1278 after processing its outstanding \link qcop.html QCop\endlink 1281 after processing its outstanding \link qcop.html QCop\endlink
1279 messages the application will start 'properly' and show itself. 1282 messages the application will start 'properly' and show itself.
1280 1283
1281 \sa keepRunning() 1284 \sa keepRunning()
1282*/ 1285*/
1283void QPEApplication::setKeepRunning() 1286void QPEApplication::setKeepRunning()
1284{ 1287{
1285 if ( qApp && qApp->inherits( "QPEApplication" ) ) { 1288 if ( qApp && qApp->inherits( "QPEApplication" ) ) {
1286 QPEApplication * qpeApp = ( QPEApplication* ) qApp; 1289 QPEApplication * qpeApp = ( QPEApplication* ) qApp;
1287 qpeApp->d->keep_running = TRUE; 1290 qpeApp->d->keep_running = TRUE;
1288 } 1291 }
1289} 1292}
1290 1293
1291/*! 1294/*!
1292 Returns TRUE if the application will quit after processing the 1295 Returns TRUE if the application will quit after processing the
1293 current list of qcop messages; otherwise returns FALSE. 1296 current list of qcop messages; otherwise returns FALSE.
1294 1297
1295 \sa setKeepRunning() 1298 \sa setKeepRunning()
1296*/ 1299*/
1297bool QPEApplication::keepRunning() const 1300bool QPEApplication::keepRunning() const
1298{ 1301{
1299 return d->keep_running; 1302 return d->keep_running;
1300} 1303}
1301 1304
1302/*! 1305/*!
1303 \internal 1306 \internal
1304*/ 1307*/
1305void QPEApplication::internalSetStyle( const QString &style ) 1308void QPEApplication::internalSetStyle( const QString &style )
1306{ 1309{
1307#if QT_VERSION >= 300 1310#if QT_VERSION >= 300
1308 if ( style == "QPE" ) { 1311 if ( style == "QPE" ) {
1309 setStyle( new QPEStyle ); 1312 setStyle( new QPEStyle );
1310 } 1313 }
1311 else { 1314 else {
1312 QStyle *s = QStyleFactory::create( style ); 1315 QStyle *s = QStyleFactory::create( style );
1313 if ( s ) 1316 if ( s )
1314 setStyle( s ); 1317 setStyle( s );
1315 } 1318 }
1316#else 1319#else
1317 if ( style == "Windows" ) { 1320 if ( style == "Windows" ) {
1318 setStyle( new QWindowsStyle ); 1321 setStyle( new QWindowsStyle );
1319 } 1322 }
1320 else if ( style == "QPE" ) { 1323 else if ( style == "QPE" ) {
1321 setStyle( new QPEStyle ); 1324 setStyle( new QPEStyle );
1322 } 1325 }
1323 else if ( style == "Light" ) { 1326 else if ( style == "Light" ) {
1324 setStyle( new LightStyle ); 1327 setStyle( new LightStyle );
1325 } 1328 }
1326#ifndef QT_NO_STYLE_PLATINUM 1329#ifndef QT_NO_STYLE_PLATINUM
1327 else if ( style == "Platinum" ) { 1330 else if ( style == "Platinum" ) {
1328 setStyle( new QPlatinumStyle ); 1331 setStyle( new QPlatinumStyle );
1329 } 1332 }
1330#endif 1333#endif
1331#ifndef QT_NO_STYLE_MOTIF 1334#ifndef QT_NO_STYLE_MOTIF
1332 else if ( style == "Motif" ) { 1335 else if ( style == "Motif" ) {
1333 setStyle( new QMotifStyle ); 1336 setStyle( new QMotifStyle );
1334 } 1337 }
1335#endif 1338#endif
1336#ifndef QT_NO_STYLE_MOTIFPLUS 1339#ifndef QT_NO_STYLE_MOTIFPLUS
1337 else if ( style == "MotifPlus" ) { 1340 else if ( style == "MotifPlus" ) {
1338 setStyle( new QMotifPlusStyle ); 1341 setStyle( new QMotifPlusStyle );
1339 } 1342 }
1340#endif 1343#endif
1341 1344
1342 else { 1345 else {
1343 QStyle *sty = 0; 1346 QStyle *sty = 0;
1344 QString path = QPEApplication::qpeDir ( ) + "/plugins/styles/"; 1347 QString path = QPEApplication::qpeDir ( ) + "/plugins/styles/";
1345 1348
1346 if ( style. find ( ".so" ) > 0 ) 1349 if ( style. find ( ".so" ) > 0 )
1347 path += style; 1350 path += style;
1348 else 1351 else
1349 path = path + "lib" + style. lower ( ) + ".so"; // compatibility 1352 path = path + "lib" + style. lower ( ) + ".so"; // compatibility
1350 1353
1351 static QLibrary *lastlib = 0; 1354 static QLibrary *lastlib = 0;
1352 static StyleInterface *lastiface = 0; 1355 static StyleInterface *lastiface = 0;
1353 1356
1354 QLibrary *lib = new QLibrary ( path ); 1357 QLibrary *lib = new QLibrary ( path );
1355 StyleInterface *iface = 0; 1358 StyleInterface *iface = 0;
1356 1359
1357 if (( lib-> queryInterface ( IID_Style, ( QUnknownInterface ** ) &iface ) == QS_OK ) && iface ) 1360 if (( lib-> queryInterface ( IID_Style, ( QUnknownInterface ** ) &iface ) == QS_OK ) && iface )
1358 sty = iface-> style ( ); 1361 sty = iface-> style ( );
1359 1362
1360 if ( sty ) { 1363 if ( sty ) {
1361 setStyle ( sty ); 1364 setStyle ( sty );
1362 1365
1363 if ( lastiface ) 1366 if ( lastiface )
1364 lastiface-> release ( ); 1367 lastiface-> release ( );
1365 lastiface = iface; 1368 lastiface = iface;
1366 1369
1367 if ( lastlib ) { 1370 if ( lastlib ) {
1368 lastlib-> unload ( ); 1371 lastlib-> unload ( );
1369 delete lastlib; 1372 delete lastlib;
1370 } 1373 }
1371 lastlib = lib; 1374 lastlib = lib;
1372 } 1375 }
1373 else { 1376 else {
1374 if ( iface ) 1377 if ( iface )
1375 iface-> release ( ); 1378 iface-> release ( );
1376 delete lib; 1379 delete lib;
1377 1380
1378 setStyle ( new LightStyle ( )); 1381 setStyle ( new LightStyle ( ));
1379 } 1382 }
1380 } 1383 }
1381#endif 1384#endif
1382} 1385}
1383 1386
1384/*! 1387/*!
1385 \internal 1388 \internal
1386*/ 1389*/
1387void QPEApplication::prepareForTermination( bool willrestart ) 1390void QPEApplication::prepareForTermination( bool willrestart )
1388{ 1391{
1389 if ( willrestart ) { 1392 if ( willrestart ) {
1390 // Draw a big wait icon, the image can be altered in later revisions 1393 // Draw a big wait icon, the image can be altered in later revisions
1391 // QWidget *d = QApplication::desktop(); 1394 // QWidget *d = QApplication::desktop();
1392 QImage img = Resource::loadImage( "launcher/new_wait" ); 1395 QImage img = Resource::loadImage( "launcher/new_wait" );
1393 QPixmap pix; 1396 QPixmap pix;
1394 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) ); 1397 pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) );
1395 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize | 1398 QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize |
1396 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool ); 1399 QWidget::WStyle_NoBorder | QWidget::WStyle_Tool );
1397 lblWait->setPixmap( pix ); 1400 lblWait->setPixmap( pix );
1398 lblWait->setAlignment( QWidget::AlignCenter ); 1401 lblWait->setAlignment( QWidget::AlignCenter );
1399 lblWait->show(); 1402 lblWait->show();
1400 lblWait->showMaximized(); 1403 lblWait->showMaximized();
1401 } 1404 }
1402#ifndef SINGLE_APP 1405#ifndef SINGLE_APP
1403 { QCopEnvelope envelope( "QPE/System", "forceQuit()" ); 1406 { QCopEnvelope envelope( "QPE/System", "forceQuit()" );
1404 } 1407 }
1405 processEvents(); // ensure the message goes out. 1408 processEvents(); // ensure the message goes out.
1406 sleep( 1 ); // You have 1 second to comply. 1409 sleep( 1 ); // You have 1 second to comply.
1407#endif 1410#endif
1408} 1411}
1409 1412
1410/*! 1413/*!
1411 \internal 1414 \internal
1412*/ 1415*/
1413void QPEApplication::shutdown() 1416void QPEApplication::shutdown()
1414{ 1417{
1415 // Implement in server's QPEApplication subclass 1418 // Implement in server's QPEApplication subclass
1416} 1419}
1417 1420
1418/*! 1421/*!
1419 \internal 1422 \internal
1420*/ 1423*/
1421void QPEApplication::restart() 1424void QPEApplication::restart()
1422{ 1425{
1423 // Implement in server's QPEApplication subclass 1426 // Implement in server's QPEApplication subclass
1424} 1427}
1425 1428
1426static QPtrDict<void>* stylusDict = 0; 1429static QPtrDict<void>* stylusDict = 0;
1427static void createDict() 1430static void createDict()
1428{ 1431{
1429 if ( !stylusDict ) 1432 if ( !stylusDict )
1430 stylusDict = new QPtrDict<void>; 1433 stylusDict = new QPtrDict<void>;
1431} 1434}
1432 1435
1433/*! 1436/*!
1434 Returns the current StylusMode for widget \a w. 1437 Returns the current StylusMode for widget \a w.
1435 1438
1436 \sa setStylusOperation() StylusMode 1439 \sa setStylusOperation() StylusMode
1437*/ 1440*/
1438QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w ) 1441QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w )
1439{ 1442{
1440 if ( stylusDict ) 1443 if ( stylusDict )
1441 return ( StylusMode ) ( int ) stylusDict->find( w ); 1444 return ( StylusMode ) ( int ) stylusDict->find( w );
1442 return LeftOnly; 1445 return LeftOnly;
1443} 1446}
1444 1447
1445/*! 1448/*!
1446 \enum QPEApplication::StylusMode 1449 \enum QPEApplication::StylusMode
1447 1450
1448 \value LeftOnly the stylus only generates LeftButton 1451 \value LeftOnly the stylus only generates LeftButton
1449 events (the default). 1452 events (the default).
1450 \value RightOnHold the stylus generates RightButton events 1453 \value RightOnHold the stylus generates RightButton events
1451 if the user uses the press-and-hold gesture. 1454 if the user uses the press-and-hold gesture.
1452 1455
1453 \sa setStylusOperation() stylusOperation() 1456 \sa setStylusOperation() stylusOperation()
1454*/ 1457*/
1455 1458
1456/*! 1459/*!
1457 Causes widget \a w to receive mouse events according to the stylus 1460 Causes widget \a w to receive mouse events according to the stylus
1458 \a mode. 1461 \a mode.
1459 1462
1460 \sa stylusOperation() StylusMode 1463 \sa stylusOperation() StylusMode
1461*/ 1464*/
1462void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode ) 1465void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode )
1463{ 1466{
1464 createDict(); 1467 createDict();
1465 if ( mode == LeftOnly ) { 1468 if ( mode == LeftOnly ) {
1466 stylusDict->remove 1469 stylusDict->remove
1467 ( w ); 1470 ( w );
1468 w->removeEventFilter( qApp ); 1471 w->removeEventFilter( qApp );
1469 } 1472 }
1470 else { 1473 else {
1471 stylusDict->insert( w, ( void* ) mode ); 1474 stylusDict->insert( w, ( void* ) mode );
1472 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) ); 1475 connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) );
1473 w->installEventFilter( qApp ); 1476 w->installEventFilter( qApp );
1474 } 1477 }
1475} 1478}
1476 1479
1477 1480
1478/*! 1481/*!
1479 \reimp 1482 \reimp
1480*/ 1483*/
1481bool QPEApplication::eventFilter( QObject *o, QEvent *e ) 1484bool QPEApplication::eventFilter( QObject *o, QEvent *e )
1482{ 1485{
1483 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) { 1486 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) {
1484 QMouseEvent * me = ( QMouseEvent* ) e; 1487 QMouseEvent * me = ( QMouseEvent* ) e;
1485 StylusMode mode = (StylusMode)(int)stylusDict->find(o); 1488 StylusMode mode = (StylusMode)(int)stylusDict->find(o);
1486 switch (mode) { 1489 switch (mode) {
1487 case RightOnHold: 1490 case RightOnHold:
1488 switch ( me->type() ) { 1491 switch ( me->type() ) {
1489 case QEvent::MouseButtonPress: 1492 case QEvent::MouseButtonPress:
1490 if ( me->button() == LeftButton ) { 1493 if ( me->button() == LeftButton ) {
1491 d->presstimer = startTimer(500); // #### pref. 1494 d->presstimer = startTimer(500); // #### pref.
1492 d->presswidget = (QWidget*)o; 1495 d->presswidget = (QWidget*)o;
1493 d->presspos = me->pos(); 1496 d->presspos = me->pos();
1494 d->rightpressed = FALSE; 1497 d->rightpressed = FALSE;
1495 } 1498 }
1496 break; 1499 break;
1497 case QEvent::MouseMove: 1500 case QEvent::MouseMove:
1498 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) { 1501 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) {
1499 killTimer(d->presstimer); 1502 killTimer(d->presstimer);
1500 d->presstimer = 0; 1503 d->presstimer = 0;
1501 } 1504 }
1502 break; 1505 break;
1503 case QEvent::MouseButtonRelease: 1506 case QEvent::MouseButtonRelease:
1504 if ( me->button() == LeftButton ) { 1507 if ( me->button() == LeftButton ) {
1505 if ( d->presstimer ) { 1508 if ( d->presstimer ) {
1506 killTimer(d->presstimer); 1509 killTimer(d->presstimer);
1507 d->presstimer = 0; 1510 d->presstimer = 0;
1508 } 1511 }
1509 if ( d->rightpressed && d->presswidget ) { 1512 if ( d->rightpressed && d->presswidget ) {
1510 // Right released 1513 // Right released
1511 postEvent( d->presswidget, 1514 postEvent( d->presswidget,
1512 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(), 1515 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(),
1513 RightButton, LeftButton + RightButton ) ); 1516 RightButton, LeftButton + RightButton ) );
1514 // Left released, off-widget 1517 // Left released, off-widget
1515 postEvent( d->presswidget, 1518 postEvent( d->presswidget,
1516 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1), 1519 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1),
1517 LeftButton, LeftButton ) ); 1520 LeftButton, LeftButton ) );
1518 postEvent( d->presswidget, 1521 postEvent( d->presswidget,
1519 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1), 1522 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1),
1520 LeftButton, LeftButton ) ); 1523 LeftButton, LeftButton ) );
1521 d->rightpressed = FALSE; 1524 d->rightpressed = FALSE;
1522 return TRUE; // don't send the real Left release 1525 return TRUE; // don't send the real Left release
1523 } 1526 }
1524 } 1527 }
1525 break; 1528 break;
1526 default: 1529 default:
1527 break; 1530 break;
1528 } 1531 }
1529 break; 1532 break;
1530 default: 1533 default:
1531 ; 1534 ;
1532 } 1535 }
1533 } 1536 }
1534 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { 1537 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
1535 QKeyEvent *ke = (QKeyEvent *)e; 1538 QKeyEvent *ke = (QKeyEvent *)e;
1536 if ( ke->key() == Key_Enter ) { 1539 if ( ke->key() == Key_Enter ) {
1537 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) { 1540 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) {
1538 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ', 1541 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ',
1539 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) ); 1542 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) );
1540 return TRUE; 1543 return TRUE;
1541 } 1544 }
1542 } 1545 }
1543 } 1546 }
1544 return FALSE; 1547 return FALSE;
1545} 1548}
1546 1549
1547/*! 1550/*!
1548 \reimp 1551 \reimp
1549*/ 1552*/
1550void QPEApplication::timerEvent( QTimerEvent *e ) 1553void QPEApplication::timerEvent( QTimerEvent *e )
1551{ 1554{
1552 if ( e->timerId() == d->presstimer && d->presswidget ) { 1555 if ( e->timerId() == d->presstimer && d->presswidget ) {
1553 // Right pressed 1556 // Right pressed
1554 postEvent( d->presswidget, 1557 postEvent( d->presswidget,
1555 new QMouseEvent( QEvent::MouseButtonPress, d->presspos, 1558 new QMouseEvent( QEvent::MouseButtonPress, d->presspos,
1556 RightButton, LeftButton ) ); 1559 RightButton, LeftButton ) );
1557 killTimer( d->presstimer ); 1560 killTimer( d->presstimer );
1558 d->presstimer = 0; 1561 d->presstimer = 0;
1559 d->rightpressed = TRUE; 1562 d->rightpressed = TRUE;
1560 } 1563 }
1561} 1564}
1562 1565
1563void QPEApplication::removeSenderFromStylusDict() 1566void QPEApplication::removeSenderFromStylusDict()
1564{ 1567{
1565 stylusDict->remove 1568 stylusDict->remove
1566 ( ( void* ) sender() ); 1569 ( ( void* ) sender() );
1567 if ( d->presswidget == sender() ) 1570 if ( d->presswidget == sender() )
1568 d->presswidget = 0; 1571 d->presswidget = 0;
1569} 1572}
1570 1573
1571/*! 1574/*!
1572 \internal 1575 \internal
1573*/ 1576*/
1574bool QPEApplication::keyboardGrabbed() const 1577bool QPEApplication::keyboardGrabbed() const
1575{ 1578{
1576 return d->kbgrabber; 1579 return d->kbgrabber;
1577} 1580}
1578 1581
1579 1582
1580/*! 1583/*!
1581 Reverses the effect of grabKeyboard(). This is called automatically 1584 Reverses the effect of grabKeyboard(). This is called automatically
1582 on program exit. 1585 on program exit.
1583*/ 1586*/
1584void QPEApplication::ungrabKeyboard() 1587void QPEApplication::ungrabKeyboard()
1585{ 1588{
1586 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; 1589 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d;
1587 if ( d->kbgrabber == 2 ) { 1590 if ( d->kbgrabber == 2 ) {
1588#ifndef QT_NO_COP 1591#ifndef QT_NO_COP
1589 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" ); 1592 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" );
1590 e << QString::null; 1593 e << QString::null;
1591#endif 1594#endif
1592 1595
1593 d->kbregrab = FALSE; 1596 d->kbregrab = FALSE;
1594 d->kbgrabber = 0; 1597 d->kbgrabber = 0;
1595 } 1598 }
1596} 1599}
1597 1600
1598/*! 1601/*!
1599 Grabs the physical keyboard keys, e.g. the application's launching 1602 Grabs the physical keyboard keys, e.g. the application's launching
1600 keys. Instead of launching applications when these keys are pressed 1603 keys. Instead of launching applications when these keys are pressed
1601 the signals emitted are sent to this application instead. Some games 1604 the signals emitted are sent to this application instead. Some games
1602 programs take over the launch keys in this way to make interaction 1605 programs take over the launch keys in this way to make interaction
1603 easier. 1606 easier.
1604 1607
1605 \sa ungrabKeyboard() 1608 \sa ungrabKeyboard()
1606*/ 1609*/
1607void QPEApplication::grabKeyboard() 1610void QPEApplication::grabKeyboard()
1608{ 1611{
1609 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; 1612 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d;
1610 if ( qApp->type() == QApplication::GuiServer ) 1613 if ( qApp->type() == QApplication::GuiServer )
1611 d->kbgrabber = 0; 1614 d->kbgrabber = 0;
1612 else { 1615 else {
1613#ifndef QT_NO_COP 1616#ifndef QT_NO_COP
1614 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" ); 1617 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" );
1615 e << d->appName; 1618 e << d->appName;
1616#endif 1619#endif
1617 1620
1618 d->kbgrabber = 2; // me 1621 d->kbgrabber = 2; // me
1619 } 1622 }
1620} 1623}
1621 1624
1622/*! 1625/*!
1623 \reimp 1626 \reimp
1624*/ 1627*/
1625int QPEApplication::exec() 1628int QPEApplication::exec()
1626{ 1629{
1627#ifndef QT_NO_COP 1630#ifndef QT_NO_COP
1628 d->sendQCopQ(); 1631 d->sendQCopQ();
1629#endif 1632#endif
1630 1633
1631 if ( d->keep_running ) 1634 if ( d->keep_running )
1632 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() ) 1635 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() )
1633 return QApplication::exec(); 1636 return QApplication::exec();
1634 1637
1635#ifndef QT_NO_COP 1638#ifndef QT_NO_COP
1636 1639
1637 { 1640 {
1638 QCopEnvelope e( "QPE/System", "closing(QString)" ); 1641 QCopEnvelope e( "QPE/System", "closing(QString)" );
1639 e << d->appName; 1642 e << d->appName;
1640 } 1643 }
1641#endif 1644#endif
1642 processEvents(); 1645 processEvents();
1643 return 0; 1646 return 0;
1644} 1647}
1645 1648
1646/*! 1649/*!
1647 \internal 1650 \internal
1648 External request for application to quit. Quits if possible without 1651 External request for application to quit. Quits if possible without
1649 loosing state. 1652 loosing state.
1650*/ 1653*/
1651void QPEApplication::tryQuit() 1654void QPEApplication::tryQuit()
1652{ 1655{
1653 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 ) 1656 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 )
1654 return ; // Inside modal loop or konsole. Too hard to save state. 1657 return ; // Inside modal loop or konsole. Too hard to save state.
1655#ifndef QT_NO_COP 1658#ifndef QT_NO_COP
1656 1659
1657 { 1660 {
1658 QCopEnvelope e( "QPE/System", "closing(QString)" ); 1661 QCopEnvelope e( "QPE/System", "closing(QString)" );
1659 e << d->appName; 1662 e << d->appName;
1660 } 1663 }
1661#endif 1664#endif
1662 processEvents(); 1665 processEvents();
1663 1666
1664 quit(); 1667 quit();
1665} 1668}
1666 1669
1667/*! 1670/*!
1668 \internal 1671 \internal
1669 User initiated quit. Makes the window 'Go Away'. If preloaded this means 1672 User initiated quit. Makes the window 'Go Away'. If preloaded this means
1670 hiding the window. If not it means quitting the application. 1673 hiding the window. If not it means quitting the application.
1671 As this is user initiated we don't need to check state. 1674 As this is user initiated we don't need to check state.
1672*/ 1675*/
1673void QPEApplication::hideOrQuit() 1676void QPEApplication::hideOrQuit()
1674{ 1677{
1675 processEvents(); 1678 processEvents();
1676 1679
1677 // If we are a preloaded application we don't actually quit, so emit 1680 // If we are a preloaded application we don't actually quit, so emit
1678 // a System message indicating we're quasi-closing. 1681 // a System message indicating we're quasi-closing.
1679 if ( d->preloaded && d->qpe_main_widget ) 1682 if ( d->preloaded && d->qpe_main_widget )
1680#ifndef QT_NO_COP 1683#ifndef QT_NO_COP
1681 1684
1682 { 1685 {
1683 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" ); 1686 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" );
1684 e << d->appName; 1687 e << d->appName;
1685 d->qpe_main_widget->hide(); 1688 d->qpe_main_widget->hide();
1686 } 1689 }
1687#endif 1690#endif
1688 else 1691 else
1689 quit(); 1692 quit();
1690} 1693}
1691 1694
1692#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SHARP) 1695#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SHARP)
1693 1696
1694// The libraries with the skiff package (and possibly others) have 1697// The libraries with the skiff package (and possibly others) have
1695// completely useless implementations of builtin new and delete that 1698// completely useless implementations of builtin new and delete that
1696// use about 50% of your CPU. Here we revert to the simple libc 1699// use about 50% of your CPU. Here we revert to the simple libc
1697// functions. 1700// functions.
1698 1701
1699void* operator new[]( size_t size ) 1702void* operator new[]( size_t size )
1700{ 1703{
1701 return malloc( size ); 1704 return malloc( size );
1702} 1705}
1703 1706
1704void* operator new( size_t size ) 1707void* operator new( size_t size )
1705{ 1708{
1706 return malloc( size ); 1709 return malloc( size );
1707} 1710}
1708 1711
1709void operator delete[]( void* p ) 1712void operator delete[]( void* p )
1710{ 1713{
1711 free( p ); 1714 free( p );
1712} 1715}
1713 1716
1714void operator delete[]( void* p, size_t /*size*/ ) 1717void operator delete[]( void* p, size_t /*size*/ )
1715{ 1718{
1716 free( p ); 1719 free( p );
1717} 1720}
1718 1721
1719void operator delete( void* p ) 1722void operator delete( void* p )
1720{ 1723{
1721 free( p ); 1724 free( p );
1722} 1725}
1723 1726
1724void operator delete( void* p, size_t /*size*/ ) 1727void operator delete( void* p, size_t /*size*/ )
1725{ 1728{
1726 free( p ); 1729 free( p );
1727} 1730}
1728 1731
1729#endif 1732#endif
1730 1733
1731#if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP) 1734#if ( QT_VERSION <= 230 ) && !defined(SINGLE_APP)
1732#include <qwidgetlist.h> 1735#include <qwidgetlist.h>
1733#ifdef QWS 1736#ifdef QWS
1734#include <qgfx_qws.h> 1737#include <qgfx_qws.h>
1735extern QRect qt_maxWindowRect; 1738extern QRect qt_maxWindowRect;
1736void qt_setMaxWindowRect(const QRect& r ) 1739void qt_setMaxWindowRect(const QRect& r )
1737{ 1740{
1738 qt_maxWindowRect = qt_screen->mapFromDevice( r, 1741 qt_maxWindowRect = qt_screen->mapFromDevice( r,
1739 qt_screen->mapToDevice( QSize( qt_screen->width(), qt_screen->height() ) ) ); 1742 qt_screen->mapToDevice( QSize( qt_screen->width(), qt_screen->height() ) ) );
1740 // Re-resize any maximized windows 1743 // Re-resize any maximized windows
1741 QWidgetList* l = QApplication::topLevelWidgets(); 1744 QWidgetList* l = QApplication::topLevelWidgets();
1742 if ( l ) { 1745 if ( l ) {
1743 QWidget * w = l->first(); 1746 QWidget * w = l->first();
1744 while ( w ) { 1747 while ( w ) {
1745 if ( w->isVisible() && w->isMaximized() ) { 1748 if ( w->isVisible() && w->isMaximized() ) {
1746 w->showMaximized(); 1749 w->showMaximized();
1747 } 1750 }
1748 w = l->next(); 1751 w = l->next();
1749 } 1752 }
1750 delete l; 1753 delete l;
1751 } 1754 }
1752} 1755}
1753#endif 1756#endif
1754#endif 1757#endif
diff --git a/library/qpedecoration_qws.cpp b/library/qpedecoration_qws.cpp
index 6221f5b..5e0c32a 100644
--- a/library/qpedecoration_qws.cpp
+++ b/library/qpedecoration_qws.cpp
@@ -1,917 +1,910 @@
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 <qapplication.h> 21#include <qapplication.h>
22#include <qstyle.h> 22#include <qstyle.h>
23#include <qwidget.h> 23#include <qwidget.h>
24#include <qpainter.h> 24#include <qpainter.h>
25#include <qtimer.h> 25#include <qtimer.h>
26#include <qwhatsthis.h> 26#include <qwhatsthis.h>
27#include "qcopenvelope_qws.h" 27#include "qcopenvelope_qws.h"
28#include "qpedecoration_qws.h" 28#include "qpedecoration_qws.h"
29#include <qdialog.h> 29#include <qdialog.h>
30#include <qdrawutil.h> 30#include <qdrawutil.h>
31#include <qgfx_qws.h> 31#include <qgfx_qws.h>
32#include "qpeapplication.h" 32#include "qpeapplication.h"
33#include "resource.h" 33#include "resource.h"
34#include "global.h" 34#include "global.h"
35#include "qlibrary.h" 35#include "qlibrary.h"
36#include "windowdecorationinterface.h" 36#include "windowdecorationinterface.h"
37#include <qfile.h> 37#include <qfile.h>
38#include <qsignal.h> 38#include <qsignal.h>
39 39
40#include <stdlib.h> 40#include <stdlib.h>
41 41
42extern QRect qt_maxWindowRect; 42extern QRect qt_maxWindowRect;
43 43
44#define WHATSTHIS_MODE 44#define WHATSTHIS_MODE
45 45
46#ifndef QT_NO_QWS_QPE_WM_STYLE 46#ifndef QT_NO_QWS_QPE_WM_STYLE
47 47
48#ifndef QT_NO_IMAGEIO_XPM 48#ifndef QT_NO_IMAGEIO_XPM
49 49
50/* XPM */ 50/* XPM */
51static const char * const qpe_close_xpm[] = { 51static const char * const qpe_close_xpm[] = {
52"16 16 3 1", 52"16 16 3 1",
53" c None", 53" c None",
54". c #FFFFFF", 54". c #FFFFFF",
55"+ c #000000", 55"+ c #000000",
56" ", 56" ",
57" ", 57" ",
58" ..... ", 58" ..... ",
59" ..+++++.. ", 59" ..+++++.. ",
60" .+++++++++. ", 60" .+++++++++. ",
61" .+..+++..+. ", 61" .+..+++..+. ",
62" .++...+...++. ", 62" .++...+...++. ",
63" .+++.....+++. ", 63" .+++.....+++. ",
64" .++++...++++. ", 64" .++++...++++. ",
65" .+++.....+++. ", 65" .+++.....+++. ",
66" .++...+...++. ", 66" .++...+...++. ",
67" .+..+++..+. ", 67" .+..+++..+. ",
68" .+++++++++. ", 68" .+++++++++. ",
69" ..+++++.. ", 69" ..+++++.. ",
70" ..... ", 70" ..... ",
71" "}; 71" "};
72 72
73/* XPM */ 73/* XPM */
74static const char * const qpe_accept_xpm[] = { 74static const char * const qpe_accept_xpm[] = {
75"16 16 3 1", 75"16 16 3 1",
76" c None", 76" c None",
77". c #FFFFFF", 77". c #FFFFFF",
78"+ c #000000", 78"+ c #000000",
79" ", 79" ",
80" ", 80" ",
81" ..... ", 81" ..... ",
82" ..+++++.. ", 82" ..+++++.. ",
83" .+++++++++. ", 83" .+++++++++. ",
84" .+++++++++. ", 84" .+++++++++. ",
85" .+++++++..++. ", 85" .+++++++..++. ",
86" .++.+++...++. ", 86" .++.+++...++. ",
87" .+...+...+++. ", 87" .+...+...+++. ",
88" .+......++++. ", 88" .+......++++. ",
89" .++....+++++. ", 89" .++....+++++. ",
90" .++..+++++. ", 90" .++..+++++. ",
91" .+++++++++. ", 91" .+++++++++. ",
92" ..+++++.. ", 92" ..+++++.. ",
93" ..... ", 93" ..... ",
94" "}; 94" "};
95 95
96#endif // QT_NO_IMAGEIO_XPM 96#endif // QT_NO_IMAGEIO_XPM
97 97
98class HackWidget : public QWidget 98class HackWidget : public QWidget
99{ 99{
100public: 100public:
101 bool needsOk() { 101 bool needsOk() {
102 return (getWState() & WState_Reserved1 ) || 102 return (getWState() & WState_Reserved1 ) ||
103 (inherits( "QDialog" ) && !inherits( "QMessageBox" ) ); 103 (inherits( "QDialog" ) && !inherits( "QMessageBox" ) );
104 } 104 }
105}; 105};
106 106
107static QImage scaleButton( const QImage &img, int height ) 107static QImage scaleButton( const QImage &img, int height )
108{ 108{
109 if ( img.height() != 0 && img.height() != height ) { 109 if ( img.height() != 0 && img.height() != height ) {
110 return img.smoothScale( img.width()*height/img.height(), height ); 110 return img.smoothScale( img.width()*height/img.height(), height );
111 } else { 111 } else {
112 return img; 112 return img;
113 } 113 }
114} 114}
115 115
116class TLWidget : public QWidget 116class TLWidget : public QWidget
117{ 117{
118public: 118public:
119 QWSManager *manager() 119 QWSManager *manager()
120 { 120 {
121 return topData()->qwsManager; 121 return topData()->qwsManager;
122 } 122 }
123 123
124 QTLWExtra *topExtra() 124 QTLWExtra *topExtra()
125 { 125 {
126 return topData(); 126 return topData();
127 } 127 }
128 128
129 void setWState( uint s ) { QWidget::setWState( s ); } 129 void setWState( uint s ) { QWidget::setWState( s ); }
130 void clearWState( uint s ) { QWidget::clearWState( s ); } 130 void clearWState( uint s ) { QWidget::clearWState( s ); }
131}; 131};
132 132
133 133
134QPEManager::QPEManager( QPEDecoration *d, QObject *parent ) 134QPEManager::QPEManager( QPEDecoration *d, QObject *parent )
135 : QObject( parent ), decoration( d ), helpState(0), inWhatsThis(FALSE) 135 : QObject( parent ), decoration( d ), helpState(0), inWhatsThis(FALSE)
136{ 136{
137 wtTimer = new QTimer( this ); 137 wtTimer = new QTimer( this );
138 connect( wtTimer, SIGNAL(timeout()), this, SLOT(whatsThisTimeout()) ); 138 connect( wtTimer, SIGNAL(timeout()), this, SLOT(whatsThisTimeout()) );
139} 139}
140 140
141 141
142void QPEManager::updateActive() 142void QPEManager::updateActive()
143{ 143{
144 QWidget *newActive = qApp->activeWindow(); 144 QWidget *newActive = qApp->activeWindow();
145 if ( newActive && (QWidget*)active == newActive ) 145 if ( newActive && (QWidget*)active == newActive )
146 return; 146 return;
147 147
148 if ( active && (!newActive || ((TLWidget *)newActive)->manager()) ) { 148 if ( active && (!newActive || ((TLWidget *)newActive)->manager()) ) {
149 ((TLWidget *)(QWidget*)active)->manager()->removeEventFilter( this ); 149 ((TLWidget *)(QWidget*)active)->manager()->removeEventFilter( this );
150 } 150 }
151 151
152 if ( newActive && ((TLWidget *)newActive)->manager() ) { 152 if ( newActive && ((TLWidget *)newActive)->manager() ) {
153 active = newActive; 153 active = newActive;
154 ((TLWidget *)(QWidget*)active)->manager()->installEventFilter( this ); 154 ((TLWidget *)(QWidget*)active)->manager()->installEventFilter( this );
155 } else if ( !newActive ) { 155 } else if ( !newActive ) {
156 active = 0; 156 active = 0;
157 } 157 }
158} 158}
159 159
160int QPEManager::pointInQpeRegion( QWidget *w, const QPoint &p ) 160int QPEManager::pointInQpeRegion( QWidget *w, const QPoint &p )
161{ 161{
162 QRect rect(w->geometry()); 162 QRect rect(w->geometry());
163 163
164 if ( decoration->region( w, rect, 164 if ( decoration->region( w, rect,
165 (QWSDecoration::Region)QPEDecoration::Help ).contains(p) ) 165 (QWSDecoration::Region)QPEDecoration::Help ).contains(p) )
166 return QPEDecoration::Help; 166 return QPEDecoration::Help;
167 167
168 for (int i = QWSDecoration::LastRegion; i >= QWSDecoration::Title; i--) { 168 for (int i = QWSDecoration::LastRegion; i >= QWSDecoration::Title; i--) {
169 if (decoration->region(w, rect, (QWSDecoration::Region)i).contains(p)) 169 if (decoration->region(w, rect, (QWSDecoration::Region)i).contains(p))
170 return (QWSDecoration::Region)i; 170 return (QWSDecoration::Region)i;
171 } 171 }
172 172
173 return QWSDecoration::None; 173 return QWSDecoration::None;
174} 174}
175 175
176bool QPEManager::eventFilter( QObject *o, QEvent *e ) 176bool QPEManager::eventFilter( QObject *o, QEvent *e )
177{ 177{
178 QWSManager *mgr = (QWSManager *)o; 178 QWSManager *mgr = (QWSManager *)o;
179 QWidget *w = mgr->widget(); 179 QWidget *w = mgr->widget();
180 switch ( e->type() ) { 180 switch ( e->type() ) {
181 case QEvent::MouseButtonPress: 181 case QEvent::MouseButtonPress:
182 { 182 {
183 pressTime = QTime::currentTime(); 183 pressTime = QTime::currentTime();
184 QPoint p = ((QMouseEvent*)e)->globalPos(); 184 QPoint p = ((QMouseEvent*)e)->globalPos();
185 int inRegion = pointInQpeRegion( w, p ); 185 int inRegion = pointInQpeRegion( w, p );
186#ifdef WHATSTHIS_MODE 186#ifdef WHATSTHIS_MODE
187 if ( !w->geometry().contains(p) && QWhatsThis::inWhatsThisMode() ) { 187 if ( !w->geometry().contains(p) && QWhatsThis::inWhatsThisMode() ) {
188 QString text; 188 QString text;
189 switch ( inRegion ) { 189 switch ( inRegion ) {
190 case QWSDecoration::Close: 190 case QWSDecoration::Close:
191 if ( ((HackWidget*)w)->needsOk() ) 191 if ( ((HackWidget*)w)->needsOk() )
192 text = tr("Click to close this window, discarding changes."); 192 text = tr("Click to close this window, discarding changes.");
193 else 193 else
194 text = tr("Click to close this window."); 194 text = tr("Click to close this window.");
195 break; 195 break;
196 case QWSDecoration::Minimize: 196 case QWSDecoration::Minimize:
197 text = tr("Click to close this window and apply changes."); 197 text = tr("Click to close this window and apply changes.");
198 break; 198 break;
199 case QWSDecoration::Maximize: 199 case QWSDecoration::Maximize:
200 if ( w->isMaximized() ) 200 if ( w->isMaximized() )
201 text = tr("Click to make this window moveable."); 201 text = tr("Click to make this window moveable.");
202 else 202 else
203 text = tr("Click to make this window use all available screen area."); 203 text = tr("Click to make this window use all available screen area.");
204 break; 204 break;
205 default: 205 default:
206 break; 206 break;
207 } 207 }
208 QWhatsThis::leaveWhatsThisMode( text ); 208 QWhatsThis::leaveWhatsThisMode( text );
209 whatsThisTimeout(); 209 whatsThisTimeout();
210 helpState = 0; 210 helpState = 0;
211 return true; 211 return true;
212 } 212 }
213#endif 213#endif
214 if ( inRegion == QPEDecoration::Help ) { 214 if ( inRegion == QPEDecoration::Help ) {
215#ifdef WHATSTHIS_MODE 215#ifdef WHATSTHIS_MODE
216 wtTimer->start( 400, TRUE ); 216 wtTimer->start( 400, TRUE );
217#endif 217#endif
218 helpState = QWSButton::Clicked|QWSButton::MouseOver; 218 helpState = QWSButton::Clicked|QWSButton::MouseOver;
219 drawButton( w, QPEDecoration::Help, helpState ); 219 drawButton( w, QPEDecoration::Help, helpState );
220 return true; 220 return true;
221 } 221 }
222 } 222 }
223 break; 223 break;
224 case QEvent::MouseButtonRelease: 224 case QEvent::MouseButtonRelease:
225 if ( helpState & QWSButton::Clicked ) { 225 if ( helpState & QWSButton::Clicked ) {
226 wtTimer->stop(); 226 wtTimer->stop();
227 helpState = 0; 227 helpState = 0;
228 drawButton( w, QPEDecoration::Help, helpState ); 228 drawButton( w, QPEDecoration::Help, helpState );
229 QPoint p = ((QMouseEvent*)e)->globalPos(); 229 QPoint p = ((QMouseEvent*)e)->globalPos();
230 if ( pointInQpeRegion( w, p ) == QPEDecoration::Help ) { 230 if ( pointInQpeRegion( w, p ) == QPEDecoration::Help ) {
231 decoration->help( w ); 231 decoration->help( w );
232 } 232 }
233 return true; 233 return true;
234 } 234 }
235 break; 235 break;
236 case QEvent::MouseMove: 236 case QEvent::MouseMove:
237 if ( helpState & QWSButton::Clicked ) { 237 if ( helpState & QWSButton::Clicked ) {
238 int oldState = helpState; 238 int oldState = helpState;
239 QPoint p = ((QMouseEvent*)e)->globalPos(); 239 QPoint p = ((QMouseEvent*)e)->globalPos();
240 if ( pointInQpeRegion( w, p ) == QPEDecoration::Help ) { 240 if ( pointInQpeRegion( w, p ) == QPEDecoration::Help ) {
241 helpState = QWSButton::Clicked|QWSButton::MouseOver; 241 helpState = QWSButton::Clicked|QWSButton::MouseOver;
242 } else { 242 } else {
243 helpState = 0; 243 helpState = 0;
244 } 244 }
245 if ( helpState != oldState ) 245 if ( helpState != oldState )
246 drawButton( w, QPEDecoration::Help, helpState ); 246 drawButton( w, QPEDecoration::Help, helpState );
247 } 247 }
248 break; 248 break;
249 default: 249 default:
250 break; 250 break;
251 } 251 }
252 return QObject::eventFilter( o, e ); 252 return QObject::eventFilter( o, e );
253} 253}
254 254
255void QPEManager::drawButton( QWidget *w, QPEDecoration::QPERegion r, int state ) 255void QPEManager::drawButton( QWidget *w, QPEDecoration::QPERegion r, int state )
256{ 256{
257 QPainter painter(w); 257 QPainter painter(w);
258 QRegion rgn = ((TLWidget *)w)->topExtra()->decor_allocated_region; 258 QRegion rgn = ((TLWidget *)w)->topExtra()->decor_allocated_region;
259 painter.internalGfx()->setWidgetDeviceRegion( rgn ); 259 painter.internalGfx()->setWidgetDeviceRegion( rgn );
260 painter.setClipRegion(decoration->region(w, w->rect(),QWSDecoration::All)); 260 painter.setClipRegion(decoration->region(w, w->rect(),QWSDecoration::All));
261 decoration->paintButton( &painter, w, (QWSDecoration::Region)r, state ); 261 decoration->paintButton( &painter, w, (QWSDecoration::Region)r, state );
262} 262}
263 263
264void QPEManager::drawTitle( QWidget *w ) 264void QPEManager::drawTitle( QWidget *w )
265{ 265{
266 QPainter painter(w); 266 QPainter painter(w);
267 QRegion rgn = ((TLWidget *)w)->topExtra()->decor_allocated_region; 267 QRegion rgn = ((TLWidget *)w)->topExtra()->decor_allocated_region;
268 painter.internalGfx()->setWidgetDeviceRegion( rgn ); 268 painter.internalGfx()->setWidgetDeviceRegion( rgn );
269 painter.setClipRegion(decoration->region(w, w->rect(),QWSDecoration::All)); 269 painter.setClipRegion(decoration->region(w, w->rect(),QWSDecoration::All));
270 decoration->paint( &painter, w ); 270 decoration->paint( &painter, w );
271 decoration->paintButton(&painter, w, QWSDecoration::Menu, 0); 271 decoration->paintButton(&painter, w, QWSDecoration::Menu, 0);
272 decoration->paintButton(&painter, w, QWSDecoration::Close, 0); 272 decoration->paintButton(&painter, w, QWSDecoration::Close, 0);
273 decoration->paintButton(&painter, w, QWSDecoration::Minimize, 0); 273 decoration->paintButton(&painter, w, QWSDecoration::Minimize, 0);
274 decoration->paintButton(&painter, w, QWSDecoration::Maximize, 0); 274 decoration->paintButton(&painter, w, QWSDecoration::Maximize, 0);
275} 275}
276 276
277void QPEManager::whatsThisTimeout() 277void QPEManager::whatsThisTimeout()
278{ 278{
279 if ( !QWhatsThis::inWhatsThisMode() ) { 279 if ( !QWhatsThis::inWhatsThisMode() ) {
280 if ( inWhatsThis ) { 280 if ( inWhatsThis ) {
281 if ( whatsThis ) { 281 if ( whatsThis ) {
282 QWidget *w = whatsThis; 282 QWidget *w = whatsThis;
283 whatsThis = 0; 283 whatsThis = 0;
284 drawTitle( w ); 284 drawTitle( w );
285 } 285 }
286 wtTimer->stop(); 286 wtTimer->stop();
287 } else { 287 } else {
288 QWhatsThis::enterWhatsThisMode(); 288 QWhatsThis::enterWhatsThisMode();
289 helpState = 0; 289 helpState = 0;
290 updateActive(); 290 updateActive();
291 if ( active ) { 291 if ( active ) {
292 whatsThis = active; 292 whatsThis = active;
293 drawTitle( active ); 293 drawTitle( active );
294 // check periodically to see if we've left whats this mode 294 // check periodically to see if we've left whats this mode
295 wtTimer->start( 250 ); 295 wtTimer->start( 250 );
296 } 296 }
297 } 297 }
298 inWhatsThis = !inWhatsThis; 298 inWhatsThis = !inWhatsThis;
299 } 299 }
300} 300}
301 301
302//=========================================================================== 302//===========================================================================
303 303
304static QImage *okImage( int th ) 304static QImage *okImage( int th )
305{ 305{
306 static QImage *i = 0; 306 static QImage *i = 0;
307 if ( !i || i->height() != th ) { 307 if ( !i || i->height() != th ) {
308 delete i; 308 delete i;
309 i = new QImage(scaleButton(Resource::loadImage("OKButton"),th)); 309 i = new QImage(scaleButton(Resource::loadImage("OKButton"),th));
310 } 310 }
311 return i; 311 return i;
312} 312}
313 313
314static QImage *closeImage( int th ) 314static QImage *closeImage( int th )
315{ 315{
316 static QImage *i = 0; 316 static QImage *i = 0;
317 if ( !i || i->height() != th ) { 317 if ( !i || i->height() != th ) {
318 delete i; 318 delete i;
319 i = new QImage(scaleButton(Resource::loadImage("CloseButton"),th)); 319 i = new QImage(scaleButton(Resource::loadImage("CloseButton"),th));
320 } 320 }
321 return i; 321 return i;
322} 322}
323 323
324static QImage *helpImage( int th ) 324static QImage *helpImage( int th )
325{ 325{
326 static QImage *i = 0; 326 static QImage *i = 0;
327 if ( !i || i->height() != th ) { 327 if ( !i || i->height() != th ) {
328 delete i; 328 delete i;
329 i = new QImage(scaleButton(Resource::loadImage("HelpButton"),th)); 329 i = new QImage(scaleButton(Resource::loadImage("HelpButton"),th));
330 } 330 }
331 return i; 331 return i;
332} 332}
333 333
334static QImage *maximizeImage( int th ) 334static QImage *maximizeImage( int th )
335{ 335{
336 static QImage *i = 0; 336 static QImage *i = 0;
337 if ( !i || i->height() != th ) { 337 if ( !i || i->height() != th ) {
338 delete i; 338 delete i;
339 i = new QImage(scaleButton(Resource::loadImage("MaximizeButton"),th)); 339 i = new QImage(scaleButton(Resource::loadImage("MaximizeButton"),th));
340 } 340 }
341 return i; 341 return i;
342} 342}
343 343
344int WindowDecorationInterface::metric( Metric m, const WindowData *wd ) const 344int WindowDecorationInterface::metric( Metric m, const WindowData *wd ) const
345{ 345{
346 switch ( m ) { 346 switch ( m ) {
347 case TitleHeight: 347 case TitleHeight:
348 if ( QApplication::desktop()->height() > 320 ) 348 if ( QApplication::desktop()->height() > 320 )
349 return 19; 349 return 19;
350 else 350 else
351 return 15; 351 return 15;
352 case LeftBorder: 352 case LeftBorder:
353 case RightBorder: 353 case RightBorder:
354 case TopBorder: 354 case TopBorder:
355 case BottomBorder: 355 case BottomBorder:
356 return 4; 356 return 4;
357 case OKWidth: 357 case OKWidth:
358 return okImage(metric(TitleHeight,wd))->width(); 358 return okImage(metric(TitleHeight,wd))->width();
359 case CloseWidth: 359 case CloseWidth:
360 return closeImage(metric(TitleHeight,wd))->width(); 360 return closeImage(metric(TitleHeight,wd))->width();
361 case HelpWidth: 361 case HelpWidth:
362 return helpImage(metric(TitleHeight,wd))->width(); 362 return helpImage(metric(TitleHeight,wd))->width();
363 case MaximizeWidth: 363 case MaximizeWidth:
364 return maximizeImage(metric(TitleHeight,wd))->width(); 364 return maximizeImage(metric(TitleHeight,wd))->width();
365 case CornerGrabSize: 365 case CornerGrabSize:
366 return 16; 366 return 16;
367 } 367 }
368 368
369 return 0; 369 return 0;
370} 370}
371 371
372void WindowDecorationInterface::drawArea( Area a, QPainter *p, const WindowData *wd ) const 372void WindowDecorationInterface::drawArea( Area a, QPainter *p, const WindowData *wd ) const
373{ 373{
374 int th = metric( TitleHeight, wd ); 374 int th = metric( TitleHeight, wd );
375 QRect r = wd->rect; 375 QRect r = wd->rect;
376 376
377 switch ( a ) { 377 switch ( a ) {
378 case Border: 378 case Border:
379 { 379 {
380 const QColorGroup &cg = wd->palette.active(); 380 const QColorGroup &cg = wd->palette.active();
381 qDrawWinPanel(p, r.x()-metric(LeftBorder,wd), 381 qDrawWinPanel(p, r.x()-metric(LeftBorder,wd),
382 r.y()-th-metric(TopBorder,wd), 382 r.y()-th-metric(TopBorder,wd),
383 r.width()+metric(LeftBorder,wd)+metric(RightBorder,wd), 383 r.width()+metric(LeftBorder,wd)+metric(RightBorder,wd),
384 r.height()+th+metric(TopBorder,wd)+metric(BottomBorder,wd), 384 r.height()+th+metric(TopBorder,wd)+metric(BottomBorder,wd),
385 cg, FALSE, &cg.brush(QColorGroup::Background)); 385 cg, FALSE, &cg.brush(QColorGroup::Background));
386 } 386 }
387 break; 387 break;
388 case Title: 388 case Title:
389 { 389 {
390 const QColorGroup &cg = wd->palette.active(); 390 const QColorGroup &cg = wd->palette.active();
391 QBrush titleBrush; 391 QBrush titleBrush;
392 QPen titleLines; 392 QPen titleLines;
393 393
394 if ( wd->flags & WindowData::Active ) { 394 if ( wd->flags & WindowData::Active ) {
395 titleBrush = cg.brush(QColorGroup::Highlight); 395 titleBrush = cg.brush(QColorGroup::Highlight);
396 titleLines = titleBrush.color().dark(); 396 titleLines = titleBrush.color().dark();
397 } else { 397 } else {
398 titleBrush = cg.brush(QColorGroup::Background); 398 titleBrush = cg.brush(QColorGroup::Background);
399 titleLines = titleBrush.color(); 399 titleLines = titleBrush.color();
400 } 400 }
401 401
402 p->fillRect( r.x(), r.y()-th, r.width(), th, titleBrush); 402 p->fillRect( r.x(), r.y()-th, r.width(), th, titleBrush);
403 403
404 p->setPen( titleLines ); 404 p->setPen( titleLines );
405 for ( int i = r.y()-th; i < r.y(); i += 2 ) 405 for ( int i = r.y()-th; i < r.y(); i += 2 )
406 p->drawLine( r.left(), i, r.right(), i ); 406 p->drawLine( r.left(), i, r.right(), i );
407 } 407 }
408 break; 408 break;
409 case TitleText: 409 case TitleText:
410 p->drawText( r.x()+3+metric(HelpWidth,wd), r.top()-th, 410 p->drawText( r.x()+3+metric(HelpWidth,wd), r.top()-th,
411 r.width()-metric(OKWidth,wd)-metric(CloseWidth,wd), 411 r.width()-metric(OKWidth,wd)-metric(CloseWidth,wd),
412 th, QPainter::AlignVCenter, wd->caption); 412 th, QPainter::AlignVCenter, wd->caption);
413 break; 413 break;
414 } 414 }
415} 415}
416 416
417void WindowDecorationInterface::drawButton( Button b, QPainter *p, const WindowData *wd, int x, int y, int, int, QWSButton::State state ) const 417void WindowDecorationInterface::drawButton( Button b, QPainter *p, const WindowData *wd, int x, int y, int, int, QWSButton::State state ) const
418{ 418{
419 QImage *img = 0; 419 QImage *img = 0;
420 switch ( b ) { 420 switch ( b ) {
421 case OK: 421 case OK:
422 img = okImage(metric(TitleHeight,wd)); 422 img = okImage(metric(TitleHeight,wd));
423 break; 423 break;
424 case Close: 424 case Close:
425 img = closeImage(metric(TitleHeight,wd)); 425 img = closeImage(metric(TitleHeight,wd));
426 break; 426 break;
427 case Help: 427 case Help:
428 img = helpImage(metric(TitleHeight,wd)); 428 img = helpImage(metric(TitleHeight,wd));
429 break; 429 break;
430 case Maximize: 430 case Maximize:
431 img = maximizeImage(metric(TitleHeight,wd)); 431 img = maximizeImage(metric(TitleHeight,wd));
432 break; 432 break;
433 } 433 }
434 434
435 if ( img ) { 435 if ( img ) {
436 if ((state & QWSButton::MouseOver) && (state & QWSButton::Clicked)) 436 if ((state & QWSButton::MouseOver) && (state & QWSButton::Clicked))
437 p->drawImage(x+2, y+2, *img); 437 p->drawImage(x+2, y+2, *img);
438 else 438 else
439 p->drawImage(x+1, y+1, *img); 439 p->drawImage(x+1, y+1, *img);
440 } 440 }
441} 441}
442 442
443QRegion WindowDecorationInterface::mask( const WindowData *wd ) const 443QRegion WindowDecorationInterface::mask( const WindowData *wd ) const
444{ 444{
445 int th = metric(TitleHeight,wd); 445 int th = metric(TitleHeight,wd);
446 QRect rect( wd->rect ); 446 QRect rect( wd->rect );
447 QRect r(rect.left() - metric(LeftBorder,wd), 447 QRect r(rect.left() - metric(LeftBorder,wd),
448 rect.top() - th - metric(TopBorder,wd), 448 rect.top() - th - metric(TopBorder,wd),
449 rect.width() + metric(LeftBorder,wd) + metric(RightBorder,wd), 449 rect.width() + metric(LeftBorder,wd) + metric(RightBorder,wd),
450 rect.height() + th + metric(TopBorder,wd) + metric(BottomBorder,wd)); 450 rect.height() + th + metric(TopBorder,wd) + metric(BottomBorder,wd));
451 return QRegion(r) - rect; 451 return QRegion(r) - rect;
452} 452}
453 453
454class DefaultWindowDecoration : public WindowDecorationInterface 454class DefaultWindowDecoration : public WindowDecorationInterface
455{ 455{
456public: 456public:
457 DefaultWindowDecoration() : ref(0) {} 457 DefaultWindowDecoration() : ref(0) {}
458 QString name() const { 458 QString name() const {
459 return "Default"; 459 return "Default";
460 } 460 }
461 QPixmap icon() const { 461 QPixmap icon() const {
462 return QPixmap(); 462 return QPixmap();
463 } 463 }
464 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { 464 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) {
465 *iface = 0; 465 *iface = 0;
466 if ( uuid == IID_QUnknown ) 466 if ( uuid == IID_QUnknown )
467 *iface = this; 467 *iface = this;
468 else if ( uuid == IID_WindowDecoration ) 468 else if ( uuid == IID_WindowDecoration )
469 *iface = this; 469 *iface = this;
470 470
471 if ( *iface ) 471 if ( *iface )
472 (*iface)->addRef(); 472 (*iface)->addRef();
473 return QS_OK; 473 return QS_OK;
474 } 474 }
475 Q_REFCOUNT 475 Q_REFCOUNT
476 476
477private: 477private:
478 ulong ref; 478 ulong ref;
479}; 479};
480 480
481static WindowDecorationInterface *wdiface = 0; 481static WindowDecorationInterface *wdiface = 0;
482static QLibrary *wdlib = 0; 482static QLibrary *wdlib = 0;
483static QString libname;
483 484
484//=========================================================================== 485//===========================================================================
485 486
486QPEDecoration::QPEDecoration() 487QPEDecoration::QPEDecoration()
487 : QWSDefaultDecoration() 488 : QWSDefaultDecoration()
488{ 489{
489 if ( wdlib ) { 490 init ( libname );
490 wdiface->release();
491 wdlib->unload();
492 delete wdlib;
493 wdlib = 0;
494 } else {
495 delete wdiface;
496 }
497 wdiface = new DefaultWindowDecoration;
498
499 helpFile = QString(qApp->argv()[0]) + ".html";
500 QStringList helpPath = Global::helpPath();
501 helpExists = FALSE;
502 for (QStringList::ConstIterator it=helpPath.begin(); it!=helpPath.end() && !helpExists; ++it) {
503 helpExists = QFile::exists( *it + "/" + helpFile );
504 qDebug ( "Checking %s/%s for help: %d", (*it).latin1(), helpFile.latin1(),helpExists);
505 }
506 qpeManager = new QPEManager( this );
507
508 // for backward compatibility:
509 imageOk = *okImage ( 15 );
510 imageClose = *closeImage ( 15 );
511 imageHelp = *helpImage ( 15 );
512} 491}
513 492
514QPEDecoration::QPEDecoration( const QString &plugin ) 493QPEDecoration::QPEDecoration( const QString &plugin )
515 : QWSDefaultDecoration() 494 : QWSDefaultDecoration()
516{ 495{
496 init ( plugin );
497}
498
499void QPEDecoration::init ( const QString &plugin )
500{
501 libname = plugin;
502
517 if ( wdlib ) { 503 if ( wdlib ) {
518 wdiface->release(); 504 wdiface->release();
519 wdlib->unload(); 505 wdlib->unload();
520 delete wdlib; 506 delete wdlib;
521 wdlib = 0; 507 wdlib = 0;
522 } else { 508 } else {
523 delete wdiface; 509 delete wdiface;
524 } 510 }
511
525 WindowDecorationInterface *iface = 0; 512 WindowDecorationInterface *iface = 0;
526 QString path = QPEApplication::qpeDir() + "/plugins/decorations"; 513 QString path = QPEApplication::qpeDir() + "/plugins/decorations";
527 QLibrary *lib = new QLibrary( path + "/" + plugin ); 514 QLibrary *lib = new QLibrary( path + "/" + plugin );
528 if ( lib->queryInterface( IID_WindowDecoration, (QUnknownInterface**)&iface ) == QS_OK && iface ) { 515 if ( lib->queryInterface( IID_WindowDecoration, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
529 wdiface = iface; 516 wdiface = iface;
530 wdlib = lib; 517 wdlib = lib;
531 } else { 518 } else {
532 delete lib; 519 delete lib;
533 wdiface = new DefaultWindowDecoration; 520 wdiface = new DefaultWindowDecoration;
534 } 521 }
535 522
536 helpFile = QString(qApp->argv()[0]) + ".html"; 523 helpFile = QString(qApp->argv()[0]) + ".html";
537 QStringList helpPath = Global::helpPath(); 524 QStringList helpPath = Global::helpPath();
538 helpExists = FALSE; 525 helpExists = FALSE;
539 for (QStringList::ConstIterator it=helpPath.begin(); it!=helpPath.end() && !helpExists; ++it) { 526 for (QStringList::ConstIterator it=helpPath.begin(); it!=helpPath.end() && !helpExists; ++it) {
540 helpExists = QFile::exists( *it + "/" + helpFile ); 527 helpExists = QFile::exists( *it + "/" + helpFile );
541 qDebug ( "Checking %s/%s for help: %d", (*it).latin1(), helpFile.latin1(),helpExists); } 528 //qDebug ( "Checking %s/%s for help: %d", (*it).latin1(), helpFile.latin1(),helpExists);
529 }
542 qpeManager = new QPEManager( this ); 530 qpeManager = new QPEManager( this );
531
532 // Qtopia 1.5 compatibility
533 imageOk = *okImage ( 15 );
534 imageClose = *closeImage ( 15 );
535 imageHelp = *helpImage ( 15 );
543} 536}
544 537
545QPEDecoration::~QPEDecoration() 538QPEDecoration::~QPEDecoration()
546{ 539{
547 delete qpeManager; 540 delete qpeManager;
548} 541}
549 542
550const char **QPEDecoration::menuPixmap() 543const char **QPEDecoration::menuPixmap()
551{ 544{
552 return (const char **)0; 545 return (const char **)0;
553} 546}
554 547
555const char **QPEDecoration::closePixmap() 548const char **QPEDecoration::closePixmap()
556{ 549{
557 return (const char **)qpe_close_xpm; 550 return (const char **)qpe_close_xpm;
558} 551}
559 552
560const char **QPEDecoration::minimizePixmap() 553const char **QPEDecoration::minimizePixmap()
561{ 554{
562 return (const char **)qpe_accept_xpm; 555 return (const char **)qpe_accept_xpm;
563} 556}
564 557
565const char **QPEDecoration::maximizePixmap() 558const char **QPEDecoration::maximizePixmap()
566{ 559{
567 return (const char **)0; 560 return (const char **)0;
568} 561}
569 562
570const char **QPEDecoration::normalizePixmap() 563const char **QPEDecoration::normalizePixmap()
571{ 564{
572 return (const char **)0; 565 return (const char **)0;
573} 566}
574 567
575int QPEDecoration::getTitleHeight( const QWidget *w ) 568int QPEDecoration::getTitleHeight( const QWidget *w )
576{ 569{
577 WindowDecorationInterface::WindowData wd; 570 WindowDecorationInterface::WindowData wd;
578 windowData( w, wd ); 571 windowData( w, wd );
579 return wdiface->metric(WindowDecorationInterface::TitleHeight,&wd); 572 return wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);
580} 573}
581 574
582/* 575/*
583 If rect is empty, no frame is added. (a hack, really) 576 If rect is empty, no frame is added. (a hack, really)
584*/ 577*/
585QRegion QPEDecoration::region(const QWidget *widget, const QRect &rect, QWSDecoration::Region type) 578QRegion QPEDecoration::region(const QWidget *widget, const QRect &rect, QWSDecoration::Region type)
586{ 579{
587 qpeManager->updateActive(); 580 qpeManager->updateActive();
588 581
589 WindowDecorationInterface::WindowData wd; 582 WindowDecorationInterface::WindowData wd;
590 windowData( widget, wd ); 583 windowData( widget, wd );
591 wd.rect = rect; 584 wd.rect = rect;
592 585
593 int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd); 586 int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);
594 int okWidth = wdiface->metric(WindowDecorationInterface::OKWidth,&wd); 587 int okWidth = wdiface->metric(WindowDecorationInterface::OKWidth,&wd);
595 int closeWidth = wdiface->metric(WindowDecorationInterface::CloseWidth,&wd); 588 int closeWidth = wdiface->metric(WindowDecorationInterface::CloseWidth,&wd);
596 int helpWidth = wdiface->metric(WindowDecorationInterface::HelpWidth,&wd); 589 int helpWidth = wdiface->metric(WindowDecorationInterface::HelpWidth,&wd);
597 int grab = wdiface->metric(WindowDecorationInterface::CornerGrabSize,&wd); 590 int grab = wdiface->metric(WindowDecorationInterface::CornerGrabSize,&wd);
598 591
599 QRegion region; 592 QRegion region;
600 593
601 switch ((int)type) { 594 switch ((int)type) {
602 case Menu: 595 case Menu:
603 break; 596 break;
604 case Maximize: 597 case Maximize:
605 if ( !widget->inherits( "QDialog" ) && qApp->desktop()->width() > 350 ) { 598 if ( !widget->inherits( "QDialog" ) && qApp->desktop()->width() > 350 ) {
606 int maximizeWidth = wdiface->metric(WindowDecorationInterface::MaximizeWidth,&wd); 599 int maximizeWidth = wdiface->metric(WindowDecorationInterface::MaximizeWidth,&wd);
607 int left = rect.right() - maximizeWidth - closeWidth; 600 int left = rect.right() - maximizeWidth - closeWidth;
608 if ( ((HackWidget *)widget)->needsOk() ) 601 if ( ((HackWidget *)widget)->needsOk() )
609 left -= okWidth; 602 left -= okWidth;
610 QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight); 603 QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight);
611 region = r; 604 region = r;
612 } 605 }
613 break; 606 break;
614 case Minimize: 607 case Minimize:
615 if ( ((HackWidget *)widget)->needsOk() ) { 608 if ( ((HackWidget *)widget)->needsOk() ) {
616 QRect r(rect.right() - okWidth, 609 QRect r(rect.right() - okWidth,
617 rect.top() - titleHeight, okWidth, titleHeight); 610 rect.top() - titleHeight, okWidth, titleHeight);
618 if (r.left() > rect.left() + titleHeight) 611 if (r.left() > rect.left() + titleHeight)
619 region = r; 612 region = r;
620 } 613 }
621 break; 614 break;
622 case Close: 615 case Close:
623 { 616 {
624 int left = rect.right() - closeWidth; 617 int left = rect.right() - closeWidth;
625 if ( ((HackWidget *)widget)->needsOk() ) 618 if ( ((HackWidget *)widget)->needsOk() )
626 left -= okWidth; 619 left -= okWidth;
627 QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight); 620 QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight);
628 region = r; 621 region = r;
629 } 622 }
630 break; 623 break;
631 case Title: 624 case Title:
632 if ( !widget->isMaximized() ) { 625 if ( !widget->isMaximized() ) {
633 int width = rect.width() - helpWidth - closeWidth; 626 int width = rect.width() - helpWidth - closeWidth;
634 if ( ((HackWidget *)widget)->needsOk() ) 627 if ( ((HackWidget *)widget)->needsOk() )
635 width -= okWidth; 628 width -= okWidth;
636 QRect r(rect.left()+helpWidth, rect.top() - titleHeight, 629 QRect r(rect.left()+helpWidth, rect.top() - titleHeight,
637 width, titleHeight); 630 width, titleHeight);
638 if (r.width() > 0) 631 if (r.width() > 0)
639 region = r; 632 region = r;
640 } 633 }
641 break; 634 break;
642 case Help: 635 case Help:
643 if ( helpExists || widget->testWFlags(Qt::WStyle_ContextHelp) ) { 636 if ( helpExists || widget->testWFlags(Qt::WStyle_ContextHelp) ) {
644 QRect r(rect.left(), rect.top() - titleHeight, 637 QRect r(rect.left(), rect.top() - titleHeight,
645 helpWidth, titleHeight); 638 helpWidth, titleHeight);
646 region = r; 639 region = r;
647 } 640 }
648 break; 641 break;
649 case Top: 642 case Top:
650 if ( !widget->isMaximized() ) { 643 if ( !widget->isMaximized() ) {
651 QRegion m = wdiface->mask(&wd); 644 QRegion m = wdiface->mask(&wd);
652 QRect br = m.boundingRect(); 645 QRect br = m.boundingRect();
653 int b = wdiface->metric(WindowDecorationInterface::TopBorder,&wd); 646 int b = wdiface->metric(WindowDecorationInterface::TopBorder,&wd);
654 region = m & QRect( br.left()+grab, br.top(), 647 region = m & QRect( br.left()+grab, br.top(),
655 br.width()-2*grab, b ); 648 br.width()-2*grab, b );
656 } 649 }
657 break; 650 break;
658 case Left: 651 case Left:
659 if ( !widget->isMaximized() ) { 652 if ( !widget->isMaximized() ) {
660 QRegion m = wdiface->mask(&wd); 653 QRegion m = wdiface->mask(&wd);
661 QRect br = m.boundingRect(); 654 QRect br = m.boundingRect();
662 int b = wdiface->metric(WindowDecorationInterface::LeftBorder,&wd); 655 int b = wdiface->metric(WindowDecorationInterface::LeftBorder,&wd);
663 region = m & QRect( br.left(), br.top()+grab, 656 region = m & QRect( br.left(), br.top()+grab,
664 b, br.height()-2*grab ); 657 b, br.height()-2*grab );
665 } 658 }
666 break; 659 break;
667 case Right: 660 case Right:
668 if ( !widget->isMaximized() ) { 661 if ( !widget->isMaximized() ) {
669 QRegion m = wdiface->mask(&wd); 662 QRegion m = wdiface->mask(&wd);
670 QRect br = m.boundingRect(); 663 QRect br = m.boundingRect();
671 int b = wdiface->metric(WindowDecorationInterface::RightBorder,&wd); 664 int b = wdiface->metric(WindowDecorationInterface::RightBorder,&wd);
672 region = m & QRect( rect.right(), br.top()+grab, 665 region = m & QRect( rect.right(), br.top()+grab,
673 b, br.height()-2*grab ); 666 b, br.height()-2*grab );
674 } 667 }
675 break; 668 break;
676 case Bottom: 669 case Bottom:
677 if ( !widget->isMaximized() ) { 670 if ( !widget->isMaximized() ) {
678 QRegion m = wdiface->mask(&wd); 671 QRegion m = wdiface->mask(&wd);
679 QRect br = m.boundingRect(); 672 QRect br = m.boundingRect();
680 int b = wdiface->metric(WindowDecorationInterface::BottomBorder,&wd); 673 int b = wdiface->metric(WindowDecorationInterface::BottomBorder,&wd);
681 region = m & QRect( br.left()+grab, rect.bottom(), 674 region = m & QRect( br.left()+grab, rect.bottom(),
682 br.width()-2*grab, b ); 675 br.width()-2*grab, b );
683 } 676 }
684 break; 677 break;
685 case TopLeft: 678 case TopLeft:
686 if ( !widget->isMaximized() ) { 679 if ( !widget->isMaximized() ) {
687 QRegion m = wdiface->mask(&wd); 680 QRegion m = wdiface->mask(&wd);
688 QRect br = m.boundingRect(); 681 QRect br = m.boundingRect();
689 int tb = wdiface->metric(WindowDecorationInterface::TopBorder,&wd); 682 int tb = wdiface->metric(WindowDecorationInterface::TopBorder,&wd);
690 int lb = wdiface->metric(WindowDecorationInterface::LeftBorder,&wd); 683 int lb = wdiface->metric(WindowDecorationInterface::LeftBorder,&wd);
691 QRegion crgn( br.left(), br.top(), grab, tb ); 684 QRegion crgn( br.left(), br.top(), grab, tb );
692 crgn |= QRect( br.left(), br.top(), lb, grab ); 685 crgn |= QRect( br.left(), br.top(), lb, grab );
693 region = m & crgn; 686 region = m & crgn;
694 } 687 }
695 break; 688 break;
696 case TopRight: 689 case TopRight:
697 if ( !widget->isMaximized() ) { 690 if ( !widget->isMaximized() ) {
698 QRegion m = wdiface->mask(&wd); 691 QRegion m = wdiface->mask(&wd);
699 QRect br = m.boundingRect(); 692 QRect br = m.boundingRect();
700 int tb = wdiface->metric(WindowDecorationInterface::TopBorder,&wd); 693 int tb = wdiface->metric(WindowDecorationInterface::TopBorder,&wd);
701 int rb = wdiface->metric(WindowDecorationInterface::RightBorder,&wd); 694 int rb = wdiface->metric(WindowDecorationInterface::RightBorder,&wd);
702 QRegion crgn( br.right()-grab, br.top(), grab, tb ); 695 QRegion crgn( br.right()-grab, br.top(), grab, tb );
703 crgn |= QRect( br.right()-rb, br.top(), rb, grab ); 696 crgn |= QRect( br.right()-rb, br.top(), rb, grab );
704 region = m & crgn; 697 region = m & crgn;
705 } 698 }
706 break; 699 break;
707 case BottomLeft: 700 case BottomLeft:
708 if ( !widget->isMaximized() ) { 701 if ( !widget->isMaximized() ) {
709 QRegion m = wdiface->mask(&wd); 702 QRegion m = wdiface->mask(&wd);
710 QRect br = m.boundingRect(); 703 QRect br = m.boundingRect();
711 region = m & QRect( br.left(), br.bottom()-grab, grab, grab ); 704 region = m & QRect( br.left(), br.bottom()-grab, grab, grab );
712 } 705 }
713 break; 706 break;
714 case BottomRight: 707 case BottomRight:
715 if ( !widget->isMaximized() ) { 708 if ( !widget->isMaximized() ) {
716 QRegion m = wdiface->mask(&wd); 709 QRegion m = wdiface->mask(&wd);
717 QRect br = m.boundingRect(); 710 QRect br = m.boundingRect();
718 region = m & QRect( br.right()-grab, br.bottom()-grab, grab, grab ); 711 region = m & QRect( br.right()-grab, br.bottom()-grab, grab, grab );
719 } 712 }
720 break; 713 break;
721 case All: 714 case All:
722 if ( widget->isMaximized() ) 715 if ( widget->isMaximized() )
723 region = QWSDefaultDecoration::region(widget, rect, type); 716 region = QWSDefaultDecoration::region(widget, rect, type);
724 else 717 else
725 region = wdiface->mask(&wd) - rect; 718 region = wdiface->mask(&wd) - rect;
726 break; 719 break;
727 default: 720 default:
728 region = QWSDefaultDecoration::region(widget, rect, type); 721 region = QWSDefaultDecoration::region(widget, rect, type);
729 break; 722 break;
730 } 723 }
731 724
732 return region; 725 return region;
733} 726}
734 727
735void QPEDecoration::paint(QPainter *painter, const QWidget *widget) 728void QPEDecoration::paint(QPainter *painter, const QWidget *widget)
736{ 729{
737 WindowDecorationInterface::WindowData wd; 730 WindowDecorationInterface::WindowData wd;
738 windowData( widget, wd ); 731 windowData( widget, wd );
739 732
740 int titleWidth = getTitleWidth(widget); 733 int titleWidth = getTitleWidth(widget);
741 int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd); 734 int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);
742 735
743 QRect rect(widget->rect()); 736 QRect rect(widget->rect());
744 737
745 // title bar rect 738 // title bar rect
746 QRect tr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight ); 739 QRect tr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight );
747 740
748#ifndef QT_NO_PALETTE 741#ifndef QT_NO_PALETTE
749 QRegion oldClip = painter->clipRegion(); 742 QRegion oldClip = painter->clipRegion();
750 painter->setClipRegion( oldClip - QRegion( tr ) );// reduce flicker 743 painter->setClipRegion( oldClip - QRegion( tr ) );// reduce flicker
751 wdiface->drawArea( WindowDecorationInterface::Border, painter, &wd ); 744 wdiface->drawArea( WindowDecorationInterface::Border, painter, &wd );
752 painter->setClipRegion( oldClip ); 745 painter->setClipRegion( oldClip );
753 746
754 if (titleWidth > 0) { 747 if (titleWidth > 0) {
755 const QColorGroup &cg = widget->palette().active(); 748 const QColorGroup &cg = widget->palette().active();
756 QBrush titleBrush; 749 QBrush titleBrush;
757 QPen titlePen; 750 QPen titlePen;
758 751
759 if ( wd.flags & WindowDecorationInterface::WindowData::Active ) { 752 if ( wd.flags & WindowDecorationInterface::WindowData::Active ) {
760 titleBrush = cg.brush(QColorGroup::Highlight); 753 titleBrush = cg.brush(QColorGroup::Highlight);
761 titlePen = cg.color(QColorGroup::HighlightedText); 754 titlePen = cg.color(QColorGroup::HighlightedText);
762 } else { 755 } else {
763 titleBrush = cg.brush(QColorGroup::Background); 756 titleBrush = cg.brush(QColorGroup::Background);
764 titlePen = cg.color(QColorGroup::Text); 757 titlePen = cg.color(QColorGroup::Text);
765 } 758 }
766 759
767 wdiface->drawArea( WindowDecorationInterface::Title, painter, &wd ); 760 wdiface->drawArea( WindowDecorationInterface::Title, painter, &wd );
768 761
769 // Draw caption 762 // Draw caption
770 painter->setPen(titlePen); 763 painter->setPen(titlePen);
771 QFont f( QApplication::font() ); 764 QFont f( QApplication::font() );
772 f.setWeight( QFont::Bold ); 765 f.setWeight( QFont::Bold );
773 painter->setFont(f); 766 painter->setFont(f);
774 wdiface->drawArea( WindowDecorationInterface::TitleText, painter, &wd ); 767 wdiface->drawArea( WindowDecorationInterface::TitleText, painter, &wd );
775 } 768 }
776#endif //QT_NO_PALETTE 769#endif //QT_NO_PALETTE
777 770
778 paintButton( painter, widget, (QWSDecoration::Region)Help, 0 ); 771 paintButton( painter, widget, (QWSDecoration::Region)Help, 0 );
779} 772}
780 773
781void QPEDecoration::paintButton(QPainter *painter, const QWidget *w, 774void QPEDecoration::paintButton(QPainter *painter, const QWidget *w,
782 QWSDecoration::Region type, int state) 775 QWSDecoration::Region type, int state)
783{ 776{
784 WindowDecorationInterface::Button b; 777 WindowDecorationInterface::Button b;
785 switch ((int)type) { 778 switch ((int)type) {
786 case Close: 779 case Close:
787 b = WindowDecorationInterface::Close; 780 b = WindowDecorationInterface::Close;
788 break; 781 break;
789 case Minimize: 782 case Minimize:
790 if ( ((HackWidget *)w)->needsOk() ) 783 if ( ((HackWidget *)w)->needsOk() )
791 b = WindowDecorationInterface::OK; 784 b = WindowDecorationInterface::OK;
792 else if ( helpExists ) 785 else if ( helpExists )
793 b = WindowDecorationInterface::Help; 786 b = WindowDecorationInterface::Help;
794 else 787 else
795 return; 788 return;
796 break; 789 break;
797 case Help: 790 case Help:
798 b = WindowDecorationInterface::Help; 791 b = WindowDecorationInterface::Help;
799 break; 792 break;
800 case Maximize: 793 case Maximize:
801 b = WindowDecorationInterface::Maximize; 794 b = WindowDecorationInterface::Maximize;
802 break; 795 break;
803 default: 796 default:
804 return; 797 return;
805 } 798 }
806 799
807 WindowDecorationInterface::WindowData wd; 800 WindowDecorationInterface::WindowData wd;
808 windowData( w, wd ); 801 windowData( w, wd );
809 802
810 int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd); 803 int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);
811 QRect rect(w->rect()); 804 QRect rect(w->rect());
812 QRect tr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight ); 805 QRect tr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight );
813 QRect brect(region(w, w->rect(), type).boundingRect()); 806 QRect brect(region(w, w->rect(), type).boundingRect());
814 807
815 const QColorGroup &cg = w->palette().active(); 808 const QColorGroup &cg = w->palette().active();
816 if ( wd.flags & WindowDecorationInterface::WindowData::Active ) 809 if ( wd.flags & WindowDecorationInterface::WindowData::Active )
817 painter->setPen( cg.color(QColorGroup::HighlightedText) ); 810 painter->setPen( cg.color(QColorGroup::HighlightedText) );
818 else 811 else
819 painter->setPen( cg.color(QColorGroup::Text) ); 812 painter->setPen( cg.color(QColorGroup::Text) );
820 813
821 QRegion oldClip = painter->clipRegion(); 814 QRegion oldClip = painter->clipRegion();
822 painter->setClipRegion( QRect(brect.x(), tr.y(), brect.width(), tr.height()) ); // reduce flicker 815 painter->setClipRegion( QRect(brect.x(), tr.y(), brect.width(), tr.height()) ); // reduce flicker
823 wdiface->drawArea( WindowDecorationInterface::Title, painter, &wd ); 816 wdiface->drawArea( WindowDecorationInterface::Title, painter, &wd );
824 wdiface->drawButton( b, painter, &wd, brect.x(), brect.y(), brect.width(), brect.height(), (QWSButton::State)state ); 817 wdiface->drawButton( b, painter, &wd, brect.x(), brect.y(), brect.width(), brect.height(), (QWSButton::State)state );
825 painter->setClipRegion( oldClip ); 818 painter->setClipRegion( oldClip );
826} 819}
827 820
828//#define QPE_DONT_SHOW_TITLEBAR 821//#define QPE_DONT_SHOW_TITLEBAR
829 822
830void QPEDecoration::maximize( QWidget *widget ) 823void QPEDecoration::maximize( QWidget *widget )
831{ 824{
832#ifdef QPE_DONT_SHOW_TITLEBAR 825#ifdef QPE_DONT_SHOW_TITLEBAR
833 if ( !widget->inherits( "QDialog" ) ) { 826 if ( !widget->inherits( "QDialog" ) ) {
834 widget->setGeometry( qt_maxWindowRect ); 827 widget->setGeometry( qt_maxWindowRect );
835 } else 828 } else
836#endif 829#endif
837 { 830 {
838 QWSDecoration::maximize( widget ); 831 QWSDecoration::maximize( widget );
839 } 832 }
840} 833}
841 834
842#ifndef QT_NO_DIALOG 835#ifndef QT_NO_DIALOG
843class HackDialog : public QDialog 836class HackDialog : public QDialog
844{ 837{
845public: 838public:
846 void acceptIt() { 839 void acceptIt() {
847 if ( isA( "QMessageBox" ) ) 840 if ( isA( "QMessageBox" ) )
848 qApp->postEvent( this, new QKeyEvent( QEvent::KeyPress, Key_Enter, '\n', 0, "\n" ) ); 841 qApp->postEvent( this, new QKeyEvent( QEvent::KeyPress, Key_Enter, '\n', 0, "\n" ) );
849 else 842 else
850 accept(); 843 accept();
851 } 844 }
852}; 845};
853#endif 846#endif
854 847
855 848
856void QPEDecoration::minimize( QWidget *widget ) 849void QPEDecoration::minimize( QWidget *widget )
857{ 850{
858#ifndef QT_NO_DIALOG 851#ifndef QT_NO_DIALOG
859 // We use the minimize button as an "accept" button. 852 // We use the minimize button as an "accept" button.
860 if ( widget->inherits( "QDialog" ) ) { 853 if ( widget->inherits( "QDialog" ) ) {
861 HackDialog *d = (HackDialog *)widget; 854 HackDialog *d = (HackDialog *)widget;
862 d->acceptIt(); 855 d->acceptIt();
863 } 856 }
864#endif 857#endif
865 else if ( ((HackWidget *)widget)->needsOk() ) { 858 else if ( ((HackWidget *)widget)->needsOk() ) {
866 QSignal s; 859 QSignal s;
867 s.connect( widget, SLOT( accept() ) ); 860 s.connect( widget, SLOT( accept() ) );
868 s.activate(); 861 s.activate();
869 } else { 862 } else {
870 help( widget ); 863 help( widget );
871 } 864 }
872} 865}
873 866
874void QPEDecoration::help( QWidget *w ) 867void QPEDecoration::help( QWidget *w )
875{ 868{
876 if ( helpExists ) { 869 if ( helpExists ) {
877 Global::execute( "helpbrowser", helpFile ); 870 Global::execute( "helpbrowser", helpFile );
878 } else if ( w && w->testWFlags(Qt::WStyle_ContextHelp) ) { 871 } else if ( w && w->testWFlags(Qt::WStyle_ContextHelp) ) {
879 QWhatsThis::enterWhatsThisMode(); 872 QWhatsThis::enterWhatsThisMode();
880 QWhatsThis::leaveWhatsThisMode( qApp->tr( 873 QWhatsThis::leaveWhatsThisMode( qApp->tr(
881 "<Qt>Comprehensive help is not available for this application, " 874 "<Qt>Comprehensive help is not available for this application, "
882 "however there is context-sensitive help.<p>To use context-sensitive help:<p>" 875 "however there is context-sensitive help.<p>To use context-sensitive help:<p>"
883 "<ol><li>click and hold the help button." 876 "<ol><li>click and hold the help button."
884 "<li>when the title bar shows <b>What's this...</b>, " 877 "<li>when the title bar shows <b>What's this...</b>, "
885 "click on any control.</ol></Qt>" ) ); 878 "click on any control.</ol></Qt>" ) );
886 } 879 }
887} 880}
888 881
889void QPEDecoration::windowData( const QWidget *w, WindowDecorationInterface::WindowData &wd ) const 882void QPEDecoration::windowData( const QWidget *w, WindowDecorationInterface::WindowData &wd ) const
890{ 883{
891 wd.rect = w->rect(); 884 wd.rect = w->rect();
892 if ( qpeManager->whatsThisWidget() == w ) 885 if ( qpeManager->whatsThisWidget() == w )
893 wd.caption = qApp->tr("What's this..." ); 886 wd.caption = qApp->tr("What's this..." );
894 else 887 else
895 wd.caption = w->caption(); 888 wd.caption = w->caption();
896 wd.palette = qApp->palette(); 889 wd.palette = qApp->palette();
897 wd.flags = 0; 890 wd.flags = 0;
898 wd.flags |= w->isMaximized() ? WindowDecorationInterface::WindowData::Maximized : 0; 891 wd.flags |= w->isMaximized() ? WindowDecorationInterface::WindowData::Maximized : 0;
899 wd.flags |= w->testWFlags(Qt::WStyle_Dialog) ? WindowDecorationInterface::WindowData::Dialog : 0; 892 wd.flags |= w->testWFlags(Qt::WStyle_Dialog) ? WindowDecorationInterface::WindowData::Dialog : 0;
900 const QWidget *active = qpeManager->activeWidget(); 893 const QWidget *active = qpeManager->activeWidget();
901 wd.flags |= w == active ? WindowDecorationInterface::WindowData::Active : 0; 894 wd.flags |= w == active ? WindowDecorationInterface::WindowData::Active : 0;
902 wd.reserved = 1; 895 wd.reserved = 1;
903} 896}
904 897
905/* 898/*
906#ifndef QT_NO_POPUPMENU 899#ifndef QT_NO_POPUPMENU
907QPopupMenu *QPEDecoration::menu(QWSManager*, const QWidget*, const QPoint&) 900QPopupMenu *QPEDecoration::menu(QWSManager*, const QWidget*, const QPoint&)
908{ 901{
909 return 0; 902 return 0;
910} 903}
911#endif 904#endif
912*/ 905*/
913 906
914 907
915 908
916 909
917#endif // QT_NO_QWS_QPE_WM_STYLE 910#endif // QT_NO_QWS_QPE_WM_STYLE
diff --git a/library/qpedecoration_qws.h b/library/qpedecoration_qws.h
index 691c6f6..6628ba2 100644
--- a/library/qpedecoration_qws.h
+++ b/library/qpedecoration_qws.h
@@ -1,111 +1,113 @@
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#ifndef QPE_DECORATION_QWS_H__ 20#ifndef QPE_DECORATION_QWS_H__
21#define QPE_DECORATION_QWS_H__ 21#define QPE_DECORATION_QWS_H__
22 22
23 23
24#ifdef QWS 24#ifdef QWS
25#include <qwsdefaultdecoration_qws.h> 25#include <qwsdefaultdecoration_qws.h>
26#include <qimage.h> 26#include <qimage.h>
27#include <qdatetime.h> 27#include <qdatetime.h>
28#include <qguardedptr.h> 28#include <qguardedptr.h>
29#include "windowdecorationinterface.h" 29#include "windowdecorationinterface.h"
30 30
31 31
32#ifndef QT_NO_QWS_QPE_WM_STYLE 32#ifndef QT_NO_QWS_QPE_WM_STYLE
33 33
34class QPEManager; 34class QPEManager;
35class QTimer; 35class QTimer;
36 36
37class QPEDecoration : public QWSDefaultDecoration 37class QPEDecoration : public QWSDefaultDecoration
38{ 38{
39public: 39public:
40 QPEDecoration(); 40 QPEDecoration();
41 QPEDecoration( const QString &plugin ); 41 QPEDecoration( const QString &plugin );
42 virtual ~QPEDecoration(); 42 virtual ~QPEDecoration();
43 43
44 virtual QRegion region(const QWidget *, const QRect &rect, Region); 44 virtual QRegion region(const QWidget *, const QRect &rect, Region);
45 virtual void paint(QPainter *, const QWidget *); 45 virtual void paint(QPainter *, const QWidget *);
46 virtual void paintButton(QPainter *, const QWidget *, Region, int state); 46 virtual void paintButton(QPainter *, const QWidget *, Region, int state);
47 47
48 void maximize( QWidget * ); 48 void maximize( QWidget * );
49 void minimize( QWidget * ); 49 void minimize( QWidget * );
50 virtual void help( QWidget * ); 50 virtual void help( QWidget * );
51 51
52 enum QPERegion { Help=LastRegion+1 }; 52 enum QPERegion { Help=LastRegion+1 };
53 void buttonClicked( QPERegion r ); 53 void buttonClicked( QPERegion r );
54 54
55protected: 55protected:
56 virtual int getTitleHeight(const QWidget *); 56 virtual int getTitleHeight(const QWidget *);
57 virtual const char **menuPixmap(); 57 virtual const char **menuPixmap();
58 virtual const char **closePixmap(); 58 virtual const char **closePixmap();
59 virtual const char **minimizePixmap(); 59 virtual const char **minimizePixmap();
60 virtual const char **maximizePixmap(); 60 virtual const char **maximizePixmap();
61 virtual const char **normalizePixmap(); 61 virtual const char **normalizePixmap();
62 62
63private: 63private:
64 void windowData( const QWidget *w, WindowDecorationInterface::WindowData &wd ) const; 64 void windowData( const QWidget *w, WindowDecorationInterface::WindowData &wd ) const;
65 65
66 void init ( const QString & );
67
66protected: 68protected:
67 QImage imageOk; 69 QImage imageOk;
68 QImage imageClose; 70 QImage imageClose;
69 QImage imageHelp; 71 QImage imageHelp;
70 QString helpFile; 72 QString helpFile;
71 bool helpExists; 73 bool helpExists;
72 QPEManager *qpeManager; 74 QPEManager *qpeManager;
73}; 75};
74 76
75 77
76class QPEManager : public QObject 78class QPEManager : public QObject
77{ 79{
78 Q_OBJECT 80 Q_OBJECT
79 friend class QPEDecoration; 81 friend class QPEDecoration;
80public: 82public:
81 QPEManager( QPEDecoration *d, QObject *parent=0 ); 83 QPEManager( QPEDecoration *d, QObject *parent=0 );
82 84
83 void updateActive(); 85 void updateActive();
84 const QWidget *activeWidget() const { return (const QWidget *)active; } 86 const QWidget *activeWidget() const { return (const QWidget *)active; }
85 const QWidget *whatsThisWidget() const { return (const QWidget *)whatsThis; } 87 const QWidget *whatsThisWidget() const { return (const QWidget *)whatsThis; }
86 88
87protected: 89protected:
88 int pointInQpeRegion( QWidget *w, const QPoint &p ); 90 int pointInQpeRegion( QWidget *w, const QPoint &p );
89 virtual bool eventFilter( QObject *, QEvent * ); 91 virtual bool eventFilter( QObject *, QEvent * );
90 void drawButton( QWidget *w, QPEDecoration::QPERegion r, int state ); 92 void drawButton( QWidget *w, QPEDecoration::QPERegion r, int state );
91 void drawTitle( QWidget *w ); 93 void drawTitle( QWidget *w );
92 94
93protected slots: 95protected slots:
94 void whatsThisTimeout(); 96 void whatsThisTimeout();
95 97
96protected: 98protected:
97 QPEDecoration *decoration; 99 QPEDecoration *decoration;
98 QGuardedPtr<QWidget> active; 100 QGuardedPtr<QWidget> active;
99 int helpState; 101 int helpState;
100 QTime pressTime; 102 QTime pressTime;
101 QTimer *wtTimer; 103 QTimer *wtTimer;
102 bool inWhatsThis; 104 bool inWhatsThis;
103 QGuardedPtr<QWidget> whatsThis; 105 QGuardedPtr<QWidget> whatsThis;
104}; 106};
105 107
106 108
107#endif // QT_NO_QWS_QPE_WM_STYLE 109#endif // QT_NO_QWS_QPE_WM_STYLE
108 110
109 111
110#endif // QPE_DECORATION_QWS_H__ 112#endif // QPE_DECORATION_QWS_H__
111#endif // QWS 113#endif // QWS