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